1

我试图把这段代码放在我的 Emacs 初始化文件中:

(setq eshell-prompt-function (lambda () 
    (concat "[" 
        (user-real-login-name) 
        "@" 
        (system-name) 
        " " 
        (car (last (split-string (eshell/pwd) "/"))) 
        "]$ ")))

它工作得很好,但出现了一些错误:

  • 当我按下 UP 键(以执行最后一个命令)时,我在 minibuffer 中收到此消息:Not found
  • 当我按下 TAB 键(自动完成路径)时,我在 minibuffer 中收到此消息:Invalid variable reference

我不明白为什么会这样。有人可以帮助我吗?谢谢!


更新

我进入了调试器模式。当我按 UP 键(只有 UP 键,而不是选项卡)时,调试器会抛出此错误:

Debugger entered--Lisp error: (error "Not found")
  signal(error ("Not found"))
  error("Not found")
  eshell-previous-matching-input("^\\[carlos@archlinux ~]\\$ " 1)
  eshell-previous-matching-input-from-input(1)
  funcall-interactively(eshell-previous-matching-input-from-input 1)
  call-interactively(eshell-previous-matching-input-from-input nil nil)
  command-execute(eshell-previous-matching-input-from-input)

更新 2

我将 eshell-prompt-regexp 设置为与我的设置匹配的正则表达式:

(setq eshell-prompt-regexp "\\[[[:alnum:]]+@[[:alnum:]]+[[:blank:]][[:print:]]+\\]\\$[[:blank:]].*")

现在,我可以按 UP 并且它工作正常,但是当我按 TAB 键自动完成 PATH 时,Emacs 会尝试使用其他“事物”自动完成。例如,目前,我在包含 Programming 目录的路径中。如果我键入cd Progr并按 TAB 键,Emacs 会尝试自动完成显示此消息:

单击完成以将其选中。在此缓冲区中,键入 RET 以选择完成近点。

可能的完成是:

. 2到3

2to3-2.7 2to3-3.6

控制面板凯特DJ

Magick++-config Magick-config

MagickCore-config MagickWand-config

NetworkManager Wand-config

WebKitWebDriver X

Xorg Xwayland

[ a2ping

和更多。为什么 emacs 不使用目录完成?非常感谢所有的评论和回答!

4

1 回答 1

1

C-hv eshell-prompt-function状态:

确保更新eshell-prompt-regexp,使其符合您的提示。

我相信适当设置该正则表达式将解决您的问题。

毫无疑问,您可能会想出比这更具体的东西,但以下正则表达式与您生成的提示匹配:

"^\\[.*?@.*? [^/]*?\\]\\$ "

这个正则表达式匹配(在行的开头)[x@y z]$,其中xy是非换行符的序列(.不匹配换行符,这在这里不是问题),并且z是非/字符的序列(由于split-string调用在您的提示功能拆分上/)。

*?是 的非贪婪版本,尽可能/必要地*匹配前面模式的尽可能少的实例;从而确保我们不会无意中匹配超出提示末尾的文本。

于 2017-10-31T10:56:53.763 回答