Перезагрузка конфигурации tmux, не развязывающей ключи (связывать-ключ кумулятивен),

Можно использовать yafc (Все же другой клиент FTP/SFTP). -r опция работает там очень хорошо.

33
06.12.2012, 01:21
7 ответов

Согласно tmux(1) страница справочника, unbind-key -a то, что Вы ищете.

Отметьте это tmux выполняет сервер, который только выйдет, после того как все сеансы закрыты, и привязки клавиш на сервер. Следовательно, после того как Вы создаете привязку, это будет персистентным по всем клиентским отсоединениям.

Тем не менее помещенный unbind-key -a в самом верху Вашего конфигурационного файла, и на перезагрузке конфигурации это должно сделать то, что Вы хотите - развязывают все и начинают связывать с нуля. Или - если Ваши модификации меньше - развязывают только, что Вы хотите изменить.

19
27.01.2020, 19:37
  • 1
    Да и я уже заявили это в моем вопросе. Но вместо того, чтобы "сбросить" все возможно связали ключи вручную, я хотел бы, чтобы tmux перезапустил с "чистым листом" и затем перезагрузил файл конфигурации. проверка –  Niels Bom 05.12.2012, 16:26
  • 2
    @NielsBom обновила ответ –  peterph 05.12.2012, 17:01
  • 3
    , Вы корректны, unbind-key -a удаляет все привязки клавиш. Я отмечу Ваш ответ как корректный, но для пользы других средств просмотра я также добавлю "взлом", который я применил для решения проблемы с unbind-key -a. –  Niels Bom 05.12.2012, 17:42
  • 4
    См. мой ответ для моего решения. –  Niels Bom 05.12.2012, 17:58

Правильное решение (Peter

Таким образом, @peterph дал корректный ответ, который является unbind-key -a который делает следующее: (человек tmux)

Если-a присутствует, все привязки клавиш удалены.

Осуществимое решение

Проблема (для меня) состоит в том, что "все" на самом деле означают все. Включая привязки клавиш tmux идет. Если Вы выполняетесь unbind-key -a управляйте, чтобы tmux немедленно не имел никаких привязок клавиш вообще больше, таким образом, Вы не можете даже ввести командный режим или сделать что-либо в основном.

Моя (довольно ужасная) фиксация для этого следующая:

  • создайте a .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 ключевыми таблицами (насколько я могу сказать), но Вы не можете добавить новые ключевые таблицы.

16
27.01.2020, 19:37
  • 1
    Вероятно, что можно быстро генерировать эквивалент Вашего .tmux.reset.conf путем выполнения tmux list-keys на "чистой" сессии. –  jw013 06.12.2012, 01:31
  • 2
    tmux -f /dev/null -L temp start-server \; list-keys эффективно генерирует значения по умолчанию (хотя необходимо добавить обратную косую черту перед точкой с запятой в ее привязке). –  Chris Johnsen 06.12.2012, 07:40
  • 3
    @ChrisJohnsen Вы могли уточнить начинать-сервер в отдельном ответе? –  Niels Bom 06.12.2012, 10:57

В настоящее время нет никакого прямого способа сбросить ключ, обязательный к его значению по умолчанию; инициализация привязки по умолчанию (в key_bindings_init()) сделан однажды, когда tmux сервер сначала запускается (в server_start()), и нет никакого механизма для сброса единственного ключа.

Для Вашего желаемого сценария, где Вы хотите, чтобы действие определения источника Вашего конфигурационного файла восстановило значение по умолчанию, связывающее, который был ранее переопределен пользовательской привязкой, которая была с тех пор удалена из Вашего конфигурационного файла, метод, который Вы разработали, разумно (хотя, к сожалению, подробный): unbind-key -a, затем восстановите всю привязку “по умолчанию”, затем установите свою пользовательскую привязку (некоторые из которых могли бы переопределить привязку “значения по умолчанию”).

Текущая привязка сервера может быть извлечена с list-keys команда*; это может помочь генерировать/поддержать Ваш предложенный .tmux.reset.conf файл, но Вам нужен способ извлечь привязку по умолчанию, не текущую привязку.

* существуют некоторые ситуации где вывод list-keys не в настоящее время непосредственно применимо: для привязки для точки с запятой нужна ее точка с запятой, которой оставляют с обратной косой чертой, чтобы препятствовать тому, чтобы он был интерпретирован как разделитель команды tmux, и любая привязка, которая имела аргументы, которые использовали двойные кавычки в одинарных кавычках (ни одна из привязки по умолчанию не похожа на это) выйдет как двойные кавычки в двойных кавычках.

Для получения привязки по умолчанию, Вам нужен временный сервер с минимальной конфигурацией (т.е. никакая пользовательская привязка) так, чтобы можно было получить 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, если такой файл существует; путь к этому “файлу конфигурации системы” трудно кодируется и нет никакой опции обойти его (за исключением исправления кода).

Обычно, Вам нужен a new-session управляйте для фактического запуска сервера, но мы не хотим, чтобы любые сессии, просто инициализированный сервер запросили. start-server команда делает просто что: запускает сервер, не создавая сессий.

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

Теперь, мы просто должны добавить нашу команду “запроса” (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 команда является в настоящее время асинхронной относительно последующих команд (управляет, чтобы прибыли после a run-shell команда будет обычно работать перед процессом, порожденным run-shell имел шанс закончиться).

7
27.01.2020, 19:37

Также обратитесь к другим ответам здесь, поскольку они делают хорошее задание объяснения ситуации. У меня есть здесь свой 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
27.01.2020, 19:37

Здесь собраны все остальные ответы в сценарий bash, который автоматически генерирует .tmux.reset.conf из привязок клавиш по умолчанию:

#!/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
6
27.01.2020, 19:37

Я спросил апстрим , что они, похоже, не хотят исправлять это (если кто-то не отправит PR).

Вот мои вручную экранированные ключи списка tmux , полученные через новый экземпляр сервера с помощью

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

ПРИМЕЧАНИЕ: Каким-то образом ответ Ричарда Кука по-прежнему вызывает проблемы с экранированием.

4
27.01.2020, 19:37

Вот подправленная версия ответа Richard Cook's answer для исправления проблем с экранированием на tmux 2.1

#!/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
2
27.01.2020, 19:37

Теги

Похожие вопросы