LINUX.ORG.RU

Синхронизация значения переменной emacs с внешней средой

 ,


0

1

И снова здравствуй, уважаемый 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 для перенаправления изменений между прогами. Но замечательный оффтопик нитого ни другого не умеет вроде, а работать и под ним должно.

Ждём-с хэлпов.

Оффтопик умеет сетевые сокеты. Можно через них.

Artificial_Thought ★★★★ ()

внешняя программа способная из файла с кодом на заданном языке строить то самое дерево разбора и выдавать на стандартный вывод записанным его в виде s-expression понятных имаксу.

emacsclient --eval, не?

lazyklimm ★★★★★ ()
Ответ на: комментарий от lazyklimm

всмысле, прогу внутри клиента запустить?
P.S. с клиентом не работал никогда

proofit404 ()
Ответ на: комментарий от proofit404

в смысле из проги(скрипта) вызвать emacsclient --eval с нужным лиспокодом

lazyklimm ★★★★★ ()
Ответ на: комментарий от lazyklimm

emacsclient -e "(setq my-parse-tree (list (list \'leaf0 \'leaf1) \'leaf2 \'leaf3))"
Позор мне такого не знать, спасибо за просветление.

proofit404 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.