Новый булшит ↑

Последний срач в Google Buzz заставил меня задуматься и поразмыслить насчёт консоли в современных никсах и о больших системах.

Противопоставление разных подходов к интерфейсам и специализация интерфейсов на определенных подходах не дает ничего хорошего. В UNIX эта беда заметнее чем во многих других системах.

Я перепробовал множество минималистичных плиточных оконных менеджеров. Среди них были очень толковые, но ни один из них меня не устроил: все они были слишком зациклены на клавиатуре — большинство из них просто игнорировало мышь как таковую. Это глупость со стороны авторов этих программ — от плиточных оконных менеджеров толку больше всего в связке с мышью, что продемонстрировал iPad, тем более, что основная программа на десктопе современного пользователя — браузер, целиком и полностью ориентирована на мышь.

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

С консолью та же беда. Это может прозвучать глупо, вроде как консоль — она на то и консоль, чтобы быть текстовой, и мышь тут не при делах. Но нет — даже в консоли поддержка мыши очень важна. Трудно отказаться от убойной фичи копирования выделением мыши и вставки по щелчку двумя кнопками. В древней операционке Open Genera для лисп машин в консоли была полная поддержка мыши, графики и гипертекста. Но это было больше 20-ти лет назад.

Консоль в UNIX, в том виде в котором она есть сейчас мало того что практически бесполезна для пользователя (простого пользователя), в большинстве случаев она просто вредна.

Я пользуюсь консолью в Ubuntu 10.04 в пяти случаях:

  1. Запуск mplayer с субтитрами. Это долго и нудно, но smplayer тормозной, а стандартный проигрыватель не поддерживает FullHD.
  2. Перезапуск сбойного pulseaudio. Здесь даже и говорить нечего.
  3. Установка софта через apt. Установка софта через консоль — это очень удобно, тут уж ничего не скажешь.
  4. Работа с git (в большинстве случаев консоли я предпочитаю Emacs, но порой проще через консоль), пакетными менеджерами, системами сборки, etc. Профессиональный софт удобно использовать в консоли, на то он и профессиональный.
  5. Правки из-под sudo в труднодоступных местах. Это уже из области техобслуживания, простой пользователь во внутренности системы не полезет, а игры с sudo опасны. Неосторожный rm -Rf / или даный добрым другом «скрипт для оптимизации системы» может иметь очень нехорошие последствия.

В остальном — от консоли толку нет.

Путь UNIX

А как же классический UNIX-way: скрипты, pipe'ы, и т.п? Только если вы сисадмин или упоротый сисадминистый пользователь, которому настолько нечего делать, что он использует все эти навороченые классические консольные инструменты (за пределами элементарных rm, mkdir, cp, chmod, конечно — эти достаточно просты, чтобы быть полезными).

У меня есть книжка в формате PDF. Я хочу её почитать. Как я сделаю это через интерфейс консоли и через интерфейс командной строки поиска Google в Chrome?

Zsh

  • Надо почитать книжку, для этого надо открыть её.
  • Вот только я не помню где она лежит — надо найти её.
  • Я читал в учебнике для системных администраторов что для этого используется команда find.
  • Чтобы узнать (или вспомнить, потому что правила использования такого навороченого механизма полностью стираются из памяти после использования) надо прочесть мануал.
  • Открываю терминал, набираю:
    man find
    
  • Проходит 5 минут. Как все сложно! Открываем вторую консоль и уже в ней продолжаем:
    find -name "SICP*" -type f -exec evince
    find: отсутствует аргумент у `-exec' 
    

    Результат нулевой — команда набрана неправильно. (Ах, да, пользователю нужно еще знать регулярные выражения).

  • Еще разок:
    find -name "SICP*" -type f -exec evince '{}' \;
    

    Заработало, только вот команду надо запускать всегда 2 раза: если в первый раз найдется 2000 файлов, то это будет кромешный ужас. Опечатки в команде приведут к еще более кромешному — можно тупо просрать все свои файлы. Откатить будет невозможно — в UNIX нет корзины. Find ищет по всей домашней директории, и если у меня 2 Тб всякого говна на винте я представляю, сколько времени она будет искать.

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

Google Chrome

Как эта задача решается в хроме.

  1. Открываем хром.
  2. Открываем новую вкладку.
  3. Печатаем «SICP». Хром выдает список с вариантом «SICP PDF». Дважды вниз, один Enter.
  4. Похоже, 4-ый результат — это то, что надо.
  5. Тык.

Наслаждаемся.

Окей, это заняло около 20 секунд. Никаких чтений мануалов. Пишешь что хочешь — получаешь что хочешь. Это — командный интерфейс для людей.

А теперь у меня возникает вопрос. Если и адресная строка хрома и юниксовая консоль — командные интерфейсы, то почему я должен тратить столько времени, пользуясь юниксовой консолью, чтобы почитать книжку? Если я в десятки раз быстрее сделаю то же самое в хроме.

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

Интегрированные системы

Людям, сведущим в технике, нравятся интегрированные системы (оставим в стороне тех, кому нравится интегрировать системы — привет, пользователи Gentoo (или, прости хосподи, LFS)). Им нравятся минималистичные системы (оставим в стороне программистов на C++ под Windows).

Я могу назвать несколько таких систем.

Chrome
Образцово-показательная минималистичная интегрированная система. Будущая Chrome OS тому подтверждение.
Лисп
Простой, минималистичный язык программирования, в который с завидной легкостью интегрируются любой другой язык программирования. Его любят за это. И ненавидят за скобочки.
Emacs
Emacs — минималистичный? Не смеши меня! — Скажут мне некоторые. Ну или почти все.

Нет, на самом деле Emacs — минималистичный. У него (относительно) небольшое ядро, а все его модули расширения (тысячи их) написаны на лиспе. Другое дело, что Эмакс используется уже несколько десятилетий, и область его применения столь широка, что сравнить её можно, разве что с Chrome OS — потому он довольно большой. Интегрированности эмакса может позавидовать любая другая система, кроме, разве что

Лисп Машина
Emacs некогда был лишь частью лисп-машины, наверное, самой интегрированной системы за всю компьютерную историю. Что и говорить, лисп-машины нравились программистам. И определенно больше, чем им нравится сейчас UNIX.

Когда у гугловского облачного хостинга Google App Engine появилась поддержка Java стало возможным писать для него приложения не только на Java, но и на языках работающих на базе JVM. Для лисперов такая возможность не осталась не замеченной, что отразилось на некотором позитивном бурлении заграничной и негативном бурлении нашей блогосферы по этому поводу. Здравые же лисперы воодушевились опытом автора первого веб-приложения и написали для App Engine своё: https://the-deadline.appspot.com.

В меру сил они поделились советом и кодом с миром, но в целом инфраструктура для написания веб-приложений для GAE на Clojure оставляет желать лучшего. Нет, написать-то можно всё что угодно, и это будет без проблем работать, вот только нужно очень попотеть чтобы собрать мозаику из разрозненных по Сети кусочков кода, тоесть шаблон-заготовку проекта в котором можно будет без проблем использовать все преимущества стиля разработки на лиспе (полноценный REPL в котором работают все оффлайновые инструменты из GAE SDK).

У сообщества еще много дел, а я расскажу о той мозаике, что мне удалось собрать за денек-другой. Результаты мои малы и неутешительны, eно стоят того чтобы поведать о них и избавить заинтересованных людей. По ходу появления в интернетах стабильных приемов работы с GAE, возможно, я буду писать о ней в этот бложик.

На сегодня я могу рассказать лишь о с любовью заготовленном мною файле-конфигурации project.clj пакетного менеджера Leiningen. Этого будет достаточно чтобы приступить к чтению одного из гайдов по написанию гостевой для GAE. В шаблоне я использую свежайшие на сегодня версии необходимых библиотек, ибо это наиболее разумный вариант (правда, со старым софтом в некоторых сетапах проблем гораздо меньше).

Всё просто:

  1. Создаём новый Clojure-проект:
    lein new guestbook
    
  2. Редактируем project.clj до следующего состояния:

  3. Получаем все необходимые jar'ы командой:
    lein deps
    

    В итоге мы имеем:

    Clojure и Clojure-contrib
    Самой последней версии.
    Compojure
    Фреймворк для веб-программирования на Clojure.
    Jetty
    Java HTTP-сервер.
    Ring
    Библиотека на Clojure для работы с HTTP.
    Hiccup
    Библиотека для генерации HTML прямо из лиспокода.
    Enlive
    Библиотека HTML-шаблонов на Clojure.
    Google App Engine SDK
    Библиотеки для работы (онлайн и оффлайн) с Google App Engine. Оффлайновые, перед отправкой приложения в облако следует удалить.
  4. Что делать дальше? Узнаете в каком-нибудь другом блоге.

Сейчас все стало сильно проще:

sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get install emacs23

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

К слову, в предыдущей версии нормального отображения шрифтов можно было добиться только путем выпиливания кучи всякого из /etc/fonts.d.

Конечно же, как только эмакс вышел — мне сразу захотелось поставить свежую версию, но я не нашел на просторах сети ни одного репозитория с 23.2. Дебиановские не в счёт — в Lucid Lynx с ними некоторые проблемы. Пришлось собирать. Рецепт по сборке нашел на эмаксовой вики. Приведу его здесь.

Устанавливаем необходимые для самостоятельной сборки программы:

sudo aptitude install build-essential libxpm-dev libgif-dev libtiff-dev libjpeg-dev libgtk2.0-dev libdbus-1-dev texinfo

Качаем исходники:

wget http://ftp.gnu.org/gnu/emacs/emacs-23.2.tar.bz2

Распаковываем архив, и в директории с исходниками выполняем:

sudo ./configure --with-x-toolkit=gtk --with-xft --prefix=/home/haru/Apps
sudo make
make install

Не то чтоб процесс был черезчур сложен — это скорее заметка для себя на будущее.

Долгие годы верой и правдой служила мне безымянная китайская клавиатура. Не сказать, что она меня подвела — сих пор в идеальном состоянии. Но проходят времена, сменяются эпохи. И вот, со сменой очередной компьютерной эпохи пришла пора сменить клавиатуру. Старый компьютер, вернее, алюминиевый скелет оного, я отнёс на помойку и купил новый черный «кубик» ASRock ION 330 на двуядерном атоме и чипсете NVidia ION — почти идеальное решение для бесхитростного домашнего компьютера.

Всё бы ничего, да вот беда: старую клавиатуру и мышь некуда воткнуть — на нынешних компьютерах нет интерфейса PS/2. На эту проблему я купил переходник-разветвитель типа «два PS/2 в один USB». Как говорится, поменял шило на мыло. Мышь работала исправно. Иной раз, правда, не определялась после загрузки. Клавиатура тоже работала исправно. Но случилось нечто неведомое с обработкой удержания клавиш, что приводило к невозможности нормально поиграть в шутеры и отредактировать текст в эмаксе, потому как у меня Caps Lock с Control'ом поменяны местами и при удержании Caps Lock'а он «срывался».

Делать нечего, пришлось купить клавиатуру. На первое время взял более-менее вменяемую клавиатуру A4 с «косыми» клавишами. Попользовался с недельку, покуда не решил купить таки нормальную.

Над выбором нормальной клавиатуры долго думать не пришлось. Потому что я еще ни разу в своей жизни в глаза не видел нормальной клавиатуры (ну, кроме той старой китайской). Всё что продается в местных магазинах — мусор в широком ценовом диапазоне. Последняя надежда оставалась на интернет-магазины. Залез в интернеты, поскреб по сайтам, в итоге остановился на двух клавиатурах. Маленькой проводной клавиатуре Apple. И клавиатуре Happy Hacking.

Happy Hacking — это воплощение мечты эмаксера. Клавиши с глубоким ходом, ничего лишнего — всё на своих местах. Но дороговато. Продаётся только на амазоне. Так что с доставкой выходит очень приличная сумма.

Я уже давно присматриваюсь к продукции фирмы Apple, поэтому решил взять яблочную клаву. При заказе я выбрал доставку EMS. Стоит она довольно дорого — 700 рублей для доставки коробки весом меньше килограмма из Москвы в пригород Уссурийска (это на другом конце страны). Но оперативность меня ну очень порадовала — через 4 дня ко мне домой курьер занёс белую коробочку с яблоком.

Немного удивился, обнаружив в коробке немного не то, что представлено на картинке на официальном сайте. Клавиша Enter не маленькая и продолговатая, как Shift, а «уголком».

С клавиатурой Apple в Ubuntu Эмакс работает нормально. Сама клавиатура тоненькая и тяжелая. Даже мультимедиа клавиши для управления звуком и открытия привода работают. Отлично. Печатать удобно, но клавиши стрелок такие маленькие, да и PgUp/PgDn нет, вынуждает «правильно» пользоваться Эмаксом: сочетания C-v, M-v, C-d, C-w, C-n, C-p, C-f, C-b используются повсеместно.

В отличие от стандартных виндовых клавиатур, на яблочной нет клавиши Windows (еще бы на их клавиатуре был логотип конкурента), вместо неё — клавиша Alt, а на месте Alt — клавиша Command. Опять таки, малый размер и неудобное положение вызывают неудобство, но оно решается перестановкой Alt и Cmd в Эмаксе:

(setq x-meta-keysym 'super)
(setq x-super-keysym 'meta)

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

Эмакс. Большая и сложная программа. Ему как ничему другому подходит это определение. Эмакс был создан очень давно в лаборатории искуственного интллекта MIT, он несет в себе гены очень своеобразной культуры лисп-хакеров былых времен. С тех пор он не раз переписывался, улучшался, дополнялся и обрастал тысячами расширений в течение десятков лет. Эмакс, если и был когда-то мощным текстовым редактором, сейчас стал некоей универсальной программой, в нём можно делать абсолютно всё что угодно, если это хотя бы немного затрагивает собой задачу отображения или редактирования текста, и даже больше. Людям знáющим универсальность играет на руку, ведь одной программой можно делать тысячу разных дел, при этом не прилагая усилий для переучивания к разным интерфейсам. Людей, впервые запустивших эмакс подобная универсальность и непривычный интерфейс поначалу пугает. Научиться пользоваться эмаксом, понять его идею и проникнуться ею задача непростая, трудоемкая и долгая.

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

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

Всё то время, что я пользовался эмаксом я именно так и поступал: собирал конфиг по кусочкам из тысячи разных мест — форумы, ЛОР, хабр, эмакс-вики, статьи, репозитории с настройками продвинутых пользователей, таких как Alex Ott, и тому подобное. В итоге конфиг разросся до неприличных размеров и превратился в страшную кашу. В общем, всё было плохо пока я не наткнулся на замечательный скринкаст Meet Emacs. В скринкасте автор не усердствует с базовой настройкой, а сразу после установки эмакса копирует в свою директорию .emacs.d репозиторий emacs-starter-kit. Сперва я скептически отнёсся к такому подходу, но попробовав Starter Kit раз, удалив, и попробовав во второй раз я проникся: его оказалось достаточно чтобы просто пользоваться эмаксом, не задумываясь о его серьезных улучшениях. Всё что мне осталось — установить через пакетный менеджер эмакса и операционной системы необходимые мне расширения, да добавить настройки шрифтов и клавиатуры для нетбука и настольного компьютера.

Оригинальный Emacs Starter Kit, ныне «центральный репозиторий» оного — это личный конфиг Фила Хагельберга, собранный им за долгие годы использования эмакса. Сейчас Kit — это сотни форков репозитория и тысячи следящих за ним на гитхабе.

Starter Kit рассчитан на легкую расширяемость пользовательскими настройками и на легкую переносимость конфигурации между машинами пользователя, так что владельцам нескольких компьютеров должно понравиться.

Установка

Установка Emacs Starter Kit элементарна: клонируйте репозиторий с гитхаба в директорию .emacs.d (предварительно сохранив свои старые настройки и удалив .emacs):

git clone http://github.com/technomancy/emacs-starter-kit.git ~/.emacs.d

Вуаля. Запускайте Emacs. (Для работы требуется GNU Emacs версии 22 или выше. С форками вроде XEmacs работать не будет).

Чтобы запустить эмакс с kit'ом на посмотреть — склонируйте репозиторий в какую-нибудь другую директорию и запустите эмакс командой:

emacs -q -l ~/emacs-starter-kit/init.el

Устройство

В директории .emacs.d kit'а есть несколько основных файлов:

.emacs.d/
  ...
  elpa/
  init.el
  starter-kit-bindings.el
  starter-kit-defuns.el
  starter-kit-elpa.el
  ...
  ... и пользовательские
  ...
  haru.el
  haru/
    color-theme.el
    info.el
    irc.el
    jabber.el
  haru-desktop.el
  haru-netbook.el

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

Следующими подгружаются файлы starter-kit-*.el — в них находятся всевозможные дополнительные функции, настройки комбинаций клавиш и режимов для некоторых динамических языков — в общем всё то, что делает эмакс более удобным, чем по-умолчанию.

В последнюю очередь загружаются пользовательские файлы:

  • Файл пользователя — файл с именем текущего пользователя с расширением .el на конце, например, haru.el

    Starter Kit настолько хорош сам по себе, что в этом файле у меня всего лишь одна строка лиспокода, которая включает мою цветовую тему.

  • Директория пользователя — директория с именем текущего пользователя с множеством .el файлов внутри, например,
    haru/
      color-theme-dzhan.el
      info.el
      irc.el
      jabber.el
    

    Я держу в этой директории файлы с настройками режимов — IRC, Jabber, Info, Org-Mode и еще самодельную цветовую тему.

  • Файл с настройками машины пользователя — чтобы узнать имя этого файла достаточно вычислить в эмаксе значение функции (system-name) и добавить .el в конец, например: haru-netbook.el для нетбука и haru-desktop.el для десктопа.

    Я держу в нём настройки дефолтного шрифта и настройку кнопок Alt и Command для яблочной клавиатуры.

Фичи

Emacs Lisp Package Archive

Пакетный менеджер для эмакса. Уже сейчас в больше сотни популярных расширений, автоматически поддерживает зависимости между ними. Элементарен в использовании: M-x package-list-packages, i — отметить для установки, x — установить. Пакеты устанавливаются в директорию ~/.emacs.d/elpa.

Для автоматической установки нужных пакетов при первом запуске эмакса нужно отредактировать переменную starter-kit-packages в файле starter-kit-elpa.el. Мне, например никак без Clojure, и я активно пользуюсь сервисом gist.github.com:

(defvar starter-kit-packages 
  (list 'clojure-mode
        'clojure-test-mode
        'css-mode
        'gist
        'inf-ruby
        'magit
        'ruby-mode
        'slime 
        'slime-repl
        'swank-clojure
        'yaml-mode
        'idle-highlight))

Starter Kit развивается уже очень давно и из elpa-to-submit/, бывает, удаляют код некоторых пакетов, но это ничего — удаленный код перетекает в ELPA. Если с очередным обновлением (я имею в виду pull/merge с «центральным» репозиторием) возникают проблемы — удалите всё из директории ~/.emacs.d/elpa и запустите M-x starter-kit-elpa-install.

IDO

Режим ido (интеллектуальная подсказка, похоже на intelli-sence из продукции Microsoft) везде где нужно — при переключении буферов, открытии, сохранении файлов и прочем. В он очень облегчает выбор вариантов и ускоряет работу в минибуфере.

Еще одна жутко удобная фича — imenu, позволяет прыгнуть к определению символа в исходнике, вызывается по C-x C-i или C-x TAB.

IBuffer

Более функциональная замена стандартной переключалке буферов.

Полоска сбоку

Полоска сбоку, показывающая конец буфера. Очень удобная.

Редактирование под sudo

Раньше для редактирования системных файлов мне приходилось специально запускать vi под sudo. В Kit'е есть функция M-x sudo-edit.

Lambda

Лямбды в лиспокоде отображаются греческими буквами. В исходниках Clojure fn заменяется на ƒ.

Улучшения в режимах динмамических языков

Множество всевозможных удобств для пользователей динамических языков: JavaScript, Emacs Lisp, Clojure, Common Lisp, Ruby, Perl. Сам-то в основном лиспами пользуюсь, поэтому улучшения в режимах лиспа и приведу.

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

Показываются аргументы функций Emacs Lisp'а в минибуфере.

Отключенный графический интерфейс

Нет скроллбара, нет тулбара, нет меню, нет диалоговых окон. Всего этого нет, ибо принесено в жертву экономии движения. Графические элементы управления требуют мышь, а чтобы дотянуться до мыши нужно оторвать руку от клавиатуры, в случае меню еще потратить уйму времени на поиск нужного пункта. От того, что эти элементы управления отключены — от пользователя не убудет — функционал отключеных элементов продублирован в интерфейсе. Во время редактирования если и используются меню, то это меню текущих режимов, а они доступны в полоске modeline. Скроллбар прекрасно заменяется стандартными клавишами для перемещения по буферу и колёсиком мыши. Тулбар же просто не нужен — выполнить любое действие проще через кейбиндинг.

Комбинации клавиш

Честно говоря, комбинации клавиш в Emacs Starter Kit мне не очень нравятся, тем более, что они не сильно отличаются от стандартных. Так что я приведу некоторые свои комбинации (которые можно найти в файле starter-kit-bindings.el в моём форке kit'а на гитхабе.

Сперва, однако, стоит вспомнить о том, что Emacs — древнейшая ныне здравствующая и широко используемая софтина, и оригинальные сочетания клавиш рассчитаны вовсе не на современные PC/Apple/… клавиатуры, а на клавиатуры почивших 20 лет назад лисп-машин (например, в мануале по Zmacs для Ti Explorer 1985 года можно найти те же самые комбинации, что используются сейчас). Вспомнить и принять меры, иначе незадачливый эмаксер рискует стать жертвой «синдрома эмаксового мизинца» — из-за активного использования клавиши Control, которую на современных клавиатурах жуть как неудобно нажимать несколько сотен раз в час. Есть много способов сохранить здоровье своих рук:

  • Самый простой: поменять Caps Lock и Control. Если вы не счастливый обладатель Happy Hacking Keyboard — меняйте, даже не думайте. Я пользуюсь Ubuntu — в ней поменять не проблема — ищите опцию в параметрах системы.
  • Купить нормальную клавиатуру. Из нормальных мне известные, разве что эргономичная микрософтовская клава и клавиатуры Kinesis.
  • Поменять кейбиндинги в эмаксе. Ибо большинство дефолтных — не фонтан. Но особо усердствовать не стоит — сочетания эмакса используются во многих местах, в первую очередь в bash и zsh.

Расскажу о некоторых своих комбинациях:

C-m
Альтернатива клавише Enter. Комбинация особенна полезна как окончание в цепочке, в которой все клавиши нажимаются вместе с Control'ом — чтобы не отпускать его и тянуться к Enter, например я переключаюсь между буферами даже не отжимая Control: C-Tab C-s C-s C-s C-m.

Еще это комбинация полезна как замена M-x: C-x C-m, если до альта долго тянуться.

C-w
Практически во всех эмуляторах терминалов эта клавиша удаляет слово слева от курсора, в эмаксе же она не делает ничего хорошего. Я забиндил на неё удаление слова назад и вырезание региона, если он выделен — это очень удобно, Backspace практически не нужен. Ко всему, M-w копирует выделенный регион.
C-g
Забудьте об Esc. Если что-то пошло не так — это клавиша универсальной отмены.
C-q
Замена C-/. Отмена редактирования. Таким образом ряд сочетаний, который в стандартных оконных системах расположен внизу — C-z, C-x, C-c у меня переезжает наверх — C-q, C-w, M-w. (Если кто подскажет как совместить эту клавишу с C-g — буду очень благодарен).
C-Tab
Обычно я держу очень много буферов и часто между ними переключаюсь. Нажимать для этого двумя руками C-x b — невероятная расточительность.
S-Tab, C-S-Tab
Переход на следующее/предыдущее окно. Быстро и удобно. Таким образом, три клавиши, расположенные вплотную одна-над-другой используются для переключения между буферами.
C-x C-k
Убивать буфер гораздо легче не отпуская клавишу Control — так можно в разы быстрее убить сразу несколько буферов.
C-s, C-r
Эти клавиши привязаны к поиску по регэкспу вперёд и назад. Помнится, один из авторов Макинтоша, Джеф Раскин, положил подобный поиск в основу интерфейса компьютера для работы с текстом Cannon Cat. Это конечно, не Cannon Cat, но тоже ничего.

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

S-Space
Очень умное автодополнение. Иногда достаточно просто раз пять нажать эту комбинацию и программа чудесным образом напишется сама.
M-Space
Переключение между языками. Две легко доступные, вплотную расположенные клавиши — это лучший вариант.
F3, F4, F4
Начало записи макроса, конец записи макроса, вызов макроса.

В статье я расскажу как сделать из Emacs'а удобную среду для программирования на языке Clojure. Рассчитываю на то, что вы используете Debian или Ubuntu в качестве своей операционной системы.

Clojure это современный диалект лиспа. Простой и мощный язык программирования общего назначения с упором на функциональный стиль, широкой поддержкой возможностей для многопоточного программирования и, конечно, родным для лиспа представлением кода как данных и наоборот. Clojure работает поверх виртуальной машины Java и виртуальной машины Common Language Runtime — части пакета Microsoft .NET Framework.

Java

В репозитории есть несколько альтернативных реализаций — OpenJDK и Sun Java — ставим любую на свой вкус, но обязательно последнюю, 6-ую.

sudo aptitude install sun-java6-jdk

Однако, надо соблюсти осторожность при использовании OpenJDK — в swank-clojure есть пренеприятный баг при подключении к java-машине из Slime. Однажды у меня возникла с ним проблема, и дабы разрешить её я использовал следующее заклинание:

sudo sed -i 's/net.ipv6.bindv6only\ =\ 1/net.ipv6.bindv6only\ =\ 0/'  /etc/sysctl.d/bindv6only.conf && sudo invoke-rc.d procps restart

Emacs

Emacs устанавливается командой

sudo aptitude install emacs

В Ubuntu ставится самый последний, 23-ий Emacs, в Debian же, в стабильном репозитории Lenny лежит старый, 22-ой, а свежий нужно ставить из тестируемого репозитория Squeeze или репозитория со снапшотами.

ELPA

Как говорится, Emacs — не только редактор, но и весьма себе неплохая ОС, и как у всякой хорошей оси у него есть свой собственный пакетный менеджер а'ля apt, только устанавливает он специально заготовленные пакеты-расширения эмакса.

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

(let ((buffer (url-retrieve-synchronously
      "http://tromey.com/elpa/package-install.el")))
  (save-excursion
    (set-buffer buffer)
    (goto-char (point-min))
    (re-search-forward "^$" nil 'move)
    (eval-region (point) (point-max))
    (kill-buffer (current-buffer))))

в scratch буфер эмакса, наводим курсор на последнюю скобку, и жмём C-x C-e, чтобы запустить код — он автоматически скачает файл package.el в ~/.emacs.d/elpa/package.el и отредактирует основной файл с настройками ~/.emacs, чтобы менеджер пакетов и всё, что он понаустанавливал потом запускалось при старте эмакса.

Swank-clojure и clojure-mode

Swank-clojure это расширение для Emacs, которое позволяет исользовать в нём Slime на пару с Clojure. А сlojure-mode — это режим эмакса для удобного редактирования исходников на Clojure, он даёт подсветку элементов синтаксиса, ключевых слов и табуляцию лиспокода в лучших традициях. Оба этих пакета ставятся через ELPA и тянут за собой Slime оттуда же как зависимость. Это ничего, но если нужна поддержка других лиспов, будь то Common Lisp или Scheme, надо будет поставить Slime еще и через Git или репозиторий операционной системы.

В Emacs'е откроте список пакетов ELPA

M-x package-list-packages

и выберите клавишей i пакеты (если выбрали не то — клавиша u отменит выбор)

  • clojure-mode
  • clojure-test-mode
  • slime
  • slime-repl
  • swank-clojure

Нажмите x чтобы установить то, что выбрали. Как скачается и установится — можно закрыть Emacs и продолжить.

Запуск REPL'а Clojure с целью поиграться

Собственно, мы установили всё что нужно для того, чтобы запустить Clojure, кроме самой Clojure. Тут нас поджидает приятный момент — всё остальное будет устанавливаться автоматически, без нашего на то вмешательства. Запустим Emacs и поиграем с Clojure в репле командой

M-x slime

по ходу дела в директорию ~/.swank-clojure скачается 3 jar-пакета — сама clojure, стандартная библиотека clojure-contrib и swank-clojure.

Это была всего лишь базовая установка, однако чтобы извлечь из Clojure больше пользы и создать свой собственный проект, а не просто потыкать REPL, нужно установить еще несколько программ, без которых ну никак не обойтись в разработке.

Git

Git — распределённая система управления версиями файлов, созданная Линусом Торвальдсом для управления разработкой ядра Linux. Ко всему она тоже понадобится, ибо большая часть проектов Clojure-коммьюнити, включая саму Clojure, используют эту систему контроля версий, и почти все они хостятся на гитхабе.

sudo aptitude install git-core

Maven и Аnt

Это фреймворки для сборки Java-проектов. Используются как платформа для leiningen.

Установим их

sudo aptitude install ant maven2

Leiningen

Leiningen — это система сборки для проектов на Clojure, созданная, чтобы лисперы не морочили голову с родными для платформы Java системами сборки, которые имеют пристрастие к обильным XML-конфигам, в которых чёрт ногу сломит. В лейнингене Clojure-проект описывается в одном файле на самой же Clojure в виде простой удобочитаемой конструкции. Еще поддерживаются плугины, например, для автодокументации в стиле документации с официального сайта clojure.

Скачайте скрипт

wget http://github.com/technomancy/leiningen/blob/master/bin/lein

и скопируйте его в какую-нибудь директорию, что прописана в пути PATH, лучше всего в /usr/local/bin/, и дайте право на выполнение +x

sudo cp lein /usr/local/bin/lein
sudo chmod +x /usr/local/bin/lein

Лейнинген устанавливает себя сам

lein self-install

И директория ~/.m2 отныне станет кэшем для всех автоматически скачаных jar'ов.

Работа со Slime

Практически вся разработка проекта проходит в REPL'е Slime, и есть несколько способов открыть проект в нём.

Способ первый — использовать команду эмакса c указанием пути к проекту

M-x swank-clojure-project

Способ второй — в директории проекта выполнить команду

lein swank

что запустит REPL на порту 4005, к которому можно будет подключиться из эмакса командой

M-x slime-connect

После подключения получаем REPL Clojure с автоматически установленными Java classpath и да прибудет с нами сила!

Работа с Clojure и Common Lisp

Slime, идущий в поставке ELPA урезан настолько, что годен только для работы с Clojure. Если от эмакса требуется работа с другими лиспами, придется поставить полноценный Slime из git-репозитория

git clone git://github.com/nablaone/slime.git ~/.emacs.d/slime

и прописать в ~/.emacs следующие строки

(add-to-list 'load-path "~/.emacs.d/slime")
(add-to-list 'load-path "~/.emacs.d/slime/contrib")

(setq slime-backend "~/.emacs.d/slime/swank-loader.lisp")

(load "slime-autoloads")

(require 'slime)
(require 'slime-autoloads)

(eval-after-load "slime"
  `(progn
     (slime-setup '(slime-repl))
     (custom-set-variables
      '(inhibit-splash-screen t)
      '(slime-complete-symbol*-fancy t)
      '(slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
      '(slime-net-coding-system 'utf-8-unix)
      '(slime-startup-animation nil)
      '(slime-lisp-implementations '((sbcl ("/usr/bin/sbcl")))))))

что позволит запускать и SBCL и Clojure командами

M-- M-x slime sbcl
M-- M-x slime clojure