vim、vanilla Vimを使用してファイルをすばやく切り替える(プラグインなし)


103

プラグインを使用しないバニラVimに制限すると、エディターの能力が制限されることを理解していますが、さまざまなマシンを頻繁に切り替えるため、環境をどこにでも移動するのは非常に面倒です。バニラヴィムにとどまりたい。

私を阻んでいるのは、ファイルをすばやく切り替える機能です。I(少なくとも信じている)をよく理解していバッファウィンドウタブだけでなく、netrwの(VexExなど)。

しかし、のようなエディタで崇高なテキスト、私は入力することができますctrl- pとすぐに私は、ファイルにしています。

シェルにドロップダウンできることはわかっていますが、ファイル名だけでなく、Vim内のファイルをすばやく切り替えるための「隠された」秘密が他にあるかどうか疑問に思います。


2
これはあなたの質問に答えませんが、プラグインの使用を検討するように説得するかもしれません:dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

私は自分の設定をDropboxと個人的に同期しています。それは不器用ですが、多かれ少なかれそれについて考える必要なく機能します。私が使用していることがわかっているプラ​​グインの1つは、Command-T(github.com/wincent/Command-T)で問題なく機能します。Ctrl-Pが代わりになる可能性があります(vim.org/scripts/script.php?script_id=3736)。
FX

1
danielmiessler.com/study/vimを見たことがありますか?彼はvimrcと必要なすべてのプラグインをGithubに配置するという非常に賢い方法を持っています...どこに行ってもクローンを作成でき、Vimは好きなとおりです。ブリリアント
bobox 2014

6
@bobox、何万人もの人がそうしています。それについて特別なことは何もありません。
romainl 2014年

回答:


236

ST2のCtrl+に最も近いもの(「厳密」ではなく「最も近い」)Pは、呼び出されるプラグインです。準備をしてください... CtrlPCommand-TFuzzyFinderのような他の同様のプラグインがあります。

私はCtrlPを使用していますが、気に入っていますが、「プラグイン不要」にするというあなたの決定を心からサポートします。これは最も簡単な方法ではありませんが、長期的には見返りが得られます。


ファイルを開く

ファイルを開く最も基本的な方法は:e /path/to/filenameです。ありがたいことに、タブ補完とワイルドカードを使用できます。クラシック*と特別な**「」は「任意のサブディレクトリ」を表します。

これらすべてを組み合わせると、次のことができます。

:e **/*foo<Tab>

foo作業ディレクトリの下の名前に含まれるすべてのファイルから選択するか、または:

:e **/*foo/*bar<Tab>

その名前にbar含まfooれるすべてのサブディレクトリの下にあるすべてのファイルから、作業ディレクトリの下の任意の場所から選択します。

もちろん、これは:tabe[dit]:sp[lit]および:vs[plit]でも機能します。

ただし、これらのコマンドは1つのファイルに制限されています。:next複数のファイルを開くために使用します。

:next **/*.js

を見てください:help arglist


バッファ間のジャンプ

:b[uffer] 基本的なバッファ切り替えコマンドです。

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

これらのコマンドとその親族の多くはカウントを受け入れることに注意してください。

この:lsコマンドは、ロードされたバッファーのリストを表示します。ただし、これは少し「特別」です。バッファを作成すると、バッファに番号が割り当てられるため、1 2 5バッファを削除した場合のようなリストを作成できます。これは少し厄介なことです。そのため、その数でバッファに切り替えるのは少し面倒です。名前の一部、:b foo<Tab>または循環による切り替えを優先し:bn :bpます。

とにかく、ここに読み込まれたすべてのバッファをリストし、プロンプトを表示して、バッファの数を入力してを押すのを待つクールなマッピングがあります<enter>

nnoremap gb :ls<CR>:b<Space>

このマッピングを使用すると、別のバッファへの切り替えは次のように簡単です。

gb
(quickly scanning the list)
3<CR>

または:

gb
(quickly scanning the list)
foo<tab><CR>

アイデアは、バイルイのVimインフォグラフィックのコレクションから取られたこの画像から来ています:

飛行vsサイクリング

Vimには、現在のバッファと前のバッファの間をジャンプする<C-^>(または<C-6>一部のキーボードでは)通常モードと同等の機能もあります:b#。2つのバッファを頻繁に切り替える場合に使用します。

バッファに関するすべてを読んでください:help buffers


宣言に行く

ファイル内では、gdまたはを使用できますgD

プロジェクト内では、Vimの「タグ」機能はあなたの友人ですが、ctagsやcscopeなどの外部コードインデクサーが必要になります。最も基本的なコマンドがある:tag foo<C-]>、メソッド名にカーソルを持ちます。どちらのツールも同様のVimに統合されています:参照:help tags:help ctags:help cscope

それだけの価値があるので、私はタグナビゲーションを広範囲に使用してプロジェクト内を移動し(CtrlP :CtrlPTag:CtrlPBufTagコマンドを使用しますが、ほとんどの場合、組み込みのコマンドも使用します)、私のお気に入りの「汎用」バッファー切り替え方法は名前です。


設定をデプロイする

Vimのユーザーの多くは、それが作るバージョン管理下に自分の設定を入れて非常に迅速かつ簡単に新しいマシンに独自の設定をインストールします。それについて考えてください。


編集する

数ヶ月前、私は古いVimがインストールされたリモートマシンで作業する必要がありました。適切なVimをインストールして自分の愛する設定を複製することもできましたが、今回は「のこぎりを研ぐ」ために軽く移動することにしました。私はすぐにミニマリスト.vimrcを構築し、半分忘れられていたネイティブ機能のいくつかを再訪しました。そのギグの後、私はCtrlPはそれほど必要ではないと判断し、それを取り除きました。ネイティブ機能とカスタムマッピングはそれほどセクシーではありませんが、依存関係がなくても仕事をこなすことができます。


ファイルのジャグリング

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findあなたがset path正しくなるとすぐに本当に素晴らしいコマンドです。私の設定で,ffoo<Tab>foo、現在のディレクトリに含まれるすべてのファイルが再帰的に検索されます。迅速で直感的で軽量です。もちろん、私は:editや友人と同じ補完機能とワイルドカードを利用できます。

プロセスをさらに速くするために、次のマッピングにより、プロジェクトの一部全体をスキップして、現在のファイルのディレクトリの下で再帰的にファイルを見つけることができます。

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

警告!このpathオプションは非常に強力です。上記の値-—は.,**機能しますが、使用する言語には標準ライブラリがありません。適切な値はに完全に依存し、あなたのニーズ。


バッファとのジャグリング

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

上記のマッピングでは、空のプロンプトで「ワイルドメニュー」に使用可能なバッファがリストされているため、メニューをナビゲートするか<Tab>、数文字を入力<Tab>してリストを絞り込むことができます。上記のファイルマッピングの場合と同様に、プロセスは迅速で、ほとんど摩擦がありません。

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

それらのマッピングはそれ自体が物語っています。


タグを使ったジャグリング

nnoremap <leader>j :tjump /

このマッピングでは、全文検索ではなく正規表現検索を使用し,jba<Tab>ているため、タグを見つけることができますfoobarbaz()

はい、あいまい一致は中毒性がありますが、それがなくても生産性を高めることができます。そして、わずかな費用で。


もっと編集する

いくつかの追加のヒント/トリック…


ワイルドメニューオプション

で有効になっている「ワイルドメニュー」は、set wildmenuファイル/バッファのナビゲーションを容易にします。その動作は、調査する価値のある多くのオプションによって管理されています。

wildmode 「ワイルドメニュー」の動作をVimに指示します。

set wildmode=list:full

wildignore すべての残骸を取り除きます:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecaseを検索しfooて見つけることができますFoo

set wildignorecase

ファイルマーク

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

私は最近、この宝石を他の誰かに見つけました~/.vimrc。バッファを離れると、カーソルの正確な位置にファイルマークが作成されるため、どこにいても、'J編集した最新のJavaScriptバッファにジャンプします。驚くばかり。


2
+1。私はとの組み合わせで「任意のサブディレクトリ」について知りませんでした:eが、私はそれを使うことになる多くのことを今から。Ctrl-Pを使用した作業には驚かされ、そこから多くのことを学ぶことができますが、うまくいきませんでした。私はそれが少し緩慢であり、そのため作業中に私の思考の列を妨害していることがわかりました(私のシステム、私の設定、私自身かもしれませんが、私は調査しませんでした)
Lieven Keersmaekers 2013

2
**本当に素晴らしいです。
romainl 2013

1
gb地図にもう一度賛成票を入れたいです。もう一つはよく使います。私が試したすべてのバッファプラグイン(CtrlP、bufExplorer、...)は、これほど高速ではありません(確かに、より多くの機能を提供しますが、使い続けるには十分ではありません)
Lieven Keersmaekers 2013

2
@LievenKeersmaekersが、これは私からそれを得たところで、これは愚かな絵がどこから来るかです。バイルイ、ありがとう!
romainl 2013

4
これは、これまでで1つの最大の答えになるかもしれません。
craigp 2015

5

答えはあなたの好みや状況に大きく依存します。いくつかの例:

  • ほとんどが2つのファイル(Cヘッダーと実装ファイルなど)であれば、<C-^>非常に便利です。一般に、代替ファイルは重要な概念です。
  • 大きなエディタウィンドウを使用している場合、ウィンドウ:splitが原因で、バッファの検索の問題がウィンドウの検索から解放されます(すべてのバッファを開いた後)。を使用[N]<C-w><C-w>してすばやく切り替えることができます。
  • (いくつかの)バッファ番号を記憶できれば、:[N]b[uffer]and :[N]sb[uffer]コマンドは非常に便利です。:ls数字を教えてくれます。

プラグイン(または少なくともカスタムマッピング)は物事を大幅に改善することができ、vim.orgのこのトピックにはさまざまな種類があります。構成を配布するさまざまなメカニズム(Pathogen + GitHub、Dropboxなど)があります。または、Vimに同梱されているnetrwプラグインを使用してサーバーファイルをリモートで編集することもできます。


4
ctags、cscope、gtags、id、およびフレンドについて言及する価値があるでしょう。大文字を使用すると非常に役立ちます。mAマークを格納するために使用しA、戻るには「A」を使用します。私が見つけnetrwの私がについて学んだ後にはるかに便利な:Rex探検家にいる戻ります。:b:e、および他の多くは次のようにワイルドカードを取ることができます*し、**:bコマンドは、ファイル名の一部を取ることができます。それを<c-d>ワイルドメニューと組み合わせると、かなり遠くまで行くことができます。プラグインに関しては、rails固有のナビゲーションコマンドを提供するrail.vimのようなドメイン固有のもの、またはCtrlPのようなより一般的なものを使用できます。
Peter Rincker 2013

@PeterRincker:マークについて言及した場合は+1。マークで回答を作成することをお勧めします。
Helbreder 2013

<C-^>と[N] <Cw> <Cw>はどういう意味ですか?
Josh Desmond

5

時には、ファイルのリストを順番にたどっていくことも便利です(たとえば、vim *.php一度に複数のファイルを開くような操作をした場合)。次に、あなたが使用することができます:n[ext](同様に:prev[ious]:fir[st]、および:la[st](他の回答で提案されたものに加えて)ナビゲーションのため)。


4

プラグインなしでコマンドラインでワイルドカードタブ補完を実行できます。例えば

:e src/**/foo*<tab>

./srcの下のディレクトリツリーにある「foo」で始まるすべてのファイルを循環して、編集するファイルを選択できます。

すでにファイルを編集していて、それがまだバッファ内にある場合は、次のようにしてファイルに切り替えることができます。

:b foo<tab>

これは、パスに「foo」が含まれるすべてのバッファを循環します。必要な動作を得るには、wildmodeおよびwildmenuオプションを設定する必要がある場合があります。私が持っています

wildmode=longest:full
wildmenu

私の.vimrcで。


2

ファイル名を使用していて、そのファイルにジャンプしたい場合は、gfが実行します。プラグインではないctagsの使用も好きです。タグを作成するだけで、コードベースを簡単に移動できます。


1

vimエディターでファイルを切り替える場合は、以下の回答を参照してください

最初にEscキーを押して編集モードを終了します。

次に、:e現在のファイルパスを確認するために入力します。

別のファイルに移動:e /path-of-file.txt/する場合は、これを使用して入力し、切り替えることができます。

前のファイルに移動する場合は、単に:e#前のファイルパスに切り替えるスイッチを入力します。


0

Vimでも同じ問題がありました。

最後に、ファイルの切り替えと同じくらい平凡なタスクをプラグインに依存する必要があります。

次の行を追加しました .vimrc

set path+=**
set wildmenu

そしてバム!:find any/filename/in/any/folder/vimがプロジェクトのルートディレクトリにある限り、これでできます。タブ補完が機能します。ワイルドカードは機能します!

ファイルが既に開かれ、バックグラウンドに大量のバッファがある場合(:lsすべてのバッファを表示するために使用できます)、実行:b any/file <TAB>するとすべてのバッファがあいまい検索され、必要なファイルにジャンプします。一意でない場合は、タブを使用して選択できるタブのワイルドメニュー(したがって、.vimrcの2行目)があります。

私の答えは、この素晴らしいビデオ
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489から来
ています。さらにトリックがあり、それを視聴することをお勧めします。

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