在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
答案 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
答案 1 :(得分:1)
对齐丢失后,M-x cd
似乎能够将其恢复:指定作为shell实际工作目录的目录,然后C-x C-f
将其用作基础。
答案 2 :(得分:0)
我在Windows上遇到类似的问题,让shell-resync-dirs
工作。事实证明,在shell模式配置中将comint-process-echoes
设置为t
解决了这个问题,由于某种原因,即使该变量为false,显示目录的命令也会被回显。