如何使函数尊重缓冲区局部变量
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 killserial
和 defun 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
.
因为您也在设置全局值,在没有局部值的情况下,您的其他命令最终将使用最新的全局值。
先设置主模式
在下面的(业余的,令人费解的)代码中,我试图创建一个环境,其中可能同时存在多个序列术语 buffers/windows。我正在做我能想到的一切(并且只是随机的绝望的事情)使变量本地化到缓冲区 运行 它们所属的终端。例如,可能有一个缓冲区“serial-1a2b-buffer”和终端“serial-1a2b-term”运行,同时有一个缓冲区“serial-3c4d-buffer”和终端其中包含“serial-3crd-term”运行。
我可以获得 buffers/terminals 设置和 运行 defun setupserial
,但是 defun killserial
和 defun 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
.
因为您也在设置全局值,在没有局部值的情况下,您的其他命令最终将使用最新的全局值。
先设置主模式