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

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

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

  • У вас есть определенный плагин Vim, который вы используете и любите?
  • Вы используете ручное сворачивание или вы размещаете маркеры в комментариях?
  • Любые другие рекомендуемые способы сделать свертывание кода для Python в Vim?
10.12.2008 22:10:45
10 ОТВЕТОВ
РЕШЕНИЕ

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

nnoremap <space> za

vnoremap <space> zf

115
11.12.2008 19:47:43
: сначала установите метод метки = отступ. Я гуглил только для этого и наткнулся на ваш ответ, очень приятно! :)
tmadsen 19.05.2010 11:51:33
Моему другу тоже понравилось set foldnestmax=2, таким образом методы классов складываются, а внутренние утверждения - нет.
Denilson Sá Maia 20.07.2011 16:09:12
Я не уверен, почему второе отображение находится в этом ответе на ZF. Он не используется, если используется отступ. Тем не менее, если вы делаете ручное сворачивание, отображение имеет смысл. za, однако, кажется лучшим способом быстро открывать / закрывать складки. Я также рекомендую использовать сложную навигацию (zk, zj).
Derek Litz 26.11.2011 17:09:44
Vnoremap хорош для ручного отображения. В вашем ftplugin добавьте set foldmethod = indent для Python. Затем в вашем .vimrc установите foldmethod = manual. Теперь вы можете сложить как Python, так и не Python с отображением пробела
Lionel 21.06.2012 21:54:31

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>
7
10.12.2008 22:26:19

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

5
19.12.2012 13:57:13
К сожалению, этот плагин использует больше процессорного времени, чем я бы предпочел (даже с версией a), так как мне нравится, чтобы мой vim работал быстро. Любые другие предложения?
Paul D. Eden 10.12.2008 23:04:08
Этот ответ действительно нуждается в описании.
sixtyfootersdude 14.02.2011 19:40:29

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

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

4
11.12.2008 07:23:05

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

26
12.12.2008 00:32:01
как сложить после раскладывания? Я не могу найти ярлык! tnx
Moj 4.12.2013 16:04:14
Пробовал этот файл синтаксиса, и он работал достаточно хорошо для выделения. Но это ничего не дало для холодного фолда, когда я использую «zM», ничего не происходит, когда я использую «za» в классе, я получаю E490 (не найдено Fold). Что не так?
Dani Gehtdichnixan 28.04.2014 13:52:34
+1. С первого раза сворачивание кода (класса, метода) Python прекрасно работает для меня. Используйте ответы Уолтера ( stackoverflow.com/a/360634/605356 ), чтобы отобразить пробел на карте, чтобы сложить команды, но это решение работает не так хорошо (для меня), как это. Спасибо @Tomas за ссылку.
Johnny Utahh 4.05.2015 00:00:25
@DaniGehtdichnixan, возможно, вам нужно: AnsiEsc - посмотрите на это, и я думаю, что вы найдете решение
serup 29.12.2016 10:29:59

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

2
7.09.2011 02:17:38
Этот файл синтаксиса НЕ содержит информацию сворачивания. Таким образом, вы не можете использовать этот файл синтаксиса со свертыванием синтаксиса.
KFL 14.03.2012 20:50:19

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

http://github.com/skyl/vim-config-python-ide

5
8.12.2009 18:32:36

Для меня идеальным складыванием является сложение только блоков 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.

3
16.01.2014 09:31:31
Мне нравится это решение. Но это не совпадает с n classи es, defесли они стоят в начале строки. Поскольку я с трудом могу прочитать выражение, у меня возникли проблемы с его настройкой, чтобы соответствовать ^defи ^class. Это любопытно, потому что это \s*должно хорошо с этим справиться ..
iago-lito 26.11.2015 10:25:13

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

SimpylFold

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

10
26.11.2015 13:51:00
Это работает лучше всего. Я вообще перестал думать о свертывании кода, так как это никогда не вызывало головной боли.
iankit 15.12.2016 06:17:11
@iankit Я иногда хотел бы, чтобы это также сворачивалось if, forи whileблокирует, не так ли?
iago-lito 15.12.2016 10:00:07
хм, это может быть не очень полезно, я думаю. Если он сворачивает эти блоки, не очень понятно, что находится в сложенном состоянии. Однако с методами и другими именованными блоками имя говорит обо всем. Я могу отчасти догадаться, что делает сложенный блок, посмотрев на его имя.
iankit 15.12.2016 11:04:43
@iankit Я не знаю .. Я хотел бы попробовать. Почему не пытаешься ? ^ ^
iago-lito 15.12.2016 13:18:15

В вашем .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для отступления понемногу.

1
3.01.2020 03:46:37