shell – 是否可以从emacs向xterm发送’cd’命令?

在Emacs中,我不喜欢
shell-mode / e
shell-mode,因为它们不能充分利用zsh而且它们很糟糕.

所以我希望使用xterm作为外部子进程.

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

现在,xterm的PWD与Emacs默认目录同步,该术语现在是一个完整的羽毛.但是有一个问题:我对子计数的启动时间总是令人失望.

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

有可能这样做吗?

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

最佳答案 这是我的设置:

(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来自我的定制的小片段

我在我的直接设置中得到了这个:

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

终端是:

(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缓冲区相同的目录的终端,
重用现有的*终端*,或者如果不存在则创建一个新终端*.

总结一下你问题的答案:

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

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