<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Категория: emacs | Unix Way]]></title>
  
  <link href="http://paul.elms.pro/" />
  <updated>2013-06-13T13:12:10+06:00</updated>
  <id>http://paul.elms.pro/</id>
  <author>
    <name><![CDATA[Павел Вязовой]]></name>
    <email><![CDATA[paul@elms.pro]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/vyazovoi-emacs" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="vyazovoi-emacs" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title type="html"><![CDATA[Смена цветовой схемы Emacs по времени восхода и захода солнца]]></title>
    <link href="http://paul.elms.pro/blog/2013/04/11/emacs-theme-change/" />
    <updated>2013-04-11T11:09:00+06:00</updated>
    <id>http://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>

<p>``` common-lisp theme-changer config <a href="http://emacswiki.org/emacs/ColorTheme#toc18">http://emacswiki.org/emacs/ColorTheme#toc18</a> emacswiki
(setq calendar-location-name &ldquo;Dallas, TX&rdquo;)
(setq calendar-latitude 32.85)
(setq calendar-longitude -96.85)</p>

<p>(require &lsquo;theme-changer)
(change-theme 'color-theme-solarized-light 'color-theme-solarized-dark)
```</p>

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

<p>Кстати, лично я предпочитаю схему xemacs днём (самая лучшая схема, по моему мнению) и схему zen-and-art ночью. Последняя не входит в color-theme, установить её можно рецептом el-get.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Переключение раскладок в Emacs]]></title>
    <link href="http://paul.elms.pro/blog/2013/04/11/pieriekliuchieniie-raskladok-v-emacs/" />
    <updated>2013-04-11T01:24:00+06:00</updated>
    <id>http://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>


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

  &lt;p&gt;Варианты решения проблемы:

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

  &lt;!--more--&gt;

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

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


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

  &lt;p&gt;&lt;h3&gt;Настраиваем ibus (scim)&lt;/h3&gt;&lt;/p&gt;

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

        Для scim:

        &lt;pre&gt;&lt;code&gt;
</code></pre>

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

<pre><code>        &lt;/code&gt;&lt;/pre&gt;

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

        &lt;pre&gt;&lt;code&gt;
</code></pre>

<p>export GTK_IM_MODULE=ibu
export QT_IM_MODULE=ibu</p>

<pre><code>        &lt;/code&gt;&lt;/pre&gt;

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

        &lt;pre&gt;&lt;code&gt;Emacs*useXIM:false&lt;/code&gt;&lt;/pre&gt;

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

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

        {% highlight cl %}
</code></pre>

<p>(global-set-key (kbd &ldquo;C-1&rdquo;)</p>

<pre><code>    (lambda ()
      (inactivate-input-method)))
</code></pre>

<p>(global-set-key (kbd &ldquo;C-2&rdquo;)</p>

<pre><code>    (lambda ()
      (set-input-method 'russian-computer)))
        {% endhighlight %}

      &lt;/li&gt;
    &lt;/ol&gt;&lt;/p&gt;

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

  &lt;p&gt;&lt;h3&gt;Использование emxkb&lt;/h3&gt;&lt;/p&gt;

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

  &lt;p&gt;Первое, что нам понадобится - программа emxkb. Её нужно &lt;a href="http://paul.elms.pro/files/emxkb.c"&gt;скачать&lt;/a&gt; и скомпилировать
  вот так:&lt;/p&gt;

    &lt;p&gt;&lt;pre&gt;&lt;code&gt;
</code></pre>

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

<pre><code>    &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

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

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

  &lt;p&gt;&lt;pre&gt;&lt;code&gt;
</code></pre>

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

<pre><code>  &lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

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

  &lt;p&gt;Теперь можно настраивать emacs:&lt;/p&gt;

  &lt;p&gt;{% highlight cl %}
</code></pre>

<p>(defun reset-flyspell-with-new-dict (dict)
  &ldquo;Set new dictionary and restart flyspell&rdquo;</p>

<p>  (unless (equal dict ispell-local-dictionary)</p>

<pre><code>(setq ispell-local-dictionary dict)
(when flyspell-mode
  (flyspell-mode)
  (flyspell-mode)))
</code></pre>

<p>  (when flyspell-mode</p>

<pre><code>(save-excursion
  (flyspell-region (window-start) (window-end))))
</code></pre>

<p>  (message nil))</p>

<p>(global-set-key [(f31)]</p>

<pre><code>            (lambda ()
              (interactive)
              ;; (reset-flyspell-with-new-dict "american")
              (inactivate-input-method)))
</code></pre>

<p>(global-set-key [(f32)]</p>

<pre><code>            (lambda ()
              (interactive)
              ;; (reset-flyspell-with-new-dict "russian")
              (set-input-method 'russian-computer)))
</code></pre>

<p>(global-set-key [(f33)]</p>

<pre><code>            (lambda ()
              (interactive)
              ;; (reset-flyspell-with-new-dict "italian")
              (set-input-method 'italian-keyboard)))
</code></pre>

<p>(defun toggle-specified-isearch-input-method (new-input-method)
  &ldquo;Toggle specified input method in interactive search.&rdquo;
  (interactive)
  (let ((overriding-terminal-local-map nil)))</p>

<p>  (if (eq new-input-method &lsquo;default-method)</p>

<pre><code>  (inactivate-input-method)
(set-input-method new-input-method))
</code></pre>

<p>  (setq isearch-input-method-function input-method-function</p>

<pre><code>isearch-input-method-local-p t)
</code></pre>

<p>  (setq input-method-function nil)
  (isearch-update))</p>

<p>(add-hook &lsquo;isearch-mode-hook</p>

<pre><code>      (lambda ()
        (define-key isearch-mode-map (kbd "&lt;f31&gt;")
          (lambda ()
            (interactive)
            (toggle-specified-isearch-input-method 'default-method)))

        (define-key isearch-mode-map (kbd "&lt;f32&gt;")
          (lambda ()
            (interactive)
            (toggle-specified-isearch-input-method 'russian-computer)))

        (define-key isearch-mode-map (kbd "&lt;f33&gt;")
          (lambda ()
            (interactive)
            (toggle-specified-isearch-input-method 'italian-keyboard)))))
  {% endhighlight %}&lt;/p&gt;

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

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