Тег «emacs»

Emacs: переключаем раскладку одинаково с ОС

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

К счастью, Emacs, как и всякая уважающая себя ОС, имеет собственный механизм переключения языков, кодировок и прочего. И все это даже работает. Одна беда — нельзя повесить переключение и в системе, и в Emacs на одну и ту же клавишу, потому что система в таком случае тоже будет переключаться. А пользоваться разными сочетаниями в Emacs и вне него… Что ж, я долгое время так и поступал. Неудобно.

Итак, задача:

  1. Хотим переключаться везде по одной и той же клавише. Причем, чтобы если мы нажимаем эту клавишу в Emacs, использовался его внутренний механизм, в остальных случаях пусть этим занимается ОС.
  2. Хотим, чтобы п. 1 работал и в Windows, и в Linux. И желательно чтобы сценарий загрузки был общим.

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

  • убедить ОС не переключаться, пока активен Emacs;
  • после одновременного переключения и в ОС, и в Emacs, переключить ОС обратно.

Оказывается, первый вариант реализуем в Linux, а второй в Windows. Дальнейшее изложение предполагает, что в качестве универсальной клавиши переключения выбран Caps Lock.

Для Linux палочкой-выручалочкой оказывается сочетание SCIM/iBus и xmodmap. С помощью xmodmap можно переназначить Caps Lock на какое-нибудь неиспользуемое действие, например, F13. Для этого в файл ~/.Xmodmap вписываем строку:

keycode 66 = F13

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

Дальше убиваем системную переключалку раскладок (без особых зверств), и настраиваем SCIM/iBus на переключение по F13, а затем отключаем переключение для Emacs, вписывая в ~/.Xdefaults строку:

Emacs*useXIM:false

Теперь остается только подправить стартовый сценарий Emacs (.emacs или init.el), вставив туда:

(global-set-key [f13] 'toggle-input-method)

Выходим из сеанса, входим обратно, тратим еще пару часов на доработку напильником, и все заработает. Для Linux это все. Я намеренно опустил некоторые подробности про настройку SCIM/iBus, поскольку времена меняются, и старые инструкции становятся устаревшими. А тут я как бы не причем: «настройте iBus на переключение по F13» еще долго не устареет. В конце концов, гугл никто не отменял. Идея использовать SCIM и его аналоги не новая, об этом много где можно прочитать.

В Windows такой фокус не пройдет, но зато один вдумчивый камрад предложил очень изящное решение (ссылка не работает?..), которое упомянуто выше: после переключения вернуть системную раскладку обратно. (Для установки Caps Lock в качестве клавиши переключения системной раскладкой нужно воспользоваться чем-то вроде lswitch или лезть в реестр.)

Теперь остается только вооружиться переменной system-type, и получим сценарий, который кроссплатформенно решает нашу задачу:

(if (eq system-type 'windows-nt)
    ((defvar safe-language-change-flag nil)
     (defun safe-language-change ()
       (interactive)
       (setq safe-language-change-flag (not safe-language-change-flag))
       (when safe-language-change-flag
         (toggle-input-method)
         (w32-toggle-lock-key 'capslock)))
     (global-set-key (kbd "<language-change>") 'safe-language-change))
  (global-set-key [f13] 'toggle-input-method))

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

УжасноПлохоНормальноХорошоОтлично (1 голосов, средний: 5,00 из 5)
Loading ... Loading ...

Emacs как редактор по умолчанию в Windows

С новым годом, кстати.

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

Что бы там ни говорили, а Emacs невыгодно отличается от своих аналогов долгим временем начальной загрузки, особенно если в процессе оной грузится пара десятков дополнительных модулей. Но если для открытия файлов, скажем, *.el, назначить файл runemacs.exe редактором по умолчанию, то попытка открыть несколько файлов приведет к открытию равного количества экземпляров Emacs, со всеми вытекающими задержками и издержками. Мы же хотим, чтобы было как в Notepad++: редактор запускается один раз, и дальше все файлы открываются в нем.

Как сказал один емаксер, «учитесь любить Emacs Server». Учимся:

  1. типы файлов, которые хотим открывать Emacs’ом, ассоциируем с %EMACSDIR%\bin\emacsclientw.exe;
  2. создаем переменную окружения ALTERNATE_EDITOR="%EMACSDIR%\bin\runemacs.exe";
  3. в начало файла .emacs (или init.el, у кого что) вставляем:
    # run emacs server
    (server-start)

Теперь когда мы открываем файл, emacsclientw пытается найти запущенный Emacs-сервер. Если не находит, обращается к альтернативному редактору (runemacs), который открывает файл и запускает сервер. Если же сервер уже запущен, то файл просто открывается в новом буфере.

УжасноПлохоНормальноХорошоОтлично (2 голосов, средний: 5,00 из 5)
Loading ... Loading ...

Plan 9: man emacs

Ржал в голос: http://cm.bell-labs.com/magic/man2html/1/emacs

Про vi тоже интересно.

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...

Eclipse vs. Emacs

Без сомнения, Emacs — лучший текстовый редактор  из тех, что мне доводилось видеть. После некоторого периода адаптации и допила производительность труда возрастает фантастически. Но только если выполняются два условия:

  1. работа выполняется с отдельными файлами, не объединенными в проект;
  2. узким местом производительности является именно ввод или редактирование текста, а не мыслительный процесс.

Проблема в том, что в случае разработки ПО не выполняются оба условия. Программы, компилируемые из одного файла с исходниками, остались где-то на первом курсе. А что касается второго — если вы придумываете код быстрее, чем можете его написать, значит вам определенно стоит больше думать над кодом. Например, моя лично производительность редко когда поднимается выше пятидесяти строк в час — я имею в виду полностью завершенный код, покрытый тестами, проверенный и снабженный комментариями. Каждая недодуманная минута сейчас оборачивается в дальнейшем часами головной боли при отладке. Так что я предпочитаю писать код медленно, но верно. Получается, не поверите, быстрее.

С проектами в Emacs все ужасно. Особенно с программными проектами. Есть мощнейшие режимы и модули, призванные сделать из текстового редактора полноценную IDE — etags, semantic, ecb, cedet, ede… Масса возможностей, множество путей расширения и настройки, но… Довольно быстро понимаешь, что это напоминает попытку Linux пробиться на десктопы домохозяек. Разработчики пыжатся, пытаются реализовать функциональность «больших» IDE, «догнать и перегнать», но выходит, что все это не повышает производительность, а снижает ее.

Я честно больше двух месяцев пытался настроить cedet и ecb под свои нужды, писал свои функции, часами рылся на емаксовых сайтах. Единственный положительный эффект — относительно неплохо выучил elisp, хотя многие сочтут это сомнительным достижением. Короче говоря, для проектов Emacs непригоден.

Поэтому я вернулся в Eclipse. И вскоре обнаружил там вот такое:

Eclipse Keys Preferences

И правда, привязка базовых операций как в Emacs! Но моя радость была недолгой: мозг решительно воспротивился использованию привычных, казалось бы, комбинаций, в «некошерной» IDE. Я постоянно нажимал не туда, портил исходники, плевался и ругался. Кроме того, все мои любовно написанные elisp-функции и нестандартные привязки, понятное дело, в Eclipse не перетащишь. Поэтому я вернул все на место.

Теперь работаю в Eclipse. Комфорт разработки заметно вырос.

УжасноПлохоНормальноХорошоОтлично (2 голосов, средний: 2,50 из 5)
Loading ... Loading ...

ebib’лиотекарь

Все началось с того, что я подсел на emacs. Путь юного джедая был долог и тернист, но в конце концов я вынужден был согласиться, что да, иногда emacs оказывается эффективнее, чем другие редакторы и IDE. И что если уж подсел — то все, организм начинает отторгать все остальное. Не иначе как специальный гормон начинает вырабатываться, вызвающий эйфорию при пользовании emacs и депрессию вместе с неконтролируемыми вспышками гнева — во всех остальных случаях. А уж какие ощущения емаксист испытывает при редактировании своего ~/.emacs, не стоит даже и пытаться описывать…

Нет, конечно, с первого раза он мне не понравился. И со второго, и с третьего тоже. Но я был настойчив, потому что хотел убедиться, что все эти странные люди со Столлманом во главе ошибаются. Наивный… Майн готт, я даже нашел людей, которые пользуются emacs в Windows! Теперь я могу их понять. Чем дальше, тем меньше хочется переключаться в другое окно. Нужна оболочка — пожалуйста, M-x shell. Почту почитать — сколько угодно, rmail-mode. С файлами и каталогами поработать — вот, извольте, C-x d. Рисунок нарисовать, PDF посмотреть, по Интернету посерфить… Ах да, в нем еще можно редактировать текст (вот ведь приятная неожиданность)! В результате ловишь себя на мысли, что и Linux в общем-то не очень нужен, и только зря жрет ресурсы.

Но падаван вырос, и настало ему время заняться поддержкой многострадальной отечественной науки. Наука у нас в стране, говоря откровенно, каким-то парадоксальным образом существует отдельно от занимающихся ею ученых, в своеобразной параллельной реальности. Оцените: ВАКовский журнал требует предоставлять публикации в формате Word, и чтоб не более 5 страниц. Вместе с иллюстрациями и библиографией. Видели когда-нибудь нормальную научную статью из 5 страниц? Найдете — покажите мне. А уж статей, качественно сверстанных в Word, — днем с огнем; большинство просто не в курсе про такую вещь, как стили.  Но я на поводу у толпы не иду и как правильный апологет CS все пишу исключительно в (La)TeX. Потом как-нибудь через ODF и MathML сконвертирую, если припрет.

Но что-то меня сегодня понесло на отвлеченные темы болтать, пора бы перейти к делу. Так вот, поскольку emacs теперь мой дом родной, то AUCTeX — просто-таки домашние тапочки, основная работа происходит именно в нем. Но какой же научный текст без библиографии? Вот и пришлось искать некий редактор BibTeX-файлов, встроенный в emacs (кто не в курсе, про что вообще речь и зачем он нужен, почитайте обзор BibTeX от Дебианщика). Таковым редактором оказался ebib. Это не режим никакой, а полноценное elisp-приложение, вроде Gnus.

ebib прост, как пятак. Для начала в ~/.emacs записываем строчку:

(autoload 'ebib "ebib" "Ebib, a BibTeX database manager." t)

Теперь запускаем его по M-x ebib, видим два буфера: верхний (индексный, index buffer) и нижний (буфер записи, entry buffer). В индексном буфере отображается список ключей всех записей в bib-базе. При выборе одного из ключей в буфере записи отображаются поля, описывающие соответствующий библиографический источник.

Ebib

Я не буду подробно и по шагам описывать, как именно пользоваться ebib — дело нехитрое. Лучше приведу небольшой набор наиболее полезных привязок:

  • o —открыть (создать) bib-файл;
  • q —выйти из ebib совсем (в индексном буфере) или завершить редактирование записи (в буфере записи);
  • z — отправить ebib на задний план, без закрытия файла (вернуть обратно опять по M-x ebib);
  • a — добавить запись;
  • e — редактировать запись (в индексном буфере) или поле (в буфере записи);
  • E —изменить ключ записи;
  • C-x b —завершить редактирование многострочного поля;
  • c, x, y —copy, cut, yank;
  • s — сохранить файл;
  • w — сохранить файл в другое место;
  • / — поиск в базе по регулярному выражению;
  • P — сформировать файл с таблицей всех записей в базе (мегаудобная штука!).

Теперь о самом главном — об интеграции с LaTeX-mode. Это происходит с двух сторон. Если мы редактируем tex-файл (то есть, находимся в LaTeX-mode), то в нашем распоряжении есть две замечательные функции:

  • ebib-insert-bibtex-key — в позицию курсора вставляется ссылка на источник, ключ которого мы зададим в минибуфере (при этом работает автодополнение!);
  • ebib-entry-summary — отобразить информацию о цитате, на которой находится курсор.

По умолчанию эти функции не закреплены за клавиатурными комбинациями, поэтому рекомундую сразу дописать в ~/.emacs следующее:

(add-hook 'LaTeX-mode-hook #'(lambda () (local-set-key "\C-cb" 'ebib-insert-bibtex-key)))
(add-hook 'LaTeX-mode-hook #'(lambda () (local-set-key "\C-cs" 'ebib-entry-summary)))

Разумеется, для корректной работы на заднем плане в это время должен работать ebib. Если же мы находимся в индексном буфере ebib’a, то можем выбрать ключ и нажать p (push), вставив тем самым цитату в некоторый другой буфер. Это хорошо тем, что перед глазами сразу вся база, и не нужно мучительно вспоминать имена ключей.

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

УжасноПлохоНормальноХорошоОтлично (Еще не оценили)
Loading ... Loading ...