이것은 거의코드 검토질문이지만 매우 *nixy입니다. 코드보다 구성에 관한 것이 더 많습니다. tmux
전환한 이후로 screen
수년 동안 내가 원하는 방식으로 작업할 수 없게 만드는 몇 가지 까다로운 문제에 부딪혔습니다. tmux 세션 내에서 실행되도록 쉘을 설정했기 때문에 마침내 이 문제를 해결할 시간이라고 결정했습니다.
기본적으로 두 개의 tmux 클라이언트를 동일한 세션에 연결하면 함께 잠깁니다. 창 중 하나를 전환하면 두 창 모두 동시에 전환됩니다. 이는 기본 동작이 공유 창 세트이지만 클라이언트 자체는 독립적인 화면과 다릅니다.
내가 원하는 것은 두 개의 tmux 클라이언트를 동일한 세션에 바인딩 해제하는 방법입니다. tmux 외부에 있고 새 클라이언트를 시작하면 이 작업을 쉽게 수행할 수 있습니다. 새 세션을 시작하려면 상위 세션을 참조하기만 하면 됩니다.
tmux new-session -t original_session -s new_session
하지만 이것을 시도해 보세요뒤쪽에클라이언트에 있고 세션을 공유하는 다른 클라이언트와의 연결을 해제하려는 경우 상황이 더 복잡해집니다. 수십 가지 방법을 시도했지만 효과가 있는 방법을 찾지 못했습니다. 내가 얻은 가장 가까운 것은 bind <key> prompt-command ...
이전 세션 이름과 새 세션 이름에 대한 프롬프트를 사용하는 것입니다.어떤 이유로든 tmux는 #{session_name}
a 또는 매개변수 내에서 변수를 확장하지 않습니다.new-session
prompt-command
이는 다른 많은 명령의 인수에서 작동하지만(예: run
아래에서 사용하고 있습니다), 이 확장이 없으면 이 특정 작업이 갑자기 복잡해집니다. 값을 수동으로 입력해도 그럭저럭 잘 작동됩니다.
오늘 드디어 출근했어요. 그러나 결과는 내가 원했던 것보다 더 나빴다. 대부분의 작업을 수행하려면 쉘 기능이 필요합니다. 외부 스크립트를 사용하지 않고 구성 파일에 포함시키기 위해(도트 파일 이식성을 위해) 해킹을 사용했습니다. 처음 두 열을 제거하면 이 구성은 실제로 쉘 스크립트로 실행될 수 있습니다. 모든 것을 함수에 캡슐화하면 모든 키 바인딩에서 필요한 스크립트 부분만 호출할 수 있습니다. 쉘 스크립트 비트는 구성의 주석이며, 쉘 스크립트에서 구성 비트는 이 문서에서 삭제됩니다.
오늘의 솔루션이런게 나왔어요(내 완전한 .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 CtrlC
한 가지 잔소리만 빼고는 괜찮습니다. 필요한 것보다 훨씬 더 복잡한 것을 간단하게 만들었습니다. 이것을 달성하는 더 쉬운 방법이 있습니까?
답변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"의 약어입니다.