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

fzf.vimでtagsを検索しながら色付きのpreviewを表示する

$
0
0

PHPでせめて定義元ぐらいは辿りたいんだけど、Language Serverが使えない、phpcdも使えない、けれど絶対Vim使うってときに、ctagsを使うことにした。他のプラグインとかで何とかなるかもしれないけど、何とかなるって情報が見つけられなかった。

仕方なくctagsでタグを作ってfzf.vimでpreviewを表示させながら選びたい。

どういうことか

こういうファイルがあって、test2()を辿りたい。

caller.php
<?phprequire_once'./functions.php';test2();
functions.php
<?phpfunctiontest1(){echo__FUNCTION__;}functiontest2(){echo__FUNCTION__;}functiontest3(){echo__FUNCTION__;}

どうするか

ひとまずctagsでtagsファイルを作っておく。

$ ls
caller.php  functions.php
$ ctags -R# 作る$ ls
caller.php  functions.php  tags # tagsができあがる$ cat tags # tagsの中身!_TAG_FILE_FORMAT   2   /extended format;--format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME  Exuberant Ctags //
!_TAG_PROGRAM_URL   http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.8 //
test1   functions.php   /^function test1()$/;"  f
test2   functions.php   /^function test2()$/;"  f
test3   functions.php   /^function test3()$/;"  f

設定

fzf.vimはpreviewを外部から受け取れる。今回はshellScriptを一つ作って、previewに渡す。

/path/to/ctags_preview.sh
#!/usr/bin/env zshNAME=$1FILE=$2#タブに囲まれた3つめの検索パターンの抽出#/^ any $/;" を ^ any $ に置換PATTERN=$(echo$3 | cut-f 3 | sed"s/^\///" | sed-E"s/\/;\".*$//" | sed"s/\"/\\\\\"/g")# 前5行、後5行を表示、-48でgrepしてるのは検索文字列に色をつけるためgrep-B 5 -A 42 --color=never "${PATTERN}"$FILE | grep-48--color=always $NAME

で、~/.vimrcに以下を書き込む。

~/.vimrcか他のconfig
command!-bang Tags
  \call fzf#vim#tags(expand('<cword>'),{  \'options': '+i  \--exact
  \--with-nth 1  \--reverse
  \--no-unicode
  \--preview "/path/to/ctags_preview.sh {1} {2} {}"  \                     '
  \})

nnoremap <silent><Leader>ft :<C-u>Tags<CR>

こうなる

caller.phpのtest2の上で、ftを押すと、下記のようなプレビューが表示される。(floating windowにしてある)

スクリーンショット 2020-04-09 1.10.38.png

まぁ……全然完全ではないんだけど……。


Viewing all articles
Browse latest Browse all 5657

Trending Articles



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