![libreadline의 대괄호 붙여넣기 모드를 프로그래밍 방식으로 비활성화하는 방법](https://linux55.com/image/201268/libreadline%EC%9D%98%20%EB%8C%80%EA%B4%84%ED%98%B8%20%EB%B6%99%EC%97%AC%EB%84%A3%EA%B8%B0%20%EB%AA%A8%EB%93%9C%EB%A5%BC%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EB%B9%84%ED%99%9C%EC%84%B1%ED%99%94%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
libreadline 버전 8.1부터 "대괄호 붙여넣기" 작업은 기본적으로 특별하게 처리됩니다. 이로 인해 내 프로그램의 구문 분석이 중단되므로 비활성화하고 싶습니다.
이 줄을 /etc/inputrc에 추가하면 전역적으로 비활성화할 수 있다는 것을 알고 있습니다.
set enable-bracketed-paste off
~/.inputrc에 동일한 줄을 추가하여 사용자별로 비활성화할 수 있다는 것을 알고 있습니다.
나는 명령이 다음과 같은 프로그램에 따라 수정될 수 있다는 것을 알고 있습니다.
$if Progname
set enable-bracketed-paste off
$endif
그러나 이러한 옵션을 사용하려면 시스템 관리자나 사용자의 조치가 필요합니다. 프로그램 자체에서 진입 시 이 모드를 비활성화하고 싶습니다. readline 문서에 따르면 rl_startup_hook is the address of a function to call just before readline prints the first prompt
. 나는 이것이 다음 코드가 내가 원하는 것을 수행해야 한다는 것을 의미한다고 생각합니다.
int my_readline_init(void) {
char *command = strdup("set enable-bracketed-paste off");
rl_parse_and_bind(command);
free(command);
}
rl_startup_hook = my_readline_init;
init 루틴에 디버그 라인이나 추적 지점을 추가하면 실제로 호출되는 것을 볼 수 있습니다. 그러나 (1) 처음뿐만 아니라 모든 입력 라인에서 호출되고 (2) 원하는 효과가 없습니다. 즉, 괄호 안의 붙여넣기 처리가 꺼지지 않습니다. 내가 뭘 잘못했나요?
답변1
마침내 이 해결책을 찾았습니다.
if (RL_VERSION_MAJOR >= 8)
rl_variable_bind ("enable-bracketed-paste", "off");