Чем хорош Emacs, или Полезные советы современным приложениям от 50-летнего редактора

в 13:01, , рубрики: emacs, godspeed, IDE, linear, ruvds_перевод, sublime, superhuman, Программирование, текстовые редакторы

Чем хорош Emacs, или Полезные советы современным приложениям от 50-летнего редактора - 1


Когда я только начал использовать Emacs, то он мне показался довольно странным. У меня возникали вопросы вроде: «Почему окна в нём называются фреймами, а вкладки — окнами?» и «Что вообще значит C-x C-s

Но я всё же на него подсел, так как это внушало мне чувство индивидуальности, а уже со временем пришло понимание преимуществ и практичности архитектуры Emacs. Он прост, но невероятно удобен.

И в современных реалиях мне кажется странным, что другие приложения не похожи на него, ведь у этого 50-летнего текстового редактора можно многому поучиться.

▍ Всё есть команда

Многие современные приложения и сайты предлагают «палитру команд», как правило, вызываемую нажатием ⌘K. Обычно в таких палитрах приводится набор команд и связанных с ними горячих клавиш, а также есть возможность поиска по ним. Вот несколько примеров из Superhuman, Linear, Sublime и Godspeed:

Чем хорош Emacs, или Полезные советы современным приложениям от 50-летнего редактора - 2

Палитры команд — великолепны! Они избавляют вас от необходимости помнить каждую комбинацию клавиш или их расположение — просто вызываем палитру и вводим имя нужной команды. Если вы делаете что-либо достаточно часто, то в итоге заучите эту комбинацию.

В Emacs тоже есть подобие палитры команд, вызываемой через M-x, иначе говоря, Meta+X (на современных клавиатурах Option+X):

Чем хорош Emacs, или Полезные советы современным приложениям от 50-летнего редактора - 3

Только здесь описанный принцип реализован на порядок глубже, так как практически всё в Emacs представляет команду. Обратите внимание на 8073 в верхнем левом углу приведённого скриншота.

Команды здесь используются не только для чего-то специфичного вроде sort-lines или list-processes — они для всего. И сюда входят даже самые базовые взаимодействия вроде forward-char — да, это команда для перемещения курсора на одну позицию вправо.

Когда вы делаете что-либо в Emacs — включая нажатие комбинации клавиш или клик — то по факту просто выполняете команду.

И есть несколько причин, по которым такая архитектура оказывается крайне полезной.

▍ Любые горячие клавиши в Emacs редактируются

Благодаря архитектуре Emacs, это легко. Так как, по сути, вы всегда просто выполняете команду, то Emacs нужно лишь вести таблицу поиска, в которой каждая комбинация клавиш будет связана с определённой командой (на деле всё чуть сложнее — вам также нужно знать «режим», в котором вы находитесь — но в принципе это так).

Изменение комбинации клавиш — это простое изменение значения в таблице поиска. Ничего особенного или пугающего здесь нет. И ни одна комбинация всё равно не является абсолютно необходимой, так как всегда можно выполнить команду напрямую через M-x (которую тоже можно переназначить).

Иммутабельная природа горячих клавиш в некоторых приложениях зачастую расстраивает. Порой штатная комбинация вам не подходит, перекрывается глобальной комбинацией или просто отсутствует. И ничего с этим не поделаешь.

В Emacs же внутренняя архитектура по умолчанию обеспечивает возможность редактирования горячих клавиш и не только.

▍ Создавать небольшие скрипты Emacs легко и полезно

Простейший способ создания скрипта Emacs — это написание новой команды, которая просто выполняет несколько уже существующих. Зачастую такая команда принимает форму макроса, включая в себя серию нажатий клавиш. После создания её можно привязать к горячим клавишам или другой команде, как и использовать через M-x.

И хотя для этого придётся познакомиться с Elisp, начать можно будет с самого простого синтаксиса.

Но есть здесь и одна проблема: вы можете знать, какие комбинации нажимать для тех или иных действий, но откуда вам знать, каким конкретно командам они соответствуют?

И в 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, я лишь выполнил серию команд. В этом случае командно-ориентированная архитектура снова себя оправдала.

▍ Всё в Emacs можно сделать с клавиатуры

В большинстве приложений акцент сделан на GUI, и уже на него накладываются горячие клавиши. В Emacs же главную роль играет именно клавиатура. GUI тоже есть, но он здесь вторичен — можно кликать по разным кнопкам, но срабатывать будут команды, точно так же, как через нажатие комбинаций клавиш.

В Emacs нет ничего, что можно было бы реализовать с помощью мыши, но не с клавиатуры.

Я не буду сильно в это углубляться, но сосредоточенное удержание рук над клавиатурой обеспечивает гораздо более плавную и быструю работу, чем в случае периодического отвлечения на манипуляции мышью. Причём в 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js