2015-01-22

Подсветка синтаксиса в nano и mc

Порой просто не хочется запускать Emacs для того чтобы просто посмотреть исходник на LISP. И раз уж я ССЗБ то пользовался для просмотра midnight-commander или nano. Никакой подсветки LISP там и в помине нет. Ну вот однажды и надоело мне сидеть у камина с бокалом кьянти и мечтать как бы кто сделал для меня это благо. Я закатал рукава и сделал так:
Для mc
1. В первую очередь нудно включить встроенный в mc редактор. Он уже имеет подсветку синтаксиса, но знает лишь пару десятков команд.
2. Заменим в файле /usr/share/mac/syntax/lisp.syntax на такое содержимое:
wholechars abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-*0123456789

context default
    keyword whole apply yellow
    keyword whole and yellow
    keyword whole car yellow
    keyword whole caar yellow
    keyword whole cadr yellow
    keyword whole cdar yellow
    keyword whole cddr yellow
    keyword whole cdr yellow

    keyword whole close yellow
    keyword whole cond yellow
    keyword whole cons yellow
    keyword whole count yellow
    keyword whole defvar brightcyan
    keyword whole defstruct brightcyan
    keyword whole defun yellow
    keyword whole do yellow
    keyword whole eq yellow
    keyword whole eql yellow
    keyword whole equal yellow
    keyword whole eval yellow
    keyword whole format yellow
    keyword whole if yellow
    keyword whole let* yellow
    keyword whole let yellow
    keyword whole list yellow
    keyword whole load yellow
    keyword whole make-package yellow
    keyword whole mapcar yellow
    keyword whole not yellow
    keyword whole null yellow
    keyword whole numberp yellow
    keyword whole open yellow
    keyword whole or yellow
    keyword whole pprint yellow
    keyword whole prin1 yellow
    keyword whole princ yellow
    keyword whole print yellow
    keyword whole provide yellow
    keyword whole read yellow
    keyword whole require yellow
    keyword whole set yellow
    keyword whole setf yellow
    keyword whole setq yellow
    keyword whole slot-value yellow
    keyword whole sort yellow
    keyword whole stringp yellow
    keyword whole terpri yellow
    keyword whole write yellow
    keyword whole defmacro brightcyan
    keyword whole case yellow
    keyword whole progn yellow
    keyword whole when yellow 
    keyword whole loop yellow
    keyword whole unless yellow
    keyword whole with-output-to-string yellow
    keyword whole labels yellow
    keyword whole return-from yellow
    keyword whole handler-case yellow
    keyword whole defmethod yellow
    keyword whole eval-when yellow
    keyword whole declare yellow
    keyword whole with-open-file yellow
    keyword whole multiple-value-bind yellow
    keyword whole defclass brightcyan
    keyword whole with-standard-io-syntax yellow
    keyword whole getf yellow
    keyword whole mapcar yellow
    keyword whole remove-if-not yellow
    keyword whole dolist yellow
    keyword whole defparameter brightcyan
    keyword whole defgeneric yellow
    keyword whole consp yellow
    
    keyword whole lambda red
    keyword whole for red
    keyword whole nil brightred
    keyword whole t brightred
    keyword whole in-package brightred
    keyword whole defpackage brightred
    keyword whole error brightred

    keyword #' brightmagenta
    keyword ' brightmagenta
    keyword , brightmagenta

    keyword ( brightcyan
    keyword ) brightcyan

# Keyword declarations and keywords

    keyword :\[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-*0123456789\] white
    keyword &\[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-*0123456789\] brightgreen

# Comments

context ; \n brown

# Strings

#context \* \* brightmagenta
context " " brightgreen
keyword \\" green
keyword \\\\ green

3. В итоге получим такую картинку

В mc редактор достаточно туповат, но умеет подсвечивать парные скобки. 

Но если вы как и я используете nano, то для вас путь особый! По умолчанию он вообще не знает о существовании Common-Lisp, по этому:

1. Создаем в /usr/share/nano/ файл описания подсветки синтаксиса
#touch /usr/share/nano/lisp.nanorc
2. В него вписываем такое содержимое:
## Here is an example for Common-Lisp.
## Adapted from http://cl-cad.blogspot.com
## (litetabs@gmail.com)
syntax "lisp" "\.lisp$"  "asd" "\.asd$"
color green "\<(defun|with-open-stream|format|setf|apply|and|car|caar|cadr|cdar|cddr|cdr|close|cond|cons|count|do|eql|equal|eval|if|let*|let|list|load|make-package|mapcar|not|null|numberp|open|or|pprint|prin1|princ|print|provide|read|require|setq|slot-value|sort|stringp|terpri|write|case|progn|when|loop|unless|with-output-to-string|labels|return-from|handler-case|eval-when|declare|with-open-file|multiple-value-bind|with-standard-io-syntax|getf|remove-if-not|dolist|consp)\>"
color red "\<(error|else|for|in-package|defpackage|defsystem|lambda)\>"
color cyan "\<(defclass|defstruct|defvar|defconstant|defmethod|defgeneric|defparameter)\>"
color brightred "\<(t|nil)\>"
icolor yellow "\:\{?[0-9A-Z_!@#$*?-]+\}?"
color brightgreen ""(\\.|[^"])*""
icolor blue "\*\{?[0-9A-Z_!@#$*?-]+\}?"
color cyan "(^|[[:space:]]);.*$"
3. Для того чтобы nano узнал о новом синтаксисе, открываем файл /etc/nanorc
#: nano /etc/nanorc
4. В самый конец вписывает строку:

## Common-Lisp files
include "/usr/share/nano/lisp.nanorc"

Теперь можно любоваться результатом


Плюс nano в том что без лишней крови подсвечивает и asd файлы и в нормальной навигации по файлу клавишами. Из минусов - нет подсветки парных скобок.

Это лишь то что сразу бросалось в глаза, по этому над подсветкой синтаксиса еще стоит поработать. В настройках есть еще куча косяков, так что для отправки разработчикам они пока не годятся, но вот пользоваться можно уже сейчас. Надеюсь среди читателей найдутся те у кого завалялись пара-тройка дельных советов.

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

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