创建新终端的Emacs函数

创建新终端的Emacs函数,emacs,lisp,elisp,Emacs,Lisp,Elisp,每次我在Emacs“M-x term”中打开一个新的终端时,我都会得到当前打开的终端,为了解决这个问题,我需要重命名终端运行的缓冲区,然后通过M-x term启动一个新的终端 我想写一个函数,其中包含一个全局计数器,并使用它来启动一个新的终端,使用它来生成缓冲区名称;完成后,我可以将此函数映射到我偏好的键绑定 我在新创建的缓冲区中运行终端时遇到问题,我不是一名经验丰富的ELisp程序员,并且此代码在某些人看来可能非常幼稚,尽管如此,我目前的处境是: (defvar counter 0)

每次我在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")
创建了一个名为terminal的新缓冲区,我感觉这里缺少了一点,有没有办法启动一个新的终端,并给它一个缓冲区名称


非常感谢。

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

也许您可以看看
sane term
软件包。它有
sane term create
(创建新术语)和
sane term
(循环术语,如果没有,则创建一个)。

这里有一种替代方法,它不使用附加到全局或缓冲区局部变量的计数器——即,计数器仅在函数持续时间内被绑定

(要求术语)
(取消我的任期(课程)
“在新缓冲区中启动终端仿真器。
缓冲区处于术语模式;有关详细信息,请参阅“术语模式”
要在该缓冲区中使用的命令。
\\键入\\[switch to buffer]切换到另一个缓冲区。“
(交互式(列表)(从微型缓冲区读取“运行程序:”
(或显式shell文件名)
(getenv“ESHELL”)
(getenv“SHELL”)
“/bin/sh”))
(let*((n0))
(完)
(而t
(让我们*(
bufname
缓冲器
(基本名称“术语”))
(setq basename(concat basename(如果(=n0)”(int到string n)))
(setq bufname(concat“*”basename“*”)
(setq n(1+n))
(何时(不是(获取缓冲区bufname))
(setq缓冲区(set缓冲区(生成术语basename程序)))
(术语模式)
(术语字符模式)
(throw'done(切换到缓冲区)))、、、、())

这里有一种替代方法,它不使用附加到全局变量或缓冲区局部变量的计数器,也就是说,计数器只允许在函数期间绑定

(要求术语)
(取消我的任期(课程)
“在新缓冲区中启动终端仿真器。
缓冲区处于术语模式;有关详细信息,请参阅“术语模式”
要在该缓冲区中使用的命令。
\\键入\\[switch to buffer]切换到另一个缓冲区。“
(交互式(列表)(从微型缓冲区读取“运行程序:”
(或显式shell文件名)
(getenv“ESHELL”)
(getenv“SHELL”)
“/bin/sh”))
(let*((n0))
(完)
(而t
(让我们*(
bufname
缓冲器
(基本名称“术语”))
(setq basename(concat basename(如果(=n0)”(int到string n)))
(setq bufname(concat“*”basename“*”)
(setq n(1+n))
(何时(不是(获取缓冲区bufname))
(setq缓冲区(set缓冲区(生成术语basename程序)))
(术语模式)
(术语字符模式)
(throw'done(切换到缓冲区)))、、、、())

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

并将其修改为:

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

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

并将其修改为:

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

下面是我用来创建连续编号的自定义暂存缓冲区的内容,您可以对其进行修改以打开一个新术语:我看到函数
术语
只有几行长——所以继续查找函数,打开它,将它复制到
.emacs
,并创建一个新函数,其名称与第一条注释中的链接类似:
M-x find function RET term RET
。当以编程方式循环或搜索具有特定名称的现有缓冲区时,无需将缓冲区对象/名称信息存储在全局变量中。后者是可能的,但似乎是必要的,除非该变量稍后将用于问题中未指定的其他事情。@lawist:我找不到函数源。。我在
.emacs
M-x eval expression RET(require'term)RET
中输入了一个->调试器--Lisp error:(错误“找不到库术语”)
(require'term)
。查找库名称:找不到库/usr/share/emacs/24.3/Lisp/term.el:-(感谢链接,尽管我觉得我们正在尝试做不同的事情,但在你的情况下,你创建了一个新的缓冲区,你可以选择它的模式,在我的情况下,我需要在它上运行一个进程,同样,我远不是一个专家。下面是我用来创建连续编号的自定义暂存缓冲区的方法,你可以修改它来打开一个新的缓冲区w term:我看到函数
term
只有几行长——因此,继续查找函数,打开它,将其复制到
.emacs
,然后创建一个新函数,使用不同的名称,并包含与第一条注释中的链接类似的概念:
M-x find function RET term RET
循环或搜索具有特定名称的现有缓冲区,这样就无需将缓冲区对象/名称信息存储在全局变量中。后者是可能的,但会出现