- PVSM.RU - https://www.pvsm.ru -
Когда я только начал использовать Emacs, то он мне показался довольно странным. У меня возникали вопросы вроде: «Почему окна в нём называются фреймами, а вкладки — окнами?» и «Что вообще значит C-x C-s
?»
Но я всё же на него подсел, так как это внушало мне чувство индивидуальности, а уже со временем пришло понимание преимуществ и практичности архитектуры Emacs. Он прост, но невероятно удобен.
И в современных реалиях мне кажется странным, что другие приложения не похожи на него, ведь у этого 50-летнего текстового редактора можно многому поучиться.
Многие современные приложения и сайты предлагают «палитру команд», как правило, вызываемую нажатием ⌘K. Обычно в таких палитрах приводится набор команд и связанных с ними горячих клавиш, а также есть возможность поиска по ним. Вот несколько примеров из Superhuman [1], Linear [2], Sublime [3] и Godspeed [4]:
Палитры команд — великолепны! Они избавляют вас от необходимости помнить каждую комбинацию клавиш или их расположение — просто вызываем палитру и вводим имя нужной команды. Если вы делаете что-либо достаточно часто, то в итоге заучите эту комбинацию.
В Emacs тоже есть подобие палитры команд, вызываемой через M-x, иначе говоря, Meta+X (на современных клавиатурах Option+X):
Только здесь описанный принцип реализован на порядок глубже, так как практически всё в Emacs представляет команду. Обратите внимание на 8073 в верхнем левом углу приведённого скриншота.
Команды здесь используются не только для чего-то специфичного вроде sort-lines
или list-processes
— они для всего. И сюда входят даже самые базовые взаимодействия вроде forward-char
— да, это команда для перемещения курсора на одну позицию вправо.
Когда вы делаете что-либо в Emacs — включая нажатие комбинации клавиш или клик — то по факту просто выполняете команду.
И есть несколько причин, по которым такая архитектура оказывается крайне полезной.
Благодаря архитектуре Emacs, это легко. Так как, по сути, вы всегда просто выполняете команду, то Emacs нужно лишь вести таблицу поиска, в которой каждая комбинация клавиш будет связана с определённой командой (на деле всё чуть сложнее — вам также нужно знать «режим», в котором вы находитесь — но в принципе это так).
Изменение комбинации клавиш — это простое изменение значения в таблице поиска. Ничего особенного или пугающего здесь нет. И ни одна комбинация всё равно не является абсолютно необходимой, так как всегда можно выполнить команду напрямую через M-x
(которую тоже можно переназначить).
Иммутабельная природа горячих клавиш в некоторых приложениях зачастую расстраивает. Порой штатная комбинация вам не подходит, перекрывается глобальной комбинацией или просто отсутствует. И ничего с этим не поделаешь.
В Emacs же внутренняя архитектура по умолчанию обеспечивает возможность редактирования горячих клавиш и не только.
Простейший способ создания скрипта Emacs — это написание новой команды, которая просто выполняет несколько уже существующих. Зачастую такая команда принимает форму макроса, включая в себя серию нажатий клавиш. После создания её можно привязать к горячим клавишам или другой команде, как и использовать через M-x
.
И хотя для этого придётся познакомиться с Elisp, начать можно будет с самого простого синтаксиса [5].
Но есть здесь и одна проблема: вы можете знать, какие комбинации нажимать для тех или иных действий, но откуда вам знать, каким конкретно командам они соответствуют?
И в Emacs на этот случай тоже есть ловкий приём — команда describe-key
. При её выполнении редактор начинает прослушивать нажимаемые вами горячие клавиши, только вместо выполнения связанной с ними команды, он эту команду вам показывает. Собственно, на этом у вас уже есть всё необходимое для начала кастомизации Emacs.
К примеру, у меня часто возникает потребность добавить комментарий TODO:
к следующей строке, поэтому я решил создать для этого отдельную команду. Естественно, я знал, как это сделать с помощью горячих клавиш, поэтому шаг за шагом смог выяснить связанные с ними команды через describe-key
. В итоге, хоть и не без помощи Google, но у меня получилось следующее:
(defun todo-comment-on-next-line ()
(interactive) ;; Ведёт к показу функции в `M-x`
(move-end-of-line nil) ;; Переход к концу текущей строки.
(newline) ;; Вставка символа перевода строки.
(back-to-indentation) ;; Перемещение курсора на текущий уровень отступа.
(insert "// TODO: ")) ;; Вставка текста комментария.
Затем я привязал эту команду к комбинации клавиш и с тех пор регулярно использую.
Мне не пришлось настраивать какую-то сложную среду разработки или изучать дополнительный API. Как это всегда происходит в Emacs, я лишь выполнил серию команд. В этом случае командно-ориентированная архитектура снова себя оправдала.
В большинстве приложений акцент сделан на GUI, и уже на него накладываются горячие клавиши. В Emacs же главную роль играет именно клавиатура. GUI тоже есть, но он здесь вторичен — можно кликать по разным кнопкам, но срабатывать будут команды, точно так же, как через нажатие комбинаций клавиш.
В Emacs нет ничего, что можно было бы реализовать с помощью мыши, но не с клавиатуры.
Я не буду сильно в это углубляться, но сосредоточенное удержание рук над клавиатурой обеспечивает гораздо более плавную и быструю работу, чем в случае периодического отвлечения на манипуляции мышью. Причём в Emacs никогда не нужно выяснять, можно ли что-либо сделать с клавиатуры, нужно лишь найти, как это сделать.
Такая командно-ориентированная архитектура является очень эффективной, и я был бы рад видеть её в основе большего числа современных приложений. Любая программа, предлагающая палитру команд, изначально близка к реализации подобной концепции.
Electron и веб-приложения могут достичь этого за счёт консоли разработчика. Это же доступ к полноценной среде JS-разработки. Закрепите за window
несколько функций API и «вуаля!», любой сможет кастомизировать ваше приложение.
Вот несколько примеров тех возможностей, которые мне бы хотелось реализовать в этой потенциальной консоли разработчика:
Я часто реагирую на последнее сообщение в Slack символом , поэтому мне бы пригодилась такая команда:
function reactWithThumbsUp() {
window.executeCommand('react-to-last-message', ':+1:');
}
В Slack переход в Unreads происходит через ⌘+Shift+A. Я же хочу делать это через ⌘U:
window.setCommandHotkey('jump-to-unreads', 'command+u');
Мне приходит множество писем от людей, которые просят студенческую скидку на одно из моих приложений. В ответ я генерирую код скидочного купона, отвечаю шаблонным сообщением, маркирую его и архивирую. Вот какая мне для всего этого нужна команда:
function respondToStudentDiscountRequest() {
window.executeCommand('insert-template', 'Student discount request');
window.executeCommand('replace-text', '{COUPON_CODE}', window.getClipboardText());
window.executeCommand('send');
window.executeCommand('add-label', 'Discount request');
window.executeCommand('archive');
}
Автор: Bright_Translate
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/415099
Ссылки в тексте:
[1] Superhuman: https://superhuman.com/
[2] Linear: https://linear.app/
[3] Sublime: https://www.sublimetext.com/
[4] Godspeed: https://godspeedapp.com/
[5] самого простого синтаксиса: https://gist.github.com/DanielDe/afe396b5645cbbceae370ce3b6da27e4
[6] Источник: https://habr.com/ru/companies/ruvds/articles/894134/?utm_source=habrahabr&utm_medium=rss&utm_campaign=894134
Нажмите здесь для печати.