vimはbashscriptで奇妙な動作をします。

vimはbashscriptで奇妙な動作をします。
#!/bin/sh

action() {

        screen -X stuff "xdotool key Ctrl+a $1"$(echo '\015')

}

action bar
screen
action 0
action Tab
action 1
action S
screen
action Tab
action 2
action Tab
vim
#action Tab
#vim $2
#action Tab
#vim $3
#action Tab

vim 行がコメントアウトされた場合 次の出力が期待どおりに表示されます。 中央に垂直仕切りがあり、その垂直仕切りの右側に横仕切りがあります。

vimラインを含む場合 水平線で区切られた2つのパーティションのみが表示されます。 最初のパーティションは画面#1を表示し、2番目のパーティションは画面#2を表示します。

vimは画面#0で開き、


l key Ctrl+a bar

次のように書かれた

ここに画像の説明を入力してください。

vimがどのようにエラーを発生させるのか理解できませんか?助けてください。

答え1

ここで何が起こるのかは、画面上のstuffコマンドが文字をウィンドウの入力バッファにプッシュしますが、一部のプログラムが文字を使用するまでそのまま残ることです。

このスクリプトがウィンドウ#0で実行され、xdotool key Ctrl+a barそのウィンドウ#0でコマンドが実行されるため、スクリプトが終了してシェルに戻ると、シェルはスクリプトを受け入れてそれを通常のシェルコマンドとして解釈します。

実際、最初のスクリーンショットでは、これらの文字が自分の行を占有してから(入力した文字と同じ)入力保留状態になることがわかります。スクリプトが終了してシェルに戻ると、スクリプトはこれらの文字を使用して最終的にコマンドを繰り返します。結果は次のとおりです。

xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$ xdotool key Ctrl+a bar
devanshu@...:~/env/bin/cp_c++$

スクリプトを終了する代わりにVimを実行すると、Vimは同じ入力を受け取り、Vimコマンドとして解釈します。これにより、次の一連のコマンドが表示されます。

  • x:カーソルの下の文字を削除します。バッファが空なので、ビープ音だけが鳴り、何もしません。
  • do:他のバッファとの違いを取得します(vimdiffモードで役立ちます)。ここでは役に立ちませんが、この場合でも何もしません。
  • too行の次の文字に移動します。行が空なので、今回は何もしません。
  • o:現在の行 次の行に挿入モードに入ります。

したがって、最後のコマンドは挿入モードに切り替わります。これは、行の残りの部分(l key Ctrl+a bar)と「Enter」が2行目のバッファに入力されることを意味します。 Vimは3行目の先頭に残り、まだ挿入モードです。

これはそれを完全に説明します。

より簡単に再現できる方法は、次のコマンドを実行することです。

$ sleep 30; vim

次に、sleep実行時に上記の行を入力します。

xdotool key Ctrl+a bar

出力は消費されないため、sleepスリープモードの終了後にVimを起動するたびに入力を使用できます。 「警告音」(ターミナルで有効になっている場合)など、上記と同じように機能することがわかります。

関連情報