키 바인딩을 해제하지 않는 tmux 구성 다시로드 (바인드 키는 누적 됨)


33

나는 다른 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있습니까?

답변:


19

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

tmux모든 세션이 닫히고 키 바인딩이 서버별로 완료되면 종료되는 서버 를 실행하십시오. 따라서 바인딩을 작성하면 모든 클라이언트 분리에 대해 지속적으로 유지됩니다.

즉, unbind-key -a구성 파일의 맨 위에 놓고 구성을 다시로드하면 원하는 것을 수행해야합니다. 모든 것을 바인딩 해제하고 처음부터 바인딩을 시작하십시오. 또는 수정 사항이 작은 경우 변경하려는 내용 만 바인딩 해제하십시오.


예, 나는 이미 내 질문에 언급했습니다. 그러나 모든 가능한 바인드 키를 수동으로 "재설정"하는 대신 tmux가 "클린 슬레이트"로 다시 시작한 다음 구성 파일을 다시로드하고 싶습니다.
Niels Bom

@NielsBom 확인 업데이트 답변하시기 바랍니다
peterph

맞습니다 unbind-key -a. 모든 키 바인딩을 제거합니다. 귀하의 답변을 정확한 것으로 표시하겠습니다. 그러나 다른 시청자를 위해 문제를 해결하기 위해 적용한 '해킹'도 추가하겠습니다 unbind-key -a.
Niels Bom

내 솔루션에 대한 내 답변을 참조하십시오.
Niels Bom

16

올바른 해결책

따라서 @peterph는 unbind-key -a다음을 수행하는 정답을 제시했습니다 . (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 키 테이블에서 작동했을 수있는 것처럼 보였지만 (내가 알 수있는 한) 새로운 키 테이블을 추가 할 수는 없습니다.


1
"깨끗한"세션에서 .tmux.reset.conf실행 하여 동등한 항목을 빠르게 생성 할 수 있습니다 tmux list-keys.
jw013

2
tmux -f /dev/null -L temp start-server \; list-keys 바인딩에서 세미콜론 앞에 백 슬래시를 추가해야하지만 기본값을 효과적으로 생성합니다.
Chris Johnsen

@ChrisJohnsen 별도의 답변으로 시작 서버에 대해 자세히 설명해 주시겠습니까?
Niels Bom

7

현재 키 바인딩을 기본값으로 재설정하는 직접적인 방법은 없습니다. 기본 바인딩의 초기화 (in key_bindings_init())는 tmux 서버가 처음 시작될 때 한 번 수행 되며 (in server_start()) 단일 키를 재설정하는 메커니즘이 없습니다.

구성 파일을 소싱하여 구성 파일에서 삭제 된 사용자 정의 바인딩으로 이전에 대체 된 기본 바인딩을 다시 설정하려는 원하는 시나리오의 경우, 사용자가 고안 한 방법이 합리적입니다 (불행하게도 장황하지만) : unbind-key -a, 그런 다음 모든 "기본"바인딩을 다시 설정 한 다음 사용자 정의 바인딩을 설정하십시오 (일부 바인딩은 "기본"바인딩을 무시할 수 있음).

서버의 현재 바인딩은 list-keys 명령 * ; 이것은 제안 된 .tmux.reset.conf파일을 생성 / 유지하는 데 도움이 될 수 있지만 현재 바인딩이 아닌 기본 바인딩 을 추출하는 방법이 필요합니다 .

*의 출력이 몇 가지 상황이 있습니다 list-keys세미콜론 바인딩은으로 해석되는 것을 방지하기 위해 백 슬래시로 이스케이프의 세미콜론이 필요 : 현재 직접 사용할 수 없습니다 TMUX의 명령을 구분하고, 내부에 큰 따옴표를 사용하여 인수했다 어떤 바인딩 하나는 따옴표 (기본 바인딩은 이와 같지 않음)는 이중 qoutes 안에 따옴표로 나옵니다.

기본 바인딩을 얻으려면 list-keys출력을 캡처 할 수 있도록 최소한의 구성 (예 : 사용자 정의 바인딩 없음)을 가진 임시 서버가 필요합니다 . 실행할 수있는 tmux 서버 수에는 제한이 없지만 각각 다른 소켓 경로 이름을 사용해야합니다. 그만큼-L-S TMUX의 옵션은에서 소켓 이름 (지정하는 데 사용할 수 있습니다 $TMPDIR/tmux-$UID.라는 이름의 소켓에 새 서버)에 대한 이야기로, 또는 전체 소켓 경로 이름을 정도 (또는 시작 temp, 당신이 사용하는 것입니다 :

tmux -L temp …

사용하지 않도록 .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

참고 : 세미콜론은 tmux 명령 구분 자가 되기 때문에 쉘이 쉘 명령 구분자로 취급하지 못하도록 이스케이프 또는 따옴표로 묶어야합니다 .

유지 보수 할 세션이 없으므로 서버는 list-keys명령 실행이 완료되면 자동으로 종료됩니다 .

따라서 다음과 같은 명령을 사용하면 .tmux.reset.conf일시적으로.tmux.conf 파일을 (기본 바인딩 만 표시하도록) 기존 서버를 종료하지 않고도 파일 할 수 있습니다.


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


6

다음 .tmux.reset.conf은 기본 키 바인딩에서 자동으로 생성 되는 bash 스크립트에 다른 모든 답변을 롤업 한 것입니다 .

#!/bin/bash
tmux -f /dev/null -L temp start-server \; list-keys | \
  sed -r \
  -e "s/bind-key(\s+)([\"#~\$])(\s+)/bind-key\1\'\2\'\3/g" \
  -e "s/bind-key(\s+)([\'])(\s+)/bind-key\1\"\2\"\3/g" \
  -e "s/bind-key(\s+)([;])(\s+)/bind-key\1\\\\\2\3/g" \
  -e "s/command-prompt -I #([SW])/command-prompt -I \"#\1\"/g" \
  > ~/.tmux.reset.conf

임베디드 sed 명령 행은에서 출력의 다양한 부분을 이스케이프 처리 list-keys합니다. 시스템의 특성에 따라 약간의 조정이 필요할 수 있습니다.

당신의에서 .tmux.conf자신의 키 바인딩을 정의하기 전에 모든 키와 소스이 파일을 간단하게 바인딩을 해제 파일 :

unbind-key -a
source-file ~/.tmux.reset.conf

4

상황을 잘 설명하는 다른 답변도 여기를 참조하십시오. 여기에 tmux 1.8 호환 tmux.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

4

내가 물었다 상류 그들은 그것을 (누군가을 제출하지 않는 한 홍보를) 해결하려하지 보인다.

다음 tmux list-keys은 새로운 서버 인스턴스를 통해 얻은 수동으로 탈출 한 것 입니다.

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

(이전 답변 덕분에)

## See https://github.com/tmux/tmux/issues/729: How to reset key bindings to default? #729

bind-key    -T prefix C-b              send-prefix
bind-key    -T prefix C-o              rotate-window
bind-key    -T prefix C-z              suspend-client
bind-key    -T prefix Space            next-layout
bind-key    -T prefix !                break-pane
bind-key    -T prefix '"'                split-window
bind-key    -T prefix '#'                list-buffers
bind-key    -T prefix '$'                command-prompt -I '#'S "rename-session '%%'"
bind-key    -T prefix %                split-window -h
bind-key    -T prefix &                confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key    -T prefix "'"                command-prompt -p index "select-window -t ':%%'"
bind-key    -T prefix (                switch-client -p
bind-key    -T prefix )                switch-client -n
bind-key    -T prefix ,                command-prompt -I '#W' "rename-window '%%'"
bind-key    -T prefix -                delete-buffer
bind-key    -T prefix .                command-prompt "move-window -t '%%'"
bind-key    -T prefix 0                select-window -t :=0
bind-key    -T prefix 1                select-window -t :=1
bind-key    -T prefix 2                select-window -t :=2
bind-key    -T prefix 3                select-window -t :=3
bind-key    -T prefix 4                select-window -t :=4
bind-key    -T prefix 5                select-window -t :=5
bind-key    -T prefix 6                select-window -t :=6
bind-key    -T prefix 7                select-window -t :=7
bind-key    -T prefix 8                select-window -t :=8
bind-key    -T prefix 9                select-window -t :=9
bind-key    -T prefix ':'                command-prompt
bind-key    -T prefix \;                last-pane
bind-key    -T prefix =                choose-buffer
bind-key    -T prefix ?                list-keys
bind-key    -T prefix D                choose-client
bind-key    -T prefix L                switch-client -l
bind-key    -T prefix M                select-pane -M
bind-key    -T prefix [                copy-mode
bind-key    -T prefix ]                paste-buffer
bind-key    -T prefix c                new-window
bind-key    -T prefix d                detach-client
bind-key    -T prefix f                command-prompt "find-window '%%'"
bind-key    -T prefix i                display-message
bind-key    -T prefix l                last-window
bind-key    -T prefix m                select-pane -m
bind-key    -T prefix n                next-window
bind-key    -T prefix o                select-pane -t :.+
bind-key    -T prefix p                previous-window
bind-key    -T prefix q                display-panes
bind-key    -T prefix r                refresh-client
bind-key    -T prefix s                choose-tree
bind-key    -T prefix t                clock-mode
bind-key    -T prefix w                choose-window
bind-key    -T prefix x                confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key    -T prefix z                resize-pane -Z
bind-key    -T prefix {                swap-pane -U
bind-key    -T prefix }                swap-pane -D
bind-key    -T prefix '~'                show-messages
bind-key    -T prefix PPage            copy-mode -u
bind-key -r -T prefix Up               select-pane -U
bind-key -r -T prefix Down             select-pane -D
bind-key -r -T prefix Left             select-pane -L
bind-key -r -T prefix Right            select-pane -R
bind-key    -T prefix M-1              select-layout even-horizontal
bind-key    -T prefix M-2              select-layout even-vertical
bind-key    -T prefix M-3              select-layout main-horizontal
bind-key    -T prefix M-4              select-layout main-vertical
bind-key    -T prefix M-5              select-layout tiled
bind-key    -T prefix M-n              next-window -a
bind-key    -T prefix M-o              rotate-window -D
bind-key    -T prefix M-p              previous-window -a
bind-key -r -T prefix M-Up             resize-pane -U 5
bind-key -r -T prefix M-Down           resize-pane -D 5
bind-key -r -T prefix M-Left           resize-pane -L 5
bind-key -r -T prefix M-Right          resize-pane -R 5
bind-key -r -T prefix C-Up             resize-pane -U
bind-key -r -T prefix C-Down           resize-pane -D
bind-key -r -T prefix C-Left           resize-pane -L
bind-key -r -T prefix C-Right          resize-pane -R
bind-key    -T root   MouseDown1Pane   select-pane -t = \; send-keys -M
bind-key    -T root   MouseDown1Status select-window -t =
bind-key    -T root   MouseDown3Pane   if-shell -F -t = '#{mouse_any_flag}' "select-pane -t=; send-keys -M" "select-pane -mt="
# Someone also was wondering how to fix here: http://tmux-users.narkive.com/dTFVvLMh/is-it-possible-to-have-a-binding-that-brings-back-mouse-behavior
bind-key    -T root   MouseDrag1Pane   if-shell -F -t = '#{mouse_any_flag}' "if -Ft= '#{pane_in_mode}' 'copy-mode -M' 'send-keys -M' " "copy-mode -M"

bind-key    -T root   MouseDrag1Border resize-pane -M
bind-key    -T root   WheelUpPane      if-shell -F -t = '#{mouse_any_flag}' "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=' "
bind-key    -T root   WheelUpStatus    previous-window
bind-key    -T root   WheelDownStatus  next-window

위의 내용 은 github에 있으므로 수행 할 수 있습니다.

curl -L https://raw.githubusercontent.com/timotheecour/dinocode/master/tmux_list_keys_escaped.txt > ~/.tmux.reset.conf
unbind-key -a
source-file ~/.tmux.reset.conf

참고 : 어떻게 든 Richard Cook의 답변으로 여전히 탈출 문제가 발생했습니다.


유닉스에 오신 것을 환영합니다! 우리는 종종 일반 링크가 지겨워서 여기에 직접 붙여 넣었습니다 (그러나 링크는 참조 용으로 유지했습니다). 이것이 주변에서 선호되는 방법입니다. 링크는 죽습니다 (github입니다! 그러나 여전히 언젠가는 죽을 수도 있습니다). 어쨌든 좋은 대답입니다 (+1). Richard의 sed 코드로 문제를 해결하면 더 좋을 것입니다. 그것은 1 세이며 tmux는 100 % 이전 버전과 호환되지 않는 나쁜 습관을 가지고 있습니다.
grochmal

2

다음 은 tmux 2.1에서 이스케이프 문제를 해결하기위한 Richard Cook의 답변 을 수정 한 것입니다.

#!/bin/bash
tmux -f /dev/null -L temp start-server \; list-keys | \
    sed -r \
    -e "s/(bind-key.*\s+)([\"#~\$])(\s+)/\1\'\2\'\3/g" \
    -e "s/(bind-key.*\s+)([\'])(\s+)/\1\"\2\"\3/g" \
    -e "s/(bind-key.*\s+)([;])(\s+)/\1\\\\\2\3/g" \
    -e "s/(command-prompt -I )#([SW])/\1\"#\2\"/g" \
    -e "s/(if-shell -F -t = )#([^ ]+)/\1\"#\2\"/g" \
    > ~/.tmux.reset.conf                              

시작 부분에 다음 줄 추가 .tmux.conf

unbind-key -a
source-file ~/.tmux.reset.conf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.