補完候補が 1 つの際の noselect,noinsert の挙動 #984

Open
heavenshell opened this Issue Nov 23, 2016 · 11 comments

Projects

None yet

2 participants

@heavenshell
heavenshell commented Nov 23, 2016 edited

質問・報告の内容

set complteoptnoselect, noinsert の両方あるいはいずれかの時に候補が 1 つしかない場合に、補完候補が表示されません。

set completeopt=menu,noselect
inoremap <F5> <C-R>=ListMonths()<CR>

function! ListMonths()
  call complete(col('.'), ['January'])
  return ''
endfunction

i<F5> で何も表示されなくて、i<F5><C-n> で挿入されます。
noselect, noinsert が設定されない場合は、そのまま挿入されます。
<C-n> をタイプすると、候補が入るし、挙動的に正しいのかもしれませんが、直感的でないと思い、
補完時に候補が 2 つ以上の場合に、noselect, noinsert が有効になるようにしてみました。

https://gist.github.com/heavenshell/119fc8cf2d43a36da31957b367e4665e

Vimのバージョン

8.0.095

OSの種類/ディストリ/バージョン

(なるべく詳しく書いてください 記述例:)

  • macOS El Capitan
  • Linux Ubuntu 15 64bit

使用している or 関係していそうなプラグイン

特になし

その他

complete() 時の挙動は上記のパッチで改善されますが、オムニ補完時の修正箇所がよくわかりませんでした。
例えばファイル補完で、ファイルの候補が 1 つしかない場合は、何も挿入されず、-- ファイル名補完 (^F^N^P) 唯一の該当 と表示されるが、何も表示されません。
ちなみに本当に改善したいのオムニ補完の挙動です。

@h-east
Member
h-east commented Nov 23, 2016 edited

cotオプションのmenuとnoinsert,noselectのどちらの仕様を優先するかという話だと思います。

現状でも以下の設定で動作変わるんじゃないでしたっけ? (今は外出中で確認できない)

set cot-=menu
set cot+=menuone

@heavenshell
heavenshell commented Nov 23, 2016 edited

ウボァー orz
本当だ。menuone ならいけますね。

では menu の時は noselect, noinsert の時は何も出ない(ポップアップもされず、候補も挿入されない)というのが仕様なんでしょうか。
# まぁ noselect, noinsert とか書いてるから、そうなのかなぁ。

うっかり set completeopt=menu の時も救えたら…と思います。
「あるぇ、候補あるのに、何で何も出ない(<C-n> すれば良いことすらわからない)?」となったので。
menu 使うな、menuone 使えというのであれば、それはそれで目的が達成できるので、wontfix ですが…。

@h-east h-east added the kind/discuss label Nov 23, 2016
@h-east
Member
h-east commented Nov 23, 2016

補完時に候補が1つの場合の現在の挙動を纏めてみました。

'completeopt'の設定 popup表示 補完候補挿入 コマンドライン行後部の表示 備考
menu No Yes The only match
menu,noinsert No No The only match ^NでBack at original。再度^Nで補完候補挿入 && The only match
menu,noselect No No Back at original ^Nで補完候補挿入 && The only match
menu,noselect,noinsert No No Back at original ^Nで補完候補挿入 && The only match
menuone Yes Yes The only match
menuone,noinsert Yes No The only match ^NでBack at original。再度^Nで補完候補挿入 && The only match
menuone,noselect Yes No Back at original ^Nで補完候補挿入 && The only match
menuone,noselect,noinsert Yes No Back at original ^Nで補完候補挿入 && The only match

popup表示有無はmenuでは2つ以上で表示、menuoneは1つでも表示とhelpに明記されているのでこれは変更すべきではないと思っています。変更するとすれば補完候補挿入有無 or/and コマンドライン行後部の表示でしょうか。
うーん、補完候補挿入有無も今更挙動を変えると困る人出てくるかも。
ご意見募集中です。

@h-east
Member
h-east commented Nov 23, 2016 edited

現状の不親切な点

  • cot=menu,noinsertの場合はpopup表示されないがコマンドライン行にThe only matchと表示されるので候補が1つだと分かる。でも、^Nを2回押さないと補完候補が挿入されない。
  • cot=menu,noselectcot=menu,noselect,noinsertの場合はpopup表示されない、かつコマンドライン行の表示では候補が1つだと分からない。←なにが起きているのか把握しにくい。
  • cot=menuone,noinsertの場合はpopup表示される、かつコマンドライン行にThe only matchと表示されるので候補が1つだと分かる。でも、^Nを2回押さないと補完候補が挿入されない。(<Enter>を押せば補完候補が挿入される)
@heavenshell

調査ありがとうございます。

menuoneは1つでも表示とhelpに明記されているのでこれは変更すべきではないと思っています。

御意。

変更するとすれば補完候補挿入有無 or/and コマンドライン行後部の表示でしょうか。
うーん、補完候補挿入有無も今更挙動を変えると困る人出てくるかも。

complete() の時のみで、オムニ補完の挙動に寄せる方が良いかなーと思いました。
オムニ補完時はメッセージでますし。complete() の時が何も言わないので、不親切かなと。
なおかつ後方互換のことを考えてオプション生やすのが良さそうですね。

cot=menu,noselectやcot=menu,noselect,noinsertの場合はpopup表示されない、かつコマンドライン行の表示では候補が1つだと分からない。←なにが起きているのか把握しにくい。

complete() 時のこれが一番わかりづらいですね。

@h-east
Member
h-east commented Nov 23, 2016

あぁ、complete()の時はコマンドライン行の表示ないんですね。となるとpopupが表示されないかつ補完候補が挿入されないと何が起きているのかまったく分からないですね😅

@heavenshell

あぁ、complete()の時はコマンドライン行の表示ないんですね。

ですです。menuone なら問題ないんですけどね 😉
メッセージを出すより、補完候補が 1 つの時は completeopt-=noselect,noinsert と同じ挙動にした方が簡単だったので、上のパッチ作った次第です。

@h-east
Member
h-east commented Nov 27, 2016

補完候補が 1 つの時は completeopt-=noselect,noinsert と同じ挙動に

仕様提案としてはアリだと思います。(今のところ、この仕様で困るケースを思い付かない)

@h-east
Member
h-east commented Dec 11, 2016

ちょうど関連する話題が出たので、仕様変更を提案してみました。
https://groups.google.com/d/msg/vim_dev/9TfUA3y5xDs/QZakkUK3DgAJ

@heavenshell Gistのpatchへのリンクと名前を出しました。

@heavenshell

ありがとうございます!放置していてすみません。
テスト書こうと思ってたけど、手がつけられず 😅

@h-east
Member
h-east commented Dec 12, 2016

menuの挙動よりもnoinsert, noselectの挙動を優先させないと自動補完系プラギンの動作がおかしくなるそうです。とは言っても候補1つの時の挙動はかなり不親切なんですけどね。
menuoneは挙動変えてもええで」とか言ってるけどそれは無責任だと思うぞ。

@heavenshell 後は任せました🐈💨

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment