GrabDuck

Мне 19 и я использую Emacs

:

Здравствуй, сообщество!

Многие мои знакомые считают некрофилией использование Emacs, а некоторые и вовсе о нем не слышали (сказывается возраст, полагаю).

Перед вами статья формата "для личного блога", в которой я очень кратко (upd. текста все равно очень много получилось) опишу, почему я уже полгода (на самом деле больше, но постоянно использую только около полугода) использую Emacs в качестве основного текстового редактора.


Впервые об Emacs я узнал, наверное, из автобиографии Линуса Торвальдса — "Just for fun: The Story of an Accidential Revolutionary". В ней была шутка вроде: "Emacs — отличная операционная система, жаль, что в ней нет нормального текстового редактора".

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

Действительно, если бы меня спросили, как я представляю себе Emacs, я бы ответил: "Это интерпретатор Лиспа, который неразрывно и очень тесно связан с текстовым редактором". Но об этом чуть позже.

Мое первое знакомство с Emacs прошло неудачно. Да, у него достаточно большой порог вхождения, а я был слишком ленив, чтобы перелезть через этот забор. Собственно, дальше установки и просмотра пары роликов дело не зашло.

По итогу сей редактор использовался мною исключительно для набора LaTeX-документов (во время учебы в вузе) и то потому, что он автоматически подхватывал эти документы. Никаких настроек, я пользовался им просто как блокнотом.

Следующий переход был удачным и, полагаю, последним. Устроившись Ruby-джуниором я решил попробовать еще раз. Мой начальник использовал (и, наверное, использует) Emacs, поэтому он меня очень поддержал в этом деле. Даже выделил мне рабочее время на то, чтобы я занимался настройкой текстового редактора (прекрасный руководитель, на самом деле).

Собственно, с тех пор окно Emacs'а не закрывается в моем маке никогда.



Абсолютная настраиваемость

В Emacs можно настроить что угодно. Лично у меня часто болят запястья (туннельный синдром, наверное), поэтому я стараюсь как можно меньше трогать стрелочки и вообще двигать руками (посмотрите, как движется ваша кисть при переходе из позиции печати на стрелки). На самом деле эту проблему я решил с помощью клавиатуры Ducky mini, но меня не совсем устраивает, где находятся arrow-keys (они находятся на okl;, а я хочу на ijkl или на wasd на худой конец).

Собственно, Emacs позволил мне настроить все сочетания клавиш. Теперь я двигаюсь по тексту с помощью Alt + i/j/k/l. Настройка, кстати, никогда не останавливается. Периодически находятся какие-то улучшения/недочеты, так что я добавил открытие конфига на Alt+9.


Автоматизация

Как я уже упоминал, я отношусь к этому текстовому редактору, как к интерпретатору лиспа со встроенным (или прикрепленным) текстовым редактором.

Т.к. большинство (полагаю) читателей Хабрахабра так или иначе знакомы с программированием, вопрос к вам: что для вас является красотой программирования?

Мой ответ на этот вопрос: автоматизация рутинной работы. В одной из компаний, в которых я работал, мне давали задачу на то, чтобы разобрать логи сервера и выдернуть оттуда какую-то инфу.

Пока я выбирал, на чем буду решать задачу, ко мне подошел сисадмин и сказал: "Я тебе скинул логи и заодно скрипт, который выдернет инфу.". Скриптом оказалась одна строчка для баша. Это было прекрасно. В тот момент я открыл для себя Unix-way.

Это было лирическое отступление.Так вот, т.к. Emacs — это интерпретатор Лиспа с одной стороны, то он позволяет *барабанная дробь* программировать.

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


Пример № 1

Мы переписывали шаблоны с ERB на Slim. Нужно было помимо всего прочего поменять двойные ковычки, на одинарные и наоборот. Т.к. файлов много, ситуации разные (не все ковычки нужно было поменять), писать внешнюю программу не имело смысла.

Но ведь я работал с Emacs! В интернете можно было найти множество функций для проведения операции замены пары ковычек, но время было, поэтому решил написать свою простенькую версию:

(defun toggle-quotes ()
  (interactive)
  (let ((saved-position (point))
        (founded-quote nil)
        (converted-quote nil))
    (search-backward-regexp "['\"]")
    (setq founded-quote (string (char-after (point))))
    (setq converted-quote (get-toggled-quote founded-quote))
    (delete-char 1)
    (insert converted-quote)
    (search-forward founded-quote)
    (delete-char -1)
    (insert converted-quote)
    (goto-char saved-position)))

(defun get-toggled-quote (ch)
  (if (equal ch "'")
      "\""
      "'"))

Не обращайте внимание на качество кода, пожалуйста. Суть в том, что оно работает. Если мне нужно поменять пару ковычек, я ставлю курсор в любое место между ними и нажимаю C-' (ctr + ').

Upd. т.к. данный пример вызвал массу неодобрения, нужно, видимо, уточнить задачу.

У вас есть ERB-шаблон. Вы в нем заменяете HTML-теги на Slim-разметку. Помимо всего прочего, надо было (вообще-то, не обязательно, но стоило придерживаться каких-то правил) в строках без интерполяции использовать двойные ковычки и наоборот.
Т.е. переключение ковычек — частный случай из более глобальной задачи. Рутины помимо этого было много, некоторая решалась макросами, но уже на уровне автоматическом, так что и не вспомнишь, как именно они использовались.

Для любителей вима и прочего — если ваш текстовый редактор умеет это делать из коробки, или вы можете предложить более простой путь — ради бога. Это ведь прекрасно!

Я не ставил своей задачей показать, как круто и быстро я умею решать задачи в emacs (для этого есть Emacs Rocks!). Своей задачей я ставил показать, как рутинные задачи могут решаться с помощью текстового редактора. Emacs — мой редактор и он многое может. Я показал, что смог сделать человек, который относительно недавно им пользуется в надежде, что кто-нибудь решит его попробовать. Или хотя бы по-новому взглянет на то, как он пользуется своим текстовым редактором (например, в комментариях я узнал, что у Notepad++ тоже есть макросы, а про то, что пользователи Sublime Text не пользуются сниппетами я упомянул в данном посте).


Пример №2

Что на текущей, что на прошлой работе мы используется Redmine и Git. Причем для фич в гите каждому коммиту дописывается постфикс с номером задачи в Redmine. Каждый раз, когда отписываешься по задаче, стараешься описывать что ты сделал и давать ссылки на коммиты (gitlab, bitbucket).

Есть 10 коммитов. 10 раз делаем "копировать-вставить". Эх....

Код:


(defun close-message(prefix issue)
  (interactive "sPrefix: \nnIssue:")
  (insert (let ((default-directory (file-name-directory (buffer-file-name (other-buffer)))))
            (shell-command-to-string
             (format "git log --pretty=oneline | grep '\#%d$' | tail -r | awk '{ print \"%s\" $0 }'"
                     issue
                     prefix)))))

Немного недоработанная функция, которая использует соседний буфер для определения рабочей директории.

Собственно, пишу префикс типа "https://bitbucket.org/project/commits/" и на выходе получаю список ссылок на коммиты с кратким гит-описанием.

В данный момент использую в связке со своей утилитой redmine_cli. Очень удобно.


Пример №3

Был json с кое-какими данными. Нужно было изменить структуру его структуру: превратить из объекта в массив, некоторые данные удалить и т.д. и т.п.

Мой начальник (все тот же), решил показать мне мастер-класс (т.к. сам я не смог сходу придумать, как решить задачу средствами редактора) и в течение 5-10 минут у него был готов макрос (!!), который для каждой записи делал нужную работу. Собственно, он просто зажал кнопочку запуска макроса и через пару секунд предоставил мне результат.


Пример №4

Нужно было добавить в класс несколько однотипных методов (абстрагивать еще сильнее смысла не было).

Написал временный сниппет (показать не могу, т.к. он был временный и не сохранялся никуда), который сократил количество набираемого текста раза в 4.

Кстати, сниппеты есть во многих текстовых редакторах, но почему-то я почти ни разу не видел, чтобы ими пользовались. А стоило бы.


Зрелость

Старичку Emacs'у уже много лет и вокруг него выросло огромное сообщество.

Если меня интересует какой-либо вопрос, связанный с Linux, и запрос "linux <вопрос>" не дал нужного результата, я добавляю туда слово "ubuntu" или "debian".

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

С Emacs ситуация точно такая же. Огромное сообщество, множество вопросов, множество ответов, огромное количество плагинов почти под любую задачу (даже игры есть!).



Вот, наверное, и все.

Summary:


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

А кто не любит свободу?