4

在 Emacs 中,我不喜欢shell-mode/eshell-mode因为它们不能充分利用它们,zsh而且它们很烂。

所以我希望xterm用作外部子进程。

(global-set-key (kbd "M-<f2>")
                (lambda () (interactive)
                  (start-process "XTerm" nil "xterm")))

现在 xterm 的 PWD 与 Emacs 同步,default-directory并且该术语现在是一个完整的术语。但是有一个问题:子程序的启动时间总是让人失望。

所以我希望xterm只启动一次,并且在Emacs中,如果它发现有一个名为XTermrunning的子进程,1)切换到它2)将xterm中运行的shell的PWD设置default-directory为Emacs。

有可能这样做吗?

如果两者都不可能,那么有了tmux,我们能实现这个目标吗?

4

2 回答 2

2

这是我的设置:

(defvar terminal-process)
(defun terminal ()
  "Switch to terminal. Launch if nonexistant."
  (interactive)
  (if (get-buffer "*terminal*")
      (switch-to-buffer "*terminal*")
    (term "/bin/bash"))
  (setq terminal-process (get-buffer-process "*terminal*")))

(global-set-key "\C-t" 'terminal)

您能否详细说明启动时间?我的是0.3s左右。

diredUPD 我自定义的一个小片段

我的dired设置中有这个:

(add-hook
 'dired-mode-hook
 (lambda()
   (define-key dired-mode-map (kbd "`")
     (lambda()(interactive)
       (let ((current-dir (dired-current-directory)))
         (term-send-string
          (terminal)
          (format "cd %s\n" current-dir)))))))

哪里terminal是:

(defun terminal ()
  "Switch to terminal. Launch if nonexistant."
  (interactive)
  (if (get-buffer "*terminal*")
      (switch-to-buffer "*terminal*")
    (term "/bin/bash"))
  (setq terminal-process (get-buffer-process "*terminal*")))

这样做的目的是为与 dired 缓冲区相同的目录打开一个终端,重用现有的*terminal*,或者如果它不存在则创建一个新的。

总结一下您的问题的答案:

是的,这是可能的。它完成了:

(term-send-string
 (terminal)
 (format "cd %s\n" default-directory))
于 2013-07-23T14:58:44.313 回答
0

如果 xterm 不是硬性要求,只是您以某种方式从 emacs 启动 zsh,然后查看AnsiTerm或我的偏好MultiTerm。他们在 emacs 中实现了一个终端仿真器(如 xterm),因此您可以在缓冲区中运行任何终端应用程序(例如 zsh)。我喜欢 MultiTerm 因为它有更好的默认 IMO。

然后你可以改变目录

(defun term-send-cd (&optional dir)
  (interactive "DDirectory: ")
  (let ((dir (if dir (expand-file-name dir) "")))
    (term-send-raw-string (format "cd '%s'\n" dir))))
于 2013-07-26T15:18:58.540 回答