是否可以从emacs向xterm发送'cd'命令?

时间:2013-07-23 14:49:04

标签: shell emacs zsh tmux xterm

在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中时,如果发现有一个名为XTerm的子进程正在运行,1)切换到它2)将在xterm中运行的shell的PWD设置为{{1} Emacs。

是否可以这样做?

如果两者都不可能,那么使用default-directory,我们能实现这一目标吗?

2 个答案:

答案 0 :(得分: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.3秒。

UPD我的dired自定义

中的小片段

我的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 buffer相同目录的终端, 重用现有的*terminal*,或者如果它不存在则创建一个新的。{/ p>

总结你问题的答案:

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

(term-send-string
 (terminal)
 (format "cd %s\n" default-directory))

答案 1 :(得分: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))))