나는 X
다음을 하기 위해 결속하려고합니다 .
- 세션 종료 여부를 사용자에게 묻습니다
- 경우
y
입력, 세션을 죽일 - 세션이 종료 된 후 다른 세션 (마지막, 이전 또는 다음 세션)을 선택하십시오.
옳지 않은 일부 유사한 명령
-
세션을 종료하고 터미널을 닫으십시오.
bind X confirm-before -p "Kill #S (y/n)?" kill-session
-
종료 할 세션 이름을 사용자에게 프롬프트하고 종료 후 다음 세션을 선택하십시오.
bind X command-prompt -p "kill:" "switch-client -n \; kill-session -t '%%'"
-
비슷한 명령의 예를 찾지 못했습니다. 작동하지 않는 해결책은 다음과 같습니다.
bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \ switch-client -n \; kill-session -t \"$SESSION\""
답변
나는 이것이 당신이 원하는 것에 가깝다고 생각합니다 :
bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"
# 3 접근법은 올바른 행을 따르지만 문제는 명령 문자열에서 스타일 대체 (예 :)를 confirm-before
수행하지 않는 것 입니다.status-left
#S
위의 바인딩에 대한주의 사항은에서 모든 것이 수행 run-shell
되므로 명령이 특정 클라이언트 또는 세션의 컨텍스트 외부에서 실행 된다는 것입니다 . “default”클라이언트 (for switch-client
) 및 “default”세션 (for #S
)이 가장 최근에 활성화 된 세션 이기 때문에 실제로 작동 합니다. 단일 활성 클라이언트 (예 : 셸 명령 실행이 완료 될 때까지 다른 tmux 클라이언트에 입력하지 않는 단일 사용자) 만있는 한 예상대로 작동합니다. (예를 들어) tmux 클라이언트 A 에서 바인딩을 트리거 하면 쉘이 시작하기 전에 tmux 클라이언트 B 가 새 입력을 수신 run-shell
하면 명령이 실행될 수 있습니다.
이 특정 경쟁 조건은 클라이언트 / 세션 / 창 / 창 정보를 run-shell
명령 에 제공하는 훌륭한 동기 부여처럼 보입니다 . 점점 대한 TODO 항목이 있습니다 if-shell
및 run-shell
지원 (옵션?) status_replace()
(즉, status-left
스타일 대체),하지만 어쩌면 더 나은 선택이 될 것이다 format_expand()
종류의 새로운 슈퍼 세트 인 status_replace
(이벤트 #{client_tty}
등).
답변
누군가가이 질문에 걸려 넘어 질 경우를 대비하여 tmux-sessionist 는 다른 많은 사람들과 함께이 기능을 제공합니다.
답변
이 또 다른 질문 비슷한 질문을하지만 약간 다릅니다.
choose-session
다른 클라이언트가 연결되어 있지 않은 경우 원래 세션을 종료하는 추가 기능을 사용 하여 표준 동작 을 원하면 해당 질문 에 관심이있을 수 있습니다.
답변
프롬프트없이 주석을 처리하는 방법에 대한 Chris Johnsen의 답변 (댓글 참조)에서 확장 confirm-before
:
bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'
세션이 하나만 남아 있고 (현재있는 세션) 명령을 실행하면 “오류”메시지가 표시되고 세션이 종료되지 않습니다. 일반적으로 (당신이 나와 같은 경우) 전환 할 수있는 다른 세션이 없어도 명령이 세션을 계속 종료하기를 원합니다. 그래서 내가 생각해 낸 것은 다음과 같습니다.
bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
"run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
"run-shell 'tmux kill-session -t \"#S\"'"