libreadline의 대괄호 붙여넣기 모드를 프로그래밍 방식으로 비활성화하는 방법

libreadline의 대괄호 붙여넣기 모드를 프로그래밍 방식으로 비활성화하는 방법

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");

관련 정보