bash/readline을 사용하여 키를 바인딩하여 콘솔 화면 하단을 지우고 싶습니다.
화면 하단을 지우는 ANSI 시퀀스는 \e[J
이므로 다음 줄을 광산에 추가하려고 시도했지만 .inputrc
작동하지 않았고 세 문자만 무시했습니다.
Control-N: "\e[J"
문자열에 일부 테스트 문자를 추가하면 다음과 같습니다.
Control-N: "BEFORE \e[J AFTER"
을 누른 다음 문자열을 삽입 BEFORE
하고 거기서 중지합니다.
현재 이 해결 방법을 찾았지만 분명히 echo
원하지 않는 명령이 포함된 줄이 표시됩니다.
Control-N: "echo -ne \"\\e[J\"\n"
바인딩을 통해 ANSI 시퀀스를 보낼 수 있습니까 readline
?
답변1
두 부분:
- Bash를 사용하면 키를 readline에 바인딩할 수 있습니다화면 지우기기능(원래 목표인 것 같습니다).
- Bash에서 readline의 목적은 명령을 실행하기 위해 텍스트를 준비(편집 등을 통해)하는 것입니다.세게 때리다. 이스케이프 시퀀스는 다음으로 전송됩니다.단말기. 없음나열된 기능readline의 경우
echo
또는 가 대체됩니다printf
.
readline의 키 바인딩에는 단일 함수 이름이나 리터럴 문자열이 필요합니다. 귀하의 예에서 readline은 가능하다고 생각되는 함수 이름을 읽고 나머지 줄은 무시합니다.
따라서 아니요, bash/readline은 이스케이프 시퀀스를 키 바인딩으로 직접 에코하는 유용한 기능을 제공하지 않습니다. 앞서 언급한 것처럼 를 사용해야 합니다 echo
.
답변2
원하는 결과를 얻었을 경우 명령 echo
내에서 명령 사용을 약간 개선하면 다음과 같습니다 ..inputrc
나는 다음 기능을 내 기능에 넣고 .bashrc
구체적으로 기능의 짧은 이름을 선택했습니다.
cbs()
{
echo -ne '\e[J\e[F\e[2K'
history -d $(history 1)
}
ANSI 시퀀스를 사용하여 화면 하단을 지운 다음( \\e[J
) 커서를 원래 있던 줄로 다시 이동하고( \\e[F
) 마지막으로 명령이 삽입된 줄을 지웁니다( \\e[2K
).
명령은 또한 오염되지 않도록 bash 기록에서 직접 제거되었습니다.
명령의 짧은 이름은 중요합니다. 줄이 너무 작은 콘솔 창에 포함되면 트릭이 제대로 작동하지 않기 때문입니다.
그런 다음 그에 Ctrl-N따라 바인딩합니다 .inputrc
.
Control-N: "cbs\n"