Command-Line

xdotools type 破壞輸入

  • October 22, 2017

我想設置一個粘貼功能,允許將複製的文本(如腳本和配置文件)粘貼到任何類型的應用程序,包括虛擬客人和執行圖形客戶端(如 VNC)的遠端會話(標準複製粘貼是不可能的)。

為此,我將桌面管理器中的快捷方式與以下命令相關聯:

sh -c 'sleep 1; xdotool type -- "$(xsel -bo)"'

這有效……但僅適用於某些應用程序(遺憾的是,VNC 不是其中的一部分,殘酷的世界!)。

  • 如果我使用它將文本粘貼到本地主機上的vi執行中xterm,那麼這將完美地工作:文件的內容被保留並按預期寫入。這似乎在gnome-terminal.
  • 例如,如果仍然在本地主機上vi執行xfce4-terminal,則所有輸入都會被破壞。
  • 同樣,如果我嘗試通過 VNC 將文本粘貼到任何應用程序(包括xterm),則文本輸入正確,但此處再次全部在一行上。

奇怪的是,如果我將以下命令附加到另一個鍵盤快捷鍵:

sh -c 'sleep 1; xdotool key Return'

這裡xdotool設法在任何應用程序中輸入輸入,因此在技術上是可行的。

我試圖以此作為一個醜陋的解決方法來強制輸入:

sh -c 'sleep 1; xsel -bo | { while read -r LINE; do xdotool type -- "$LINE"; xdotool key Return; done; }'

現在輸入“有效”,這種解決方法現在會破壞選項卡,並且在所有情況下我都不喜歡它,因為我並不總是想要最終的輸入(例如,在填寫 Web 表單欄位而不立即送出時)。

我想我和這個人有同樣的問題,但遺憾的是執行緒沒有解釋。

哪裡有問題?我怎樣才能使這項工作?或者,如果由於某種原因這是不可能的,是否有另一種輕量級的替代方案可以滿足我的初始需求?

由於歷史原因,有兩個字元表示換行符:換行(通常表示為 LF、、、、\nCtrl \012+J、…)和輸入(CR、、、、\rCtrl \015+M)。Unix 使用 LF 作為行終止符,但是當您按下 時,鍵盤會發送 CR Return。一些應用程序可以辨識一個Linefeed鍵(它存在於一些不是為 PC 市場製造的稀有鍵盤上),但這種情況很少見。

實驗上,當字元串中有換行符時,xdotool 會發送一個Linefeed鍵。我對某些應用程序無法辨識這一點並不感到驚訝。您可以Return通過用輸入替換換行符來發送它。

sleep 1; xdotool type -- "$(xsel -bo | tr \\n \\r | sed s/\\r*\$//)"

也可以使您的解決方法起作用。設置IFS為空值,否則read去除每行的前導和尾隨空格(這就是製表符消失的原因)。並且不要Return在最後一行之後發送。(這並不嚴格等同於命令替換方法:使用命令替換,所有尾隨空行都被刪除;使用以下方法,只有最後一個換行符(如果有)被忽略。)

sleep 1
xsel -bo | {
 IFS= read -r LINE;
 xdotool type -- "$LINE";
 while IFS= read -r LINE; do
   xdotool key Return;
   xdotool type -- "$LINE";
 done;
}

注意:我沒有在 VNC 中嘗試過任何東西,所以你的里程可能會有所不同。

引用自:https://unix.stackexchange.com/questions/399403