不完全なファイルパスを素のVimで開くには
業務でPHPプロジェクトを触っているのですが、require_onceなどでimportされるファイルパスの一部に定数などが使われていて、文字列だけだと不完全な場合がよくあります。
定数を含むrequire_onceの例
require_onceHOGEHOGE_PATH."/path/to/file.php"
こういったパスってgf
コマンドだけでは開けないので、開くなら
vimコマンドライン
:e **/path/to/file.php
と、ここまでコマンドラインモードで打ってtabでパスを展開させたり、別にパスを展開しなくてもEnterでこのまま実行させても最初にマッチするファイルを開いてくれたりします。
この時の最短の手順は、
- ノーマルモードでファイルパスの上にカーソルを移動する
- :でコマンドモードに入って 『e **/』と入力
- Ctrl+r Ctrl+f でノーマルモードの時のカーソル下のファイルパスを入力
になるのかなと思います。
また、大きいプロジェクトだとvimが無数のファイルから検索する時間が発生してしまいます。
今時のIDEとかならもっとスマートに開けそうですし、これだと手数が多くて待ち時間が発生するのがちょっと嫌ですね。
fzfを使ったファイルを開く方法
fzfの紹介は自分の他の記事でもしているのでここでは書きません。
→ fzfを活用してTerminalの作業効率を高める
プラグインはインストールされている前提です。
https://github.com/junegunn/fzf.vim
.vimrc
" vim-plugを使っている場合
Plug 'junegunn/fzf',{'dir':'~/.fzf','do':'./install --all'}
Plug 'junegunn/fzf.vim'
.vimrcに下記を記述します。
解説なども兼ねてコメント多めです。
.vimrc
" <leader> fで実行できるように定義" 自分は<leader>はスペースをアサインしています↓" let mapleader = "\<Space>"
nnoremap <leader>f:FZFOpenFile<CR>" :FZFOpenFileでcall FZFOpenFileFunc()を実行します。" <leader> fで直接call FZFOpenFileFunc()を実行できるようにしてもよいと思います
command! FZFOpenFile call FZFOpenFileFunc()function! FZFOpenFileFunc()" カーソル下のファイルパスを取得lets:file_path= expand("<cfile>")" 空行などで実行されたりした場合の考慮ifs:file_path==''
echo '[Error]<cfile>return empty string.return0endif" fzf実行" .DS_Store はmacの不要なファイルcall fzf#run({ \'source':'find . -type d -name .git -prune -o ! -name .DS_Store', \'sink':'e', \'options':'-x +s --query='. shellescape(s:file_path), \'down':'40%'})endfunction
開きたいファイルパスにカーソルが乗っかっている状態で、<leader> f(→自分はSpace f)、または:FZFOpenFile
で実行します。
これで実行時にfzfに予めファイルパスが入った状態で開くことができます。
fzfを利用することによって複数ファイルが引っかかった場合でも選択が容易です。
sourceをgit ls-files にしてもおもしろかったかもしれません。
個人的には困らないのと速度的に十分なのでfindを利用しています。