![tmux 복사 모드에서 임의 명령 실행](https://linux55.com/image/194473/tmux%20%EB%B3%B5%EC%82%AC%20%EB%AA%A8%EB%93%9C%EC%97%90%EC%84%9C%20%EC%9E%84%EC%9D%98%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
tmux 복사 모드에서 일부 텍스트를 선택할 때 미리 정의된 키 바인딩을 사용하지 않고 선택한 텍스트에 대해 시스템 명령을 호출할 수 있습니까?
예를 들어 전화를 걸어 pastebin
선택한 텍스트를 Pastebin으로 보내거나 전화를 걸어 wc
줄 수를 세어볼 수 있습니다. 나는 성공하지 않고 다음을 시도했습니다.
- 텍스트 선택
c-b [
- 두 가지 방법을 모두 시도했습니다.
:
명령 모드로 들어가려고 를 누르십시오 . "라인으로 이동"이라는 메시지가 표시되므로 작동하지 않습니다.- 누르면
c-b :copy-pipe wc
- 복사 파이프가 알 수 없는 명령이므로 작동하지 않습니다.
참고: 저는 Tmux 3.1c를 사용하고 있습니다.
나는 이런 해결책을 알고 있다이것. 그러나 이를 위해서는 모든 사용 사례를 예측하고 실행할 수 있는 모든 명령에 대한 키 바인딩을 미리 정의해야 합니다.
Vim에서는 이것이 지원됩니다. 즉, 텍스트를 선택한 다음 :!<system_command>
텍스트를 system_command
.
답변1
당신은 적어도 목표에 가까워졌습니다. 복사 모드 명령은 를 통해 전송되어야 합니다 sendkeys -X
.
따라서 선택한 텍스트를 명령에 파이프하려면 다음과 같습니다.
- Prefix :
send-keys -X copy-pipe "wc"
그러나 Tmux는 copy-pipe
어디에도 출력을 표시하지 않습니다. 를 사용하면 run-command
출력이 복사 버퍼에 표시됩니다. 의 경우 copy-pipe
, 그냥 잡아먹힌 것 같았습니다. 다른 답변에 링크한 예는 버퍼를 저장하기만 하므로 출력/피드백이 필요하지 않습니다.
이는 wc
. 내가 추측하는 출력은 pastebin
매우 유용한 URL입니다 ...
제가 찾은 가장 간단한 대안은 혼란스러워지기 시작하는 것입니다.특히임의의 명령을 사용하여 이 작업을 수행하려고 하기 때문입니다.
- Prefix :
send-keys -X copy-selection-no-clear ; run-shell "tmux show-buffer | wc"
항목이 선택되었는지 확인하기 위한 오류 검사는 없습니다. 단순히 show-buffer
최신 버퍼에서 실행 됩니다 .
IMHO 아마도 더 나은 옵션 일 것입니다
Vim은 이 사용 사례에 능숙하므로 사용하세요. vim
프로세스 대체를 사용할 때 스크롤백 버퍼를 켜는 키 바인딩을 설정합니다 .
쉘에서 테스트하는 경우(테스트됨):
tmux bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \\\; run-shell "sleep 1" \\\; select-window -t scrollback
또는 구성(테스트되지 않음)에서:
bind-key -T copy-mode v new-window -d -n scrollback "vi <(tmux capture-pane -p -S - -E -)" \; run-shell "sleep 1" \; select-window -t scrollback
Hacky, 그렇습니다. 더 큰 버퍼를 추가해야 할 수도 있습니다 sleep
. 아직 테스트해 본 적이 없습니다. 아마도 더 좋은 방법이 있을 것입니다. 하지만 이것이 제가 생각해낸 방법입니다.
또한 ANSI 색상 코드가 손실되지만 다음 명령을 사용하여 이를 처리할 수 있습니다(관심 있는 경우).안시 ESCVIM 확장자 -e
로 추가됩니다 capture-buffer
(버퍼링된 출력에서 ANSI 코드를 보존하기 위해).
답변2
NotTheDr01ds 기반답변, 완전한 솔루션을 얻었습니다.
bind-key -T copy-mode ! command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
bind-key -T copy-mode-vi ! command-prompt -p "cmd:" "send-keys -X copy-selection-no-clear \; run-shell \"tmux show-buffer | %1\" "
사용법: 일부 텍스트를 선택하고 를 누릅니다 !
. 쉘 명령을 실행하라는 메시지가 표시됩니다. 선택한 텍스트는 쉘 명령에 대한 표준 입력으로 제공됩니다. 쉘 명령의 표준 출력이 tmux 창에 다시 표시됩니다.
훌륭한 팁을 주신 NotTheDr01ds에게 감사드립니다!