在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
,我们能实现这一目标吗?
答案 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秒。
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))))