<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Unix Way]]></title>
  <link href="https://paul.elms.pro/atom.xml" rel="self"/>
  <link href="https://paul.elms.pro/"/>
  <updated>2026-04-29T20:32:43+00:00</updated>
  <id>https://paul.elms.pro/</id>
  <author>
    <name><![CDATA[Павел Вязовой]]></name>
    
  </author>
  <generator uri="http://github.com/">Jekyll</generator>

  
  <entry>
    <title type="html"><![CDATA[Как готовить Emacs в OS X]]></title>
    <link href="https://paul.elms.pro/blog/2014/05/12/emacs_in_osx/" rel="alternate" />
    <updated>2014-05-12T02:53:00+00:00</updated>
    <id>https://paul.elms.pro/blog/2014/05/12/emacs_in_osx</id>
    <content type="html"><![CDATA[<h2 id="установка">Установка</h2>

<p>Самая лучшая сборка Emacs для OS X устанавливается следующим образом (у тебя ведь уже есть <a href="http://brew.sh">homebrew</a>, верно?):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew tap railwaycat/emacsmacport
brew install emacs-mac --icon-modern
brew linkapps
</code></pre></div></div>

<p>Это свежий GNU Emacs с рядом патчей “под макось”.<br />
Например, этот порт по-умолчанию меняет местами ⌘ и ⌥ в Emacs, потому что так удобнее.
Но это отключается.
А полный список патчей <a href="https://github.com/railwaycat/emacs-mac-port/blob/master/README-mac">здесь</a>.</p>

<h2 id="клавиатура-под-emacs">Клавиатура под Emacs</h2>

<p>Теперь займемся хардварной оптимизацией. Необходимо демонтировать клаву вашего макбука и заменить на… Да я шучу, конечно =)</p>

<p>Не обязательно, но рекомендую: для комфортной работы в Emacs надо немного поменять расположение самых часто используемых клавиш.
А именно: нужно поменять местами левый control с caps lock (это почти обязательно), и правый контрол с return (желательно, чтобы не превратиться в осьминога).</p>

<p>Шутки шутками, а без этого не знаю смог бы ли я познать всю внутреннюю красоту емакса со сломанными пальцами.</p>

<p>Левый контрол с капсом легко меняются средствами системы. Ключ вот здесь:</p>

<p><a class="screenshot" href="http://monosnap.com/image/UyRm2puGZMPN9N6KS03pjrYwtQMsk0.png" rel="screenshot" title="Назначаем control на capslock"><img src="http://monosnap.com/image/UyRm2puGZMPN9N6KS03pjrYwtQMsk0.png" alt="caps-ctrl-swap" /></a></p>

<p>С правым контролом чуть сложнее – понадобится программа <a href="https://pqrs.org/macosx/keyremap4macbook/">KeyRemap4MacBook</a>.
Зато она умеет много других полезных штук, например – переключаться на английский язык
по одиночному нажатию левой клавиши ⌘, и на русский – по нажатию правой.</p>

<p>В KeyRemap4MacBook нужно включить опцию “Change Return Key &gt; Return to Control_L”.
При этом стандартная функция кнопки Return тоже сохраняется – срабатывает в том случае, если нажата только одна клавиша Return, без сочетания с другими.
Правда ты же подсел на Emacs, теперь ты должен использовать только ⌃M, точнее сказать C-m, %username%.<br />
Единственный неприятный момент – на такой Return не совсем адекватно реагирует Alfred. Но это было давно, может уже само починилось.</p>

<h2 id="emacs-mode-в-keyremap4macbook">Emacs Mode в KeyRemap4MacBook</h2>

<p>В этой программе есть целая группа опций под названием Emacs Mode.
Она позволяет применять Emacs-like хоткеи для всей системы.
На самом деле, во всех полях ввода OS X уже и так работают Emacs-like хоткеи.
Но только основные, а эти опции могут сделать больше, например, транслировать
⌥W в ⌘C (для копирования в emacs-стиле).</p>

<h2 id="emacsclient">EmacsClient</h2>

<p>Для того, чтобы открывать файлы из командной строки в emacs, служит emacsclient,
который устанавливается в /usr/local/bin, если ты воспользовался рекомендуемым мной
способом установки Emacs. Это не относится к OS X, но на всякий случай уточнил, что он работает.
Не забудь только сделать (server-start) в одном инстансе емакса.</p>

<h2 id="настройки-osx-only">Настройки OSX-only</h2>

<p>Для тех, кто использует один конфиг Emacs на разных ОС, существует возможность задавать настройки локально.
Для OS X это делается следующим образом:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(when (eq system-type 'darwin)
; ты знаешь что делать
)
</code></pre></div></div>

<p>Сразу рекомендую прописать туда:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(menu-bar-mode 1)
</code></pre></div></div>

<p>Дело в том, что любой уважающий себя емаксер сразу отключает тулбар, менюбар и, не редко, скроллбар.
В емаксе это всё лишнее расходование экранного пространства, но вышеозначенная опция все-таки
менюбар включает. Дело в том, что в OS X меню расположено в панели, а вот если его отключить,
окно меняет свой тип и его уже не получится развернуть в фулл-скрин, а также будут проблемы
с потерей фокуса.</p>

<h2 id="переключение-языков-в-emacs">Переключение языков в Emacs</h2>

<p>Хорошо бы написать аналог программы emxkb для оконной системы OS X, чтобы удобно переключать
языки ввода в Emacs. <a href="http://paul.elms.pro/blog/2013/04/11/pieriekliuchieniie-raskladok-v-emacs/">Подробнее про emxkb</a>.</p>

<h2 id="org-protocol">org-protocol</h2>

<p>Org-mode это <a href="http://doc.norang.ca/org-mode.html">обалденный</a> пакет.
Если ты им пользуешься и тебе нужен рабочий org-protocol в OS X, то читай дальше.</p>

<p>Подробнее что зачем и почему написано <a href="http://jcardente.blogspot.ru/2010/09/saving-weblinks-to-org-mode-from-safari.html">вот здесь</a>.</p>

<p>Реализация для Aquamacs <a href="https://github.com/neil-smithline-elisp/EmacsClient.app">здесь</a>.</p>

<p>Реализацию для GNU Emacs из brew я сделал и положил <a href="http://take.ms/uCG7l">сюда</a>. Нужно просто скачать и положить в /Applications.</p>

<p>Есть ещё один нюанс: у меня в safari не работали букмарклеты для org-protocol пока я не заменил
двойные слеши на одинарные, вот так:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>javascript:location.href='org-protocol:/store-link:/'+encodeURIComponent(location.href)
</code></pre></div></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Скромное мнение о редакторах текста]]></title>
    <link href="https://paul.elms.pro/blog/2014/05/12/text_editors/" rel="alternate" />
    <updated>2014-05-12T00:40:00+00:00</updated>
    <id>https://paul.elms.pro/blog/2014/05/12/text_editors</id>
    <content type="html"><![CDATA[<p>Я люблю экспериментировать с разными редакторами кода для программистов.
Особый интерес проявляю к так называемым “hackable” редакторам кода (затрудняюсь перевести на русский).
Давно хотел написать такой пост – просто мнение о тех редакторах, на которые обращаю внимание.</p>

<h2 id="vim-macvim">VIM (MacVim)</h2>

<p>Автор vim-плагина Airline очень хорошо охарактеризовал его, когда <a href="http://bling.github.io/blog/2013/10/27/emacs-as-my-leader-vim-survival-guide/">сваливал на Emacs</a>.
Он написал примерно так: “VIM лучше в редактировании текста, но Emacs лучше для работы”.
Я полностью согласен, команды vim очень хороши в навигации по тексту и его редактировании.
Только для того, чтобы понять эту магию, необходимо хорошо изучить vim.
Но vim тормоз и ограниченный. Если попытаться добавить в него часть функциональности, которую я привык видеть в Emacs,
он начинает дико тормозить. Я пробовал профилировать плагины, тормозят все по немногу.</p>

<h2 id="emacs">Emacs</h2>

<p>До сих пор считаю эту среду лучшей для множества задач.
Emacs это не редактор, а интерпретатор лиспа – этим всё сказано.
Если в виме есть работа с метками (закладками) и история изменений в виде дерева,
то для Emacs существует несколько пакетов рыботы с метками и пакет для реализации истории, как в vim.
Всё это реализовано на elisp и программист (у Emacs нет “просто пользователей”) может в реальном времени
изменять или полностью переделывать реализацию этих функций.
Emacs – замечательный почтовый и jabber клиент, <a href="http://doc.norang.ca/org-mode.html">лучший органайзер</a> и т.д.
Но всё это великолепие затмевается высоким порогом вхождения. Если не углубиться в Emacs и сразу свалить на vim,
то так и не познаешь всю эту магию (у большинства заявляющих “пробовал я этот ваш emacs” именно так и было, не распробовал).
Кстати, упомянутый выше автор Airline перешел на Emacs только потому, что для Emacs существует лучшая
реализация эмуляции vim-а. Работают все команды, которые я знаю в vim (а я их знаю много, целенаправленно изучал).
Некоторые считают evil-mode реализацией недостающего текстового редактора в операционной системе Emacs.
Для него даже замечательный плагин surround реализован и работает точно как в vim, а не так, как жалкое подобие в sublime.</p>

<h2 id="sublime-text-3">Sublime Text 3</h2>

<p>Действительно хороший редактор, но с ним как-то скучно. UI для плагинов у него слишком простой,
но зато это единственный редактор, в котором есть умный авто-комплит и переход к определению для PHP.
Всё благодаря плагину Sublime CodeIntel, код которого был взят из Komodo IDE.
Плагины в саблайме работают в отдельном потоке, именно поэтому линтеры работают в фоне, а не при каждом сохранеии (как vim).
И именно поэтому возможна реализация CodeIntel, который в фоне индексирует код.
Не тормозит с кучей плагинов, красивый, всё работает.</p>

<h2 id="atom">Atom</h2>

<p>Вроде как “hackable editor for the 21st Century”, но пока слишком тормозной.
Зато сразу на старте появилась почти вся нужная мне функциональность, потому что
плагины клепают очень быстро, они ведь на javascript (и coffee).
Плагины на javascript это хорошо.
А вот “taking the web native” пока не в полной мере присутствует.
Где live-coding для javascript как в LightTable?
Кстати, они, кажется, хотели его продавать. А как это, если исходники открыты под
либеральной лицензией?</p>

<h2 id="lighttable">LightTable</h2>

<p>По задумке классный проект, но в данный момент больше напоминает демку.
Из коробки live coding для нескольких языков: html/css, javascript, clojure, clojurescript, python. Можно ещё плагин для ruby доустановить.
Live coding реализован классно – можно видеть результат выполнения кода прямо в редакторе,
а можно подключиться к своему браузеру/repl/приложению и выполнять его там.
Но много чего пока нету и самое печальное – нет документации для разработчиков. Так – пару статей в блогах о внутренностях LT.
Короче говоря нет такой инструкции как у атома – садимся и за пять минут пишем демо-плагин.
Кстати, сделан этот редактор (IDE?) тоже на web-технологиях, поэтому в качестве редактора используется <a href="http://codemirror.net">CodeMirror</a>.
Ощущения от редактирования как-то не очень, хотя тормозит меньше чем atom.
Тем не менее, что бы я там себе не думал, программисты на clojure уже используют его в работе.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Относительная нумерация строк в Emacs и VIM]]></title>
    <link href="https://paul.elms.pro/blog/2014/02/07/emacs-and-vim-relative-line-numbers/" rel="alternate" />
    <updated>2014-02-07T14:32:00+00:00</updated>
    <id>https://paul.elms.pro/blog/2014/02/07/emacs-and-vim-relative-line-numbers</id>
    <content type="html"><![CDATA[<p>Я не стану в очередной раз писать, что многие пользователи Emacs и VIM используют свои редакторы не эффективно, применяя к ним принципы работы с “обычными” редакторами кода типа Sublime Text и Textmate. Скажу только что среди всего прочего, для эффективного использования можно применять цифровые префиксы.</p>

<p>Например, если мне в Emacs надо удалить десять строк подряд: то я могу выжать комбинацию C-1 C-0 C-k. Это значит с зажатым контролом нажать по очереди 10 и k. Таким образом, Emacs повторит удаление строки 10 раз.</p>

<p>Отвлекаясь от темы, скажу что у меня контрол висит на капслоке и на return. Поэтому сложные емаксовые комбинации выжимать очень удобно. С дефолтным расположением контролов я бы использовал vim или один из “вимификаторов” емакса. Как настроить таким образом OS X я тоже напишу. А заодно и обновлю статью про переключение раскладок в Linux под OS X.</p>

<p>Итак, возвращаемся к теме: выжать числовой префикс удобнее, чем выделять эти строки или 10 раз нажимать C-k. Особенно если строк не 10, а скажем 30. Есть конечно и другие способы навигации и редактирования, но числовые префиксы – один из них, не самый худший.</p>

<p>Но… это не работает так хорошо, если нет относительной нумерации строк. Когда она включена, достаточно просто посмотреть на номер той строки, до которой необходимо выполнить удаление строк (или любое другое действие). Числовые префиксы можно использовать не только для работы со строками само собой, но для строк это удобно.</p>

<p>В vim относительная нумерация строк появилась, кажется, в версии 7.3. Включается она очень просто:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>set number
set relativenumber
</code></pre></div></div>

<p>А в Emacs у меня есть два варианта. Во-первых, старый кусок кода, который устанавливает две полосы номеров строк: обычную и относительную. Но он гадит в Messages варнингами (но работает):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(eval-after-load "linum"
  '(defun linum-update (buffer)
     "Update line numbers for all windows displaying BUFFER."
     ;; this is only change but couldn't find better way to do it, tried
     ;; linum-before-update-hook but it runs in an excursion so I couldn't get
     ;; current line number
     (setq linum-last-pos (line-number-at-pos))
     (with-current-buffer buffer
       (when linum-mode
         (setq linum-available linum-overlays)
         (setq linum-overlays nil)
         (save-excursion
           (mapc #'linum-update-window
                 (get-buffer-window-list buffer nil 'visible)))
         (mapc #'delete-overlay linum-available)
         (setq linum-available nil)))))

(defun linum-relativenumber-format (line-number)
  (let ((diff (abs (- line-number linum-last-pos))))
    (concat (propertize (format "%5d" line-number)
                        'face 'linum-line)
            (propertize (format "%3d" diff)
                        'face (cond ((zerop diff) 'linum-zero)
                                    ((eq 1 line-number) 'linum-top)
                                    (t 'linum))))))

;; (setq linum-format 'dynamic)
(setq linum-format 'linum-relativenumber-format)
</code></pre></div></div>

<p>Во-вторых, в melpa и в рецептах el-get есть пакет linum-relative. Он заменяет обычную нумерацию на относительную. Работает из коробки, только я поменял у него оформление текущей строки через customize-face linum-relative-current-face.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Смена цветовой схемы Emacs по времени восхода и захода солнца]]></title>
    <link href="https://paul.elms.pro/blog/2013/04/11/emacs-theme-change/" rel="alternate" />
    <updated>2013-04-11T11:09:00+00:00</updated>
    <id>https://paul.elms.pro/blog/2013/04/11/emacs-theme-change</id>
    <content type="html"><![CDATA[<p>Я давно хотел поделиться интересными сниппетами из моего конфига Emacs. Сам конфиг я публиковать не хочу, потому что в нём половина кода не работает, другая половина содержит какие-то пароли и личные данные, которые я не вынес в отдельный файл. А вот этот сниппет опубликую. Даже не сниппет, а пример конфигурации готового пакета <a href="https://github.com/hadronzoo/theme-changer">theme-changer</a>.</p>

<p>Есть такой пакет для Emacs: <a href="https://github.com/hadronzoo/theme-changer">theme-changer</a>. Он умеет переключать цветовую схему по времени восхода и захода солнца. А настраивается он вот так:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(setq calendar-location-name "Dallas, TX") 
(setq calendar-latitude 32.85)
(setq calendar-longitude -96.85)

(require 'theme-changer)
(change-theme 'solarized-light 'solarized-dark)
</code></pre></div></div>

<p>Значения latitude и longitude можно узнать несколькими способами. Во-первых, можно просто тыкнуть в google maps и скопировать координаты. Кроме того можно найти свой город в википедии и там в шаблоне справа будет ссылка на сервис geohack, откуда нужно скопировать координаты в десятичном формате.</p>

<h2 id="emacs-24-vs-пакет-color-theme">Emacs 24 vs пакет color-theme</h2>

<p>В Emacs 24 появился свой механизм тем на замену пакету color-theme. Сниппет выше – пример конфигурации уже для встроенного механизма тем. Для старого пакета color-theme конфигурация будет выглядеть следующим образом:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(setq calendar-location-name "Dallas, TX") 
(setq calendar-latitude 32.85)
(setq calendar-longitude -96.85)

(require 'theme-changer)
(setq theme-changer-mode "color-theme")
(change-theme 'color-theme-solarized-light 'color-theme-solarized-dark)
</code></pre></div></div>

<p>Кстати, лично я предпочитаю схему xemacs днём (самая лучшая схема, по моему мнению) и схему zen-and-art ночью.<br />
<strong>UPD:</strong> уже переключился на solarized.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Переключение раскладок в Emacs]]></title>
    <link href="https://paul.elms.pro/blog/2013/04/11/pieriekliuchieniie-raskladok-v-emacs/" rel="alternate" />
    <updated>2013-04-11T01:24:00+00:00</updated>
    <id>https://paul.elms.pro/blog/2013/04/11/pieriekliuchieniie-raskladok-v-emacs</id>
    <content type="html"><![CDATA[<p><strong>UPD:</strong> перепост старой заметки в новый блог, планирую обновлять и поддерживать в актуальном состоянии</p>
<p>Последнее обновление: Среда, 10. Март 2010</p>

      <p>Описание проблемы: при переключении на не-латинскую раскладку клавиатуры в Emacs не работают горячие клавиши. Также не запоминается своя раскладка для каждого буфера Emacs.</p>

      <p>Варианты решения проблемы:

        <ul>
          <li>Продублировать все горячие клавиши для нужной раскладки и отказаться от
          отдельной для каждого буфера раскладки (плохой выход из ситуации).</li>
          <li>Использовать встроенную в Emacs переключалку (то, что нам нужно).</li>
        </ul>
      </p>

      <!--more-->

      <p>По умолчанию цикличное переключение раскладок в Emacs работает по комбинации C-\<br />
        Очевидно, вы пожелаете настроить в Emacs клавиатурное сочетание для переключения раскладок как в xorg, и тут появляется проблема номер 2:</p>

      <p>Xorg не передает приложению нажатие клавиш, которыми он переключает раскладку. К тому же нет возможности настроить игнорирование иксорговской переключалкой конкретного приложения. Для решения этой проблемы ранее предлагали использовать патченный xxkb, который переключал раскладку в окне Emacs всегда на латиницу и передавал окну нужные клавиатурные сочетания. Как показала практика - работает это решение не всегда и глючит, поэтому появились следующие, более корректные решения этой проблемы:</p>


      <p>
        <ul>
          <li>Хороший человек с псевдонимом Akshaal написал программку, а другой хороший
          человек с псевдонимом Bzek доработал её. К сожалению, все ссылки на описание
          этого метода померли, поэтому я переношу эту информацию сюда (см. ниже). Этот
          метод имеет свои недостатки, но я пользуюсь именно им. Суть метода сводится к
          переключению раскладок сторонней программой, которая сама определяет окно Emacs
          и отправляет ему нужное сочетание клавиш вместо переключения раскладки.</li>
          <li>Использовать для переключения языков альтернативный метод ввода
          ibus (scim). Достаточно отключить его в Emacs и клавиатурные сочетания, которые вы
          настроили в ibus (scim), будут обрабатываться в Emacs. Описание тоже ниже.</li>
        </ul>
      </p>

      <p><h3>Настраиваем ibus (scim)</h3></p>

      <p>
        <ol>
          <li>Устанавливаем scim, scim-m17n и scim-tables (для ibus сами определяйтесь, не
          пользуюсь им). Последние два включают в себя
          приличное количество раскладок клавиатуры для различных языков.</li>
          <li>Прописываем в профиль переменные среды:

            Для scim:

            <pre><code>
export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
            </code></pre>

            Для ibus видимо будет как-то так:

            <pre><code>
export GTK_IM_MODULE=ibu
export QT_IM_MODULE=ibu
            </code></pre>

          </li>
          <li>Отключаем ibus (scim) в Emas, для этого пишем в .Xdefaults:

            <pre><code>Emacs*useXIM:false</code></pre>

            (не знаю правда, как тут с ibus; если кто-то знает - пишите мне)

          </li>
          <li>Запускаем scim-setup и настраиваем всё что нужно. Останавливаться на этом не
          буду - если не разберетесь, то можете спросить в xmpp-конференции
          emacs@conference.jabber.ru.</li>
          <li>Настраиваем в Emacs обработку этих сочетаний клавиш. Например так:

            <figure class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="p">(</span><span class="nv">global-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"C-1"</span><span class="p">)</span>
		<span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
		  <span class="p">(</span><span class="nv">inactivate-input-method</span><span class="p">)))</span>
<span class="p">(</span><span class="nv">global-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"C-2"</span><span class="p">)</span>
		<span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
		  <span class="p">(</span><span class="nv">set-input-method</span> <span class="ss">'russian-computer</span><span class="p">)))</span>
            </code></pre></figure>

          </li>
        </ol></p>

      <p>Вы можете добавить сюда переключение словаря flyspell, например. Или настроить
        цикличное переключение, в этом вам поможет функция toggle-input-method.</p>

      <p><h3>Использование emxkb</h3></p>

      <p>Замечание к этому методу: с его помощью нельзя настроить раскладку на цикличное
      переключение (хотя, можно просто модифицировать программу). У меня, например,
      группа "us" включается по нажатию C-1, а "ru" - C-2.</p>

      <p>Первое, что нам понадобится - программа emxkb. Её нужно <a href="/files/emxkb.c">скачать</a> и скомпилировать
      вот так:</p>

        <p><pre><code>
gcc -L/usr/X11R6/lib -lX11 -o emxkb emxkb.c
        </code></pre></p>

      <p>При выполнении emxkb 0 раскладка переключается на первую группу, emxkb 1 -
      вторую и т.д. Если же значение WM_CLASS текущего окна равно "emacs", то вместо
      переключения групп emxkb шлёт нажатие виртуальных клавиш F31, F32, F33 и
      т.д. Остается только обрабатывать эти нажатия в emacs.</p>

      <p>Итак, вы уже настроили в своём wm (или xbindkeys) какие-либо сочетания клавиш на
      выполнение комманд emxkb 0 и emxkb 1. Но ещё не все готово для настройки
      emacs. Дело в том, что клавиш F31, F32 и т.д. не существует и нужно их виртуально
      "создать" с помощью xmodmap:</p>

      <p><pre><code>
keycode 431=F31
keycode 432=F32
keycode 433=F33
      </code></pre></p>

      <p>431, 432, 433 можно заменить на любые другие свободные кейкоды.</p>

      <p>Теперь можно настраивать emacs:</p>

      <p><figure class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="p">(</span><span class="nb">defun</span> <span class="nv">reset-flyspell-with-new-dict</span> <span class="p">(</span><span class="nv">dict</span><span class="p">)</span>
  <span class="s">"Set new dictionary and restart flyspell"</span>

  <span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nb">equal</span> <span class="nv">dict</span> <span class="nv">ispell-local-dictionary</span><span class="p">)</span>
    <span class="p">(</span><span class="k">setq</span> <span class="nv">ispell-local-dictionary</span> <span class="nv">dict</span><span class="p">)</span>
    <span class="p">(</span><span class="nb">when</span> <span class="nv">flyspell-mode</span>
      <span class="p">(</span><span class="nv">flyspell-mode</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">flyspell-mode</span><span class="p">)))</span>

  <span class="p">(</span><span class="nb">when</span> <span class="nv">flyspell-mode</span>
    <span class="p">(</span><span class="nv">save-excursion</span>
      <span class="p">(</span><span class="nv">flyspell-region</span> <span class="p">(</span><span class="nv">window-start</span><span class="p">)</span> <span class="p">(</span><span class="nv">window-end</span><span class="p">))))</span>

  <span class="p">(</span><span class="nv">message</span> <span class="no">nil</span><span class="p">))</span>

<span class="p">(</span><span class="nv">global-set-key</span> <span class="nv">[</span><span class="p">(</span><span class="nv">f31</span><span class="p">)</span><span class="nv">]</span>
                <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                  <span class="c1">;; (reset-flyspell-with-new-dict "american")</span>
                  <span class="p">(</span><span class="nv">inactivate-input-method</span><span class="p">)))</span>

<span class="p">(</span><span class="nv">global-set-key</span> <span class="nv">[</span><span class="p">(</span><span class="nv">f32</span><span class="p">)</span><span class="nv">]</span>
                <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                  <span class="c1">;; (reset-flyspell-with-new-dict "russian")</span>
                  <span class="p">(</span><span class="nv">set-input-method</span> <span class="ss">'russian-computer</span><span class="p">)))</span>

<span class="p">(</span><span class="nv">global-set-key</span> <span class="nv">[</span><span class="p">(</span><span class="nv">f33</span><span class="p">)</span><span class="nv">]</span>
                <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                  <span class="c1">;; (reset-flyspell-with-new-dict "italian")</span>
                  <span class="p">(</span><span class="nv">set-input-method</span> <span class="ss">'italian-keyboard</span><span class="p">)))</span>


<span class="p">(</span><span class="nb">defun</span> <span class="nv">toggle-specified-isearch-input-method</span> <span class="p">(</span><span class="nv">new-input-method</span><span class="p">)</span>
  <span class="s">"Toggle specified input method in interactive search."</span>
  <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
  <span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">overriding-terminal-local-map</span> <span class="no">nil</span><span class="p">)))</span>

  <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">eq</span> <span class="nv">new-input-method</span> <span class="ss">'default-method</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">inactivate-input-method</span><span class="p">)</span>
    <span class="p">(</span><span class="nv">set-input-method</span> <span class="nv">new-input-method</span><span class="p">))</span>

  <span class="p">(</span><span class="k">setq</span> <span class="nv">isearch-input-method-function</span> <span class="nv">input-method-function</span>
	<span class="nv">isearch-input-method-local-p</span> <span class="no">t</span><span class="p">)</span>
  <span class="p">(</span><span class="k">setq</span> <span class="nv">input-method-function</span> <span class="no">nil</span><span class="p">)</span>
  <span class="p">(</span><span class="nv">isearch-update</span><span class="p">))</span>


<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'isearch-mode-hook</span>
          <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
            <span class="p">(</span><span class="nv">define-key</span> <span class="nv">isearch-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"&lt;f31&gt;"</span><span class="p">)</span>
              <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                <span class="p">(</span><span class="nv">toggle-specified-isearch-input-method</span> <span class="ss">'default-method</span><span class="p">)))</span>

            <span class="p">(</span><span class="nv">define-key</span> <span class="nv">isearch-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"&lt;f32&gt;"</span><span class="p">)</span>
              <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                <span class="p">(</span><span class="nv">toggle-specified-isearch-input-method</span> <span class="ss">'russian-computer</span><span class="p">)))</span>

            <span class="p">(</span><span class="nv">define-key</span> <span class="nv">isearch-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"&lt;f33&gt;"</span><span class="p">)</span>
              <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
                <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
                <span class="p">(</span><span class="nv">toggle-specified-isearch-input-method</span> <span class="ss">'italian-keyboard</span><span class="p">)))))</span>
      </code></pre></figure></p>

      <p>Внимательно (или не очень) изучите приведенный кусок кода на elisp и настройте
      его под свои нужды.</p>

      <p>P.S. Если у вас что-то не получилось, <strike>вы можете найти меня в конференции
        emacs@conference.jabber.ru</strike>. Приветствуются любые дополнения и правки к статье.<br />
        P.P.S. Для консольной версии Emacs проблема всё ещё актуальна.</p>]]></content>
  </entry>
  
</feed>
