Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

挿入モード時に <C-r>= し、さらにその中で <C-o> するときの挙動がおかしい #1380

Open
cohama opened this issue Sep 18, 2021 · 6 comments

Comments

@cohama
Copy link

cohama commented Sep 18, 2021

不具合の内容

挿入モード時に、<C-r>= をし、さらにその中で <C-o> で挿入ノーマルモードになると、通常1コマンドで挿入モードに戻るはずがずっとノーマルモードのままになります。
また、<C-r>= のなかで "\<C-o>a" なので挿入モードに入り直すと、挿入モードがネストしたような状態になります。(挿入モードから <Esc>で抜けてももう一度挿入モードに勝手に入ってしまう。)

再現手順

  1. vim -u NONE -N で起動
  2. 適当にテスト用の文字列を入力
  3. 挿入モードに入り、<C-r>="\<C-o>hhh"<CR> と入力
  4. 通常、<C-o>h の時点で挿入モードに戻り、hh と入力されるはずが残りの hh も含めてノーマルモードのコマンドとして実行され結果としてカーソルが左に3つ移動する

Vimのバージョン

Vim 7.4
Neovim 0.5 でもこの問題が確認できました。Neovim フォーク前からあるかもしれないです。

( :version で確認できます)

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

Ubuntu 16.04

@h-east
Copy link
Member

h-east commented Sep 22, 2021

Ubuntu 16.04 でVimバージョン2種(8.2.3452, 7.4.1689)とターミナル2種(PuTTY 0.76, GNOME端末 3.18.3)の組み合わせで試しましたが再現しませんでした。
<C-o>を入力しても^Oが入力されるだけでモード変更は起きていないように見えます。

@mattn
Copy link
Member

mattn commented Sep 22, 2021

同じく。 (Windows10 Vim 8.2.3440)

@iranoan
Copy link

iranoan commented Sep 22, 2021

h-east さん、mattn さんに意図通り伝わっていないと思います
<C-r>="\<C-o>hhh"<CR>
の内最初の <C-r> は Ctrl を押しながらの r のタイプを、最後の は Enter キーにタイプを意図しているでしょう
ただ真ん中の ="\<C-o>hhh" について、cohama さんは <> で挟まれている部分も含めて、そのまま文字列としての入力を意図していると思います

この理解のもと、私が試した範囲では、「再現手順」部分は再現しました
ただこれが不具合なのか仕様なのかは解りません
gg や zz など複数キーによるマップのために、hhh全体で一纏めてとして扱うほうが素直な実装の気もします

また

また、<C-r>= のなかで "\<C-o>a" なので挿入モードに入り直すと、挿入モードがネストしたような状態になります。(挿入モードから <Esc>で抜けてももう一度挿入モードに勝手に入ってしまう。)

は再現しませんでした
ヘルプに有る通り

CTRL-O コマンドではノーマルモードに移動できる。その最中に挿入モードに再突入す
るコマンドを使ってもそれはモードが入れ子になるわけではない

通りの動きのようです

試したのは、次の環境で GVim と Gnome terminal, tilda, mlterm 上の Vim です

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 21.04
Release: 21.04
Codename: hirsute
$ vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Feb 15 2021 12:29:39)

@thinca
Copy link
Member

thinca commented Sep 22, 2021

再現しました。

case 1

test.vim

call setline(1, 'abcde')
normal! $
call feedkeys("i\<C-r>=\"\\<C-o>hhh\"\<CR>", '')
  1. vim -u NONE -i NONE -N -S test.vim を実行

Expected: abchhde (カーソルは h と d の間)
Actual: abcde (カーソルは a と b の間)

case 2

test.vim

call setline(1, 'abcde')
normal! $
call feedkeys("i\<C-r>=\"\\<C-o>aaa\"\<CR>\<Esc>", '')
  1. vim -u NONE -i NONE -N -S test.vim を実行

Expected: abcdeaa (カーソルは末尾、ノーマルモード)
Actual: abcdeaa (カーソルは a と a の間、挿入モード)

環境

Arch Linux
Vim v8.2.3345

@mattn
Copy link
Member

mattn commented Sep 22, 2021

内容把握。normal.c の invoke_edit がそれですが、stuff_empty を見ている様ですね。つまり rx の様に後続があるかないかでモード保持をやってる様です。どのコマンドかは見てないですね。つまり最初の h の時点で残りの hh がある事から、これは一連のコマンドだと認識している様に見えます。

追記

つまりこの処理ではネストした物を実行できる様にはなってなさそう。

@cohama
Copy link
Author

cohama commented Sep 24, 2021

う、分かりづらい説明で申し訳ありません。。。懺悔
thinca さん補足ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants