PythonコードにVimフォールディングを使用するための推奨される方法は何ですか


112

VimでPythonコードのコードフォールディングを有効にすることに興味があります。そうするための複数の方法に気づきました。

VimでPythonコードをフォールディングする好ましい方法はありますか?つまり、

  • 使用していて気に入っている特定のVimプラグインはありますか?
  • 手動で折りたたむか、コメントにマーカーを配置しますか?
  • VimでPythonのコード折りたたみを行うための他の推奨される方法はありますか?

回答:


117

個人的には、コードをマーカーで散らかすように自分を説得することはできません。私はインデント折りたたみを使用することにかなり慣れてきました(そして効率的です)。折りたたみの開閉とzRおよびzMコマンドへのスペースバーのマッピング(以下を参照)と共に、私は自宅にいます。Pythonに最適!

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

81
:foldmethod = indentを最初に設定します。私はこれだけをググって、あなたの答えに出くわしました、とてもいいです!:)
tmadsen

47
私の友人もset foldnestmax=2、この方法でクラスのメソッドを折りたたみましたが、内部ステートメントは折りたたんでいません。
デニルソンサマイア

9
2番目のマッピングがzfに対するこの回答に含まれている理由はわかりません。インデント折りたたみが使用されている場合は使用されません。ただし、手動で折りたたむ場合は、マッピングは完全に理にかなっています。しかし、zaは折り目をすばやく開閉する最良の方法のようです。折りたたみナビゲーション(zk、zj)の使用もお勧めします。
Derek Litz

vnoremapは手動マッピングに適しています。ftpluginに、Pythonのset foldmethod = indentを追加します。次に、.vimrcでfoldmethod = manualを設定します。これで、スペースバーマッピングを使用してPythonと非Pythonの両方で折りたたむことができます
Lionel

26

この構文ファイルはPythonで使用ます。折りたたみ方法を構文に設定し、すべてのクラスと関数を折りたたみます。


展開後に折りたたむ方法?ショートカットが見つかりません!tnx
Moj

この構文ファイルを試してみたところ、強調表示にはかなりうまくいきました。しかし、コールドフォールディングにはまったく何もしませんでした。「zM」を使用すると何も起こりません。クラスで「za」を使用すると、E490が表示されます(フォールドが見つかりません)。何が問題になっていますか?
ダニGehtdichnixan 2014

+1。最初は、Pythonコード(クラス、メソッド)の折りたたみがうまく機能します。ウォルター(stackoverflow.com/a/360634/605356)を使用して、スペースバーをマップして折りたたみコマンドを実行しますが、このソリューションは(私にとって)これほどうまく機能しません。参考に@Tomasに感謝します。
Johnny Utahh

@DaniGehtdichnixan、おそらく必要です:AnsiEsc-調べてみれば解決策が見つかると思います
serup

10

Pythonコードを折りたたむためのさらに別のプラグイン。かなりシンプルで、docstringを処理し、GitHubで:

シンフィルフォールド

楽しい!


これが最適です。コードの折りたたみは頭痛の種ではないので、私はコードの折りたたみについてはまったく考えなくなりました。
iankit 16

私は時々 、それはまた折るほしい@iankit ifforおよびwhileブロックは、あなたではないのですか?
iago-lito

うーん、あまり役に立たないかもしれません。彼がこれらのブロックを折りたたむと、折りたたまれた状態のコンテンツははっきりしません。ただし、メソッドやその他の名前付きブロックでは、名前からすべてがわかります。折り畳まれたブロックが何をしているのか、その名前を見て推測できます。
iankit 16

@iankitわからない..やってみたい。なぜしようと?^ ^
iago-lito

7

Pythonはインデントの折りたたみに適しています。独自のコードを書くのに少し適しています。マーカーを使用すると、ドキュメントを思い通りに切り詰めて、一種の目次として使用できます。他の人のコードを表示しているときに、これをvimrcに入れて2つを切り替えます。

#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>




3

私にとって理想的な折りたたみはclassdefブロックだけを折りたたむことです。インデント折りたたみは私の好みには多すぎます。エレガントな解決策の1つは、Tomasが言及したこのような構文システムを使用することだと思います。ただし、これは元の構文ファイルを置き換えるためのものであり、元の構文ファイルよりも古くなる可能性があります(つまり、そのスクリプトは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 and defs 'とは一致しません。私はほとんどの式を読み込むことはできませんので、私は、一致させるために、それを微調整しようとして困っています^def^class。以来けれどもこれは好奇心旺盛で\s*これをうまく対処しなければならない。..
イアーゴー-リト「残し考慮

2

Pythonソースには、vim構文プラグインとカスタムvimrcファイルが付属しています。vimpython FAQを確認してください


2
この構文ファイルには折りたたみ情報も含まれていません。したがって、この構文ファイルを構文フォールディングで使用することはできません。
KFL 2012年

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

私は.vimrc用に書いたこの小さなvimスクリプトが本当に好きです。これは、マッピングしalt+1、最初のPythonのインデントレベル(クラス定義や関数)を折るためにalt+2第二レベル(クラスメソッド)を折り畳み、およびalt+0展開]すべてのものに。これにより、1つのレベルのみが折りたたまれ、ネストされたサブレベルは折りたたまれません。を使用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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.