프롬프트에 입력되는 모든 문자에 대해 bash 또는 zsh에서 기능을 실행하는 방법은 무엇입니까?

프롬프트에 입력되는 모든 문자에 대해 bash 또는 zsh에서 기능을 실행하는 방법은 무엇입니까?

나는 대해 알고있다사전실행()zsh용 후크와 이를 bash에서 달성할 수 있는 방법. (링크)

그런데 내가 얻을 수 있을까?현재 입력아직 타이핑하는 동안?

이 질문의 아이디어는 다음과 같습니다.

명령, 인수 및 바로 가기를 더 빨리 배울 수 있도록 "도움말/알아두면 좋은 정보/바로 가기" 힌트를 제공하는 "데이터베이스"에 입력 중인 명령을 검색하고 입력하는 동안 screen/tmux를 사용하여 다른 세션에 이를 표시하고 싶습니다. 다른쪽에.

현재 입력 중인 명령을 확인할 수 있나요? 모든 키 입력에서 작동하지 않으면 타이머 루프도 작동할 수 있습니다.

답변1

에 대해서만 대답할 수 있습니다 zsh. 이 작업을 수행할 수 있는 경우에는 예입니다.

첫째, 이미 다음을 위한 몇 가지 위젯이 있습니다.증분 완료. 첫 번째는 Y. Fujii의 작품인 것 같습니다. 하지만그 사이트일본어로 되어 있기 때문에 해당 언어를 말하지 않고도 그것이 어떻게 작동하고 어떻게 사용하는지 쉽게 알아낼 수 있습니다. 자동 푸원본 스크립트의 확장입니다.

지금까지 참고자료입니다. 에서zshzsh 라인 편집기( zle)는 명령줄의 대화형 사용을 담당합니다. 위젯에 제공되는 다른 많은 변수(참고자료 참조 man zshzle) 외에도,현재 명령줄:

$버퍼: 편집 버퍼의 전체 내용입니다.

$LBUFFER: 커서 위치의 왼쪽에 있는 버퍼 부분입니다.

$RBUFFER: 커서 위치의 오른쪽에 있는 버퍼 부분입니다.

이러한 변수는 쓰기 가능하므로 현재 명령줄이 어떻게 변경됩니까?

각 키 입력을 캡처하려면 또는 를 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내장 위젯이므로 무한 루프에 빠지지 않습니다.

따라서 처음부터 시작하거나 Fujii의 스크립트에서 시작하여 수정할 수 있습니다. 후자의 한 가지 이점은 내가 여기서 무시한 키 입력 삭제를 일부 처리한다는 것입니다.

답변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

관련 정보