?

Log in

No account? Create an account

емакс, часть 2: восторг - Excelsior — LiveJournal

Aug. 14th, 2011

09:44 pm - емакс, часть 2: восторг

Previous Entry Share Next Entry

емакс, часть 1: первый взгляд
емакс, часть 2: восторг
емакс, часть 3: windows
емакс, часть 4: ретроспектива

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

Вначале я хотел все сделать правильно - пройти туториал, освоить emacs way (например, редактирование текста без стрелочек), но дело продвигалось крайне медленно в силу отсутствия привычки. Дело в том, что емакс появился задолго до того, как сформировались современные стандарты графического интерфейса, поэтому многие вещи для непосвященных вроде меня там кажутся... гм, экстравагантными. Поэтому, я решил сделать хитрее, а именно: адаптировать емакс под мои привычки после вижуал-студии. CUA-мод, undo-tree, tabbar, бессовестный ремап хоткеев сохранения, поиска и так далее - все пошло в дело.

После того, как лед тронулся, дела пошли все лучше и лучше. Когда я перестал спотыкаться на базовых вещах, играться стало гораздо интереснее. Через пару дней даже скобочки перестали казаться вырвиглазным абстракционизмом. По концовке удалось запилить:
1) Мейнстримный флейвор редактирования текста (виджет с деревом файлов, закладки, копипаста, традиционный undo/redo, привычные функции мышки),
2) Поддержку мультимониторности,
3) Простенький механизм проектов (в емаксе проектов нет, поэтому пришлось все делать самому - впрочем, 90% строительных блоков были уже реализованы в сторонних модулях),
4) Интеграцию с основными тулами (sbt для компиляции, git для сорс контроля).



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



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



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

Отдельного восторга заслуживает коллективный разум емаксеров, который нашел миллион способов выполнять самые разные задачи в text-only режиме. Вот, например, диред (dired). На первый взгляд, в текстовом буфере просто-напросто отображается вывод команды ls. Но, присмотревшись, понимаешь, что имена файлов и папок отрендерены гиперлинками и, кроме того, команды перемещения курсора сами прыгают к именам, даже если курсор был в другой части строки. Еще присмотревшись, понимаешь, что обычные кнопки вроде d или r перемаплены на выполнение операций с файловой системой. Дальше замечаешь вещи вроде dired-dwim-target. Скажем, если в двух окнах открыто по инстансу диреда, то диред уже не будет спрашивать куда копировать, а сам догадается, что надо использовать директорию, открытую в другом окне. Удобно - дает мне надежду на то, что со временем удастся-таки найти/написать замену тотал-коммандеру для линухи.



В завершение хочу пожелать каждому когда-нибудь поиграться с емаксом. За страшной маской допотопного гуи и скобочного программирования скрывается прекраснейший тул в моей практике. Даже несмотря на нулевое знание базовых вещей лиспа (например, мне так и не удалось написать лямбду, которая генерирует лямбду), мне удалось нафигачить крайне полезные вещи, которых так не хватало в других редакторах.

Самый большой страх у меня был связан с тем, что придется осваивать на каждом шагу непривычные хоткеи, но его удалось побороть тривиальным образом - просто методично перемаппить часто используемые фичи на удобные сочетания клавиш. Конечно, это неолдскульно и, наверняка, неэкономично с точки зрения движения рук - короче, полный постмодерн, но зато позволило мне сделать первый шаг в использовании емакса, отчего я сейчас невероятно счастлив! =)

Comments:

[User Picture]
From:lionet
Date:August 14th, 2011 06:51 pm (UTC)
(Link)
по поводу "наверняка, неэкономично с точки зрения движения рук" высказаться хочу. У эмакса хоткеи не были спроектированы с учётом эргономичности. Так что если их просто рандомно переопределить, сильно хуже не будет. Поэтому ты не в пролёте, не переживай ;)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 14th, 2011 06:56 pm (UTC)
(Link)
Насчет эргономичности у меня отдельный загон. Как научился печатать пяти/шести-пальцевым способом вслепую, так и переучиться не могу на нормальный десятипальцевый. А тут еще с хоткеями загон - читал в инете, как народ говорит, что типа бросайте вы стрелочки, рулят C-b/C-f и товарищи. Для меня это вообще взрыв мозга. Впрочем, когда-нибудь дойдет дело и до тесного знакомства с клавиатурой.
(Reply) (Parent) (Thread)
[User Picture]
From:lionet
Date:August 14th, 2011 07:14 pm (UTC)
(Link)
C-b/C-f не рулят, это иллюзии у них. Рулят hjkl от vi.
(Reply) (Parent) (Thread)
[User Picture]
From:Sergey Lilo
Date:August 15th, 2011 06:38 am (UTC)
(Link)
>C-b/C-f не рулят, это иллюзии у них. Рулят hjkl от vi.
Не могу согласиться. Emacs`овые комбы хотя бы можно понять (back, forward, next, prev). HJKL же полнейшая шиза. Ну зачем заставлять пользователя сдвигать правую руку с "jkl;"? Сделали хотя бы как в Квейке - WASD, было бы разумнее, имхо :)
(Reply) (Parent) (Thread)
[User Picture]
From:lionet
Date:August 15th, 2011 06:51 am (UTC)
(Link)
hint: сдвигать не надо, ибо h не используется.
(Reply) (Parent) (Thread)
[User Picture]
From:Sergey Lilo
Date:August 15th, 2011 07:15 am (UTC)
(Link)
>ибо h не используется.
Довольно активно используется.
Как твой курсор налево ходит? )
(Reply) (Parent) (Thread)
[User Picture]
From:lionet
Date:August 15th, 2011 06:45 pm (UTC)
(Link)
'b' гораздо быстрее и эргономичнее, чем 'h'.
(Reply) (Parent) (Thread)
[User Picture]
From:logn_sk
Date:August 14th, 2011 11:18 pm (UTC)
(Link)
>адаптировать емакс под мои привычки после вижуал-студии. CUA-мод, undo-tree, tabbar,
не хорошо это,
эх, первые шаги к разочарованию.
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 15th, 2011 04:03 am (UTC)
(Link)
Какому разочарованию? Объясните, пожалуйста.
(Reply) (Parent) (Thread)
[User Picture]
From:logn_sk
Date:August 15th, 2011 11:19 am (UTC)
(Link)
Нужно привыкнуть к стандартным емаксовым хоткеям, не нужно переделывать емакс под вижуал студию.
Потом всё это надоест, особенно если начать работать на других машинах, где емакс не настроен под Вас. Емакс требует привыкания. при настройке нужно добавлять функционал, но стараться много не изменять уже настроенного.
Когда я осваивал емакс, я просто верил, что его написали люди умнее меня, и они знают как лучше =)
(Reply) (Parent) (Thread)
[User Picture]
From:superbobry
Date:August 16th, 2011 07:07 pm (UTC)
(Link)
Мне кажется это скорее релевантно для vi -- который де факто есть везде, а емакс как раз можно настроить под себя, потому что все равно вероятность, что он стоит где то еще (например на каком нибудь далеком сервере), довольно низкая.
(Reply) (Parent) (Thread)
[User Picture]
From:cd_riper
Date:August 15th, 2011 06:12 am (UTC)
(Link)
время можно тратить и с большей пользой :)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 15th, 2011 07:24 am (UTC)
(Link)
можешь объяснить подробнее? 1) красноглазие не рулит, 2) красноглазие рулит, но в данном конкретном случае результат не впечатляет, ибо <...>, 3) емакс не рулит, ибо <...>. который из вариантов?
(Reply) (Parent) (Thread)
[User Picture]
From:cd_riper
Date:August 15th, 2011 07:27 am (UTC)
(Link)
я понимаю, что тебе вся эта история в кайф. ты просто получаешь фан. а заодно и LISP подтянешь...

но мне кажется, тратить столько времени на настройку редактора -- не очень рационально.
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 15th, 2011 07:48 am (UTC)
(Link)
в емакс я полез, по большому счету, из-за того, что для скалы нет ни одного нормального IDE (эклипс тормозит, идея виснет, нетбинс недостаточно функционален). программировать в одном из местных блокнотов (я использовал gedit) и консоли для sbt/git тоже как-то не очень - я попробовал поработать так недельку и не впечатлило.

а со скалой мне еще жить и жить. причем не с обычной скалой, а с особенной. так что в данном случае я надеюсь через некоторое время параллельно с работой запилить что-то вроде mini-ide с семантической навигацией и рефакторингом для этой не совсем обычной скалы. понятно, что весь функционал я реализовывать не буду - по опыту использования того же решарпера мне надо от силы пару фич. кроме того, у скалы есть т.н. presentation compiler, т.е. штука, которая на лету парсит код и выдает типизированный AST. все равно сложно, да, но уже в пределах досягаемости команды из одного человека. кое-что уже сделано добрыми людьми (ensime), поэтому с нуля писать не придется. соответственно, эта неделя - первый шаг.

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

впрочем, общее впечатление у меня оптимистичное. вот, например, только в 2010й студии появилась поддержка нескольких мониторов, а в емаксе я ее нафигачил за час-полтора. "нафигачил" в плане сделал хоткей, который текущее окно переносит на другой монитор, с автоматическим созданием нового окна, если надо, ну и так далее еще пару мелочей. или та же интеграция с билд-тулом. заняла много времени, но на выходе удобнее, чем то, чем я пользовался в студии.

Edited at 2011-08-15 08:02 am (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:alexott
Date:August 15th, 2011 08:45 am (UTC)
(Link)
я бы посоветовал посмотреть на CEDET - если сможете его скрестить со скалой, то автоматом получится поддержка скалы в ECB (emacs code browser), ну и проекты в EDE, и т.д.
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:August 15th, 2011 09:54 am (UTC)
(Link)
спасибо. есть еще ENSIME - с ним тоже хотелось бы разобраться, чтобы не изобретать велосипед, но это уже следующий шаг.

кстати, вроде бы уже есть интеграция скалы в ECB через етаги, если я не ошибаюсь. впрочем, сам не проверял - на этой неделе я специально не смотрел языковые фичи, чтобы совсем не закопаться.
(Reply) (Parent) (Thread)
[User Picture]
From:Sergey Lilo
Date:August 15th, 2011 06:49 am (UTC)
(Link)
Пара советов:
- пройди туториал и освой стандартные хоткеи — потом будет меньше сюрпризов со всякими разными режимами.
- не назначай анонимные функции на комбинации клавиш, на хуки и в подобных местах.
- (scroll-bar-mode -1)
- (menu-bar-mode -1)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:August 15th, 2011 07:30 am (UTC)
(Link)
Менюбар у меня обычно отключен (как на первом скриншоте). На остальных я его специально оставил включенным, чтобы в кадре было больше деталей. Насчет скроллбаров спасибо - надо будет попробовать, хотя не хочется отвыкать от того, что видишь в каком примерно месте файла находишься.

Почему не стоит в описанных местах юзать лямбды? Я могу представить себе причину, почему не надо использовать лямбды в add-hook - ибо код добавления хука может случайно выполниться два раза и потом будет два одинаковых хандлера. А что не так с установкой биндингов?
(Reply) (Parent) (Thread)
[User Picture]
From:alexott
Date:August 15th, 2011 08:43 am (UTC)
(Link)
именованные функции легче изменять. обычный workflow следующий - захотел что-то изменить в поведении функции, изменил код, вычислил тут же, биндинг автоматом вызовет уже измененую функцию. то же самое и с хуками
(Reply) (Parent) (Thread)
From:(Anonymous)
Date:August 15th, 2011 12:53 pm (UTC)
(Link)
Просто по прошествии некоторого времени везде будет по лямбде и будет сложнее ориентироваться во всех хуках и хоткеях. Кроме того, добавив лямбду в хук её становится сложно оттуда удалить - имени то нету по которому удалять. Опять же у лямбд документацию сложнее посмотреть и тд.

Но в хуки таки можно добавлять лямбды и дважды они выполнятся не будут так как add-hook это контролирует.
(Reply) (Parent) (Thread)
[User Picture]
From:alexott
Date:August 15th, 2011 06:53 am (UTC)
(Link)
в сторону проектов можно посмотреть на EDE из CEDET - мне кажется, что это хорошая основа для дальнейшей работы
(Reply) (Thread)
From:zeuhl-mode.blogspot.com
Date:August 15th, 2011 04:45 pm (UTC)
(Link)
> Удобно - дает мне надежду на то, что со временем удастся-таки найти/написать замену тотал-коммандеру для линухи.

Уже есть... и даже лучше (как mc но на основе dired): http://www.emacswiki.org/emacs/Sunrise_Commander

Что касается биндингов, я использую сочетания на основе ErgoEmacs (http://code.google.com/p/ergoemacs/). Помимо того, что они эргономичнее стандартных Emacs'овских и общепринятых, они также легко запоминаются.
(Reply) (Thread)