我知道關於預執行()zsh 的鉤子以及在 bash 中實現這一點的方式。 (關聯)
但我可以得到電流輸入還在打字的時候?
這個問題背後的想法如下:
為了更快地學習命令、參數和快捷方式,我想搜尋在「資料庫」中鍵入的命令,提供「幫助/有用的知識/快捷方式」提示,並在鍵入時使用screen/tmux 在另一個會話中顯示這些命令在另一個。
是否可以檢查目前正在鍵入的命令?如果它不能在每次擊鍵時都起作用,則計時器循環也可能起作用。
答案1
我只能回答zsh
,在哪裡可以做到這一點,是的。
首先,已經有一些小部件增量完成。第一個顯然是 Y. Fujii 的。雖然它的網站是日語,即使不說該語言,您也可以輕鬆了解它的工作原理以及如何使用它。 自動福是原始腳本的擴充。
到目前為止的參考資料。在zsh
裡面zsh 行編輯器( zle
) 負責命令列的交互使用。除了提供給小部件的許多其他變數(請參閱 參考資料man zshzle
)之外,您還對這些變數感興趣,因為您想要捕獲目前命令列:
$緩衝區:編輯緩衝區的全部內容。
$LB緩衝區:緩衝區中位於遊標位置左側的部分。
$緩衝記憶體:緩衝區中位於遊標位置右側的部分。
這些變數是可寫的,這會改變當前的命令列!
若要擷取每個擊鍵,您可以修改為除或self-insert
之外的每個按鍵執行(預設)的小工具。這是一個示例,它沒有做任何非常有用的事情,但為每次擊鍵附加一個點- 只是為了說明它是如何工作的:LF
CR
$RBUFFER
function self-insert() {
RBUFFER+="."
# execute some other command, but ensure they don't produce any output.
zle .self-insert
}
zle -N self-insert
.self-insert
是內建小部件,因此我們不會遇到無限循環。
所以,你要么從頭開始,要么從藤井的腳本開始並修改它。後者的一個好處是,它還對我在這裡忽略的刪除擊鍵進行了一些處理。
答案2
對於 Bash,您可以建立以下test.sh
腳本:
#!/usr/bin/env bash
ARRAY=('1' '2' '3' '4' '5' '6' '7' '8' '9' '0' '-' '=' 'BACKSPACE' ''
'q' 'w' 'e' 'r' 't' 'y' 'u' 'i' 'o' 'p' '[' ']' 'NEWLINE' ''
'a' 's' 'd' 'f' 'g' 'h' 'j' 'k' 'l' ';' "'" '' '' '' 'z' 'x' 'c'
'v' 'b' 'n' 'm' '0' ',' '.' '/' '' '' 'SPACE')
while read row
do
if [[ "$row" == *press* ]]
then
index=$((${row/key press /}-10))
if [[ "${ARRAY[$index]}" == 'NEWLINE' ]]
then
printf "\n"
elif [[ "${ARRAY[$index]}" == 'BACKSPACE' ]]
then
echo -ne "\b \b"
elif [[ "${ARRAY[$index]}" == 'SPACE' ]]
then
printf " "
else
printf "%s" "${ARRAY[$index]}"
fi
fi
done
這是一個簡單的腳本,它接收一些鍵盤代碼並將它們印在螢幕上。現在將鍵盤代碼傳遞給它:
$ stdbuf -o0 xinput test 'AT Translated Set 2 keyboard' | bash test.sh
現在,如果您在另一個終端中鍵入,它應該會收到鍵值。我不知道是否有任何聰明的方法可以將按鍵代碼映射到它們的 ASCII 值,所以我只是做一個簡單的映射。您可以改進此程式碼以對其他按鍵做出反應。但請注意,該腳本將接收所有鍵盤輸入,而不僅僅是傳遞到給定終端。
至於任務本身(檢查目前鍵入的命令),您可以compgen -c
根據傳遞的參數產生可能完成的清單:
$ compgen -c 'ls' | head -1
ls
$ compgen -c 'lsp' | head -1
lspci