суббота, 17 мая 2014 г.

emacs. Отладка регулярных выражений

В данной заметке я хочу поделиться информацией о потрясающей функции emacs - конструкторе и отладчике регулярных выражений re-builder. Итак, поехали.
Для начала, запустим emacs и откроем какой-нибудь файл. Пусть это будет один из файлов исходного кода.
Далее, запустим re-builder. Делается это как обычно.
M-x re-builder
В результате, в окне emacs будет открыт буфер *RE-Builder*.
Задачу ставим такую: сконструировать регулярное выражение для получения всех строк с директивой #include. В моем файле эти строки начинаются с #include (вот это поворот :-) ). Начнем же создание регулярного выражения.
Как видите, стоило там только указать, что искомые строки начинаются с #include, как re-builder тут же нам их подсветил. Часть регулярного выражения уже создана и мы сразу же видим, как она работает. Едем дальше.
А дальше у нас возможны пробелы (один, несколько или вообще их отсутствие), укажем же сей факт в нашем регулярном выражении.
За директивой #include и пробелами следует открывающая скобка < или двойная кавычка.
Как видите, стоило нам только указать это в регулярном выражении, как все сработало как нужно. После скобки или двойной кавычки нас ждут символы алфавита и цифры в количестве от единицы и более. Необходимо это учесть.
Кажется, мы забыли указать, что в именах заголовочных файлов могут содержаться слэши, точки и символы подчеркивания. Исправляемся.
И последний штрих - закрывающая скобка > или двойная кавычка.
Просто шикарно! Регулярное выражение готово.

Первоисточник: Introduction to Regex in Emacs.

пятница, 2 мая 2014 г.

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

Для emacs существует огромное количество расширений, среди которых много весьма и весьма полезных. Установить пакет с каким-либо расширением можно как вручную с сайта разработчика, так и воспользовавшись менеджером пакетов, входящим в штатный комплект редактора. Если вы не находите нужного пакета в репозитории ELPA, то можете подключить еще парочку, например, MELPA и Marmalade. Дополнительные репозитории подключаются следующим кодом, который следует поместить в файл .emacs.
(require 'package)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)
При работе с пакетами пригодятся следующие команды и горячие клавиши:
  • M-x package-refresh-contents - обновить список доступных пакетов;
  • M-x list-packages - загрузить список пакетов (будет создан буфер со списком доступных пакетов и их кратким описанием);
  • В буфере со списком пакетов можно отметить пакет для установки (клавиша i), обновления (клавиша U) или удаления (клавиша d). Отметку можно снять с помощью клавиши u. После того, как вы отметили пакеты, необходимо применить запланированные действия. Сделать это можно нажав клавишу x.
После установки какого-либо пакета, необходимо настроить его для использования в emacs. Для этого следует обратиться к файлу README проекта или комментариям в коде. Про сайт разработчика тоже забывать не стоит.

UPD: 07.09.2014

четверг, 1 мая 2014 г.

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

Еще одной весьма востребованной функцией любого текстового редактора является возможность удобного и быстрого переключения между режимами переноса строк. В emacs это делается добавлением следующего кода в файл .emacs.
(setq default-truncate-lines t)
(global-visual-line-mode 1)
(global-set-key [f9] 'toggle-truncate-lines)
Как видно из настроек, переключение между режимами будет осуществляться с помощью горячей клавиши F9. По умолчанию режим будет включен и перенос будет осуществляться без разрыва слов.

Полезная ссылка по теме: http://ergoemacs.org/emacs/emacs_long_line_wrap.html

среда, 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

Улучшен код.