【问题标题】:How to make functions respect buffer local variables如何使函数尊重缓冲区局部变量
【发布时间】:2021-12-09 08:44:23
【问题描述】:

在下面的(业余的、复杂的)代码中,我正在尝试创建一个环境,其中可能同时存在多个串行项缓冲区/窗口。我正在做我能想到的一切(并且只是随机的绝望的事情),以使变量在运行它们所属的终端的缓冲区中成为本地变量。例如,可能有一个缓冲区“serial-1a2b-buffer”和终端“serial-1a2b-term”在其中运行,同时有一个缓冲区“serial-3c4d-buffer”和终端“serial-3crd” -term”在其中运行。

我可以使用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)

【问题讨论】:

  • 我在 resetserial 中尝试过 "buffname" 和 "bufferid"。两者都应该有效,但都没有给出适当范围内的值。

标签: elisp


【解决方案1】:

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

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

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

先设置主模式。

【讨论】:

  • 非常感谢。我至少读了六遍,改变模式后发生的第一件事是kill-all-local-variables,但由于某种原因,它并没有嵌入我的大脑。我正在遭受隧道视野的困扰,认为这是范围的某种问题。
  • 不客气。我要补充一点,我不确定您是否有理由分配全局值和缓冲区本地值,但如果没有,那么您可以考虑使用 defvar-local 声明它们,然后在您的函数中您可以简单地使用 @987654325在更改主模式后@它们,您将自动设置缓冲区本地值。还有setq-local,这是一种更简洁的方法来设置缓冲区本地值,而不管变量是如何定义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多