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

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

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

  • У вас есть конкретный плагин Vim, который вам нравится и который вам нравится?
  • Используете ли вы складывание вручную или размещаете маркеры в комментариях?
  • Есть ли другие рекомендуемые способы сворачивания кода для Python в Vim?
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
117
0
50 136
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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.

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

Paul D. Eden 11.12.2008 02:04

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

sixtyfootersdude 14.02.2011 22:40

Попробуйте этот плагин:

http://vim.sourceforge.net/scripts/script.php?script_id=515

Ответ принят как подходящий

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

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

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

tmadsen 19.05.2010 15:51

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

Denilson Sá Maia 20.07.2011 20:09

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

Derek Litz 26.11.2011 21:09

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

Lionel 22.06.2012 01:54

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

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

Moj 04.12.2013 20:04

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

Dani Gehtdichnixan 28.04.2014 17:52

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

Johnny Utahh 04.05.2015 03:00

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

serup 29.12.2016 13:29

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

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

KFL 15.03.2012 00:50

Я думаю, что складывание отступов подходит для Python. Я делаю разветвленное репозиторий git для идей vim-config python / django IDE. Разветвляйся!

http://github.com/skyl/vim-config-python-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* должен хорошо с этим справляться.

iago-lito 'considering leaving 26.11.2015 13:25

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

SimpylFold

Наслаждаться!

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

iankit 15.12.2016 09:17

@iankit Иногда мне хочется, чтобы он также складывал блоки if, for и while, не так ли?

iago-lito 'considering leaving 15.12.2016 13:00

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

iankit 15.12.2016 14:04

@iankit Не знаю .. Хотелось бы попробовать. Почему не пытающийся? ^ ^

iago-lito 'considering leaving 15.12.2016 16:18

В вашем .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

Mike Bannister 18.06.2020 18:38

Другие вопросы по теме