1

在 emacs 的外壳中,我使用的是 ditrack-mode ( M-x dirtrack-mode)。我在*Directory Tracking Log*缓冲区中收到错误:

输入 `user@machine:~/modules/mydir> ' 无法匹配 `dirtrack-list'

为了解决它,我试图设置dirtrack-list变量以告诉 emacs 我的提示形式,但没有运气。这主要是因为我不理解这个变量的文档:

污垢列表的值是("^emacs ^.\\{1,\\}@.\\{1,\\}:.+> " nil)

以任何方式设置时自动变为缓冲区本地。

文档:目录跟踪列表。第一项是一个正则表达式,它描述了在提示中找到路径的位置。第二个是数字,要匹配的正则表达式组。可选的第三项是提示是否为多行。如果 nil 或省略,则假定提示位于一行。

谁能给我解释一下第一项,第二项和第三是什么?如何告诉 emacs 提示的哪一部分是路径?

4

2 回答 2

3

您的dirtrack-list变量的值是一个列表:

("^emacs ^.\\{1,\\}@.\\{1,\\}:.+> " nil)

该列表由两项组成:字符串和符号nil。根据文档,第一项是一个正则表达式,它与您的提示匹配以提取路径。

因此,假设您的 shell 提示符如下所示:

toni@host [/home/toni/stuff] >

那么您希望正则表达式匹配包含/home/toni/stuff. 显然,默认的正则表达式 fordirtrack-list并没有这样做,所以你必须替换它。对于上面的示例,应该这样做:

"^[^@]*@[^ ]* \\[\\([^]]*\\)\\] > "

在该正则表达式中,作为实际路径的部分由"\\(...\\)"组捕获。由于它是您的正则表达式中的第一个(也是唯一一个)组,因此您希望将数字作为变量1的第二项。dirtrack-list

为了使用您自己的正则表达式,例如示例中的正则表达式,请键入M-x customize-variable RET dirtrack-list RET. 然后将值编辑为:

("^[^@]*@[^ ]* \\[\\([^]]*\\)\\] > " 1)

并将其设置为当前会话。当然,您必须使用与您的实际提示匹配的正则表达式,而不是我的示例中的那个。

于 2013-04-05T05:18:45.903 回答
2

托马斯的回答对我很有用,但在我输入双反斜杠之前,正则表达式不起作用。

对于像这样的提示:

user@place:~/work$

我将 ditrack-list 变量设置为

("^[^:]+:\\([^\\$]+\\)\\$" 1)

总是使用双反斜杠而不是单反斜杠。

反斜杠必须输入为 \\。

编辑:感谢@phils 编辑原始问题并选择包含双反斜杠的答案。

下面是添加到我的 .emacs 文件中以启用 emacs 'dirtrack' 模式的代码段 - shell通过观察提示来监视当前目录的模式(假设 pwd 打印在提示中)。默认模式“shell-dirtrack”通过解析cd、pushdpopd的输入命令来跟踪。

我在此处添加它是因为该页面的某些读者可能正在追求该选项。

(require 'dirtrack) ;change the method used to determine the current directory in a shell
(add-hook 'shell-mode-hook
          (lambda ()
            (shell-dirtrack-mode 0) ;stop the usual shell-dirtrack mode
            (setq dirtrack-list '("^[^:]+:\\([^\\$#]+\\)[\\$#]" 1)) 
            (dirtrack-debug-mode) ;this shows any change in directory that dirtrack mode sees
            (dirtrack-mode))) ;enable the more powerful dirtrack mode

(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(dirtrack-list (quote ("^[^:]+:\\([^\\$#]+\\)[\\$#]" 1))))

您可以看到ditrack-list设置了两次。第一个是本地的 shell 模式钩子。第二个是在使用交互式 UI 命令Mx customize-variable [RET] dirack-list [RET]时自动插入的部分中全局。可能只需要一个。

注意:最终的正则表达式涵盖了两种提示情况:

user@place:~/work$

user@place:~/work#

注意:Emacs 有一个交互式函数Mx re-builder,它使得测试正确的正则表达式变得非常容易。

于 2018-03-24T06:12:30.810 回答