Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimでカーソル下の(不完全な)ファイルパスからファイルを開く(fzf)

$
0
0

不完全なファイルパスを素の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を利用しています。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>