每当我在Emacs“Mx term”中打开一个新终端时,我得到当前打开的终端,为了解决这个问题,我需要重命名终端运行的缓冲区,然后通过Mx术语开始一个新的终端。 / p>
我想编写一个包含全局计数器的函数,并使用它来启动一个新终端,用它来生成缓冲区名称;一旦完成,我可以将此功能映射到我的偏好的键绑定。
我在新创建的缓冲区中运行终端时遇到问题,我不是一位经验丰富的ELisp程序员,这段代码对某些人来说可能看起来很天真,但是我现在处于这样的地方:
(defvar counter 0)
(defun mine/open-terminal ()
"Open a new terminal and rename the buffer"
(setq counter (+ counter 1))
(setq title (concat "Terminal-" (number-to-string counter)))
(setq terminal (get-buffer-create title))
该函数创建一个具有正确名称的新缓冲区 - 虽然它不会像我希望的那样立即显示它,但是如果我在函数末尾添加行:
(term "/bin/bash")
创建了一个名为terminal的新缓冲区,我觉得我在这里缺少一点,有没有办法启动一个新的终端给它一个缓冲区名称?
非常感谢。
答案 0 :(得分:1)
也许您可以查看sane-term
包。它有sane-term-create
(创建新术语)和sane-term
(循环术语或如果没有则创建一个。)
答案 1 :(得分:0)
这是一种替代方法,它不使用附加到全局或缓冲区局部变量的计数器 - 即,计数器仅在函数持续时间内被限制。
(require 'term)
(defun my-term (program)
"Start a terminal-emulator in a new buffer.
The buffer is in Term mode; see `term-mode' for the
commands to use in that buffer.
\\<term-raw-map>Type \\[switch-to-buffer] to switch to another buffer."
(interactive (list (read-from-minibuffer "Run program: "
(or explicit-shell-file-name
(getenv "ESHELL")
(getenv "SHELL")
"/bin/sh"))))
(let* ((n 0))
(catch 'done
(while t
(let* (
bufname
buffer
(basename "term"))
(setq basename (concat basename (if (= n 0) "" (int-to-string n))))
(setq bufname (concat "*" basename "*"))
(setq n (1+ n))
(when (not (get-buffer bufname))
(setq buffer (set-buffer (make-term basename program)))
(term-mode)
(term-char-mode)
(throw 'done (switch-to-buffer buffer))) )))))
答案 2 :(得分:0)
到目前为止我发现的最简单的方法是从字面上复制原始术语函数的源代码:
并将其修改为:
;; My terminal stuff
(defvar counter 0)
(defun my/open-terminal ()
"Open a new terminal and rename the buffer"
(interactive)
(setq counter (+ counter 1))
(setq title (concat "Terminal-" (number-to-string counter)))
(setq buf-title (concat "*" title "*"))
(message buf-title)
(set-buffer (make-term title "/bin/bash"))
(term-mode)
(term-char-mode)
(switch-to-buffer buf-title)
)