(mac osx lsi
처럼) /usr/lib/w3mimgdisplay
으로 이미지를 터미널에 인쇄하는 작은 스크립트를 작성하고 싶습니다. 따라서 스크립트가 시작되면 실제 커서 위치 (또는 캐럿 위치)가 필요합니다. (- 그게 중요한 경우 모르는 urvxt 및 bash는)Python 3에서 ANSI 시퀀스로 터미널 커서 위치를 결정하십시오.
$ echo -en "\e[6n"
^[[2;1R$ 1R
이의 응답 순서가 같이 ANSI 방법이 있습니다 : 지금까지 나는 ANSI 시퀀스와 쉘의 커서 위치를 얻기 위해 알아 냈어 . 따라서이 시퀀스는 결과 (^[[2;1R
)를 즉시 출력합니다. 그리고 이것은 내가 이해하지 못하는 것입니다. 어떻게 이뤄지나요? 만약 내가 아주 간단한 셸 스크립트를 작성한다면, 그 명령을 사용하고 스크립트를 strace하면, 이것으로 ether를 지우지 않을 것이다. 뭐야? 그런 다음 terminfo 맨 페이지를보고 어떻게되는지 알아 내려고합니다. 여기에서 그것을 찾을 수 없습니다 (어쩌면 내가 열심히 노력하지 않았다). 이 시점에서 나는이 개념에 대해 매우 혼란스러워합니다. 터미널이 stdout으로도 위치를 기록합니까?
터미널
#!/bin/bash
echo -en "\e[6n"
$ strace sh curpos.sh
[...]
read(255, "#!/bin/bash\necho -en \"\\e[6n\"\n", 29) = 29
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 8), ...}) = 0
write(1, "\33[6n", 4) = 4
^[[54;21Rread(255, "", 29) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(0) = ?
+++ exited with 0 +++
파이썬
먼저 난 물론 그냥 내가 감동 한 문자열을 반환 subprocess.check_output
을 사용했습니다. 이 ANSI 시퀀스에 대한 응답을 어떻게 캡처합니까?
>>> subprocess.check_output(["echo", "-en", "\x1b[6n"])
b"\x1b[6n"
나는 또한 stdin과 stdout을 읽는 것과 같은 많은 다른 것들을 시도했다. 스레드의 유무에 관계없이 모든 작업은 무엇을해야 할지를 아는 것보다 추측하고 조롱하는 것이 었습니다. 나는 또한 인터넷 검색 방법을 예제로 찾기를 바란다. 그러나 행운을 부리지는 마라. 같은 질문에 대한 대답을 찾았습니다. https://stackoverflow.com/a/35526389/2787738하지만이 방법은 효과가 없습니다. 실제로이 질문에 대한 답변을 stdout에서 시작하기 전에 stdout 작성된 때문에이 일한 적이 있습니까? 여기에서 나는이 ANSI 시퀀스가 실제로 어떻게 작동하는지 개념/메커니즘을 이해하지 못한다는 것을 다시 깨달았다. 그래서이 시점에서 모든 것을 설명하는 모든 설명은 매우 감사하게 생각합니다. 내가 찾은 가장 유용한 게시물은 다음과 같습니다. https://www.linuxquestions.org/questions/programming-9/get-cursor-position-in-c-947833/.
다음#!/bin/bash
# Restore terminal settings when the script exits.
termios="$(stty -g)"
trap "stty '$termios'" EXIT
# Disable ICANON ECHO. Should probably also disable CREAD.
stty -icanon -echo
# Request cursor coordinates
printf '\033[6n'
# Read response from standard input; note, it ends at R, not at newline
read -d "R" rowscols
# Clean up the rowscols (from \033[rows;cols -- the R at end was eaten)
rowscols="${rowscols//[^0-9;]/}"
rowscols=("${rowscols//;/ }")
printf '(row %d, column %d) ' ${rowscols[0]} ${rowscols[1]}
# Reset original terminal settings.
stty "$termios"
우리는 응답이 마법 어떻게 든 하나의 화면 : 표시 실제로 것을 볼 수 있습니다 :이 스레드에서 사람이 bash는 스크립트를 기록했다. 따라서이 스크립트는 터미널에서 반향을 비활성화하고 응답을 읽은 후 stty
을 통해 원래 터미널 설정을 다시 설정합니다.
관련이 있음 : 원격 터미널은 사용자가 입력 한 것처럼 위치에 "입력"합니다. 이 문제가 발생하기 위해서는 실제로 보내야합니다. https://stackoverflow.com/questions/8343250/how-can-i-get-position-of-cursor-in-minmin – Max
@max 그러나이 키스톤을 읽는 방법은 무엇입니까? 'sys.stdin.read()'라고 생각합니다. 그러나'subprocess.check_output ([ "echo", "-en", "\ x1b [6n"]); curpos = sys, stdin.read (10)'는 작동하지 않습니다. 그것은 경쟁 조건 문제 때문이거나 파이썬 쉘이 어떻게 든 그것을 무시합니까? – netzego