#!/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つのパーティションのみが表示されます。
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モードで役立ちます)。ここでは役に立ちませんが、この場合でも何もしません。to
:o
行の次の文字に移動します。行が空なので、今回は何もしません。o
:現在の行 次の行に挿入モードに入ります。
したがって、最後のコマンドは挿入モードに切り替わります。これは、行の残りの部分(l key Ctrl+a bar
)と「Enter」が2行目のバッファに入力されることを意味します。 Vimは3行目の先頭に残り、まだ挿入モードです。
これはそれを完全に説明します。
より簡単に再現できる方法は、次のコマンドを実行することです。
$ sleep 30; vim
次に、sleep
実行時に上記の行を入力します。
xdotool key Ctrl+a bar
出力は消費されないため、sleep
スリープモードの終了後にVimを起動するたびに入力を使用できます。 「警告音」(ターミナルで有効になっている場合)など、上記と同じように機能することがわかります。