Який рекомендований спосіб використання складання 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 = відступ. Я гугла саме за це і натрапила на вашу відповідь, дуже приємно! :)
tmadsen

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

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

Vnoremap хороший для ручного картографування. У свій ftplugin додайте set foldmethod = відступ для Python. Потім у своєму .vimrc встановіть foldmethod = керівництво. Тепер ви можете складати як Python, так і не-Python, за допомогою карти пробілів
Lionel

26

Я використовую цей файл синтаксису для Python. Він встановлює метод складання в синтаксис і складе всі класи та функції, але нічого іншого.


як скласти після розгортання? Я не можу знайти ярлик! tnx
Мій

Спробував цей синтаксичний файл, і він досить добре працював для виділення. Але це не зробило абсолютно нічого для холодного складання, коли я використовую 'zM', нічого не відбувається, коли я використовую 'za' у класі, я отримую E490 (Не Fold знайдено). Що йде не так?
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
На жаль, цей плагін використовує більше процесорного часу, ніж я хотів би (навіть з версією), оскільки мені подобається тримати свій vim якнайшвидший. Будь-які інші пропозиції?
Пол Д. Еден

11
Ця відповідь справді потребує опису.
шістдесят футів


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 fold classes і defs, якщо вони стоять на початку рядка. Оскільки я навряд чи можу прочитати вираз, я відчуваю проблеми, намагаючись підправити його, щоб відповідати ^defі ^class. Це цікаво, хоча з цим \s*слід добре впоратися ..
iago-lito 'розглядаючи можливість виїзду

2

Джерело Python постачається із плагіном синтаксису vim разом із спеціальним файлом vimrc. Перевірте поширені питання 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, тому сміливо вносите пропозиції щодо функції :)

" 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
Щоб використовувати клавіші alt на Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Майк Банністер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.