以前、OmniSharp-Vim と fzf を連携させる という記事を書きました。
この記事を書いたときには OmniSharpFindUsages
(使っている場所を調べるコマンド) の場合について書いたのですが、 OmniSharpFindMembers
(開いたファイルのメンバー一覧を表示するコマンド)の場合について書きたいと思います。
きっかけ
VisualStudio だとメンバー一覧が表示できて良いなーと思っていました。
Omnisharp-Vim にもきっと同様の機能があるだろうと思って調べるとありました。
OmniSharpFindMembers
というコマンドで実行できるようです。
OmniSharpFindMembers を使ってみる
実行してみました。Quickfix リストが表示されて開いているファイルのメンバー一覧が取れました。
Quickfix リストで選択を行うと定義場所へジャンプします。便利です。
ソースコードを見たところ -
は private, +
は public, &
は internal |
は protected を示しているようでした。
となると、この結果を fzf に渡して -
で検索すれば private なメンバーだけを参照できそうです。
OmniSharpFindMembers の結果を fzf に渡す
つぎにOmniSharpFindMembers
の結果を fzf に渡したいです。マニュアルを読むと let g:OmniSharp_selector_findmembers = 'fzf'
を設定すれば良いことが分かりました。
設定すると自分の画面ではこうなりました。
画面右側は bat で定義場所を bat でプレビューできるように設定しているのですが、引数エラーでコケているようです。
前回の OmniSharp-Vim と fzf を連携させる で設定した OmniSharpFindUsages の画面と見比べてみます。
見比べてみると、fzf に渡されるパスの部分が違うことに気づきました。
OmniSharpFindUsages
のときは Neovim を起動した場所からの相対パスになっていました。
OmniSharpFindMembers
のときはフルパスになっていました。
OmniSharpFindUsages のとき : ClassAnalyzer\Program.cs: 49 col 31 if (!analyzer.HasClass(targetClassName))
OmniSharpFindMembers のとき: C:\Users\sasab\works\ClassAnalyzer\src\ClassAnalyzer\CSharpCodeAnalyzer.cs: 9 col 11 namesp..
OmniSharp-Vim と fzf を連携させる では下記のように fzf へ値を渡していました。
let g:OmniSharp_fzf_options = {
\'options': [
\'--delimiter', ':| col ',
\'--preview', 'bat --color=always {1} --highlight-line {2}',
\'--preview-window', '+{2}+3/2'
\]
\}
この設定の場合、区切り文字の :
か col
で区切られた1番目の要素が bat の引数(開きたいファイルのパス)で指定されることになります。
なので、C:
で始まるフルパスが渡されると 1番目の要素は C
になってしまい、うまくファイルを開けていなかったようです。
解決策(無理やり)
とりあえず、使えればいいやの精神で無理やり解決することにしました。
fzf のオプションは OmniSharp_fzf_options
で指定しています。
このオプションの指定を OmniSharpFindMembers
のときは別の変数を参照するように、 OmniSharp-Vim のソースコードを修正します。
ソースコードの 108行目を修正しました。
OmniSharpFindMembers
のときは `OmniSharp_find_members_fzf_options' という値からオプション設定を読み込むことにします。
" let fzf_options = copy(get(g:, 'OmniSharp_fzf_options', { 'down': '40%' }))
let fzf_options = copy(get(g:, 'OmniSharp_find_members_fzf_options', { 'down': '40%' }))
続いて init.vim 側を設定します。
bat に渡す引数を変えています。
また、OmniSharpFindMembers
のときは、プレビュー画面は上側にあるほうが見やすかったのでプレビュー画面の出現する位置を up
で指定しています。
let g:OmniSharp_selector_ui = 'fzf'
let g:OmniSharp_selector_findusages = 'fzf'
let g:OmniSharp_selector_findmembers = 'fzf'
let g:OmniSharp_fzf_options = {
\'options': [
\'--delimiter', ':| col ',
\'--preview', 'bat --color=always {1} --highlight-line {2}',
\'--preview-window', '+{2}+3/2'
\]
\}
let g:OmniSharp_find_members_fzf_options = {
\'options': [
\'--delimiter', ':| col ',
\'--preview', 'bat --color=always {2} --highlight-line {3}',
\'--preview-window', 'up,+{3}+3/2'
\]
\}
プライベートなメンバーに絞り込んだ様子です。-
で絞り込んでいます。
おかげ様で使いやすくなりました!