나는 대해 알고있다사전실행()zsh용 후크와 이를 bash에서 달성할 수 있는 방법. (링크)
그런데 내가 얻을 수 있을까?현재 입력아직 타이핑하는 동안?
이 질문의 아이디어는 다음과 같습니다.
명령, 인수 및 바로 가기를 더 빨리 배울 수 있도록 "도움말/알아두면 좋은 정보/바로 가기" 힌트를 제공하는 "데이터베이스"에 입력 중인 명령을 검색하고 입력하는 동안 screen/tmux를 사용하여 다른 세션에 이를 표시하고 싶습니다. 다른쪽에.
현재 입력 중인 명령을 확인할 수 있나요? 모든 키 입력에서 작동하지 않으면 타이머 루프도 작동할 수 있습니다.
답변1
에 대해서만 대답할 수 있습니다 zsh
. 이 작업을 수행할 수 있는 경우에는 예입니다.
첫째, 이미 다음을 위한 몇 가지 위젯이 있습니다.증분 완료. 첫 번째는 Y. Fujii의 작품인 것 같습니다. 하지만그 사이트일본어로 되어 있기 때문에 해당 언어를 말하지 않고도 그것이 어떻게 작동하고 어떻게 사용하는지 쉽게 알아낼 수 있습니다. 자동 푸원본 스크립트의 확장입니다.
지금까지 참고자료입니다. 에서zsh
zsh 라인 편집기( zle
)는 명령줄의 대화형 사용을 담당합니다. 위젯에 제공되는 다른 많은 변수(참고자료 참조 man zshzle
) 외에도,현재 명령줄:
$버퍼: 편집 버퍼의 전체 내용입니다.
$LBUFFER: 커서 위치의 왼쪽에 있는 버퍼 부분입니다.
$RBUFFER: 커서 위치의 오른쪽에 있는 버퍼 부분입니다.
이러한 변수는 쓰기 가능하므로 현재 명령줄이 어떻게 변경됩니까?
각 키 입력을 캡처하려면 또는 를 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
내장 위젯이므로 무한 루프에 빠지지 않습니다.
따라서 처음부터 시작하거나 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