바인딩 해제 키 없이 tmux 구성 다시 로드(바인딩 키는 누적됨)

바인딩 해제 키 없이 tmux 구성 다시 로드(바인딩 키는 누적됨)

저는 다양한 tmux 키 바인딩 설정을 실험해 본 결과 다음과 같은 사실을 발견했습니다.

tmux 구성을 다시 로드하면(tmux 내에서) 한 번 로드한 키 바인딩이 로드된 상태로 유지됩니다. (내가 아는) 이 문제를 해결하는 유일한 방법은 모든 tmux 세션을 종료하고 다시 시작하는 것입니다. 따라서 tmux는 이전에 로드된 모든 키 바인딩을 기억하고 재부팅하거나 명시적으로 바인딩을 해제해야만 제거할 것 같습니다.

이것을 재현하려면:

  • 개방형 터미널(A)
  • tmux 시작
  • 키 바인딩에 시계가 표시되는지 확인(누름 PREFIX C-t)
  • PREFIX ?목록에서 키 바인딩을 보려면 누르세요 .
  • 편집하다~/.tmux.conf
  • 추가키바인딩( bind C-t display "Keybinding C-t")
  • tmux 구성 다시 로드( PREFIX : source-file ~/.tmux.conf)
  • 키바인딩이 유효한지 확인하세요. (누르세요 PREFIX C-t)
  • PREFIX ?목록에서 새 키 바인딩을 보려면 이 버튼을 누르세요.
  • ~/.tmux.conf다시 편집
  • 키 바인딩을 제거하십시오 (그러므로 삭제하십시오 bind C-t display "Keybinding C-t")
  • tmux 구성 다시 로드( PREFIX : source-file ~/.tmux.conf)
  • 키 바인딩이 작동하는지 확인했지만(누르기 PREFIX C-t) 여전히 "키 바인딩 Ct"라고 표시됩니다.
  • PREFIX ?목록에 여전히 새 키 바인딩을 보려면 클릭하세요 .
  • tmux 종료
  • tmux를 입력하세요
  • 원래 키 바인딩이 다시 작동하는지 확인하고(누르기 PREFIX C-t) 이제 시계가 다시 표시되어야 합니다.
  • PREFIX ?목록에서 제거된 새 키 바인딩을 보려면 누르세요 .

내 질문: 로드된 모든 구성을 "잊고" 로드하도록 tmux에 지시하는 방법이 있습니까 .tmux.conf?

답변1

tmux(1)매뉴얼 페이지 에 따르면 unbind-key -a이것이 당신이 찾고 있는 것입니다.

tmux실행 중인 서버는 모든 세션이 닫힌 후에만 종료되며 키 바인딩은 서버별로 적용됩니다 . 따라서 바인딩이 생성되면 모든 클라이언트 분리에서 지속됩니다.

즉, unbind-key -a구성 파일의 맨 위에 배치하면 구성이 다시 로드될 때 원하는 작업을 수행해야 합니다. 모든 것을 바인딩 해제하고 처음부터 바인딩을 시작합니다. 또는 수정 사항이 사소한 경우 변경하려는 항목만 바인딩 해제합니다.

답변2

올바른 솔루션(저자: Peter

unbind-key -a그래서 @peterph는 다음을 수행하는 정답을 제시했습니다 . (man tmux)

-a가 있으면 모든 키 바인딩이 제거됩니다.

가능한 해결책

(저에게 있어서) 문제는 "모두"가 실제로 모두를 의미한다는 것입니다.tmux와 함께 제공되는 키 바인딩 포함. 명령을 즉시 실행 하면 unbind-key -atmux에는 더 이상 키 바인딩이 없으므로 명령 모드로 들어가거나 기본적으로 아무것도 할 수 없습니다.

이에 대한 내 (다소 추악한) 수정 사항은 다음과 같습니다.

  • .tmux.reset.conf모든 키 바인딩을 제거한 다음 기본적으로 tmux에서 모든 키 바인딩을 다시 바인딩하는 키를 만듭니다 .
  • 상단에서 소스 재설정.tmux.conf

내 거 .tmux.conf:

# always load the reset file first
source-file ~/.tmux.reset.conf

내 거 .tmux.reset.conf:

# First remove *all* keybindings
unbind-key -a
# Now reinsert all the regular tmux keys
bind-key C-b send-prefix
bind-key C-o rotate-window
bind-key C-z suspend-client
bind-key Space next-layout
bind-key ! break-pane
bind-key " split-window
bind-key # list-buffers
bind-key $ command-prompt -I #S "rename-session '%%'"
bind-key % split-window -h
bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key ' command-prompt -p index "select-window -t ':%%'"
bind-key ( switch-client -p
bind-key ) switch-client -n
bind-key , command-prompt -I #W "rename-window '%%'"
bind-key - delete-buffer
bind-key . command-prompt "move-window -t '%%'"
bind-key 0 select-window -t :0
bind-key 1 select-window -t :1
bind-key 2 select-window -t :2
bind-key 3 select-window -t :3
bind-key 4 select-window -t :4
bind-key 5 select-window -t :5
bind-key 6 select-window -t :6
bind-key 7 select-window -t :7
bind-key 8 select-window -t :8
bind-key 9 select-window -t :9
bind-key : command-prompt
bind-key ; last-pane
bind-key = choose-buffer
bind-key ? list-keys
bind-key D choose-client
bind-key L switch-client -l
bind-key [ copy-mode
bind-key ] paste-buffer
bind-key c new-window
bind-key d detach-client
bind-key f command-prompt "find-window '%%'"
bind-key i display-message
bind-key l last-window
bind-key n next-window
bind-key o select-pane -t :.+
bind-key p previous-window
bind-key q display-panes
bind-key r refresh-client
bind-key s choose-session
bind-key t clock-mode
bind-key w choose-window
bind-key x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key { swap-pane -U
bind-key } swap-pane -D
bind-key ~ show-messages
bind-key PPage copy-mode -u
bind-key -r Up select-pane -U
bind-key -r Down select-pane -D
bind-key -r Left select-pane -L
bind-key -r Right select-pane -R
bind-key -r M-1 select-layout even-horizontal
bind-key -r M-2 select-layout even-vertical
bind-key -r M-3 select-layout main-horizontal
bind-key -r M-4 select-layout main-vertical
bind-key -r M-5 select-layout tiled
bind-key -r M-n next-window -a
bind-key -r M-o rotate-window -D
bind-key -r M-p previous-window -a
bind-key -r M-Up resize-pane -U 5
bind-key -r M-Down resize-pane -D 5
bind-key -r M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r C-Up resize-pane -U
bind-key -r C-Down resize-pane -D
bind-key -r C-Left resize-pane -L
bind-key -r C-Right resize-pane -R

(내가 아는 한) tmux 키 테이블과 함께 사용할 수 있는 것처럼 보이지만 새 키 테이블을 추가할 수는 없습니다.

답변3

현재 키 바인딩을 기본값으로 재설정하는 직접적인 방법은 없습니다. 기본 바인딩(in)의 초기화는 key_bindings_init()한 번 수행됩니다.멀티플렉서서버가 먼저 시작되고( 에서 server_start()) 개별 키를 재설정하는 메커니즘이 없습니다.

프로필에서 제거된 사용자 지정 바인딩으로 이전에 덮어쓴 기본 바인딩을 다시 설정하기 위해 프로필의 동작을 가져오려는 의도한 시나리오의 경우 고안한 접근 방식은 합리적입니다(불행히도 장황하지만). 그런 unbind-key -a다음 다시 -모든 "기본" 바인딩을 설정한 다음 사용자 정의 바인딩을 구축합니다(일부는 "기본" 바인딩을 재정의할 수 있음).

list-keys서버의 현재 바인딩은 * 명령을 사용하여 추출할 수 있습니다 . 이는 제안한 파일을 생성/유지하는 데 도움이 될 수 있지만 .tmux.reset.conf추출하는 방법이 필요합니다.기본대신 바인딩현재의제본.

* 일부 경우에는 list-keys현재 직접적으로 가능하지 않습니다. 세미콜론을 바인딩하려면 다음과 같이 해석되는 것을 방지하기 위해 백슬래시로 세미콜론을 이스케이프해야 합니다.멀티플렉서명령 구분 기호 및 내부적으로 큰따옴표를 사용하는 인수가 있는 바인딩하나의따옴표(기본 바인딩 중 어느 것도 이를 수행하지 않음)는 내부적으로 큰따옴표로 표시됩니다.더블인용하다.

기본 바인딩을 얻으려면 출력을 캡처할 수 있도록 최소한의 구성(즉, 사용자 정의 바인딩 없음)이 포함된 스테이징 서버가 필요합니다 list-keys. 수량 제한 없음멀티플렉서서버를 실행할 수 있지만 각 서버는 서로 다른 소켓 경로 이름을 사용해야 합니다 -L.-S 멀티플렉서옵션을 사용하여 소켓 이름( $TMPDIR/tmux-$UID소켓 경로 이름 또는 전체 소켓 경로 이름)을 지정할 수 있습니다. 따라서 이름이 지정된 소켓에서 새 서버와 통신(또는 시작)하려면 temp다음 명령을 사용합니다.

tmux -L temp …

yours 를 사용하지 않도록 하려면 읽도록 지시 .tmux.conf할 수 있습니다 (항상 비어 있는 특수 파일).-f/dev/null

tmux -f /dev/null -L temp …

노트/etc/tmux.conf: 이러한 파일이 존재하는 경우 처리를 방해하지 않습니다. 이 "시스템 구성 파일"에 대한 경로가 하드 코딩되어 있고 이를 우회할 수 있는 옵션이 없습니다(코드가 패치되지 않는 한).

일반적으로 서버를 실제로 시작하려면 명령이 필요 new-session하지만 세션은 필요하지 않고 쿼리할 초기화된 서버만 필요합니다. 이 start-server명령의 목적은 세션을 생성하지 않고 서버를 시작하는 것입니다.

tmux -f /dev/null -L temp start-server …

이제 "query" 명령만 추가하면 됩니다( list-keys이 경우):

tmux -f /dev/null -L temp start-server \; list-keys

노트: 쉘이 이를 쉘 명령 구분 기호로 처리하는 것을 방지하려면 세미콜론을 이스케이프하거나 인용해야 합니다.멀티플렉서명령 구분 기호.

유지할 세션이 없으므로 명령을 실행한 후 서버가 자동으로 종료됩니다 list-keys.

따라서 이와 같은 명령을 사용하면 일시적으로 파일을 삭제하거나(기본 바인딩만 볼 수 있음) 기존 서버를 종료하는 것에 .tmux.reset.conf대해 걱정할 필요 없이 대부분의 콘텐츠를 생성할 수 있습니다 ..tmux.conf


명령이 동기식 인 경우 정적 파일(yours)을 사용하는 대신 run-shell구성 파일(나중에 사용할 임시 파일로 캡처)에 이러한 호출을 포함할 수 있습니다 . 이렇게 하면 항상 기본 바인딩의 현재 버전을 사용하게 됩니다.source-file.tmux.reset.conf멀티플렉서(기본 바인딩은 때때로 변경됩니다). 불행하게도 이 명령의 완료는 run-shell현재 후속 명령과 관련하여 비동기적입니다. 명령 다음에 오는 명령은 run-shell생성된 프로세스가 run-shell완료되기 전에 실행되는 경우가 많습니다.

답변4

상황을 잘 설명하는 다른 답변도 참조하세요. 내 것도 여기 있어멀티플렉서 1.8tmux.reset.conf와 호환되므로 출력을 복사한 후 일부 수정이 필요했습니다 tmux -f /dev/null -L temp start-server \; list-keys. 특히 몇 가지를 인용해야 한다.

# First remove *all* keybindings
unbind-key -a
# Now reinsert all the regular tmux keys
bind-key C-b send-prefix
bind-key C-o rotate-window
bind-key C-z suspend-client
bind-key Space next-layout
bind-key ! break-pane
bind-key '"' split-window
bind-key '#' list-buffers
bind-key '$' command-prompt -I "#S" "rename-session '%%'"
bind-key % split-window -h
bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key "'" command-prompt -p index "select-window -t ':%%'"
bind-key ( switch-client -p
bind-key ) switch-client -n
bind-key , command-prompt -I "#W" "rename-window '%%'"
bind-key - delete-buffer
bind-key . command-prompt "move-window -t '%%'"
bind-key 0 select-window -t :0
bind-key 1 select-window -t :1
bind-key 2 select-window -t :2
bind-key 3 select-window -t :3
bind-key 4 select-window -t :4
bind-key 5 select-window -t :5
bind-key 6 select-window -t :6
bind-key 7 select-window -t :7
bind-key 8 select-window -t :8
bind-key 9 select-window -t :9
bind-key : command-prompt
bind-key \; last-pane
bind-key = choose-buffer
bind-key ? list-keys
bind-key D choose-client
bind-key L switch-client -l
bind-key [ copy-mode
bind-key ] paste-buffer
bind-key c new-window
bind-key d detach-client
bind-key f command-prompt "find-window '%%'"
bind-key i display-message
bind-key l last-window
bind-key n next-window
bind-key o select-pane -t :.+
bind-key p previous-window
bind-key q display-panes
bind-key r refresh-client
bind-key s choose-tree
bind-key t clock-mode
bind-key w choose-window
bind-key x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key z resize-pane -Z
bind-key { swap-pane -U
bind-key } swap-pane -D
bind-key '~' show-messages
bind-key PPage copy-mode -u
bind-key -r Up select-pane -U
bind-key -r Down select-pane -D
bind-key -r Left select-pane -L
bind-key -r Right select-pane -R
bind-key M-1 select-layout even-horizontal
bind-key M-2 select-layout even-vertical
bind-key M-3 select-layout main-horizontal
bind-key M-4 select-layout main-vertical
bind-key M-5 select-layout tiled
bind-key M-n next-window -a
bind-key M-o rotate-window -D
bind-key M-p previous-window -a
bind-key -r M-Up resize-pane -U 5
bind-key -r M-Down resize-pane -D 5
bind-key -r M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r C-Up resize-pane -U
bind-key -r C-Down resize-pane -D
bind-key -r C-Left resize-pane -L
bind-key -r C-Right resize-pane -R

관련 정보