Каков рекомендуемый способ использования сворачивания Vim для кода Python


112

Меня интересует возможность сворачивания кода в Vim для кода Python. Я заметил несколько способов сделать это.

Есть ли у кого-нибудь предпочтительный способ сворачивания кода Python в Vim? То есть,

  • У вас есть конкретный плагин Vim, который вам нравится и который вам нравится?
  • Используете ли вы складывание вручную или в комментариях размещаете маркеры?
  • Есть ли другие рекомендуемые способы сворачивания кода для Python в Vim?

Ответы:


117

Лично я не могу убедить себя засорять свой код маркерами. Я привык (и эффективно) использовать складывание отступов. Вместе с моей схемой пробела (см. Ниже) для открытия / закрытия складок и командами zR и zM я как раз дома. Идеально подходит для Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
: сначала установить метод foldmethod = indent. Я искал в Google только это и наткнулся на ваш ответ, очень приятно! :)
tmadsen

47
Моему другу тоже понравилось set foldnestmax=2, что методы классов сворачиваются, а внутренние операторы - нет.
Denilson Sá Maia

9
Я не уверен, почему второе отображение находится в этом ответе на zf. Он не используется, если используется складывание с отступом. Однако, если вы выполняете складывание вручную, отображение имеет смысл. za, однако, кажется лучшим способом быстро открывать / закрывать складки. Я также рекомендую использовать складную навигацию (zk, zj).
Дерек Литц

Vnoremap хорош для ручного отображения. В ftplugin добавьте set foldmethod = indent для Python. Затем в вашем .vimrc установите foldmethod = manual. Теперь вы можете складывать как Python, так и не Python с отображением пробела
Лайонел,

26

Я использую этот файл синтаксиса для Python. Он устанавливает синтаксис метода сворачивания и сворачивает все классы и функции, но ничего больше.


как складывать после раскладывания? Я не могу найти ярлык! tnx
Moj

Пробовал этот файл синтаксиса, и он работал достаточно хорошо для выделения. Но это абсолютно ничего не дало для холодного складывания, когда я использую «zM», ничего не происходит, когда я использую «za» в классе, я получаю E490 (складка не найдена). Что не так?
Dani Gehtdichnixan

+1. На первый взгляд, сворачивание кода Python (класса, метода) отлично работает для меня. Воспользуйтесь ответами Уолтера ( stackoverflow.com/a/360634/605356 ) на отображение пробела для складывания команд, но это решение работает не так хорошо (для меня), как это. Спасибо @Tomas за ссылку.
Джонни Юта,

@DaniGehtdichnixan, возможно, вам понадобится: AnsiEsc - изучите это, и я думаю, вы найдете решение
serup

10

Еще один плагин для сворачивания кода Python. Довольно просто, обрабатывая строки документации, и на GitHub:

SimpylFold

Наслаждайтесь!


Это работает лучше всего. Я вообще перестал думать о сворачивании кода, поскольку это никогда не вызывало головной боли.
iankit

@iankit я иногда хочу это также сложить if, forи whileблоки, не так ли?
iago-lito 'рассматривает возможность отъезда

хм, я думаю, это может быть не очень полезно. Если он складывает эти блоки, не очень понятно, что это за контент в сложенном состоянии. Однако с методами и другими именованными блоками имя говорит само за себя. Я могу догадаться, что делает сложенный блок, глядя на его имя.
iankit

@iankit Не знаю .. Хотелось бы попробовать. Почему бы не попробовать ? ^ ^
iago-lito 'подумывает об отъезде

7

Python хорошо подходит для сворачивания по отступу, немного для написания собственного кода я использую маркеры, поскольку они могут измельчать документ так, как вы хотите, и могут служить своего рода оглавлением. У меня есть это в моем vimrc, чтобы переключаться между ними, когда я просматриваю код другого пользователя.

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>


5

python_ifoldПлагин мне очень нравится .


1
К сожалению, этот плагин использует больше процессорного времени, чем я бы предпочел (даже с версией a), так как мне нравится, чтобы мой vim работал быстрее. Есть другие предложения?
Пол Д. Иден,

11
Этот ответ действительно нуждается в описании.
sixtyfootersdude


3

Для меня идеальный складной сложить только те classи defблоки, отступа складывание слишком много , на мой вкус. Я думаю, что одним из элегантных решений является использование синтаксической системы, подобной той, которую упомянул Томас. Однако он предназначен для замены исходного файла синтаксиса и может оказаться старше оригинала (т.е. этот сценарий не упоминает синтаксис Python 3).

Мое решение - поместить в ~/.vim/syntaxпапку файл с именем, python.vimсостоящим только из важных строк (взятых из приведенного выше сценария):

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

Затем просто активируйте складывание с помощью :set foldmethod=syntax.


1
Мне нравится это решение. Но это не совпадает с n classскладками и defs, если они стоят в начале строки. Поскольку я с трудом могу прочесть выражение, у меня возникли проблемы с попыткой настроить его так, чтобы оно соответствовало ^defи ^class. Это любопытно, так как \s*должно хорошо с этим справиться ..
iago-lito 'рассматривает возможность отъезда

2

Исходный код Python поставляется с плагином синтаксиса vim вместе с настраиваемым файлом vimrc. Проверьте FAQ по python на vim


2
Этот файл синтаксиса также НЕ содержит информации о сворачивании. Таким образом, вы не можете использовать этот файл синтаксиса со сворачиванием синтаксиса.
KFL

2

В вашем .vimrc:

set foldmethod=indent
set shiftwidth=4

Затем zMвсе замаскировать, zRчтобы все развернуть. Я также добавил:

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

Так что вы можете z1и z2понемногу раскрываться.


2

Мне очень нравится этот небольшой сценарий vim, который я написал для .vimrc. Он отображает alt+1складывание первого уровня отступа Python (определения классов и функций), alt+2складывание второго уровня (методы класса) и alt+0развертывание всего. Это гарантирует, что он сворачивает только один уровень и не сворачивает ни один из вложенных подуровней. Вы все еще можете использовать zaдля переключения сворачивания для текущего блока. Обратите внимание ^[0, что ^[это altдля моего терминала. У вас нет большого опыта работы с vim script, поэтому не стесняйтесь вносить предложения по функции :)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction

1
Чтобы использовать альтернативные клавиши на Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Майк Баннистер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.