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






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>
Мне очень нравится Плагин python_ifold.
Этот ответ действительно нуждается в описании.
Попробуйте этот плагин:
Лично я не могу убедить себя засорять свой код маркерами. Я привык (и эффективно) использовать складывание отступов. Вместе с моей схемой пробела (см. Ниже) для открытия / закрытия складок и командами zR и zM я уже дома. Идеально подходит для Python!
set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
: сначала установить метод foldmethod = indent. Я искал именно это в Google и наткнулся на ваш ответ, очень приятно! :)
Моему другу тоже понравился set foldnestmax=2, так складываются методы классов, а внутренние операторы - нет.
Я не уверен, почему второе отображение находится в этом ответе на zf. Он не используется, если используется складывание с отступом. Однако, если вы выполняете складывание вручную, отображение имеет смысл. za, однако, кажется лучшим способом быстро открывать / закрывать складки. Я также рекомендую использовать складную навигацию (zk, zj).
Vnoremap хорош для ручного отображения. В ftplugin добавьте set foldmethod = indent для Python. Затем в вашем .vimrc установите foldmethod = manual. Теперь вы можете складывать как Python, так и не Python с отображением пробела.
Я использую файл синтаксиса это для Python. Он устанавливает синтаксис метода сворачивания и сворачивает все классы и функции, но ничего больше.
как складывать после раскладывания? Я не могу найти ярлык! tnx
Пробовал этот файл синтаксиса, и он достаточно хорошо работал для выделения. Но это абсолютно ничего не дало для холодного складывания, когда я использую «zM», ничего не происходит, когда я использую «za» в классе, я получаю E490 (складка не найдена). Что не так?
+1. На первый взгляд, сворачивание кода Python (класса, метода) у меня прекрасно работает. Используйте ответы Уолтера (stackoverflow.com/a/360634/605356) на карту пробела, чтобы свернуть команды, но это решение работает не так хорошо (для меня), как это. Спасибо @Tomas за ссылку.
@DaniGehtdichnixan, возможно, вам понадобится: AnsiEsc - изучите это, и я думаю, вы найдете решение
Исходный код Python поставляется с плагином синтаксиса vim вместе с настраиваемым файлом vimrc. Проверьте Python FAQ по vim
Этот файл синтаксиса также НЕ содержит информации о сворачивании. Таким образом, вы не можете использовать этот файл синтаксиса со сворачиванием синтаксиса.
Я думаю, что складывание отступов подходит для Python. Я делаю разветвленное репозиторий git для идей vim-config python / django IDE. Разветвляйся!
Для меня идеальным фальцеванием является фальцовка только блоков 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.
Мне нравится это решение. Но он не подходит для складывания class и def, если они стоят в начале строки. Поскольку я с трудом могу прочитать выражение, у меня возникают проблемы с попыткой настроить его, чтобы он соответствовал ^def и ^class. Это любопытно, поскольку \s* должен хорошо с этим справляться.
Еще один плагин для сворачивания кода Python. Довольно просто, обрабатывая строки документации, и на GitHub:
Наслаждаться!
Это работает лучше всего. Я вообще перестал думать о сворачивании кода, потому что это никогда не вызывало головной боли.
@iankit Иногда мне хочется, чтобы он также складывал блоки if, for и while, не так ли?
хм, я думаю, это может быть не очень полезно. Если он складывает эти блоки, не очень понятно, что это за содержимое в свернутом состоянии. Однако с методами и другими именованными блоками имя говорит само за себя. Я могу догадаться, что делает сложенный блок, глядя на его имя.
@iankit Не знаю .. Хотелось бы попробовать. Почему не пытающийся? ^ ^
В вашем .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.
Мне очень нравится этот небольшой сценарий vim, который я написал для .vimrc. Он сопоставляет alt+1, чтобы свернуть первый уровень отступа Python (определения классов и функции), alt+2, чтобы свернуть второй уровень (методы класса), и alt+0, чтобы развернуть все. Это гарантирует, что он сворачивает только один уровень и не сворачивает ни один из вложенных подуровней. Вы все еще можете использовать za для переключения сворачивания для текущего блока. Обратите внимание, что в ^[0 для моего терминала ^[ - это alt. У вас нет большого опыта работы со скриптом vim, поэтому не стесняйтесь вносить предложения по функции :)
" 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
Чтобы использовать клавиши Alt на Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
К сожалению, этот плагин использует больше процессорного времени, чем я бы предпочел (даже с версией a), так как я предпочитаю, чтобы мой vim работал быстрее. Есть другие предложения?