Hi, all опять!
Спасибо еще раз всем откликнувшимся. Привожу на ваш суд то, что получилось в
результате сидения сегодняшней ночью... Столько интересного про e- и common
lisp узнаешь в результате :)
Функция которая dictionary-er запрашивает слово и выдает его перевод из
англо-русского словаря Мюллера (кстати, сам словарь по-моему можно скачать на
http://muller.chat.ru или что-то вроде того)... Если кого заинтересовало -
все остальное могу дать либо лично, либо в лист - там маленькая програмка
findword для облегчения поиска с кое-каким индексированием...
Ну, естественно, с ростом кода растут и амбиции. Хотелось бы высказать
следующие пожелания и услышать вариант, предлагаемые народом по поводу того,
как это можно сделать:
1) Запрашиваемое слово через (interactive). Хотелось бы чтобы по умолчанию в
запросе стояло то слово, что под курсором (ну типа как, когда C-h, f делаешь
- по умолчанию стоит на той функции, что под курсором). Как это делается?
2) pop-to-buffer для показывания буфера в принципе действует неплохо, но
все-равно как-то слишком искусственно. Например, когда окно уже поделено на
две части, в верхней - рабочий буфер, снизу - буфер со словарем и курсор в
буфере со словарем, то почему-то после отработки словаря появляется еще такой
же буфер со словарем сверху, замещая рабочий - что не удобно... Можно,
конечно, отделаться if-ом проверять, но это все как-то имхо глуповато
выглядит... Готовой функции для этого нету?
3) Перспективы на будущее уже совсем из области фантастики - отлавливать
отдельные слова и выражения (я слабо представляю, какой же там может быть
regex... жуть), эти самые отдельные слова и выражения делать подсвечиваемыми
мышкой и при нажатии по ним mouse3 вставлять переводы автоматом в текст
рабочего буфера...
Так же см. мои комментарии ниже по тексту - буду признателен, если кто скажет
пару умных слов по поводу...
============================================= dict.el
; Muller dictionary add-on
(defun dictionary-fontify (buf)
"Fontifies dictionary buffer."
(interactive)
(goto-char (point-min))
(while (re-search-forward "[0-9]+>" nil t)
(set-extent-face (make-extent (match-beginning 0) (match-end 0)) 'bold)
)
(goto-char (point-min))
(while (re-search-forward "_\\(.*?\\) " nil t)
(replace-match "\\1 ")
(set-extent-face (make-extent (match-beginning 0) (match-end 1)) 'bold)
;; Вот здесь я обрабатываю конструкцию типа "_слово ", сначала убирая
;; подчеркивание, а потом выделяя все жирным. Проблема в том, что жирным бы
;; надо выделять не все вместе, а только слово - а так захватывается еще
;; пробел от него (а в перспективе на месте пробела может стоять например
;; скобка). Можно конечно вручную вычесть единичку из (match-end 1), но нет
;; ли способа получше? А то юзать regex, только для того, чтобы потом руками
;; высчитывать длины строк - как-то очень варварски...
)
(goto-char (point-min))
(while (re-search-forward "[IV]+ " nil t)
(replace-match "\n\n\\&")
)
(goto-char (point-min))
(while (re-search-forward "[0-9]+\\. " nil t)
(replace-match "\n\\&")
)
)
(defun dictionary-er (word)
"Translates one word from english into russian."
(interactive "sEnglish word: ")
(let ((buf (get-buffer-create "Dictionary")))
(erase-buffer buf)
(set-buffer buf)
(setq buffer-file-coding-system 'koi8-r)
;; Вот здесь есть другая проблема. Когда в транскрипции встречаются некоторые
;; символы (типа \215, которых нет в koi8-r), все в буфере становится в
;; кодировке Noconv и соответственно iso8859-1, то есть все русские буквы
;; летят. К сожалению, установка выше вообще ни на что не влияет, так как
;; судя по всему вывод call-process'а идет монолитным куском а-ля загрузка
;; нового файла и кодировка в любом случае определяется по этому куску. Что
;; делать?
(call-process "/work/dict/findword" nil buf nil word)
(dictionary-fontify buf)
(pop-to-buffer buf t nil))
)
============================================= dict.el
--
WBR, Mikhail Yakshin AKA GreyCat
http://3d.onego.ru/
mailto:yakshin@online.ru