如何让 bash 在制表符补全期间停止转义 $?

如何让 bash 在制表符补全期间停止转义 $?

我在命令行上有这个:

ln -sf $PWD/wine-

然后我点击Tab完成文件名。在早期版本的 Ubuntu 中,这可以很好地完成wine-文件名(并且作为副作用,$PWD当时会扩展)。但现在它变成了

ln -sf \$PWD/wine-

这根本不是我的意思,而且没有完成任何事情,因为该文件实际上不是以 开头的$

我如何才能使完成度恢复到不那么中断的行为?

set告诉我这些是我当前的设置:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

答案1

我发现bash 版本 >= 4.2.29有一个新的direxpandshopt 设置。(查看man docs/bash.1是否签出新的 bash,或查看bash.1 从第 8951 行开始

如果有人使用 Quantal Quetzal 12.10 或以其他方式获得(或签出并构建)一个新的 bash,那么:

shopt -s direxpand

给予我想要的、需要的和喜欢的行为。

解决方法:与此同时,Ctrl++代替也能达到我想要的Alt效果。但有点尴尬。ETab

顺便说一句,有几个线程名为“bash tab 变量扩展问题?”错误。通过阅读它们,我找到了这里的信息。

答案2

shopt -u progcomp

这帮我解决了这个问题,它还删除了很多“智能”完成选项,我发现这些选项会妨碍我完成那些我知道存在的文件,因为这个愚蠢的东西认为我不想将它们作为特定命令的参数。ARRRGH

答案3

_filedir()在顶层 bash_completion 脚本中搜索并更改行

compopt -o filenames 2>/dev/null

compopt -o filenames -o noquote 2>/dev/null

答案4

对于那些(像我一样)使用 12.04 的人,可以使用 ~+ 代替 $PWD...

例如 :

cd /bin
echo ~+/ls
/bin/ls

相关内容