프로그래밍 목적으로 파이프 창 내용에 대한 tmux 키 바인딩

프로그래밍 목적으로 파이프 창 내용에 대한 tmux 키 바인딩

나는 이 키 바인딩을 작동시켜 현재 창의 내용을 내가 선택한 프로그램으로 연결하려고 합니다.

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    delete-buffer -b PIPE"

- 하지만 항상 tmux 보고가 발생합니다 no buffer PIPE. 텍스트는 일반적으로 너무 빨리 표시되고 덮어쓰기 때문에 sleep 10명령 이름을 사용하여 출력을 파이핑하여 이를 유도합니다.

에 의해 생성된 자동으로 명명된 버퍼의 이름을 바꾸기로 결정했습니다. capture-pane그렇지 않으면 new-window호출이 tmux의 현재/기본 버퍼를 복사 모드에서 마지막으로 복사한 버퍼로 재설정하는 것처럼 보였기 때문입니다. 내가 아는 한, 새 버퍼의 이름을 PIPE.

파이프 대신 파일로 콘텐츠를 출력하고 완벽하게 작동하는 유사하지만 더 간단한 바인딩이 있습니다.

bind H command-prompt -I "tmux_#W.txt" \
    "capture-pane -eJ -S - -E -; \
    save-buffer '%%'; \
    delete-buffer"

여기에 있는 명령을 하나씩 실행하면 프로그램은 다른 파이프에서와 마찬가지로 창에 텍스트를 받습니다. 내가 뭘 잘못했나요?

답변1

new-window명령 사이에 경합이 있는 것 같습니다 delete-buffer. 즉, vim이나 실행하려는 프로그램으로 파이프되기 전에 "PIPE" 버퍼가 삭제됩니다.

아래의 추악한 해킹은 delete-buffer전화하기 전에 잠시 잠을 자면서 문제를 해결했습니다.

bind P command-prompt -I "vim -" \
    "capture-pane -eJ -S - -E -; \
    set-buffer -n PIPE; \
    new-window -n '|%1' 'tmux save-buffer -b PIPE - | %1'; \
    run-sh 'sleep 1 && tmux delete-buffer -b PIPE'"

관련 정보