ErgoEmacs — a way to Lisp

Если вы получаете удовольствие от программирования, то, наверняка, перманентно находитесь в состоянии поиска лучших инструментов, лучших идей, лучших решений. И знаете, конечной остановкой лично для меня стал Emacs. А точнее — его сборка под названием ErgoEmacs. Под катом будет попытка логического и последовательного рассказа об использовании данного текстового редактора в контексте знакомства с ним впервые в жизни (не вдаваясь в сильную конкретику, а скорее стараясь уловить общую идею); идеологическая пропаганда (емакса вообще и лиспа в частности); небольшая критика последней из статей на Хабре по данной тематике, а также небольшое философское заключение. Если вы хотите расширить свой кругозор, прошу под кат.

Предисловие


Данную статью я решил написать после прочтения этой потому, что если бы я не использовал Emacs, то ничего бы не понял (из статьи, на которую приведена ссылка), а если бы использовал, то понял бы, что если бы не использовал, то ничего бы не понял. Статься написана бессистемно, используя простую компиляцию (фактологического материала, ссылок на ресурсы и собственного .emacs [файла настроек]), что явно не поспособствует привлечению в наши ряды новых адептов. Попробуем исправить ситуацию.

1. Предварительные сведения


Итак, изначально предполагается, что вы:

  • Пользователь Windows (я опишу некоторые подводные камни при установке Emacs именно на этой ОС). Если вы используете Linux или Mac, то, к сожалению, разбираться с возникающими сложностями при работе с редактором (если они конечно будут) вам придется самим.
  • Свободно владеете слепым десятипальцевым методом набора текста. При невыполнении данного условия, целесообразность перехода на Emacs и его использование стремится к нулю.
  • Любите программировать. Если программирование просто ваша работа и вы не стремитесь получить от нее удовлетворение или удовольствие, то вам нужно переосмыслить жизнь Emacs ни к чему
  • Знаете (любите) Lisp. Это скорее пожелание, нежели требование, но, как мне кажется, любовь к Лиспу (или хотя бы его знание, или же стремление его изучить), в некотором роде, является определяющим фактором при выборе этого редактора. Хотя, это сугубо мое личное мнение и оно не является догмой (в отличии от предыдущих двух пунктов)


2. Почему Emacs?


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

  • Управлять курсором (в рабочем поле редактора) с клавиатуры (не отрывая рук и не меняя положения 8 пальцев из 10)
  • Относительно легко (в сравнение с любыми IDE) автоматизировать, перепрограммировать, настраивать и создавать что угодно (новые пункты меню, «биндинг» клавиш, функции, макросы, автокомлит, расширения и т.д. и т.п.)

Вообще говоря, это все из действительно объективных показателей полезности (кроссплатформенность, нетребовательность к аппаратным ресурсам и прочее я в расчет не беру, так как от этого мало толку, учитывая некоторую сложность при изучении программы). Но, с моей точки зрения, и исходя из моего опыта пользования редактором, двух описанных пунктов вполне достаточно, чтобы начать получать максимальное удовольствие и удобство в процессе работы (даже пусть и после некоторого потраченного времени на освоение возможностей Emacs).

Дополнительные бонусы появляются, если вы программируете на Common Lisp. Устанавливая Emacs, SBCL, Slime и quicklisp вы, по сути, получаете «нативную» среду разработки. Для Emacs написано огромное количество дополнений разной степени полезности и качества, но в общем и целом для Web-разработки этого хватает с головой. Существует также прекрасный менеджер пакетов и менеджер библиотек, которые существенно облегчат вам жизнь. Есть множество прекрасных тем оформления для комфортной работы.

Но самое главное, в контексте обсуждаемого нами вопроса, это то, что есть умные китайцы. И один из них, по имени Xah Lee (старый, прожженный емаксер), создал сборку Emacs, «перебиндив» почти все активно используемые сочетания клавиш (а в базовом емаксе, они, мягко говоря, не удобные и не очевидные), добавил некоторые пункты меню и установил море нужных (в каждом хозяйстве) плагинов и с десяток тем оформления. Назвал он все это дело ErgoEmacs?, тонко намекая будущим пользователям на то, что его сборка «несколько удобнее», чем базовый редактор. Я считаю, что первоначальное знакомство (да и все последующее в принципе тоже), нужно начинать именно с этой сборки. И главной причиной тому является простота освоения (и пользования) программой, по сравнению с установкой базовой версии (дело и в сочетаниях клавиш, и в сэкономленном времени на установку и настройку плагинов, и в прекрасном «туториале» для этой сборки). Также высока вероятность того, что юный адепт не плюнет в экран монитора и не закроет этот сложный и не понятный редактор, как это обычно бывает в случаях, когда морально (умственно, идейно) не подготовленный человек устанавливает Emacs.

3. Подводные камни при установке ErgoEmacs на Windows


  • Создайте перед установкой редактора системную переменную HOME, значением которой должен являться адрес одноименной папки, созданной заранее в корне системного раздела диска:

  • Зайдите в свойства папки HOME во вкладку безопасности и дайте себе (как пользователю, а не как администратору) все права на действия с папкой, а также сделайте себя (как пользователя, а не как администратора) владельцем этой папки:


  • Устанавливайте ErgoEmacs
  • Не запускайте. Проделайте все тоже самое (права, владелец) с папкой, в которую установили редактор
  • Создайте в папке HOME файл ".emacs"
  • Запускаете редактор, выбирает тему оформления, выбираете дефолтный шрифт, сохраняете настройки (все можно сделать через меню)

На этом базовая настройка емакса, в принципе, закончена. Можете начинать экспериментировать и творить. Крайне рекомендую почитать туториал на сайте проекта, выучить основные комбинации клавиш (для перемещения курсора, к примеру, зажмите Alt и нажимайте J, K, L, I). В сборке, по умолчанию, вместо комбинации клавиш «M-x» предусмотрена комбинация клавиш «M-a» (где М это Alt). Посмотрите хотя бы первые три (самые основы) лекции подкаста Дмитрия Бушенко. Также можете ознакомится с творением того же Дмитрия Бушенко в соавторстве с А. Оттом «Programming Emacs for Editting and Refactoring Code», в котором дается база программирования emacs lisp. Надумаете создать из Emacs среду разработки для Common Lisp — следующее видео в помощь. Купите эргономичную клавиатуру. И будет вам счастье.

4. ErgoEmacs — a way to Lisp


Собственно статья эта не об ErgoEmacs (хотя большая ее часть было именно о нем). Она о Лиспе (точнее о современном диалекте этого языка — Common Lisp). Потому как, на мой взгляд, заставить человека использовать даже ErgoEmacs (не говоря уже о базовой версии этого редактора), крайне тяжело без веской на то причины. И главной причиной был и всегда будет Lisp. Если ты любишь Lisp — ты программируешь в Emacs. И это утверждение не нуждается в доказательстве.
В конечном итоге, последней инстанцией, определяющей выбор той или иной идеи (языка, концепции, теории, веры) является понятие «красоты». Нет более страшного оскорбления для физика, к примеру, чем сказать ему о том, что его теория не красива. Рефлексивность нашего мышления и не возможность абсолютного обоснования чего бы то не было (в основе любого метода лежит некоторая аксиоматическая часть, которая принимается «на веру» [бездоказательно]) «вынуждают нас видеть красоту» в симметрии и/или в самоподобии (к примеру). Лисп в этом плане, на мой взгляд, самый красивый и выразительный язык. Он отражает способ и принцип нашего мышления (что, собственно, и не удивительно, ведь создавался этот язык для исследования искусственного интеллекта).

Да, Лисп потерпел рыночный крах и как язык системного программирования, и как прикладного, а Lisp-машины стали экспонатами музеев. Но вина ли в этом Лиспа? Я думаю, что нет. Не буду углубляться в историю компании Symbolics, Inc., самого крупного игрока на рынке lisp-машин, системного и прикладного программного обеспечения, написанного на Лиспе, но одним из ключевых инженеров этой компании был некто иной как Ричард Столмэн — бог современных линуксоидов и основатель Free Software Foundaion. Столмэн по идейным соображениям ненавидел идею коммерческого ПО и воровал код из Symbolics, копируя его в бесплатный продукт MIT. Когда же это вскрылось, он послал e-mail в компанию и угрожал взорвать динамитом. И смешно, и грустно. Это одна из более-менее конкретных причин краха Лиспа. Но она далеко не ключевая, на мой взгляд.

Корень проблемы в идеологии современного общества. Лисп был на пике популярности во время бума исследований в области искусственного интеллекта и создания экспертных систем. Когда человечеству надоело заниматься развитием, а захотелось получать наслаждение (продавая и покупая), то и Лисп ушел со сцены. Он стал не нужен. Он артефакт современного общества — предмет уникальный и обладающий особыми свойствами, но практически не использующийся по прямому назначению в следствии своей сложности (в изучении, воспроизведении) и отсутствия задач соответствующего масштаба.

Тем не менее, это не умаляет мощности, красоты и выразительности языка, а так же его гомоморфности человеческому интеллекту.

P.S.


Если кому-то интересен мой .emacs, то вот он.
.emacs
(add-to-list 'load-path "~/.emacs.d/")
(add-to-list 'load-path «C:/slime»)
(add-to-list 'load-path «C:/sbcl/sbcl.exe»)
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")

(load (expand-file-name "~/quicklisp/slime-helper.el"))
;; Replace «sbcl» with the path to your implementation
(setq inferior-lisp-program «C:/sbcl/sbcl.exe»)

(setq show-paren-style 'expression)
(show-paren-mode 2)

(menu-bar-mode 1)
(tool-bar-mode -1)

(setq make-backup-files nil); Don't want any backup files
(setq auto-save-list-file-name nil); Don't want any .saves files
(setq auto-save-default nil); Don't want any auto saving

(set-language-environment 'UTF-8)
(setq default-buffer-file-coding-system 'utf-8-unix)

(require 'slime)

(setq slime-net-coding-system 'utf-8-unix)

(slime-setup '(slime-fancy))

(setq lisp-indent-function 'common-lisp-indent-function)

;; built-in
(require 'ido)
(ido-mode t)
(setq ido-enable-flex-matching t)


;; built-in
(require 'bs)
(setq bs-configurations
'((«files» "^\\*scratch\\*" nil nil bs-visits-non-file bs-sort-buffer-interns-are-last)))

(global-set-key (kbd "") 'bs-show)

(require 'sr-speedbar)
(global-set-key (kbd "") 'sr-speedbar-toggle)

(when (>= emacs-major-version 24)
(require 'package)
(package-initialize)
(add-to-list 'package-archives '(«melpa». «melpa.milkbox.net/packages») t)
)

(global-set-key (kbd "") 'other-window)
(global-set-key (kbd "") 'slime-eval-defun)
(global-set-key (kbd "") 'slime-eval-last-expression)
(global-set-key (kbd "") 'slime-compile-file)

(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(cua-mode t nil (cua-base))
'(custom-enabled-themes (quote (deeper-blue)))
'(show-paren-mode t)
'(tool-bar-mode nil))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:family «Consolas» :foundry «outline» :slant normal :weight bold :height 158 :width normal))))
'(completions-common-part ((t (:inherit default :foreground «red»))))
'(diredp-compressed-file-suffix ((t (:foreground "#7b68ee"))))
'(diredp-ignored-file-name ((t (:foreground "#aaaaaa"))))
'(show-paren-match ((((class color) (background light)) (:background «azure2»)))))

(setq TeX-auto-save t)
(setq TeX-parse-self t)
(setq TeX-save-query nil)
(setq TeX-PDF-mode t)

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 19

    +2
    xkcd://lisp
    +3
    в следствии своей сложности (в изучении, воспроизведении) и отсутствия задач соответствующего масштаба

    Не соответствует действительности. Lisp — самый простой из языков программирования. И в изучении, и в воспроизведении. Проблема Lisp в том, что людям захотелось в какой-то момент времени заниматься математическим моделированием, для чего потребовалось писать сложные формулы. А сложная формула на Lisp — это адский ад из скобочек. Физики и математики к такой записи совсем не приспособлены. А сам LISP не был приспособлен к эффективным операциям с массивами данных. Поэтому, в своё время, Fortran победил Lisp.

    Ну и Lisp достаточно активно используется и сейчас. Scheme, например, в куче систем используется в качестве скриптового языка. Именно по той причине, что он очень простой в реализации.
      –1
      Вы оппонируете контексту статьи, а не сути высказывания. Определение сложности языка (в контексте статьи, да и в принципе) является следствием задач, которые он может решать, а не простотой изучение его базовых конструктов и синтаксиса. Просто или сложно изучить язык Х, к примеру? Это зависит от вашей задачи. Если вы пишете базу данных MP3 композиций в 50 строк, то, наверное, просто. Если же вы создаете экспертную систему в области геодезии, то, наверное, сложно.
      Насчет скобочек я не согласен. Кода на Лиспе читается (и пишется) отступами, а не скобочками. Все скобочки (создающие синтаксические конструкции) за вас поставит редактор. Все скобочки, задействованные в написании самой формулы, будут присутствовать (очевидно) хоть в Си, хоть в Лиспе, хоть в Джаве.
      Насчет Фортрана и Лиспа я дискутировать не готов, но их соперничество, насколько я понимаю, касалось лишь высокопроизводительных вычислений (наука, инженерия), а в какой именно момент Фортран «победил» и что этому поспособствовало я надеюсь узнать от вас.
      +1
      Про Столлмана — желтизна какая-то.

      > Столмэн по идейным соображениям ненавидел идею коммерческого ПО

      Это неверно. Столлман против проприетарного ПО, а коммерциализацию свободного ПО он, наоборот, поддерживает. На gnu.org это уже разжёвывалось неоднократно, например здесь:
      www.gnu.org/philosophy/selling.html

      > и воровал код из Symbolics, копируя его в бесплатный продукт

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

      > статья… о Лиспе (точнее о современном диалекте этого языка — Common Lisp)

      Статья может создать у начинающего ложное впечатление, что Emacs использует Common Lisp и тесно с ним связан. Это неверно: основной диалект лиспа, используемый в Emacs, — это Emacs Lisp, и он является довольно ограниченной реализацией лиспа. Есть пакет cl, но это фактически слой совместимости c Common Lisp, а не реализация.
        0
        Первый раз слышу о том, что он у кого-то в Symbolics что-то воровал и кому-то угрожал. Пытался в одиночку разработать аналог ПО, производимого Symbolics, — это да. Перманентно ругался с Symbolics — тоже да, но на этом всё.
        Касательно Столлмана — информация, действительно, спорная. Первоисточник находится здесь — The Brain Makers. Обсуждение сути вопроса и некоторые интересные детали здесь (так же по этой ссылке в комментариях легкой найти цитату из книги «Хакеры: Герои компьютерной революции» Стивена Леви, в которой приводятся слова самого Столлмана, касательно «копирования» кода). Но если рассуждать здраво (с точки зрения рыночных отношений, корпоративной культуры, этики), то на мой взгляд, Столмман поступал, как минимум, некорректно, по отношению к компании, в которой работал ведущим инженером.

        Статья может создать у начинающего ложное впечатление, что Emacs использует Common Lisp и тесно с ним связан. Это неверно: основной диалект лиспа, используемый в Emacs, — это Emacs Lisp, и он является довольно ограниченной реализацией лиспа. Есть пакет cl, но это фактически слой совместимости c Common Lisp, а не реализация.
        Касательно Common Lispa, вы, пожалуй, правы. Я не акцентировал на этом внимание и впечатление такое действительно может сложится. Другой вопрос, что я не вижу других предпосылок для изучения емакса (что собственно и отражено в названии статьи), кроме как изучения Лиспа (естественно, имеется ввиду Common Lisp) как такового, с последующим использованием оных в работе.
        0
        Не знаю, но меня устраивает ТОЛЬКО консольный Emacs.
        А ключевым в его изучении стала фраза «Чтобы полюбить Emacs его надо возненавидеть»
          0
          удалено
            0
            > Когда человечеству надоело заниматься развитием, а захотелось получать наслаждение (продавая и покупая), то и Лисп ушел со сцены.

            И, конечно, именно прекращение развития вызвало к жизни такие вещи как система типов Хиндли-Милнера, реализованная в ML-языках и в Хаскелле, или зависимые типы, реализованные в Coq, Agda и десятке других систем.

            На самом деле, всё гораздо проще. Лисп банально не оправдал ожиданий. Он обещал многое, но дать сумел гораздо меньше.
              0
              До некоторой степени, вы правы.
              +1
              Статья получилась пессимистичная какая-то.

              Лисп практически во всех своих инкарнациях — очень гибкий язык, и в этом его сложность. Лисп может быть такой, какой нужен программисту. В нем (особенно это верно для Common Lisp) можно работать в любой программной парадигме: процедурное программирование, ООП, функциональное программирование, аспектно-ориентированное программирование, декларативное программирование и т.д. Систему макросов так вообще еще никто не догнал и вряд ли догонит.

              Многие программные продукты появляются сначала на Лиспе в качестве proof of concept, а затем уже переписываются на чем-то другом (см., например, Montezuma). Его рыночная ниша действительно небольшая. Но это и не нужно, т.к. далеко не всегда нужна подобная гибкость. Зачастую лучше взять инструмент попроще.

              Что касается собственно ErgoEmacs, то это скорее вредный продукт. Я им пользовался продолжительное время (что-то около полугода), но потом вернулся на классическую раскладку и ничуть не жалею.
              Во-первых, Emacs, как правило, везде настроен одинаково в смысле клавиатурных сокращений и не всегда есть возможность использовать свой конфиг.
              Во-вторых, и это более значительный факт, большинство пакетов, которые ставятся в Emacs неявно предполагают наличие классической раскладки, т.е. несколько раз у меня было, что в ErgoEmacs пакеты просто отказывались работать из-за клавиш.
              Ну и последнее, раз уж автор упомянул работу с эргономичной клавиатурой. Я достаточно долго уже использую раскладку Dvorak в паре с эргономичной клавиатурой (TypeMatrix). Если при этом еще использовать ErgoEmacs, то клавиши приходится в уме переводить дважды, сначала с Dvorak, затем с ErgoEmacs. Получилось слишком уж мудрено.

              В итоге я вернулся на классический Emacs, постепенно выстраиваю его под себя, а разрекламированный ErgoEmacs снес и больше не вспоминаю.
                0
                Что касается собственно ErgoEmacs, то это скорее вредный продукт.
                Категорически не согласен

                Во-первых, Emacs, как правило, везде настроен одинаково в смысле клавиатурных сокращений и не всегда есть возможность использовать свой конфиг.
                Ну как сказать… Конфиг всегда можно выполнять напрямую в емаксе, без использования инициализирующего файла .emacs. Плюсом всегда есть пакет ergoemacs-mode, который меняет биндинг клавиш стандратного емакса (я могу представить ситуацию, когда на рабочем нет возможности поставить свою программу (ErgoEmacs) условно говоря, но мне тяжело представить ситуацию, когда на работе пресекается установка пакетов для дефолтного емакса). Плюсом весь биндинг клавишь ErgoEmacs можно сбросить до дефолтного через меню (есть несколько вариантов настройки).

                Во-вторых, и это более значительный факт, большинство пакетов, которые ставятся в Emacs неявно предполагают наличие классической раскладки, т.е. несколько раз у меня было, что в ErgoEmacs пакеты просто отказывались работать из-за клавиш.
                Если честно, я плохо представляю себе пакеты «предполагающие» наличие классической раскладки. Более того, я не понимаю сути претензии. Ну перебиндена системная комбинация клавиш запуска команд по имени с классического M-x, на эргономичный M-a (и, естественно, вы в курсе этого). Каким образом это влияет на использование пакетов? И каким образом пакеты, касаются системных комбинаций клавиш (кроме как опосредованно)? Ну в крайней случае можно перебиндить стандартные сочетания клавиш пакета в .emacs. Вообще, честно говоря, желательно привести конкретный пример не работающего пакет, потому как я с таким не сталкивался и в теории не могу себе представить такой ситуации.

                Ну и последнее, раз уж автор упомянул работу с эргономичной клавиатурой. Я достаточно долго уже использую раскладку Dvorak в паре с эргономичной клавиатурой (TypeMatrix). Если при этом еще использовать ErgoEmacs, то клавиши приходится в уме переводить дважды, сначала с Dvorak, затем с ErgoEmacs. Получилось слишком уж мудрено
                Я в некотором замешательстве. Раскладка Dvorak (и клавиатурные сочетания под нее) присутствует в ErgoEmacs (наряду с некоторыми другими), но не используется по умолчанию. Переключение на нее осуществляется через меню за пару кликов.
                  0
                  Не буду оспаривать ваши замечания — я пользовался ErgoEmacs продолжительное время.
                  Есть вещи, которые кажутся удобными, а есть удобные. Вот ErgoEmacs претендует на удобство, но, по сути, не предоставляет его.

                  В ситуации, когда есть необходимость мигрировать между большим количеством компьютеров, ОС, сред и т.д., не все из которых ты можешь настраивать, проще держать минимальную конфигурацию (разных) Emacs и пользоваться ей.
                0
                > Она о Лиспе (точнее о современном диалекте этого языка — Common Lisp)

                Вы что там курите?
                  0
                  А что вас не устраивает?
                    0
                    Поддерживаю
                      0
                      я почему-то всегда думал что только 1 язык имеет право называть современный диалектом чего — либо, но википедия говорит что и clojure и common-lisp — оба современные диалекты. Вообщем был не прав, признаю
                        0
                        Еще есть Scheme. А у Паскаля есть и Object Pascal и Oxygene, хотя пользуются ли им сейчас — не знаю.
                  0
                  Что-то вы батенька в третьем пункте ад какой-то творите. Не проще ли открыть Emacs и (setenv «Home» (getenv «UserProfile»)) M-x eval-last-sexp?

                  Only users with full accounts can post comments. Log in, please.