将dos shell目录与emacs'工作目录'对齐

时间:2014-07-22 09:05:17

标签: windows shell emacs

在Windows Emacs中,我经常使用dos提示符。 (M-x shell) 大部分时间我的emacs'工作目录是最新的提示'目录。例如,当我的提示目录是c:\ TEMP \ project而我执行C-x f时,它会提示从c:\ temp \ project获取文件,这是所需的行为。

有时,emacs'工作目录和shell工作之间的对齐会丢失,尤其是在使用/ D标志(cd /D E:\TEMP\other-project)时。 有没有办法恢复这种对齐?

我在emacs i386-mingw-nt6.1.7601

3 个答案:

答案 0 :(得分:4)

M-x shell-resync-dirs RET

或简单地(默认情况下): M-RET

Resync the buffer's idea of the current directory stack.
This command queries the shell with the command bound to
`shell-dirstack-query' (default "dirs"), reads the next
line output and parses it to form the new directory stack.
DON'T issue this command unless the buffer is at a shell prompt.
Also, note that if some other subprocess decides to do output
immediately after the query, its output will be taken as the
new directory stack -- you lose.  If this happens, just do the
command again.
然而,在dos中的YMMV。

在我看来,您需要(setq shell-dirstack-query "cd"),因为dos中不存在默认的dirs命令。没有参数的cd似乎是需要的。

在我的win32框中,我看到所有命令都回显,这会干扰shell-resync-dirs尝试读取正确的目录,因此您可能需要参考http://www.gnu.org/software/emacs/manual/html_node/efaq-w32/Shell-echo.html

然而,所有这一切,它仍然不可靠。我相信路径中的空间正在抛弃它。如果你没有空格,你可能会没事。

编辑:是的,尝试解析目录时,有一个不太理想的正则表达式:

;; regexp = optional whitespace, (non-whitespace), optional whitespace
(string-match "\\s *\\(\\S +\\)\\s *" dl i) ; pick off next dir

我不确定潜在的可移植性问题是什么,但您可以将其更改为以下内容:

;; regexp = optional whitespace, everything up until the last non-whitespace, optional whitespace
(string-match "\\s *\\(.+\\S +\\)\\s *" dl i) ; pick off next dir

该代码位于 M-x find-function RET shell-resync-dirs RET

我发现有几个相关的Emacs错误报告(1160711608)。你可能想要跟进它们。

答案 1 :(得分:1)

对齐丢失后,M-x cd似乎能够将其恢复:指定作为shell实际工作目录的目录,然后C-x C-f将其用作基础。

答案 2 :(得分:0)

我在Windows上遇到类似的问题,让shell-resync-dirs工作。事实证明,在shell模式配置中将comint-process-echoes设置为t解决了这个问题,由于某种原因,即使该变量为false,显示目录的命令也会被回显。