如何定义一个在Emacs上运行多个shell的函数?

时间:2012-03-01 10:26:49

标签: emacs elisp

众所周知,“C-u M-x shell”可用于运行多个shell。 但是如何定义一个与“C-u M-x shell”做同样事情的函数呢?

1 个答案:

答案 0 :(得分:2)

(defun my-named-shell ()
  "Equivalent to C-u M-x shell RET"
  (interactive)
  (shell (get-buffer
          (read-buffer
           "Shell buffer: "
           (generate-new-buffer-name "*shell*")))))

我使用describe-functionfind-function来检查shell及其interactive声明的行为,然后我只是复制了必要的代码以将其转换为对shell函数进行非交互式调用的参数(但将其包装在get-buffer中以便提供缓冲区参数)。

我实际上遗漏了一些处理远程文件的代码,因为该代码中的注释似乎有点混乱。如果您不习惯在通过Tramp访问远程文件的缓冲区中使用C-u M-x shell,则该遗漏不会对您造成影响。

总而言之,一种更简单(也更完整)的方法就是:

(defun my-named-shell ()
  "Equivalent to C-u M-x shell RET"
  (interactive)
  (let ((current-prefix-arg '(4)))
    (call-interactively 'shell)))

有关详细信息,请参阅https://stackoverflow.com/a/9388058/324105

在这种情况下,current-prefix-arg可以是任何非零值,但我认为使用C-u实际生成的值是一个好习惯。

相关问题