vim-operator-surround icon indicating copy to clipboard operation
vim-operator-surround copied to clipboard

<Plug>(operator-surround-append) 時に textobj を入力する前に括弧を指定したい

Open osyo-manga opened this issue 11 years ago • 48 comments

lingr で言っていたやつですが、こちらにも要望を出しておきます。 現在、<Plug>(operator-surround-append)

  • operator → textobj →任意の括弧の入力

という順番で処理されるのですが、これを

  • operator →任意の括弧の入力→textobj

という風に textobj の前に括弧の入力を行いたいです。 これは例えば次のように利用することを想定しています。

" <Plug>(operator-surround-append-before) は先に括弧の入力を受け付けるマッピング
" <Plug>(operator-surround-append){textobj}( と同等
" e.g. s(iw は単語の範囲を () で囲む
map s( <Plug>(operator-surround-append-before)(

osyo-manga avatar Feb 19 '14 17:02 osyo-manga

operator#user#define() の第3引数でいけそうなので,少し試してみます. ただ,変更箇所が多いので実装には時間がかかると思います.

rhysd avatar Feb 19 '14 22:02 rhysd

了解です。お願いしますいぬ。 (ただ、結構欲しい機能だったりするので先に自分で簡単なラッパーを書いてしまうかも…。

osyo-manga avatar Feb 20 '14 01:02 osyo-manga

簡単なラッパーを書いてみました。 https://github.com/osyo-manga/vim-operator-surround-before これは次のように利用できます。

nmap sa <Plug>(operator-surround-append-before-getchar)
nmap s( <Plug>(operator-surround-append-before-getchar)(
nmap s{ <Plug>(operator-surround-append-before-getchar){
nmap s" <Plug>(operator-surround-append-before-getchar)"

ご参考までに。

osyo-manga avatar Feb 20 '14 12:02 osyo-manga

現在実装中ですので,もうしばらくそちらのラッパーでお待ち下さい.

rhysd avatar Feb 20 '14 13:02 rhysd

!?

osyo-manga avatar Feb 20 '14 13:02 osyo-manga

すみません,ブラウザがコメント後遷移せず,反応が無いと勘違いしてクリック連打してしまいました…

rhysd avatar Feb 20 '14 13:02 rhysd

連打力

osyo-manga avatar Feb 20 '14 13:02 osyo-manga

inu

rhysd avatar Feb 20 '14 13:02 rhysd

osyo-manga avatar Feb 20 '14 13:02 osyo-manga

うかさま!

rhysd avatar Feb 20 '14 13:02 rhysd

うかさま!

osyo-manga avatar Feb 20 '14 13:02 osyo-manga

試しに実装してみようとしましたが,operator#user#define() の第3引数で getchar() を呼んでもマッピングの後の入力を getchar() が食ってしまうのでうまくいかないですね.イヌゥ…

rhysd avatar Feb 20 '14 15:02 rhysd

かなり汚い実装になりそうですが,別マッピング定義する方向で実装します.

rhysd avatar Feb 20 '14 15:02 rhysd

ちなみにわたしの実装は先に getchar() を処理してから <Plug>(operator-surround-append) を呼び出していますね。

osyo-manga avatar Feb 20 '14 15:02 osyo-manga

s/<Plug>(operator-surround-append)/operator#surround#append/

osyo-manga avatar Feb 20 '14 15:02 osyo-manga

<Plug>(operator-surround-append) に対して,<Plug>(operator-surround-append-2) 的なマッピング用意します.

rhysd avatar Feb 20 '14 16:02 rhysd

はい,そんな感じでいきます.

rhysd avatar Feb 20 '14 16:02 rhysd

<Plug>(operator-surround-append-2)

!?

osyo-manga avatar Feb 20 '14 16:02 osyo-manga

input_in_advance ブランチにとりあえず実装してみました.<Plug>(operator-surround-* を上書きしてしまえば良いと気づいたので,余計なマッピングは定義しなくて済みました.operator#surround#input_block_in_advance1 にすると有効になります. テスト書いて問題が無さそうなら master にマージ予定です.

rhysd avatar Feb 21 '14 15:02 rhysd

ありがとうございます。試してみます。

input_in_advance ブランチにとりあえず実装してみました.<Plug>(operator-surround-* を上書きしてしまえば良いと気づいたので,余計なマッピングは定義しなくて済みました.

個人的には <Plug>(operator-surround-append-before) みたいなマッピングを増やしてもらっても構わなかったですね(オプションで切り替えるよりは任意のマッピングを選択して使用する方が柔軟性が高いので。

osyo-manga avatar Feb 21 '14 15:02 osyo-manga

こちらでも動作することを確認しました。ありがとうございます。 あと <Plug>(operator-surround-repace) にも対応する事って可能でしょうか。 こちらも先に括弧が入力する事ができれば便利そうです。

個人的には <Plug>(operator-surround-append-before) みたいなマッピングを増やしてもらっても構わなかったですね(オプションで切り替えるよりは任意のマッピングを選択して使用する方が柔軟性が高いので。

これなのですがやはりオプションで切り替えるよりはマッピングを増やしてしまったほうが柔軟性が高いんじゃないかと思いました。 例えばマッピングごとに対応しておけば『<Plug>(operator-surround-append) は先に入力をしたいけど <Plug>(operator-surround-repace) は後から括弧を入力したい。』みたいな事が可能だと思います。

osyo-manga avatar Feb 22 '14 15:02 osyo-manga

確認ありがとうございます.

あと <Plug>(operator-surround-repace) にも対応する事って可能でしょうか。

あれ,appendreplace の両方に対応していたつもりだったんですが,できてませんでしたか… 確認してみます.報告ありがとうございます!

例えばマッピングごとに対応しておけば『<Plug>(operator-surround-append) は先に入力をしたいけど <Plug>(operator-surround-repace) は後から括弧を入力したい。』みたいな事が可能だと思います。

確かに可能ですが,それをやりたいユースケースが思いつかないです.おしょーさんがそうしたいという要望があるのであれば,実装します.

rhysd avatar Feb 23 '14 08:02 rhysd

あれ,append と replace の両方に対応していたつもりだったんですが,できてませんでしたか… 確認してみます.報告ありがとうございます!

あにゃ、こちらでもう1回試してみましたがやはり <Plug>(operator-surround-replace) の方は後から括弧の入力になりますね。

確かに可能ですが,それをやりたいユースケースが思いつかないです.おしょーさんがそうしたいという要望があるのであれば,実装します.

んー『どうしてもほしい』という要望があるわけではないですが、『そういう要望があった場合に柔軟に対応できるよねー』という感じですかね ~~どちらかというとオプションで切り替える設計が気持ち悪いというのが強い~~

osyo-manga avatar Feb 23 '14 10:02 osyo-manga

あれ、今気づいたんですが<Plug>(operator-surround-append)operator#surround#input_block_in_advance の値に関係なく『先にブロックを入力する処理』になりますね。

osyo-manga avatar Feb 23 '14 10:02 osyo-manga

あとはなしは変わるんですが、以下のように『連続して CursorHold を呼び出すハック』を行っている場合、『ブロックの入力待ち』がupdatetimeの間隔でスキップされてしまうようです。

augroup test
    autocmd!
    autocmd CursorHold * call feedkeys(mode() =~# '[iR]' ? "\<C-g>\<ESC>" : "g\<ESC>", 'n')
augroup END

わたしの vim-operator-surround-before だとこの問題は起きないようですね。

osyo-manga avatar Feb 23 '14 10:02 osyo-manga

あーあと『ブロックの入力』を <C-c> でキャンセルした場合、以下の様なエラーメッセージが出力されました。

function operator#surround#wrap の処理中にエラーが検出されました:
行    1:
E706: 変数の型が一致しません: s:input

osyo-manga avatar Feb 23 '14 10:02 osyo-manga

反応遅くてすみません…なかなかまとまった時間取れないので,返信だけですが

あれ、今気づいたんですが<Plug>(operator-surround-append) は operator#surround#input_block_in_advance の値に関係なく『先にブロックを入力する処理』になりますね。

こちらでは,初回のみ挙動がおかしくなりますね…どうしてだろう.

あとはなしは変わるんですが、以下のように『連続して CursorHold を呼び出すハック』を行っている場合、『ブロックの入力待ち』がupdatetimeの間隔でスキップされてしまうようです。

あー,多分 feedkeys() の入力を getchar() が食っちゃうからですね.おしょーさんのほうのは wrapper コマンドにも feedkeys() を使っているから大丈夫なんだと思います.ちょっと対応してみます.

あーあと『ブロックの入力』を <C-c> でキャンセルした場合、以下の様なエラーメッセージが出力されました。

こちらでも再現しました.多分すぐに修正できます.

コメントありがとうございます.ちょっと引越し前で時間が取れないので,気長にお待ちください…

rhysd avatar Feb 25 '14 14:02 rhysd

あとはなしは変わるんですが、以下のように『連続して CursorHold を呼び出すハック』を行っている場合、『ブロックの入力待ち』がupdatetimeの間隔でスキップされてしまうようです。

これについて feedkeys() 使ってみましたが,<SID> マッピングの入力に使われる特殊文字がうまく入らないですね…

rhysd avatar Feb 25 '14 15:02 rhysd

コメントありがとうございます.ちょっと引越し前で時間が取れないので,気長にお待ちください…

りょーかいです。 新しい犬小屋づくりがんばってください!

osyo-manga avatar Feb 25 '14 22:02 osyo-manga

いくつか試してみて

あれ、今気づいたんですが<Plug>(operator-surround-append) は operator#surround#input_block_in_advance の値に関係なく『先にブロックを入力する処理』になりますね。

あーあと『ブロックの入力』を <C-c> でキャンセルした場合、以下の様なエラーメッセージが出力されました。

が修正されていることを確認しました。ありがとうございます。 あと <C-c> でキャンセルを行った場合でも textobj の入力待ちが発生するのですがこれは意図的なのでしょうか。 キャンセルしてしまっているのでもうこれも抜けてしまってもよいような気がします。

osyo-manga avatar Feb 25 '14 23:02 osyo-manga