tmux 내부에서 세션을 공유하는 두 개의 tmux 클라이언트 연결을 해제하는 더 우아한 방법이 있습니까?

tmux 내부에서 세션을 공유하는 두 개의 tmux 클라이언트 연결을 해제하는 더 우아한 방법이 있습니까?

이것은 거의코드 검토질문이지만 코드보다 구성에 대해 매우 *불쾌하고 더 많은 것입니다. tmux에서 전환한 이후 몇 년 동안 screen내가 원하는 방식으로 작업을 수행할 수 없는 몇 가지 잔소리 문제가 있었습니다. tmux 세션으로 실행하도록 쉘을 설정했기 때문에 마침내 이 문제를 고칠 시간이라고 결정했습니다.

기본적으로 두 개의 tmux 클라이언트를 동일한 세션에 연결하면 함께 잠깁니다. 하나의 창을 전환하고 두 스위치 모두 동기화합니다. 이는 기본 동작이 공유 창 세트였지만 클라이언트 자체는 독립적인 화면과 다릅니다.

내가 원했던 것은 동일한 세션에 연결된 두 개의 tmux 클라이언트를 바인딩 해제하는 방법이었습니다. tmux 외부에 있고 새 클라이언트를 시작하는 경우 이 작업을 수행하는 것은 충분히 쉽습니다. 상위 세션을 참조하여 새 세션을 시작하면 됩니다.

tmux new-session -t original_session -s new_session

하지만 이렇게 해보세요~ 후에당신은 클라이언트에 있고 다른 클라이언트가 해당 세션을 공유하고 있는 모든 것과 연결을 해제하려고 하며 상황이 더 복잡해집니다. 나는 수십 가지 방법을 시도했지만 잘 작동하는 방법을 찾지 못했습니다. 내가 얻은 가장 가까운 것은 bind <key> prompt-command ...이전 세션 이름과 새 세션 이름을 모두 묻는 데 사용하는 것입니다.어떤 이유로든 tmux는 또는 #{session_name}인수 내부의 변수를 확장하지 않습니다 .new-sessionprompt-command이는 다른 많은 명령에 대한 인수로 사용되지만(예: 아래에서 사용함 run) 확장이 없으면 이 특정 작업이 갑자기 복잡해집니다. 값을 수동으로 입력하더라도 어느 정도 작동했습니다.

오늘 드디어 일을 하게 됐어요. 그러나 결과는 내가 원했던 것보다 더 추악했습니다. 대부분의 마법을 수행하려면 쉘 기능이 필요합니다. 외부 스크립트를 사용하지 않고 구성 파일에만 이것을 포함하기 위해(도트 파일 이식성을 위해) 해킹을 사용하고 있습니다. 처음 두 열을 잘라내면 구성은 실제로 쉘 스크립트로 실행 가능합니다. 모든 것이 함수로 래핑되어 있으므로 모든 키 바인딩에서 필요한 스크립트 부분만 호출할 수 있습니다. 쉘 스크립트 비트는 구성의 주석인 반면, 쉘 스크립트에서 작성된 구성 비트는 here-doc와 함께 삭제됩니다.

오늘의 솔루션이런 게 나왔어요(내 전체 .tmux.conf파일):

# : << ENDOFCONF

# Clear the default binding
unbind C-c
# Pass the name of the current session to a function to clone it
bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"

# ENDOFCONF
# clone () {
#   orig=${1%-*}
#   copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"
#   TMUX= tmux new-session -d -t $orig -s $copy
#   tmux switch-client -t $copy
#   tmux set -q -t $copy destroy-unattached on
# }
# $@

이것이 효과가 있다는 것을 명심하십시오. 실행 중인 tmux 클라이언트에서 Ctrl+ B Ctrl+는 C현재 세션 이름에 숫자가 추가된 새 세션을 생성하고 현재 세션을 창의 대상으로 사용하고 해당 세션으로 전환합니다.

필요한 것보다 훨씬 더 복잡한 것을 단순하게 만들었다는 잔소리만 제외하면 이것에 만족합니다. 이를 달성하는 더 간단한 방법이 있습니까?

답변1

이것이 내가 한 일입니다:

alias ta='export NEW_SESSION=\$(uuidgen) ; tmux new-session -t 0 -s \$NEW_SESSION ; tmux kill-session -t \$NEW_SESSION'

이것이 하는 일은 '0'(지정하지 않은 경우 첫 번째 세션의 이름)이라는 세션에서 새 세션을 생성하고 고유하게 무작위로 이름을 지정한 다음(uuidgen을 사용하여) 분리할 때 해당 세션을 종료하는 것입니다.

저는 zsh를 사용하고 있습니다. 'ta'는 'tmux Attach'의 약어입니다.

관련 정보