24

http://www.vim.org/scripts/script.php?script_id=1984

次のコマンドで FuzzyFinder を起動できます。

     Command           Mode ~
    |:FufBuffer|     - Buffer mode (|fuf-buffer-mode|)
    |:FufFile|       - File mode (|fuf-file-mode|)
    |:FufDir|        - Directory mode (|fuf-dir-mode|)
    |:FufMruFile|    - MRU-File mode (|fuf-mrufile-mode|)
    |:FufMruCmd|     - MRU-Command mode (|fuf-mrucmd-mode|)
    |:FufBookmark|   - Bookmark mode (|fuf-bookmark-mode|)
    |:FufTag|        - Tag mode (|fuf-tag-mode|)
    |:FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|)
    |:FufJumpList|   - Jump-List mode (|fuf-jumplist-mode|)
    |:FufChangeList| - Change-List mode (|fuf-changelist-mode|)
    |:FufQuickfix|   - Quickfix mode (|fuf-quickfix-mode|)
    |:FufLine|       - Line mode (|fuf-line-mode|)
    |:FufHelp|       - Help mode (|fuf-help-mode|)

それで、私は最近 FuzzyFinder について知りました。これをかなり長い間使用している人のために、これらのコマンドを実際にどのように組み合わせて使用​​するか、作成するマッピング、これを使用するときに知っておくべき落とし穴を示してもらえますか?

4

6 に答える 6

13

FuzzyFinder 自体は、私にはまったく役に立ちません。Mac での TextMate の Cmd+T オプションと同様に、FuzzyFinder-TextMate およびすべてのファイルとサブディレクトリを走査してファイルを検索する Ruby ライブラリと組み合わせて使用​​します。ここで実際の動作を見ることができます。

残念ながら、元の作成者がスクリプトの保守を停止したため、機能させるには多少の努力が必要です。ただし、定期的に github に更新を投稿する人がまだいます。fuzzyfinder_textmate.vimとの 2 つのスクリプトが必要ですfuzzy_file_finder.rb

最新バージョンは、Vim FuzzyFinder 2.22.3 との組み合わせで問題なく動作します。Vim は、Ruby をサポートするようにコンパイルする必要があります。そうしないと、動作しません。原作者のブログには、適切な使用方法に関する詳細情報が含まれています。または、Vim のセットアップを見て、どのように使用できるかを確認してください。セットアップは 2 つのキーマッピング,sを定義し,e、ファイルをファジー検索して、それぞれ新しいウィンドウまたは現在のウィンドウで開きます。

function IdeFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<CR>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<C-j>'
  exe "FuzzyFinderTextMate"
endfunction

function IdeSplitFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<C-j>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<CR>'
  exe "FuzzyFinderTextMate"
endfunction

let mapleader = ","
map <silent> <leader>e :call IdeFindTextMate()<CR>
map <silent> <leader>s :call IdeSplitFindTextMate()<CR>

アップデート:

現在、FuzzyFinder の代わりに優れたCommand-T プラグインを使用しています。理由については、このスーパーユーザーの回答をご覧ください。

于 2009-12-13T17:13:12.067 に答える
10

パーティーに少し遅れましたが、FuzzyFinder の最新バージョンに新しいコマンドがあることを付け加え:FufCoverageFileたいと思います: は、まさにあなたが望むことを行います。

>CoverageFile>appcontr
  20: app/controllers/application_controller.rb
  22: app/views/layouts/application.html.erb
于 2011-09-18T19:54:53.017 に答える
7

Kris の回答に加えて、次のように .vimrc ファイルですぐに '**/' をマップすることをお勧めします。

map ,f :FufFile **/<CR>

したがって、次のように入力するだけです。

,fTest 

すべてのサブディレクトリで Test のすべての一致を検索するには!

HTH

于 2012-02-08T21:46:22.920 に答える
6

:FufFile を ,b にマップして使用し、最初に **/ と入力し、その後に探している文字列の最初の数文字を入力します。

これにより、文字列を含むすべての一致するファイルのリストが提供されます。

例えば

,b
**/doc
    13: app/models/document.rb
    75: test/fixtures/documents.yml
    82: test/unit/document_test.rb
于 2011-04-01T22:33:33.563 に答える
5

最初に、最新のあいまい検索スクリプトをインストールします。それで...

設定

.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

于 2013-06-24T13:43:15.043 に答える
4

これが私が使用するマッピングです(私は今では本当に慣れていますが、それらは私のものではありません):

let g:fuf_modesDisable = []
let g:fuf_mrufile_maxItem = 1000
let g:fuf_mrucmd_maxItem = 400
let g:fuf_mrufile_exclude = '\v\~$|\.(bak|sw[po])$|^(\/\/|\\\\|\/mnt\/)'
nnoremap <silent> <C-n>      :FufBuffer<CR>
nnoremap <silent> <C-p>      :FufFileWithCurrentBufferDir<CR>
nnoremap <silent> <C-f><C-p> :FufFileWithFullCwd<CR>
nnoremap <silent> <C-f>p     :FufFile<CR>
nnoremap <silent> <C-f><C-d> :FufDirWithCurrentBufferDir<CR>
nnoremap <silent> <C-f>d     :FufDirWithFullCwd<CR>
nnoremap <silent> <C-f>D     :FufDir<CR>
nnoremap <silent> <C-j>      :FufMruFile<CR>
nnoremap <silent> <C-k>      :FufMruCmd<CR>
nnoremap <silent> <C-b>      :FufBookmarkDir<CR>
nnoremap <silent> <C-f><C-t> :FufTag<CR>
nnoremap <silent> <C-f>t     :FufTag!<CR>
noremap  <silent> g]         :FufTagWithCursorWord!<CR>
nnoremap <silent> <C-f><C-f> :FufTaggedFile<CR>
nnoremap <silent> <C-f><C-j> :FufJumpList<CR>
nnoremap <silent> <C-f><C-g> :FufChangeList<CR>
nnoremap <silent> <C-f><C-q> :FufQuickfix<CR>
nnoremap <silent> <C-f><C-l> :FufLine<CR>
nnoremap <silent> <C-f><C-h> :FufHelp<CR>
nnoremap <silent> <C-f><C-b> :FufAddBookmark<CR>
vnoremap <silent> <C-f><C-b> :FufAddBookmarkAsSelectedText<CR>
nnoremap <silent> <C-f><C-e> :FufEditInfo<CR>
nnoremap <silent> <C-f><C-r> :FufRenewCache<CR>

私は主に : for last open files to change buffers (そして、すべての buxexplorer プラグインを削除しました) p を使用して、ファイル/ディレクトリを参照します

于 2011-09-19T07:32:50.260 に答える