如何使函数尊重缓冲区局部变量

How to make functions respect buffer local variables

在下面的(业余的,令人费解的)代码中,我试图创建一个环境,其中可能同时存在多个序列术语 buffers/windows。我正在做我能想到的一切(并且只是随机的绝望的事情)使变量本地化到缓冲区 运行 它们所属的终端。例如,可能有一个缓冲区“serial-1a2b-buffer”和终端“serial-1a2b-term”运行,同时有一个缓冲区“serial-3c4d-buffer”和终端其中包含“serial-3crd-term”运行。

我可以获得 buffers/terminals 设置和 运行 defun setupserial,但是 defun killserialdefun resetserial 没有获得“termname”的正确值和“buffname”。它可能是另一个缓冲区中的值,也可能是不再存在的缓冲区和终端的过去值。

(以防万一有人想知道,我用微控制器做了很多工作。如果与它们的串行连接中断,比如硬件复位,那么串行进程就死了。我的想法是有一个快速的方法重置连接 - 就像绑定到键序列的函数一样。)

(defvar serialspeed "115200")
(defvar serialport "/dev/ttyACM0")
(defvar serialbasename "serial")
(require 'term)


(defun setupserial (serialport serialspeed)
  (interactive
   (list
    (read-string
     (format "Serial Port (%s): "
         serialport)
     nil nil
     serialport)
    (read-string
     (format "Speed (%s): "
         serialspeed)
     nil nil
     serialspeed)))
  (setq uniqueid (format "%04x" (random (expt 16 4))))
  (setq serialid (concat serialbasename "-" uniqueid))
  (setq buffname (concat serialid "-buffer"))
  (setq termname (concat serialid "-term"))
  (setq bufferid (get-buffer-create buffname))
  (setq procid (make-serial-process
   :speed (string-to-number serialspeed)
   :port serialport
   :name termname
   :buffer buffname))
  (switch-to-buffer bufferid)
  (make-local-variable 'serialid)
  (make-local-variable 'buffname)
  (make-local-variable 'bufferid)
  (make-local-variable 'termname)
  (make-local-variable 'procid)
  (make-local-variable 'serialspeed)
  (make-local-variable 'serialport)
  (term-mode)
  (term-char-mode)
  (local-set-key (kbd "M-r") #'resetserial)
  (local-set-key (kbd "M-k") #'killserial)
  (local-set-key (kbd "M-x") #'execute-extended-command)
  (local-set-key (kbd "M-o") #'ace-window)
  (message "Started Serial Terminal"))

(defun resetserial ()
  (interactive)
  (make-serial-process
   :speed (string-to-number serialspeed)
   :port serialport
   :name termname
   :buffer bufferid)
  (message "Restarted Serial Terminal"))


(defun killserial ()
  (interactive)
  (delete-process termname))

(global-set-key (kbd "C-c s") #'setupserial)

(provide 'setup-serial)

你的问题是连续的。创建了所有缓冲区局部变量后,您将通过调用新的主模式来销毁它们。

this answer 中关于“派生模式和模式挂钩”的部分可能很有用,但关键是调用主模式时首先发生的事情是 kill-all-local-variables .

因为您也在设置全局值,在没有局部值的情况下,您的其他命令最终将使用最新的全局值。

先设置主模式