最初に、最新のあいまい検索スクリプトをインストールします。それで...
設定
.vimrc の設定を微調整します:
" Truth be told, I don't remember what these do, but I must have
" found them necessary back when I installed fuzzyfinder years ago
let s:slash = '[/\\]'
let s:startname = '(^|'.s:slash.')'
let s:endname = '($|'.s:slash.')'
" directories and extensions to ignore when listing files
" these contain a lot of Python-isms, yours will probably vary
let s:extension = '\.bak|\.dll|\.exe|\.o|\.pyc|\.pyo|\.swp|\.swo'
let s:dirname = 'build|deploy|dist|vms|\.bzr|\.git|\.hg|\.svn|.+\.egg-info'
let g:fuf_file_exclude = '\v'.'('.s:startname.'('.s:dirname.')'.s:endname.')|(('.s:extension.')$)'
let g:fuf_dir_exclude = '\v'.s:startname.'('.s:dirname.')'.s:endname
" limit number of displayed matches
" (makes response instant even on huge source trees)
let g:fuf_enumeratingLimit = 60
そして、それをアクティブにするためのショートカット キーをいくつか定義します。
nnoremap <Leader>f :FufFile **/<cr>
nnoremap <Leader>b :FufBuffer<cr>
nnoremap <Leader>t :FufTag<cr>
Vim を再起動して .vimrc 構成を再読み込みします。
ファイル/バッファを検索
<leader>f を押すと、現在のディレクトリとサブディレクトリ内のファイルのリストが表示されます。入力を開始すると、入力内容に (あいまいに) 一致するものだけがリストに表示されます。カーソルキーを使用して一致を選択し、Enter を押してそのファイルを開きます。非常に大きな新しいプロジェクトでこれを初めてアクティブにする場合、ファイル名をキャッシュするのに数秒かかる場合があります。
同様に、開いているバッファがいくつかある場合は、<leader>b を押して、開いているバッファのリストから選択します。
タグを探す
何よりも優れているのは、タグの一致です (つまり、関数、クラス、メソッドなどに移動します)。ただし、最初にタグファイルを生成する必要があります。
ファイルのタグ付けに慣れていない場合、これを手動で行うのは面倒に思えるかもしれません。多くのツールがタグファイルを使用することに注意してください。たとえば、Vim 自体がタグファイルを読み取って「定義に移動」を有効にします。この回答の最後にあるリンクを参照してください。
最新の ctags ( http://ctags.sourceforge.net/ ) をインストールし、それが PATH にあることを確認して、コマンド ラインから呼び出すことができるようにします。最近のバージョンは、Python などの言語向けに大幅に改善されています。次に、プロジェクトで簡単に再実行できるように .vimrc でキーストロークを定義し、同時に fuzzyfinder のキャッシュを吹き飛ばします。
noremap <f12> :silent !ctags -R --languages=python .<cr>:FufRenewCache<cr>
または Windows の場合:
noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>
( /min は、非常に大きなプロジェクトのインデックス作成中に Vim がロックアップしないように、コマンドをバックグラウンドで実行するための Windows 固有の方法です)
vim を再起動し、f12 を押すと、現在のディレクトリとサブディレクトリ内のすべてのファイルがスキャンされ、すべての定義済み関数、クラスなどのインデックスが作成されます。ctags は多くのプログラミング言語を解析します。出力は「tags」というファイルに送られます。タグファイルにプロジェクトのすべてが含まれるように、これをプロジェクトルートで実行するのが理にかなっています (Vim の :pwd と :cd を使用して、それがどこにあるかを確認します)。
<leader>t を押すと、プロジェクト内のすべてのクラス、関数、メソッドなどのリストが表示されます。上記のように、入力を開始すると、入力内容に一致するものだけがリストに表示されます。カーソルを使用してエンターすると、Vim はそのタグが定義されているファイル/行に移動します。
落とし穴
タグがプロジェクトで複数回定義されている場合 (関数と同じ名前のクラスなど)、fuzzyfinder はメニューを提供するので、ジャンプ先を選択できます。デフォルトでは、ctags が生成する Python ファイルのタグ定義が多すぎるため、これは少し面倒です。クラス、メソッド、および関数の定義だけでなく、ソース ファイル内でシンボルが定義されているすべての場所をリストします。これには、変数の作成と、シンボルが別の場所からインポートされる場所が含まれます。これは、1 つのファイルで定義され、2 番目のファイルにインポートされたシンボルには 2 つの定義場所があることを意味します。つまり、単にクラス定義に直接ジャンプするのではなく、常にメニューが表示されます。~/.ctags に ctags オプション ファイルを作成することで、これを修正できます。
--python-kinds=-i
--exclude=build
--exclude=dist
ソース コードを変更すると、タグ ファイルが古くなります。新しいクラス/関数/メソッド/などを作成した場合、それらにジャンプするには、上記のように ctags を再実行する必要があります。ただし、これが問題になることはめったにありません。
<leader>b が動作する前に 1 秒間一時停止することがわかりましたが、これは面倒でした。その理由は、私の BClose プラグインによって定義された <leader>bd に対して定義された別のマッピングがあり、Vim は、どのキー マッピングを呼び出すかを決定する前に、後続の d が押されたかどうかを確認するのを待っていたためです。私はそれを決して使用しないので、.vimrc でこれを使用して無効にしました:
autocmd VimEnter * nunmap <Leader>bd
ところで、プロジェクトのタグファイルを生成しているので、キーストロークを有効にして、テキスト カーソルの下にあるシンボルの「定義に移動」することも簡単です。それについての私のブログ投稿を参照してください: https://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows