ZSH 쉘 프롬프트를 그리는 함수 내에서 변수에 현재 커서 위치 (현재 행 번호 및 열)를 변수로 읽으려고합니다. 필자의 목표는 여분의 스크롤을 발생시키지 않을만큼 충분한 빈 줄이있을 때만 프롬프트 아래에 물건을 표시하는 것입니다.ZSH 프롬프트를 그릴 때 현재 커서 위치 가져 오기
대화 형 쉘에서, 내가 사용할 수있는 다음 명령 : 그러나
echo -ne "\033[6n"
read -t 1 -s -d 'R' line
line="${line##*\[}"
line="${line%;*}"
echo "XX $line XX"
# Prints: XX 2 XX"
, 내가 깨끗한 zsh -f
을 시작하고 프롬프트를 렌더링 할 때 실행되는 함수에이를 넣어 경우, 그것은 작동하지 : 터미널에 의해 반환
setopt prompt_subst
prompt_fn(){
echo -ne "\033[6n"
read -t 1 -s -d 'R' line
line="${line##*\[}"
line="${line%;*}"
echo "XX $line XX"
}
PROMPT='`prompt_fn` '
는 ANSI 이스케이프 시퀀스 (나는 내 키보드에 입력 한 것처럼) 현재 명령에 추가됩니다,하지만 위의 read -t 1 -s -d 'R' line
명령에 의해 탐욕스럽게 먹게되지 않습니다. 나는 ZSH가 프롬프트를 그리는 동안 STDIN에 대한 액세스를 불가능하게한다고 생각하지만 임시로 액세스를 다시 얻는 방법을 모르겠다. (보통의 키보드 키 입력은 프롬프트를 그리기 전에 입력했거나 초 당 10 분의 1은 그리면 안된다. 가로 채기), 또는 ZLE을 사용하여 해당 정보에 액세스하는 방법.
편집 : 프롬프트가 표시되기 전에 사용자가 명령의 시작을 이미 입력 한 경우 해당 입력을 버려서는 안됩니다. 내가 지금까지 찾은 해결책 (아래 내 자신의 답변 참조) 불행히도 이러한 문자를 읽고 떨어 뜨립니다. 이것은 새로운 터미널 창을 열고 바로 타이핑을 시작하면, 프롬프트가 나타나기 전에 입력 된 문자는 버려지는 것처럼 실망 스럽습니다.