1. ホーム
  2. vim

[解決済み] vim, vanilla Vim (プラグインなし)でファイル間を高速に切り替える

2022-09-17 13:37:54

質問

プラグインを使わず、Vinilla Vim に限定することでエディタが制限されることは理解していますが、頻繁にマシンを切り替えるため、環境をあちこちに移動させるのが面倒な場合があります。私はただ vanilla Vim にとどまりたいのです。

私をためらわせるものは、ファイル間をすばやく切り替える能力です。 私は (少なくとも信じて) バッファ , ウィンドウ , タブ と同様、netrw ( Vex , Ex など)。

しかし、以下のようなエディタでは サブライムテキスト のようなエディタでは、私はただ ctrl - p で、即座にこのファイルにたどり着きます。

シェルにドロップダウンできることは知っていますが、Vim でファイル名だけでなく、ファイル間をすばやく切り替えるための他の "hidden" 秘密はないのでしょうか。

どのように解決するのですか?

ST2に最も近い("close"、"exact"ではない)等価な Ctrl + P というプラグインで、用意するのは CtrlP . のような他の類似のプラグインがあります。 コマンド-T または ファジーファインダー .

私は CtrlP を使っていて、とても気に入っていますが、プラグインを使わないというあなたの決断を心から支持します。

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>

このアイデアは、この画像から来ています Bairui の Vim インフォグラフィック集から引用しました。 :

Vim はまた <C-^> (または <C-6> に相当します。 :b# -で、現在のバッファと前のバッファの間にジャンプする。2 つのバッファの間を頻繁に行き来する場合に使用します。

バッファについて詳しくは :help buffers .


宣言へ移動

ファイル内では gd または gD .

プロジェクト内では、Vim の "tags" 機能が便利ですが、ctags や cscope のような外部のコードインデクサが必要です。最も基本的なコマンドは :tag foo<C-]> でメソッド名にカーソルを合わせます。どちらのツールも Vim にうまく統合されています。 :help tags , :help ctags:help cscope .

参考までに、私はプロジェクト内の移動にタグナビゲーションを多用しています(CtrlPの :CtrlPTag:CtrlPBufTag コマンドを使用し、私のお気に入りのバッファ切り替え方法は名前によるものです。


コンフィグをデプロイする

多くの Vim ユーザは設定をバージョン管理下に置いています。 非常に を迅速かつ簡単にインストールできます。考えてみてください。


EDIT

数ヶ月前、私は古い Vim を使ってリモート マシンで仕事をする必要がありました。適切な Vim をインストールし、自分の愛すべき設定をクローンすることもできましたが、今回は、鋸を研ぐために身軽な旅をすることにしました。私はすぐに最小限の .vimrc を素早く構築し、半ば忘れかけていたいくつかのネイティブ機能を再訪しました。ネイティブ機能とカスタム マッピングはそれほどセクシーではありませんが、多くの依存関係なしに仕事をこなすことができます。


ファイルとのジャグリング

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>

上記のマッピングは空のプロンプトで "wildmenu" の利用可能なバッファをリストアップし、メニューを <Tab> でメニューをナビゲートするか、いくつかの文字をタイプして <Tab> をもう一度入力すると、リストが絞り込まれます。上記のファイル マッピングと同様に、このプロセスは迅速で、ほとんど摩擦がありません。

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

これらのマッピングはそれ自身を語っています。


タグとの連携

nnoremap <leader>j :tjump /

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

確かにファジーマッチは病みつきになりますが、それをしなくても同じように生産性を上げることができます。しかも、ほんのわずかなコストで。


その他の編集

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


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

で有効になる "wildmenu"。 set wildmenu で有効になり、ファイル/バッファのナビゲーションがより簡単になります。その動作は、調査する価値のある多くのオプションによって制御されます。

wildmode は Vim に "wildmenu" をどのように動作させたいかを指示します。

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 バッファにジャンプします。素晴らしい。