И снова здравствуй, уважаемый LOR.
В продолжение предыдущей темы хочется выяснить подробности синхронизации внутреннего состояния имакса с окружающим миром.
Имеется следующая программная мешанина:
- n'ное количество elisp функций, работающих скажем с переменной my-parse-tree, в которой валяется, как видно из названия, дерево разбора кода для текущего буфера.
- внешняя программа способная из файла с кодом на заданном языке строить то самое дерево разбора и выдавать на стандартный вывод записанным его в виде s-expression понятных имаксу.
Необходимо установить двухсторонний обмен между имаксом и парсером так, чтобы при изменении буфера менялось и само дерево разбора.
Топорно можно решить проблему в следующем стиле с поправкой на перезапуск процесса:
(with-current-buffer (generate-new-buffer "*Redirect*")
(set (make-local-variable 'redirection-session-process)
(start-process (buffer-name) (buffer-name) "wonderful-parser"))
(while (not (equal (buffer-substring-no-properties
(line-beginning-position)
(line-end-position))
"**End*Of*Parse*Process**"))
(accept-process-output redirection-session-process))
(goto-char (point-max))
(previous-line)
(delete-region (line-end-position) (point-max))
(setq my-parse-tree (read (buffer-string))))
Но при таком долбанном подходе на каждый чих, модифицирующий буфер, парсить придётся весь файл. Сами собой напрашиваются sockets и pipes для перенаправления изменений между прогами. Но замечательный оффтопик нитого ни другого не умеет вроде, а работать и под ним должно.
Ждём-с хэлпов.