◉ Информация актуальна только для macOS.
Проблема
Известная особенность, что комбинации клавиш в которых включена клавиша (Command)
⌘
не передаются в консольные приложения отчего становится невозможным использовать например такие привычные сочетания клавиш для работы с буфером обмена как ⌘ + C
, ⌘ + V
и ⌘ + Z
. А использование соответствующих
⌃ + C
, ⌃ + V
и ⌃ + Z
крайне неудобно из-за физиологических особенностей – клавиша (Control)
⌃
смещена чрезмерно влево.
Даже в документации текстового редактора micro указано, что использование ⌘
не представляется возможными.
Can micro support the Command key on MacOS?
Unfortunately terminals don’t send key events for the Command key so it’s impossible for micro to make keybindings for it.
А в качестве обходного решения предлагается в популярном эмуляторе терминала iTerm2 переназначить ⌘
на функционирование как ⌃
, что автоматически блокирует использование стандартных системных сочетаний вроде ⌘ + Q
для завершения приложения или внутренних сочетаний вроде ⌘ + D
для разбиения окна на панели. По понятным причинам, такой подход неприемлем.
Решение
iTerm2
, как и ряд других терминалов, позволяет назначать действия на любые комбинации клавиш. Трюк заключается в том, чтобы необходимым комбинациям задать команду отсылки escape-последовательности которую и привязать к необходимому действию.
Для этого переходим в настройках профилей на вкладку Keys
, на вкладке General
удостоверяемся что Left Option key
выбрана как Esc+
и на вкладке Key Mappings
добавляем новую комбинацию которой в качестве действия выбираем Send Escape Sequence
.
В качестве последовательности удобно использовать собственно наименование действия, как в примере на снимке окна для комбинации ⌘ + V
это cmdpaste
.
Теперь откроем файл настроек micro
для горячих клавиш, по умолчанию это ~/.config/micro/bindings.json
и добавим нашу новую комбинацию к которой привяжем команду Paste
:
Здесь нужно отметить, что \u001b
означает ESC
, поэтому данный символ обязательно должен быть указан перед каждой последовательностью.
Теперь, если запустить micro
, то комбинация ⌘ + V
будет вставлять текст из буфера обмена.
Дополнительно
Если текущая раскладка отличается от латиницы, то вместо ⌘ + V
сработает комбинация клавиш ⌘ + М
. Для стандартных GUI приложений подобная ситуация обрабатывается macOS автоматически, но в нашем случае нужно дополнительно внести и эту комбинацию в Key Mappings
.
В iTerm
присутствует баг из-за которого обе комбинации в списке будут отображаться как одинаковые (либо в латинице, либо в кириллице), но не стоит переживать, это лишь проблема с отображением. Для проверки экспортируем настройки в файл и проверим как iTerm
их хранит:
| |
"0x76-0x100000-0x9":
Ещё одна проблема: полный набор всех привычных сочетаний клавиш пересекается с уже предложенными по умолчанию в iTerm
, как то ⌘ + →
(перемещение в конец строки) которое шлет код 0x5
соответствующий ⌃ + E
. Это ряд стандартных сочетаний уходящий своими корнями ещё в Emacs и ставшие своеобразным стандартом. Если переназначить данную комбинацию на отсылку esc-последовательности, тогда в консоли перестанут работать стандартное для macos перемещение и вместо этого будет появляться текст последовательности. И если подобные сочетания можно оставить как есть переопределив их в настройках micro
:
"Ctrl-a": "StartOfLine", // cmd+left
"Ctrl-e": "EndOfLine", // cmd+right
Чтобы узнать, как именно обрабатывается та или иная комбинация клавиш, в micro имеется специальный режим отображающий коды всех событий. Для входа в него нужно ввести команду
raw
(режим ввода команд по умолчанию Ctrl + E; выход Ctrl + Q).
То стандартные системные сочетания вроде ⌘ + V
уже заблокируют нормальную работу с консолью. Дабы избежать подобного поведения совсем, необходимо разделить настройки клавиш для micro
и для всего остального.
Создадим новый профиль который будет применяться при использовании только micro
. Именно в данном профиле будем назначать все необходимые сочетания клавиш. Выбираем профиль (Preferences → Profiles
) который используется у вас как база (обычно это ‘★ Default’) и создаём дубликат (Other Actions → Duplicate Profile
). На вкладке Advanced
включим автоматические переключение профиля указав &micro
в списке Automatic Profile Switching
.
Готово. Теперь данный профиль и все сочетания клавиш будут работать только для конкретного окна терминала и только когда там запущенДля работы автоматического переключения профилей, iTerm должен
быть интегрирован в оболочку.
micro
. При выходе из редактора будет автоматически происходить переключение на профиль по умолчанию. Ниже приведена готовая конфигурация для таких привычных сочетаний как:
⌘+x, ⌘+c, ⌘+v, ⌘+a, ⌘+z, ⌘+⇧+z, ⌘+ч, ⌘+с, ⌘+м, ⌘+ф, ⌘+ы, ⌘+⇧+я, ⌘+←, ⌘+→, ⌘+↑, ⌘+↓, ⌘+⇧+←, ⌘+⇧+→, ⌘+⇧+↑, ⌘+⇧+↓, ⌥+←, ⌥+→, ⌥+⌫, ⌘+⌫
Конфигурация в bindings.json
:
"\u001bf": "WordRight",
"\u001bcmdsave": "Save",
"\u001bcmdundo": "Undo",
"\u001bcmdredo": "Redo",
"\u001bcmdcopy": "Copy",
"\u001bcmdpaste": "Paste",
"\u001bcmdcut": "Cut",
"\u001bcmdsell": "SelectToStartOfLine",
"\u001bcmdselr": "SelectToEndOfLine",
"\u001bcmdselu": "SelectToStart",
"\u001bcmdseld": "SelectToEnd",
"\u001bcmdall": "SelectAll",
"\u001bcmdup": "CursorStart",
"\u001bcmddown": "CursorEnd",
"\u001bcmde": "CommandMode", // replacement for ctrl+e
"\u001bcmdg": "command-edit:goto ", // alternative for ctrl+l
"Ctrl-a": "StartOfLine", // cmd+left
"Ctrl-e": "EndOfLine", // cmd+right
"Ctrl-u": "SelectToStartOfLine,Delete" // cmd+backspace
Готовый к импорту в iTerm
файл (включает стандартные сочетания Natural Text Editing
): micro-keys.itermkeymap
Для импорта, в настройках Profiles → Keys → Key Mappings
в выпадающем списке Presets
выбрать пункт Import
и указать данный файл.