понедельник, 29 июня 2015 г.

Отображение непечатаемых символов в emacs

Отображение непечатаемых символов в emacs с одной стороны очень простая тема, выполняем "M-x whitespace-mode" и пробелы, символы табуляции, перес строк будет сразу видны на экране, выполняем команду ещё раз - режим выключается. Настройки по умолчанию в принципе неплохие и если они устраивают, то на этом можно и закончить изучение режима. Но это же emacs, и "под капотом" скрывается на удивление много настроек для этого режима. К сожалению информация о нем раскидана по разным уголкам интернета, а кое-что пришлось узнавать экспериментальным путём. Так что сейчас попробую описать важные на мой взгляд опции этого режима.


Итак первой рассмотрим переменную "whitespace-style" это список, в котором требуется перечислить что собственно будет отображаться после "M-x whitespace-mode", возможные значения вот такие:
  • face - Разрешить визуализацию всех режимов описанных ниже. Без этой опции ничего кроме режимов space-mark, tab-mark и newline-mark работать не будет.
  • trailing - Дополнительно подсветить "лишние" пробелы и символы табуляции в конце строки.
  • tabs - Отобразить символы табуляции отображаемые опцией tab-mark отличным от цвета по умолчанию.
  • spaces - Аналогично "tabs", только действует на то, что отображается с включённой опцией space-mark.
  • newline - Аналогично "tabs", для опции newline-mark.
  • lines - Выделение линий длиннее whitespace-line-column символов (по умолчанию 80 символов).
  • empty - Выделение "лишних" линий в начале и конце документа, причём одна пустая строка в конце не считается "ошибочной", а вот если их 2 и более - то подсвечивается.
  • space-mark - Показывает специальные символов вместо пробелов.
  • tab-mark - Показывает специальные символы для табуляции.
  • newline-mark - Показывает символы переноса на следующую строку.
У каждого отображаемого таким образом элемента можно настроить цвет, шрифт и т.п. через соответствующий ему face, я не буду расписывать назначение каждого, приведу лишь список доступных, все в принципе понятно из названия: whitespace-space, whitespace-hspace, whitespace-tab, whitespace-newline, whitespace-trailing, whitespace-line, whitespace-space-before-tab, whitespace-indentation, whitespace-empty, whitespace-space-after-tab.
Что бы было понятнее о чем я пишу, приведу пример:
(setq whitespace-style '(face trailing tabs spaces lines newline empty
                         space-mark tab-mark newline-mark))
(set-face-attribute 'whitespace-space nil :background nil :foreground "#00FF00")
(set-face-attribute 'whitespace-newline nil :background nil :foreground "#0000FF")
Т.е. мы включаем все возможные whitespace-style, и для пробелов в середине текста выставляем зелёный цвет, для символов переноса строки - синий, в результате получим вот такую картинку:

Ещё интересной опцией является "whitespace-display-mappings". Она показывает какие символы относятся к space-mark, tab-mark и newline-mark и как их отображать. По умолчанию она имеет такой вид:
(setq whitespace-display-mappings
      '((space-mark 32 [183] [46])
        (space-mark 160 [164] [95])
        (newline-mark 10 [36 10])
        (tab-mark 9 [187 9] [92 9])))
Каждая строчка содержит имя режима, затем код символа который мы хотим отнести к этому режиму, а потом вектор с набором кодов символов, которые нужно отображать вместо исходного в whitespace-mode. Если первый вектор отобразить невозможно, emacs попытается взять следующий, если ни один не подойдёт, то ничего отображать не будет. Список кодов юникод символов можно найти например тут. Только прийдётся переводить из шестнадцатеричной формы в десятеричную. В качестве примера заменим символ l(108) на символ копирайта(169), а символ переноса строки сменим с "$"(36) на более привычный "¶"(182):
(setq whitespace-display-mappings
      '((space-mark 32 [183] [46])
        (space-mark 160 [164] [95])
        (space-mark 108 [169] [95])
        (newline-mark 10 [182 10])
        (tab-mark 9 [187 9] [92 9])))
Теперь предыдущая картинка будет выглядеть вот так:

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

Комментариев нет:

Отправить комментарий