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

win_gotoid() で cmdwin から出れてしまう #1306

Closed
thinca opened this issue Sep 6, 2019 · 4 comments
Closed

win_gotoid() で cmdwin から出れてしまう #1306

thinca opened this issue Sep 6, 2019 · 4 comments

Comments

@thinca
Copy link
Member

thinca commented Sep 6, 2019

不具合の内容

q: 等で開くコマンドラインウィンドウからは、通常別のウィンドウに移ることができないようになっていますが、win_gotoid() を使うと移動できてしまい、その後の処理がおかしくなります。

現象・ログ

Vim は移動した後のウィンドウ(バッファ)をコマンドラインウィンドウであるかのように処理してしまいます。

  • 移動先のウィンドウから通常の手段(<C-w> 系コマンド)で移動しようとしても出られない
  • <CR> を押すと現在行をコマンドとして実行しようとする
  • コマンドラインウィンドウに成り代わったバッファが複数のウィンドウで開かれていると、この偽のコマンドラインウィンドウを閉じようとした時にクラッシュする

具体的に内部がどのようになっているかまでは確認していません。

再現手順

クラッシュする例:

$ vim --clean -S example.vim

example.vim

sp
call feedkeys("q::call win_gotoid(1000)\<CR>\<CR>")

上記のスクリプトでやっていること(直接手打ちでも再現します)

  1. ウィンドウを分割する (<C-w>s)
  2. コマンドラインウィンドウを開く (q:)
  3. コマンドラインウィンドウは使わず、コマンドライン上で win_gotoid() を呼び出し先程のウィンドウに移動する
  4. <CR> を押すと空行をコマンドとして実行し、コマンドラインウィンドウを閉じようとするが、内部の状態がおかしくなっておりクラッシュする

期待動作

従来通りであれば、win_gotoid() を使ってもコマンドラインウィンドウから出られないのが正しい気がします。

(しかしオフトピックになってしまいますが、この「コマンドラインウィンドウからは出られない」と言う制約はプラグインの作成において毎度頭を悩ませるイレギュラーな状況であり正直なところこの制約はなくせないものかと個人的には思っています…。)

Vimのバージョン

8.1.1991

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

  • Gentoo Linux (5.2.2-gentoo)

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

なし

その他

(関連して何か気がついたこと、気になることがあればココに書いてください)
コマンドラインウィンドウは闇が深い。

@tsuyoshicho
Copy link
Contributor

VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep  9 2019 23:38:44)
MS-Windows 64 ビット GUI/コンソール 版 with OLE サポート
適用済パッチ: 1-2019

で実行すると、以下になりました。

E315: ml_get: 無効なlnumです: 1
E315: ml_get: 無効なlnumです: 1

1テストで2行出ますね。

@mattn
Copy link
Member

mattn commented Sep 13, 2019

diff --git a/src/ex_getln.c b/src/ex_getln.c
index 5e32f2b6c..22a9de423 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4040,7 +4040,7 @@ get_list_range(char_u **str, int *num1, int *num2)
 open_cmdwin(void)
 {
     bufref_T		old_curbuf;
-    win_T		*old_curwin = curwin;
+    win_T		*old_curwin = curwin, *cur_cmdwin;
     bufref_T		bufref;
     win_T		*wp;
     int			i;
@@ -4161,6 +4161,8 @@ open_cmdwin(void)
     setmouse();
 # endif
 
+    cur_cmdwin = curwin;
+
     // Trigger CmdwinEnter autocommands.
     trigger_cmd_autocmd(cmdwin_type, EVENT_CMDWINENTER);
     if (restart_edit != 0)	// autocmd with ":startinsert"
@@ -4266,7 +4268,7 @@ open_cmdwin(void)
 	// Avoid command-line window first character being concealed.
 	curwin->w_p_cole = 0;
 # endif
-	wp = curwin;
+	wp = cur_cmdwin;
 	set_bufref(&bufref, curbuf);
 	win_goto(old_curwin);
 	win_close(wp, TRUE);

となたか試してもらえますか。

@tyru
Copy link
Member

tyru commented Sep 13, 2019

macOS 10.14.6 で該当 Vim バージョン (8.1.1991) で試した所、クラッシュはしませんでしたが以下のエラーが出ました。

E315: ml_get: invalid lnum: 1
E315: ml_get: invalid lnum: 1

image

エンター後 (その後キー入力するたび上記エラーが出る)

image


8.1.1991 だとパッチが一部 reject (src/ex_getln.c.rej) されたため、
8.1.2022 に上げて適用後に手順を試した所、エラーは出なくなりました。

image

@thinca
Copy link
Member Author

thinca commented Sep 16, 2019

v8.1.2037 で修正されたようです。
想定とは違うパッチだったようですが、パッチの対応と報告ありがとうございました!

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

No branches or pull requests

4 participants