プロジェクト全体のすべてのファイル内をインタラクティブに検索するようにVIMを構成する方法はありますか?
することで、インタラクティブ、私は、各キーストロークを更新する意味します。
Emacs counsel-git-grepのようなものは、サンプルデモを参照してください。
ctrl-p
対話形式で、ファイルの内容を検索する方法がありますか?名前に基づいてファイルをインタラクティブに検索するためだけに使用したことがあります。
プロジェクト全体のすべてのファイル内をインタラクティブに検索するようにVIMを構成する方法はありますか?
することで、インタラクティブ、私は、各キーストロークを更新する意味します。
Emacs counsel-git-grepのようなものは、サンプルデモを参照してください。
ctrl-p
対話形式で、ファイルの内容を検索する方法がありますか?名前に基づいてファイルをインタラクティブに検索するためだけに使用したことがあります。
回答:
これがあなたが探しているものかどうかはわかりませんが、おそらくfzfとfzf.vimを試すことができます。
プラグインマネージャとしてvim-plugを使用する場合、それらをインストールするために必要な作業は、次の行をに追加するだけvimrc
です:
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
...行間のどこか:
call plug#begin('~/.vim/plugged')
そして:
call plug#end()
次にを実行し:PlugInstall
ます。
によって提供されるさまざまなコマンドとマッピングfzf.vim
(その唯一の目的は、fzf
定義済みのソースを介したファジー検索を要求するマッピングとコマンドをインストールすることであると思われる)には、コマンドがあり:Ag
ます。
使用するには、シェルコマンドagをインストールする必要があります。Debianベースのディストリビューションでは、次のコマンドで実行できます。
apt-get install silversearcher-ag
githubのプロジェクトでは、MacOSにインストールする方法を説明しています。
brew install the_silver_searcher
:Ag
は、のラッパー$ ag
であり、現在のディレクトリ(を入力したときに表示されるディレクトリ)のファイル内のパターンをファジー検索できます:pwd
。一致は、キーストロークごとに更新されます。
あなたはできる:
C-n
とC-p
Tab
/S-Tab
M-a
たりM-d
1つまたは複数の一致を選択した場合、Enterキーを押すと、クイックフィックスリストに入力されます。そこから次のような、デフォルトのVimのコマンド/マッピングでそれらをナビゲートできるようになります:cnext
と:cprevious
。
によってインストールされたすべてのコマンドにプレフィックスを追加し、fzf.vim
既存のコマンドを上書きしないようにする場合は、これをに追加できますvimrc
。
let g:fzf_command_prefix = 'your_prefix'
私Fzf
は接頭辞として使用します。だから私はタイプしませんでした:Ag
が:FzfAg
。
のgit grep
代わりに使用する場合はag
、次のように、独自のカスタムラッパーをインストールできるようです:GGrep
。
command! -bang -nargs=* GGrep
\ call fzf#vim#grep('git grep --line-number '.shellescape(<q-args>), 0, <bang>0)
で説明されてい:h fzf-vim-customization
ます。
また、場合はfzf
tmuxの中にペインを開き、あなたはそれではなく、画面全体を取る好むだろう、あなたはすべてのコマンドに強打を追加することができます(:Ag!
、:GGrep!
、...)。
最後のコメントで述べたように、デフォルトでfzf
はシェルの構成を変更します。たとえば、を使用する場合bash
、次の行がに追加されます~/.bashrc
:
[ -f ~/.fzf.bash ] && source ~/.fzf.bash
これにより、ファイルが取得されます~/.fzf.bash
。後者にはいくつかのコードが含まれています。
# Setup fzf
# ---------
if [[ ! "$PATH" == */home/user/.fzf/bin* ]]; then
export PATH="$PATH:/home/user/.fzf/bin"
fi
# Auto-completion
# ---------------
[[ $- == *i* ]] && source "/home/user/.fzf/shell/completion.bash" 2> /dev/null
# Key bindings
# ------------
source "/home/user/.fzf/shell/key-bindings.bash"
このコードは、環境変数にパスを追加します$PATH
:/home/user/.fzf/bin
; これは、fzf
プログラムを含むフォルダーです。
また、他の2つのファイルも取得します。
/home/user/.fzf/shell/completion.bash
/home/user/.fzf/shell/key-bindings.bash
最初のものは補完機能を定義しているようですが、2番目のものはキーバインディングをインストールします。
残念ながら、キーバインディングはデフォルトのreadline
機能をオーバーライドする場合があります。
たとえばfzf
、関数fzf-file-widget
をにバインドしますC-t
。このキーは通常、transpose-chars
関数を実行するためにreadlineによって使用されます。
これが望ましくない場合、可能な解決策の1つは、構成のソースを取得した~/.bashrc
後fzf
に、内のキーバインディングを復元することです。たとえばC-t
、カーソルの周りの2文字を転置し、fzf-file-widget
別のキーにバインドするという古い動作を維持したいC-x C-t
場合は、次の行の最後にこれらの行を追加できます~/.bashrc
。
bind -x '"\C-x\C-t": fzf-file-widget'
bind '"\C-t": transpose-chars'
同じことがzsh
シェルにも当てはまりますが、キーバインディングをインストールする構文は少し異なります。
bindkey '^X^T' fzf-file-widget
bindkey '^T' transpose-chars
使用していたシェルキーバインディングの1つがによってオーバーライドされたfzf
場合、それを復元したいが、実行された関数の正確な名前がわからない場合は、次のことを試すことができます。
まず、の内部で~/.bashrc
、fzf
構成のソースとなる行を一時的にコメント化します。次に、ターミナルを再度開き、bind -P
コマンドの出力を確認します。出力はVimバッファーで読み取ることができます。
bind -P | vim -R -
よくわかりませんが、ほとんどまたはすべてのreadline
キーバインディングが表示されるはずです。C-t
キーにバインドされたreadline関数の名前をVimバッファーで探して\\C-t
いる場合は、を検索します。M-c
(meta / altキー)にバインドされているものを探している場合、検索します\\ec
(\e
エスケープキーを表しM-c
、と同じキーコードを生成するようですescape + c
)。
コマンドのzsh
出力を見ると、同じことができますbindkey
。ただし、今回^[
は、meta / alt修飾子キーを^
表し、単一のキャレット()文字はコントロールキーを表します。
現在、fzf
名前にキーワードを含む関数を実行する4つのキーバインディングが見つかりました。彼らは、キーシーケンスを使用C-i
(と同じTab
)、 C-r
、C-t
とM-c
。これらは、次の機能にバインドされています。
C-i fzf-completion
C-r fzf-history-widget
C-t fzf-file-widget
M-c fzf-cd-widget
私のシステムでは、元々readline
(bash
コマンドラインの編集に使用されるライブラリ)がこれらのキーを次の機能にバインドしていました。
C-i complete
C-r reverse-search-history
C-t transpose-chars
M-c capitalize-word
そしてzle
(で使用される行エディタzsh
)、それらを次のようにバインドします:
C-i expand-or-complete
C-r history-incremental-search-backward
C-t transpose-chars
M-c capitalize-word
ag
ニーズがインストールされていることを、別のプラグイン/ツール?
ag
も必要であることを忘れていました。答えを更新しました。
ctrl-p
はあなたが探しているものだと思うか、同様のプラグインです。それunite.vim
もできるはずですが、私の意見ではかなり重くてバグを作成するプラグインなので、お勧めしません。