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


91

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

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

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

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

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

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

私はしばらくの間でした私はVIMに切り替えたい主な理由を再構築し、私は1つのエディタ環境を持つことができますので、私が知っていることがあるであろう任意のプラットフォーム間で簡単に作業。

そこにあるオプションは、どんなアイデアでも圧倒的に高く評価されています!


1
ファイルやバッファをナビゲートするための本当に満足のいく方法を見つけられませんでした。それは外部の援助をまったく使用しません。組み込みのものはかなり悪いです(つまり、その番号でバッファに変更しますか?一時的なバッファ番号を覚えているのは誰ですか...)
Svend

1
@svend:あなたは数だけでなく、名前でバッファを参照することができます-以下の私の答えを参照
デイブカービー

マップcaps-lockしましたctrlか?これは、とのほとんどのものになりctrl非常に良くし...あなたが好きなものを使用することができますgnome-tweakssetxkbmap -o ctrl:nocaps
ネイサンチャペル

回答:


93

:eタブ補完の適切な構成を考えると、昔ながらのサブディレクトリへのドリルダウンがそれほど面倒だとは思いません。

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

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

私のワークフローは次のようなものです。

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

    • 最も単純なシナリオ:タイプ:e f<tab>b<tab>b<tab><enter>

    • bこれらのディレクトリの1つで始まるファイルが複数ある場合は、キーボードでファイル間をジャンプするために、または別のファイルを実行する<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を開き、いくつかのウィンドウを設定し、それらの中でいくつかのファイルを開くのに数秒かかります。個人的には、サードパーティのファイル閲覧スクリプトが非常に役立つとは思っていません。


4
素晴らしい説明のための帽子の先端。あなたがすでに説明を理解しなければならないskillz ++のための指の揺れ。
ボーディン氏2014年

261

ファイルシステムを参照する簡単な方法は、次のコマンドです。

:Sex

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


15
そして助けから私は:Vexも素晴らしいことを知っています。
jrwren 2012年

18
そしてこれには69の賛成票があります。私にはそれを変える心がないと思います。
AlbeyAmakiir 2014

3
また:Vex、画面を水平方向ではなく垂直方向に分割したい場合
sreenivas 2015年

1
うわー、これらのどちらも知らなかった。私は:Vexもっと実用的だと思っていますが、:Sexちょうど私の一日を作りました。
ウィリアムロバートソン

2
記録のために、:Se同様に機能します(Ve, Teバリアントについても同じです)。奇妙にする必要はありません:)
towc19年

47

:Sex:Vex:Texそして:Exあなたから何か別のを使用したい場合は、システム上の元のためのすべての便利なコマンド(ploring)ファイルです:e

S/V/TSplit / Vertical / Tabの略)


7

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

  • オリジナルのファジーファインダープラグイン-IIRCにはRubyバインディングの問題はありません
  • プロジェクトプラグイン-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

5

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

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

:tabe(例えばので、「タブの編集」の略で、新しいものを開き:tabe、空のためまたは:tabe path/to/fileあなたと隣接するタブ間を移動することができ、新しいタブでファイルを開くための)gt/ gT、および他のタブ関連のナビゲーションコマンドの束もあります、などあなたはVimに期待するかもしれません(:help tabs

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

最後のヒント:「:sb <partial_buf_name>switchbuffer 」コマンド()を使用することがあります。これは、TMのファジー検出に似ていますが、すでに開いているバッファーに対してのみ機能します。一度に12個以上のファイルを開いている場合でも最適です。(注:set switchbuf=usetab:これをタブ間で機能させるには、vimrcで行う必要がありましたが、一度設定すると素晴らしいです。)


1
タブの私の理解ではそれが本当に、1はビデオのタブ上のブラムMolenaars独自のビュー「効果的なテキスト編集の7つの習慣」から(各タブにチェックを開いているバッファた方法よりレイアウト浮き袋のではないということです。
スヴェン

次に、このようなコマンドが機能することを理解したら、それらをキーにバインドできます。開いているバッファ(Firefox)間でコントロールタブを切り替えていますが、代わりにタブを切り替えることができます。
Jonathan Hartley

vim-titlecaseGT / GTマッピングとネジが、そこにある回避策は
naught1 0118

5

LustyExplorerはこれまでで最高だと思います。

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

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

バッファリストからファイルを開く場合、ディレクトリツリーをナビゲートする必要はありませんが、他の2つのモードでは残念ながら、ツリーをナビゲートする必要があります。良いことは、最初の文字から始める必要がないことです。

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

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

開きたいdir_b/file.html場合は、通常、次のように入力して見つけることができますb<Tab>h


私はこの素晴らしいアドオンにいくつかの拡張を行いました。svendtofte.com/wp-content/uploads/2009/08/…svendtofte.com/other/vim-stuff 基本 的に、最近使用したファイルの名前を入力するだけで、すでにロードされているかどうかは関係ありません。つまり、ファイルを初めて開くときにのみFSを参照する必要があります。
Svend

4

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


3

プラグインCommand-Tの代わりにプラグインctrlpをチェックしてください。これは「ネイティブ」のVimスクリプトであり、非常に高速で目立たないように実行しながら、Ruby(またはその他のサポート)を使用してVimをコンパイルする必要がないという点でこれよりも優れています。


2

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

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

ウィンドウを分割して新しいウィンドウでバッファを開きたい場合は、 :sb name

新しいタブでバッファを開きたい場合は、 :tab b name

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


1

私はこの関数をサブディレクトリ内のファイルを見つけるために使用しますが、私はそれを書きませんでした。それはvimwikiからです:

関数!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")) 
    l:num0の場合 
            エコー「番号ではありません」 
            戻る 
        endif 
        l:inputl:numの場合 
            エコー「範囲外」 
            戻る 
        endif 
        let l:line = matchstr( "\ n" .l:list、 "\ n" .l:input。 "\ t [^ \ n] *") 
    そうしないと 
      l:line = l:listとします 
    endif 
    let l:line = replace(l:line、 "^ [^ \ t] * \ t。/"、 ""、 "") 
    ":e" .l:lineを実行します 
エンドファンクション 

コマンド!-nargs = 1 Find:call Find( "")

私が気に入っているのは、ワイルドカード(*)がサポートされていることです。また、複数の試合でも適切に動作します。


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




0

これは私が自分の中に固執するかなり些細なこと.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からの特別なビルドオプションを必要としません(つまり、バニラプラグインです)。


サブディレクトリからロードできるようにしたいのですが、複数のファイルの問題は私にとって大きな問題になります。私は通常、サブディレクトリの束を持っているので、私はすべてを持っていることを、Djangoの開発者だmodels.pyviews.pyなど
ピート

0

ファイルを見つけるための私のワークフローは、wildmenu、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を使用してください:)

^D常にあなたにすべての試合を与えます。autocmdは常に現在のファイルのフォルダーに移動するため、操作が簡単です。あなたが入っていてfoo/bar.py、あなたがあなたに行きたいのfoo/baz.pyなら:e baz.py、あなたはそこにいるだけです。これはバッファでも機能します(:b foo^Dfooで始まるすべてのバッファを一覧表示します)


他のディレクトリにアクセスするのはどうですか?たとえば、Pythonビュー、HTMLテンプレート、JavaScriptファイルの間で作業することがよくあります。これらはすべて異なるサブディレクトリにありますか?TextMateでファイルの名前を入力し始めると、「プロジェクト」(別名cwd)内のすべての一致が表示されます。
ピート

いいえ、サブフォルダーに再帰しません。しかし、私は自分のワークフローをそれに適応させました。また、ファイルを開いたら、バッファの名前を指定するだけで問題ありません。開いているバッファを記憶するようにVimに指示することができます。そうすれば、通常、その機能はまったく必要ありません。
Armin Ronacher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.