Logo

Использование (cmd) ⌘ в горячих клавишах

Трюк с передачей сочетаний в консольный редактор micro.

◉ Информация актуальна только для  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:

{
     "\u001bcmdpaste": "Paste",
}

Здесь нужно отметить, что \u001b означает ESC, поэтому данный символ обязательно должен быть указан перед каждой последовательностью.

Теперь, если запустить micro, то комбинация ⌘ + V будет вставлять текст из буфера обмена.

Дополнительно

Если текущая раскладка отличается от латиницы, то вместо ⌘ + V сработает комбинация клавиш ⌘ + М. Для стандартных GUI приложений подобная ситуация обрабатывается macOS автоматически, но в нашем случае нужно дополнительно внести и эту комбинацию в Key Mappings.

В iTerm присутствует баг из-за которого обе комбинации в списке будут отображаться как одинаковые (либо в латинице, либо в кириллице), но не стоит переживать, это лишь проблема с отображением. Для проверки экспортируем настройки в файл и проверим как iTerm их хранит:

$ cat keys.itermkeymap | jq | grep 'cmdpaste' -B 3
    "0x76-0x100000-0x9": {
      "Version": 1,
      "Action": 10,
      "Text": "cmdpaste",

    "0x43c-0x100000-0x9": {
      "Version": 1,
      "Action": 10,
      "Text": "cmdpaste",

Ещё одна проблема: полный набор всех привычных сочетаний клавиш пересекается с уже предложенными по умолчанию в 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 и указать данный файл.