web-dev-qa-db-ja.com

Vimファイルナビゲーション

過去数年間、TextMateを使用した後、vimを学ぶために一生懸命努力しています。

ファイル内のナビゲーションの一部をメモリにコミットし始めましたが、複数のファイル間を移動するのに苦労しています。

私のワークフローでは、少数のファイルをかなり定期的に切り替えています(分割ペインウィンドウが小さくなりすぎるほどのファイル)。

私は現在NERDTreeを使用していますが、ディレクトリへのドリルダウンは面倒であり、常に使用しています CTRL+Wh/CTRL+Wl 前後にホップします。

簡単に切り替えることができるタブの方がうまくいくと思いますが、別のワークフローを使用する必要があるかもしれません。

「ファイルへ移動...」ショートカットのようなものも欲しい CMD+T TextMateで。見つけました fuzzy_file_Finder ですが、vimをRubyバインディングでビルドする必要があります。これは、私が取り組んだネイティブインストールの場合ではありません。

私はcouldがvimに切り替えたい主な理由を再構築しますが、どのプラットフォームでも簡単に動作することがわかっているエディタ環境を1つ持つことができます。

そこにある選択肢は圧倒的で、どんなアイデアも大歓迎です!

77
Pete

単純な古い:eを介してサブディレクトリにドリルダウンするのは、タブ補完のための適切な構成を考えると面倒です。

'wildmenu'オプションを調べて、Vimがコマンドラインの上にあるモードラインで補完(ファイル名)のリストを表示するようにします。 'wildmode'オプションを変更して、Vimが行うタブ補完の種類をさらに設定できます。

個人的には:set wildmode=fullを使用しています。

私のワークフローは次のとおりです。

  1. :cdをプロジェクトのトップレベルディレクトリに移動します。
  2. ファイルfoo/bar/bazを開くには:

    • 最も単純なシナリオ::e f<tab>b<tab>b<tab><enter>と入力します。

    • それらのディレクトリの1つにbで始まるファイルが複数ある場合は、キーボードで<left>または<right>または別の<tab>を実行する必要があります。それら(または、明確にするためにさらにいくつかの文字を入力します)。

    • 最悪のシナリオでは、名前を共有するファイルとディレクトリがあり、ディレクトリにドリルダウンする必要があります。この場合、ディレクトリ名をタブ補完し、*<tab>と入力してドリルダウンします。

  3. 2つまたは3つのウィンドウを開き、必要に応じてそれらすべてでファイルを開きます。
  4. ファイルがバッファで開かれたら、バッファを殺さないでください。新しいファイルを開くときは、バックグラウンドで開いたままにします。同じウィンドウに新しいファイルを:eだけ。
  5. 次に、:b <tab>を使用して、バックグラウンドですでに開いているバッファーを順に切り替えます。 :b foo<tab>と入力すると、fooと一致する現在開いているファイルとのみ一致します。

また、これらのマッピングを使用して、新しいウィンドウを開いたり、それらの間をジャンプしたりするのを簡単にします。

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Vimを開いていくつかのウィンドウを設定し、その中のいくつかのファイルを開くのに数秒かかります。個人的には、サードパーティのファイル参照スクリプトが非常に有用であることを発見したことはありません。

83
Brian Carper

ファイルシステムを簡単に参照するには、次のコマンドを使用します。

:Sex

私はこれを構成していません:)

233
user286754

:Sex:Vex:Tex、および:Exはすべて、:eとは異なるものを使用する場合にシステム上のファイルをex(ploring)するのに便利なコマンドです。

S/V/TはSplit/Vertical/Tabの略です)

38
Emil Rehhnberg

まだ見つけていない場合は、チェックアウトすることをお勧めします。

  • 元の ファジーファインダー プラグイン-IIRCにはRubyバインディングの問題はありません
  • projectプラグイン-NERDTreeに類似
  • バッファエクスプローラプラグイン-オープンバッファのリストを表示します

また、.vimrcのキーショートカットを再マップして、面倒を軽減できることにも留意してください。分割ウィンドウを頻繁に使用します。次のことが、それらの処理をはるかに簡単にすることがわかりました。

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h
6
dlimeb

これまでのところ、 LustyExplorer が最適です。

名前の一部のみを入力して、ファイルを開くことができます。

現在のファイルのディレクトリ、現在のpwd、またはバッファリストからファイルを開くことができます。

バッファリストからファイルを開いた場合、ディレクトリツリー内を移動する必要はありませんが、残念ながら他の2つのモードでは、ツリー内を移動する必要があります。良いことは、最初のキャラクターから始める必要がないことです。

あなたが持っている場合:

dir_a/
    ...
dir_b/
    file.js
    file.html

dir_b/file.htmlを開きたい場合は、一般的にb<Tab>hと入力して見つけることができます

5
hasen

簡単に切り替えることができるタブの方がうまくいくと思いますが、別のワークフローを使用する必要があるかもしれません。

Vimのタブを知っていますか?そこでVimの独自のタブを参照していたのか、TextMateのピンを固定していたのかはわかりません。使用しているVimのバージョンは不明ですが、少なくとも7.0以降にタブがあり(最近見たところすべてにインストールされているようです)、それらは素晴らしいです。

:tabeは新しいタブを開きます(「タブ編集」の略です。たとえば、空の場合は:tabe、新しいタブでファイルを開く場合は:tabe path/to/file)、gtで隣接するタブ間を移動できます。/gT、およびその他のタブ関連のnavコマンドも多数あります。これは、Vimから予想されるとおりです(:help tabs

大規模なプロジェクトのワークフローには、必要なコンテキストの種類に応じて、それぞれが1〜3個のウィンドウを持つ多数のタブが含まれる傾向があります。 :vsで垂直に分割できるので、倍幅のターミナルウィンドウがある場合、これはさらに機能します。そのため、1つのタブで4つのファイルを一度に簡単に表示できます。

最後のヒント:私は時々、「スイッチバッファ」コマンド(:sb <partial_buf_name>)を使用します。これは、TMのファジー検索に似ていますが、すでに開いているバッファに対してのみ十分に機能します。一度に12個以上のファイルを開いている場合に最適です。 (N.B.これはタブ間で機能するために、vimrcで:set switchbuf=usetabする必要がありましたが、一度設定すると素晴らしいです。)

4
bitprophet

プラグインを確認してください ctrlp プラグインの代替として コマンド-T これは「ネイティブ」のVimスクリプトであり、VimをRuby(またはその他のサポート))でコンパイルする必要がないため、非常に高速で目立たないため、これよりも優れています。

3
nikola

:findコマンドは、どの回答にも言及されていません。私は通常Railsプロジェクトで作業します。このプロジェクトでは、ディレクトリ階層を深く掘り下げる必要があります。したがって、ファイルの場合はapplication.css、 にあります app/assets/stylesheets/入力する必要があるのは:find applicaを押してからtabを押してオートコンプリートし、enterを押して開きます。

2
Imran Ali

必要なファイルが既にバッファにロードされている場合(少数のファイルを定期的に切り替える場合がそうです)、:b[uffer]コマンドを使用してバッファにすばやく切り替えることができます。

:bは、パラメータとしてバッファ番号を使用するか、(より便利なことに)パス/ファイル名のpartに一致する文字列を使用できます。複数の一致がある場合は、Tabを使用してそれらを循環できます。

ウィンドウを分割して新しいウィンドウでバッファを開く場合は、:sb nameを使用します

新しいタブでバッファを開く場合は、:tab b nameを使用します

:lsコマンドを使用して、現在ロードされているバッファーのリストを表示することもできます。

2
Dave Kirby

macVimアプリケーションを知っていますか?これはVIM OS X向けに洗練されており、その機能の1つはタブ(CMD + Tで新しいタブを開く)のサポート、引き出しなどがあります...(これを読んでください:- http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/

それを試してみてください!

よろしくミカル

1
msgre

NerdTreeは、vimでのファイルナビゲーションに最適です。

以下のリンクは、nerdtreeの優れた紹介です。

http://www.catonmat.net/blog/vim-plugins-nerdtree-vim/

1
xinghua

この機能は、サブディレクトリ内のファイルを見つけるために使用しますが、作成しませんでした。 vim wiki からのものです:

関数! Find(name)
 let l:list = system( "find。-name '" .a:name。 "' | grep -v \"。svn/\ "| Perl -ne 'print \" $ 。\\ t $ _\"'")
 let l:num = strlen(substitute(l:list、 "[^\n]"、 ""、 "g"))
 if l:num 0 
 echo "Not a number" 
 return 
 endif 
 if l:inputl:num 
 echo "範囲外" 
 return 
 endif 
 let l:line = matchstr( "\ n" .l:list、 "\ n" .l:input。 "\ t [^\n] * ")
 else 
 let l:line = l:list 
 endif 
 let l:line = substitute(l:line、" ^ [^\t ] *\t。/ "、" "、" ")
":e ".l:line 
 endfunction 
 
コマンドを実行してください! -nargs = 1 Find:call Find( "")

私が気に入っていることの1つは、ワイルドカード(*)をサポートしていることです。また、複数の一致に対しても適切に動作します。

1

wildmenuの回答に加えて、 BufExplorer プラグインと次のマッピングを使用して、バッファーをすばやくジャンプします。

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

または、基本的に同じことを表示する:lsコマンドでバッファーエクスプローラーを置き換えることができます。

最後の1つはAlt-=をマップして、バッファーエクスプローラーを表示します。

通常、1つまたは2つのウィンドウしか持っていないので、Windowsはそれほど使用しません。

また、statuslineを変更して、バッファー番号%2nを含めることで、どのバッファーが編集されているかを常に把握できるようにしました。 :h statuslineをご覧ください

1
Ayman

.vimrc。任意のサブディレクトリからファイルをロードします。

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

だから私は言うことができます:

:Er Main.Java

そして、サブディレクトリを検索し、Main.Javaそしてそれをロードします。同じ名前の複数のファイルに対してはうまく動作しませんが、すばやく簡単です。

私が使用する他のツールは VTreeExplorer です。これは、ファイル/ディレクトリのツリーベースのウィンドウを提供し、VIMからの特別なビルドオプションを必要としませんVanillaプラグイン)。

0
Brian Agnew

ファイルを見つけるための私のワークフローは、ワイルドメニュー、autocwd、および:eです。

.vimrcの関連部分:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

そして、それを使用する方法:

:e myf^D

これにより、myfで始まる現在のディレクトリ内のすべてのファイルが提供されます。それらを<Tab>することもできます。 Return to openを使用:)

^Dは常にすべての一致を提供します。 autocmdは常に現在のファイルのフォルダーに移動するため、操作が簡単です。 foo/bar.pyにいて、foo/baz.pyに行きたい場合は、:e baz.pyを実行するだけで、そこにいます。これはバッファーでも機能します(:b foo^Dはfooで始まるすべてのバッファーをリストします)

0
Armin Ronacher