2017-05-11 12 views
0

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을 사용하여 해당 정보에 액세스하는 방법.

편집 : 프롬프트가 표시되기 전에 사용자가 명령의 시작을 이미 입력 한 경우 해당 입력을 버려서는 안됩니다. 내가 지금까지 찾은 해결책 (아래 내 자신의 답변 참조) 불행히도 이러한 문자를 읽고 떨어 뜨립니다. 이것은 새로운 터미널 창을 열고 바로 타이핑을 시작하면, 프롬프트가 나타나기 전에 입력 된 문자는 버려지는 것처럼 실망 스럽습니다.

답변

0

/dev/tty에서 직접 읽기는 대부분 작동하는 것처럼 보이지만, prompt_fnread 명령의 시작 부분 사이에 입력 된 입력을 여전히 혼란스럽게 만듭니다. prompt_fn이 그 지점에 도달하기 전에 약간의 작업을 수행하면 일부 사용자 입력이 삭제 될 수 있습니다. 다행히 누군가가 더 나은 해결책을 찾아 낼 것입니다.

setopt prompt_subst 
prompt_fn(){ 
    echo -ne "\033[6n" > /dev/tty 
    read -t 1 -s -d 'R' line < /dev/tty 
    line="${line##*\[}" 
    line="${line%;*}" 
    echo "XX $line XX" 
} 
PROMPT='`prompt_fn` '