Readline: ANSI 이스케이프 시퀀스를 키에 바인딩

Readline: ANSI 이스케이프 시퀀스를 키에 바인딩

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"

관련 정보