ErgoEmacs — a way to Lisp

в 10:52, , рубрики: emacs, ErgoEmacs, емакс, Лисп, Программирование

ErgoEmacs — a way to Lisp - 1Если вы получаете удовольствие от программирования, то, наверняка, перманентно находитесь в состоянии поиска лучших инструментов, лучших идей, лучших решений. И знаете, конечной остановкой лично для меня стал 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, значением которой должен являться адрес одноименной папки, созданной заранее в корне системного раздела диска:

    ErgoEmacs — a way to Lisp - 2

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

    ErgoEmacs — a way to Lisp - 3

  • Устанавливайте 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)

Автор: LanKano_CL

Источник

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


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