среда, 30 апреля 2014 г.

emacs. Быстрая смена кодировки

Emacs поддерживает огромное количество кодировок символов текста. Разумеется, имеются штатные универсальные средства изменения текущей кодировки буфера. Например, для того, чтобы перезагрузить буфер с использованием другой кодировки необходимо нажать C-x <ENTER> r <указать-требуемую-кодировку> <ENTER> yes <ENTER>.
Однако, пользователь в работе редко использует более трех или четырех кодировок. Хотелось бы иметь возможность однажды задать эти наши "ходовые" кодировки, а впоследствии быстро, с помощью горячей клавиши, минуя всю эту интерактивность, между ними, в случае необходимости, переключаться.
К счастью, у нас в руках emacs! И что еще круче - emacs lisp! Поэтому мы спокойно расширяем его возможности с помощью своего кода. Я написал функцию, реализующую нужный мне функционал (это, кстати, мое второе произведение на emacs lisp), поместил ее в файл .emacs и назначил горячую клавишу. Я доволен дальше некуда, надеюсь еще кому-нибудь пригодится )
(setq my-working-codings ["utf-8" "windows-1251" "koi8-r" "cp866"])
(setq my-current-coding-index -1)
(defun pa23-change-coding ()
  "Change coding for current buffer."
  (interactive)
  (let (my-current-eol
        my-next-coding-index
        my-new-coding-system
        my-new-coding)
    (setq my-current-eol
          (coding-system-eol-type buffer-file-coding-system))
    (setq my-next-coding-index (1+ my-current-coding-index))
    (if (equal my-next-coding-index (length my-working-codings))
        (setq my-next-coding-index 0))
    (setq my-new-coding-system
          (elt my-working-codings my-next-coding-index))
    (cond ((equal my-current-eol 0)
           (setq my-new-coding (concat my-new-coding-system "-unix")))
          ((equal my-current-eol 1)
           (setq my-new-coding (concat my-new-coding-system "-dos")))
          ((equal my-current-eol 2)
           (setq my-new-coding (concat my-new-coding-system "-mac"))))
    (setq coding-system-for-read (read my-new-coding))
    (revert-buffer t t)
    (setq my-current-coding-index my-next-coding-index)
    (message "Set coding %s." my-new-coding)
    )
  )
(global-set-key [f11] 'pa23-change-coding)
При смене кодировки, emacs, извещением в минибуфере, оповестит вас о том, на что он переключился. Наслаждайтесь работой в любимом редакторе!

Напомню также, что мой рабочий вариант файла .emacs можно взять здесь.

UPD: 05.05.2014

Поработал над кодом. Теперь функция выглядит значительно лучше, чем самый первый вариант )

UPD: 09.05.2014

Очередное улучшение кода.

вторник, 29 апреля 2014 г.

emacs. Быстрая смена символов перевода строки

Давно хотел написать для emacs несколько функций, которые бы позволили мне делать некоторые операции быстрей. Одной из таких задумок является быстрая смена символов перевода строки, коих у нас в ходу аж целых три: unix, dos и mac. При каждом вызове функция определяет используемый в данный момент вариант и устанавливает следующий из доступных. Это функция - мое первое произведение на emacs lisp )
(defun pa23-change-eol ()
  "Change EOL for current buffer."
  (interactive)
  (let (my-current-eol
        my-new-eol
        my-new-coding)
    (setq my-current-eol
          (coding-system-eol-type buffer-file-coding-system))
    (if (equal my-current-eol 2)
        (setq my-new-eol 0)
      (setq my-new-eol (1+ my-current-eol)))
    (setq my-new-coding
          (coding-system-change-eol-conversion
           buffer-file-coding-system my-new-eol))
    (set-buffer-file-coding-system my-new-coding)
    )
  )
Приведенный выше код можно поместить в свой файл .emacs и назначить на эту функцию горячую клавишу, например, F12.
(global-set-key [f12] 'change-eol)
Напомню также, что мой рабочий вариант файла .emacs можно взять здесь.

UPD: 09.05.2014

Улучшен код.

воскресенье, 27 апреля 2014 г.

emacs. Быстрое и удобное переключение между буферами

До недавнего времени, для переключения между буферами в emacs, я использовал пакет tabbar. Штука чрезвычайно удобная. Все открытые файлы tabbar автоматически сортирует по группам. На переключение между группами и между буферами назначаются горячие клавиши. Кроме того, буферы в группе, включая текущий, выводятся на специальную панель в верхней части экрана. Для использования tabbar необходим tabbar.el (можно установить из репозитория MELPA), а код для файла .emacs, обеспечивающий взаимодействие с ним, будет следующим:
(require 'tabbar)
(tabbar-mode t)
(global-set-key (kbd "C-<") 'tabbar-backward-group)
(global-set-key (kbd "C->") 'tabbar-forward-group)
(global-set-key (kbd "C-,") 'tabbar-backward)
(global-set-key (kbd "C-.") 'tabbar-forward)
Вот как все это выглядит.
Однако, на днях я случайно нашел в сети произведение под названием popup-switcher, которое, признаться, впечатлило меня не меньше, чем в свое время tabbar. Подробно о нем можно почитать в блоге автора. Здесь же я хотел бы коротко сказать, что переключаться между буферами с помощью функций данного пакета, благодаря его возможности фильтровать список открытых файлов при наборе имени, получается, в большинстве случаев, значительно быстрей и удобней, чем при использовании tabbar.
Для использования popup-switcher необходимы пакеты popup.el и popup-switcher.el, которые, так же как и tabbar, можно установить из репозитория MELPA.
Код для файла .emacs, обеспечивающий переключение между буферами с помощью popup-switcher:
(require 'popup-switcher)
(setq psw-in-window-center t)
(global-set-key [f2] 'psw-switch-buffer)
И, конечно же, скриншот.
Кроме быстрого переключения между буферами, popup-switcher обеспечивает в той же манере переключение между функциями в файле исходного кода (читаем об этом в блоге автора по ссылке выше).

Вот и все, что я хотел поведать в этой заметке. Пусть emacs радует вас так же, как и меня )

UPD: 18.05.2014

О том, как в emacs работать с репозиториями пакетов, см. заметку emacs. Работа с репозиториями пакетов.

Программирование на Emacs Lisp (в формате ODT и PDF)

Некоторое время назад мне захотелось изучить emacs lisp. Поискав на просторах сети документацию на русском языке, я наткнулся на сайт http://alexott.net/ru/emacs/elisp-intro/. Руководство хоть и довольно старое, но вряд ли потеряло актуальность настолько, чтобы не быть хорошей вводной в этот язык. Все бы хорошо, но хотелось того же самого, но с перламутровыми пуговицами в PDF - работать-то удобней, особенно если возникнет желание распечатать. Посидел, подумал и решил потратить n-ное количество времени, чтобы перевести сие руководство к более удобопотребимому виду, чем, собственно, и спешу поделиться.

Emacs Lisp RU (ODT, PDF)

Хочу добавить, что данные файлы являются практически полной копией текста с alexott.net. Я лишь приложил руку к оформлению и исправлению опечаток, попавшихся мне на глаза при копировании текста. Вычитку текста я планирую совместить с изучением материала.

UPD: 01.05.2014

На данный момент, я не спеша читаю вышеупомянутую книгу и не могу не поделиться впечатлением. Знаете, на мой взгляд, это перебор. Я понимаю, что рассчитана она на новичков. Причем не на новичков в Lisp, а на новичков в программировании вообще. Но, черт побери, это перебор. Я прочитал 3 главы и у меня реально болит голова, а нового я узнал при этом с гулькин нос. Меня до невозможности утомляет стократное повторение одного и того же. Сто раз по одному. На мой взгляд, автор с этим явно перестарался.
Я благодарен ребятам, сделавшим перевод данной книги. Это действительно большая работа. К сожалению, в тексте очень много и опечаток, и ошибок. Со знаками препинания так просто беда. Местами такое ощущение, что они расставлены случайным образом. Я постараюсь внести свою лепту, но, чувствую, что одного прохода для вычитки будет явно мало...

UPD: 05.05.2014

Все-таки я решил эту книгу отложить. Я просто не выношу, когда мне так елозят мозг. Для изучения Emacs Lisp я бы порекомендовал:
  1. замечательное руководство в примерах Elisp Tutorial на ErgoEmacs для быстрого вхождения
  2. и официальное руководство GNU Emacs Lisp Reference Manual для детального изучения всех аспектов языка.

четверг, 24 апреля 2014 г.

Закрытие всех буферов Emacs одной командой

Реализуется данная возможность весьма просто. Для этого в файл .emacs необходимо добавить следующую функцию:
(defun kill-all-buffers ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))
Найдено случайно здесь.

суббота, 19 апреля 2014 г.

Релиз reup-1.4.0

В программу добавлена возможность расчета хеш-сумм (по алгоритму md5) для вновь созданных hex-файлов и их запись в таблицу описаний двигателей при ее обновлении.
Исходный код доступен ЗДЕСЬ.