【问题标题】:Emacs function to create new terminalEmacs 函数创建新终端
【发布时间】:2016-05-25 16:51:51
【问题描述】:

每次我在 Emacs "M-x term" 中打开一个新终端时,我都会得到当前打开的终端,为了解决这个问题,我需要重命名终端运行所在的缓冲区,然后通过 M-x term 启动一个新终端。

我想写一个函数来保存一个全局计数器,并用它来启动一个新的终端,用它来生成缓冲区名称;完成后,我可以将此函数映射到我偏好的键绑定。

我在新创建的缓冲区中运行终端时遇到问题,我不是经验丰富的 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")

创建了一个名为终端的新缓冲区,我觉得我在这里遗漏了一点,有没有办法启动一个新的终端给它一个缓冲区名称?

非常感谢。

【问题讨论】:

  • 这是我用来创建连续编号的自定义暂存缓冲区,您可以对其进行修改以打开一个新术语:emacs.stackexchange.com/a/16493/2287
  • 我看到函数 term 只是几行长 -- 所以继续找到函数,打开它,将它复制到您的 .emacs,然后创建一个新函数一个不同的名称,包含类似于第一条评论中的链接的概念:M-x find-function RET term RET。当您以编程方式循环或搜索具有特定名称的现有缓冲区时,无需将缓冲区对象/名称信息存储在全局变量中。后者是可能的,但似乎是必要的,除非该变量稍后将用于问题中未指定的其他事物。
  • @lawist: 我找不到函数源.. 我得到一个 -> 调试器进入--Lisp 错误:(错误“找不到库术语”)
  • (require 'term).emacsM-x eval-expression RET (require 'term) RET 中。
  • find-library-name: 找不到库 /usr/share/emacs/24.3/lisp/term.el :-( 感谢您的链接,尽管在我看来我们是尝试做不同的事情,在您的情况下,您创建一个新缓冲区并为它设置模式,在我的情况下,我需要在其上运行一个进程,再说一次,我远非专家。

标签: emacs lisp elisp


【解决方案1】:

到目前为止,我发现的最简单的方法是从以下位置逐字复制原始术语函数的源代码:

term.el source

并修改为:

;; 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)
)

【讨论】:

    【解决方案2】:

    也许你可以看看sane-term 包。它有sane-term-create(创建新术语)和sane-term(遍历术语,如果没有则创建一个。)

    【讨论】:

      【解决方案3】:

      这是一种替代方法,它不使用附加到全局或缓冲区局部变量的计数器 - 即,计数器仅在函数执行期间被绑定。

      (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))) )))))
      

      【讨论】:

        猜你喜欢
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多