четверг, 6 октября 2011 г.

Переделывание .emacs

Поскольку сейчас на досуге ковыряю Common Lisp то заглянув в свой .emacs пришел в легкий ужас от того что было сделано ранее. Ну и поскольку зуд в руках было не унять переделал все немного. Добавил функцию тригерного подсвечивания слов. Т.е. если слово не подсвечено оно подсвечивается по всему тексту. Если подсвечено то подсветка снимается. Удобно. В процессе создания меня ждало несколько обломов и разочарований.

1) Зачем было давать в elisp другие имена функциям имеющим сходное поведение в CL??

2) Не нашел аналога функции position из CL пришлось писать свой велосипед

3) Удаление элемента из списка. В доке по elisp сказано буквально следующее

— Function: delete object sequence

If sequence is a list, this function destructively removes all
elements equal to object from sequence. For lists, delete is to
delq as member is to memq: it uses equal to compare elements with
object, like member; when it finds an element that matches, it
cuts the element out just as delq would.

оказалось она ни разу не деструктивная.

В результате получилось следующее. Предыдущий вариант можно посмотреть в более ранних постах.
(defvar*highlited* '())

(defunmy-extract-word ()
(interactive)
(let((start 0)
(end 0))
(backward-word 1)
(setq start (point))
(forward-word 1)
(setq end (point))
(buffer-substring start end)))

(defun find-highlited (param)
(let((i 0)
(retindex -1))
(while (< i (length *highlited*))
(if (string= (elt *highlited* i) param)
(setq retindex i))
(setq i (+ i 1)))
retindex))

(defun my-highlight-phrase ()
(interactive)
(let ((curr-word (my-extract-word)))
(if (>= (find-highlited curr-word) 0)
(progn (unhighlight-regexp
(elt *highlited* (find-highlited curr-word)))
(setq *highlited* (delete curr-word *highlited*)))
(progn (highlight-regexp (my-extract-word) 'hi-yellow)
(add-to-list '*highlited* curr-word)))))

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

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