Переключиться в буфер
Использовать существующие макросы. Например, следующее переключается в буфер (и создает его при необходимости) и записывает что-то в него. Весь код внутри (with-current-buffer-window ...)
выполняется в контексте, где выбранный буфер активен и видим.
(with-current-buffer-window "*mongo-dev*" nil nil
(insert "Hello"))
Вышеуказанный макрос является расширением, и перед оценкой он расширяется до кода. Позвонив по коду macroexpand-all
(обратите внимание на цитату '
), вы увидите, что является результатом преобразования кода:
(macroexpand-all '(with-current-buffer-window "*mongo-dev*" nil nil
(insert "Hello")))
(let* ((buffer (temp-buffer-window-setup "*mongo-dev*"))
(standard-output buffer)
window
value)
(save-current-buffer
(set-buffer buffer)
(setq value (progn (insert "Hello")))
(setq window (temp-buffer-window-show buffer nil)))
(if (functionp nil)
(funcall nil window value)
value))
Создание процесса и использование буфера для просмотра его вывода
Это обычная задача, вместо этого вы можете использовать следующее:
(start-process-shell-command "my-process"
"*mongo-dev*"
"ls -la /usr/bin")
Ваш код
(defvar buffer-name)
defvar
только для объявлений глобальных переменных в качестве операторов верхнего уровня. Вам редко (никогда) нужно помещать defvar
внутри функции.
(setq buffer-name "*mongo-dev*")
Вместо этого вы хотели сделать локальную привязку (символ «имя буфера» используется в качестве локальной переменной внутри тела let
).
(let ((buffer-name "*mongo-dev*"))
(switch-to-buffer-other-window buffer-name)
(call-process "sleep" nil buffer-name nil "2"))
call-process
является синхронным, у вас есть другие варианты, но это слишком широко, чтобы детализировать здесь. См. Руководство.
Кстати, в Emacs есть ли встроенный формат для кода elisp?
Да, emacs-lisp-mode
.