当我将此代码放在我的init文件中时,emacs shell的某些功能会消失

时间:2017-10-30 22:43:22

标签: emacs eshell

我尝试将此代码放在我的Emacs init文件中:

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

效果很好,但会出现一些错误:

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

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

更新

我进入了调试器模式。当我按下UP键(仅UP键,而不是Tab键)时,调试器会抛出此错误:

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会尝试使用其他'自动完成。例如,目前,我在包含编程目录的路径中。如果我输入cd Progr并按TAB键,Emacs会尝试自动填充显示此消息:

  

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

     

可能的完成是:

     

。 2to3的

     

2to3-2.7 2to3-3.6

     

ControlPanel KateDJ

     

Magick ++ - 配置Magick-config

     

MagickCore-config MagickWand-config

     

NetworkManager Wand-config

     

WebKitWebDriver X

     

Xorg Xwayland

     

[a2ping

等等。为什么没有使用目录完成emacs?非常感谢所有评论和答案!

1 个答案:

答案 0 :(得分:1)

C-h v eshell-prompt-function州:

  

请务必更新eshell-prompt-regexp,以使其符合您的提示。

我认为正确设置正则表达式可以解决您的问题。

你无疑会想出一些比这更具体的东西,但是下面的正则表达式与你生成的提示相符:

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

此正则表达式匹配(在行的开头)[x@y z]$其中xy是非换行符的序列(.与换行符不匹配,这里不存在问题),z是一系列非/个字符(由于split-string中的/调用快速函数拆分*? )。

*addDockWidget的非贪婪版本,尽可能/必要匹配前一个模式的少数个实例;从而确保我们无法在提示结束之后无意中匹配文本。