xdotools type
破壞輸入
我想設置一個粘貼功能,允許將複製的文本(如腳本和配置文件)粘貼到任何類型的應用程序,包括虛擬客人和執行圖形客戶端(如 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、、、、
\n
Ctrl\012
+J、…)和輸入(CR、、、、\r
Ctrl\015
+M)。Unix 使用 LF 作為行終止符,但是當您按下 時,鍵盤會發送 CRReturn
。一些應用程序可以辨識一個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 中嘗試過任何東西,所以你的里程可能會有所不同。