以前、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'
\]
\}
プライベートなメンバーに絞り込んだ様子です。- で絞り込んでいます。

おかげ様で使いやすくなりました!




