키 바인딩을 해제하지 않는 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있습니까?



답변

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

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

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


답변

올바른 해결책

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


답변

현재 키 바인딩을 기본값으로 재설정하는 직접적인 방법은 없습니다. 기본 바인딩의 초기화 (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가 완료 되기 전에 실행됩니다 ).


답변

다음 .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


답변

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


답변

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

다음 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의 답변으로 여전히 탈출 문제가 발생했습니다.


답변

다음 은 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