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