0
0

OmniSharp-Vim と fzf を連携させる メンバーのリスト表示編

Posted at

以前、OmniSharp-Vim と fzf を連携させる という記事を書きました。
この記事を書いたときには OmniSharpFindUsages (使っている場所を調べるコマンド) の場合について書いたのですが、 OmniSharpFindMembers (開いたファイルのメンバー一覧を表示するコマンド)の場合について書きたいと思います。

きっかけ

VisualStudio だとメンバー一覧が表示できて良いなーと思っていました。
image.png
Omnisharp-Vim にもきっと同様の機能があるだろうと思って調べるとありました。

image.png

OmniSharpFindMembers というコマンドで実行できるようです。

OmniSharpFindMembers を使ってみる

実行してみました。Quickfix リストが表示されて開いているファイルのメンバー一覧が取れました。
image.png

Quickfix リストで選択を行うと定義場所へジャンプします。便利です。
ソースコードを見たところ - は private, + は public, & は internal | は protected を示しているようでした。

となると、この結果を fzf に渡して - で検索すれば private なメンバーだけを参照できそうです。

OmniSharpFindMembers の結果を fzf に渡す

つぎにOmniSharpFindMembers の結果を fzf に渡したいです。マニュアルを読むと let g:OmniSharp_selector_findmembers = 'fzf' を設定すれば良いことが分かりました。

image.png

設定すると自分の画面ではこうなりました。
画面右側は bat で定義場所を bat でプレビューできるように設定しているのですが、引数エラーでコケているようです。
image.png

前回の OmniSharp-Vim と fzf を連携させる で設定した OmniSharpFindUsages の画面と見比べてみます。

image.png

見比べてみると、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 のソースコードを修正します。

Monosnap omnisharp-vim_autoload_fzf_OmniSharp.vim .png

ソースコードの 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'
  \]
\}

設定後の画面です。ちゃんとプレビュー画面が見えています。
image.png

プライベートなメンバーに絞り込んだ様子です。- で絞り込んでいます。
image.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0