如何在提示符號中輸入每個字母時執行 bash 或 zsh 中的函數?

如何在提示符號中輸入每個字母時執行 bash 或 zsh 中的函數?

我知道關於預執行()zsh 的鉤子以及在 bash 中實現這一點的方式。 (關聯

但我可以得到電流輸入還在打字的時候?

這個問題背後的想法如下:

為了更快地學習命令、參數和快捷方式,我想搜尋在「資料庫」中鍵入的命令,提供「幫助/有用的知識/快捷方式」提示,並在鍵入時使用screen/tmux 在另一個會話中顯示這些命令在另一個。

是否可以檢查目前正在鍵入的命令?如果它不能在每次擊鍵時都起作用,則計時器循環也可能起作用。

答案1

我只能回答zsh,在哪裡可以做到這一點,是的。

首先,已經有一些小部件增量完成。第一個顯然是 Y. Fujii 的。雖然它的網站是日語,即使不說該語言,您也可以輕鬆了解它的工作原理以及如何使用它。 自動福是原始腳本的擴充。

到目前為止的參考資料。在zsh裡面zsh 行編輯器( zle) 負責命令列的交互使用。除了提供給小部件的許多其他變數(請參閱 參考資料man zshzle)之外,您還對這些變數感興趣,因為您想要捕獲目前命令列:

$緩衝區:編輯緩衝區的全部內容。

$LB緩衝區:緩衝區中位於遊標位置左側的部分。

$緩衝記憶體:緩衝區中位於遊標位置右側的部分。

這些變數是可寫的,這會改變當前的命令列!

若要擷取每個擊鍵,您可以修改為除或self-insert之外的每個按鍵執行(預設)的小工具。這是一個示例,它沒有做任何非常有用的事情,但為每次擊鍵附加一個點- 只是為了說明它是如何工作的:LFCR$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

相關內容