【问题标题】:bash tab completion without variable expansion?没有变量扩展的bash选项卡完成?
【发布时间】:2011-02-08 19:51:02
【问题描述】:

假设我在bashrc 中定义了这些变量:

i='cgi-bin/internal';  
e='cgi-bin/external';  
f='cgi-bin/foo';  
b='cgi-bin/bar';  
ad='cgi-bin/admin';  
#etc...

当我在命令行vim $i/edit_TAB 上使用变量时,它将扩展变量并且命令行上的输入变为vim /www/productX/subdomain_x/cgi-bin/internal/edit_(无论我在哪个站点上)和然后我 TABTAB 得到可能的完成。

没关系,功能不是问题。只是每次都看到完整路径而不仅仅是变量的值会很烦人。

有没有办法在不影响功能的情况下不扩展命令行上的 bash 变量?
是 bash 完成吗?

期望的结果是 $i 没有扩展到它的值(视觉上)或 $i 扩展到相对路径而不是完整路径。

【问题讨论】:

  • 你什么时候看到这个?除非我执行 shell-expand-line (Ctrl-Alt-e) 或 complete-variable (Alt-$),否则变量不会为我扩展。您的 Ctrl-i(或 Esc-Esc)绑定与默认绑定不同吗? bind -p|grep ' complete$' 的结果是什么?
  • ack,抱歉,我的 好像从原始帖子中删除了...
  • bind -p|grep ' complete$' 的结果是什么?如果$i 包含“cgi-bin/internal/”,那么“/www/productX/subdomain_x/”从何而来?
  • "\C-i": 完成 "\e\e": 完成当前工作目录类似于 "/www/productX/subdomain_x/"。因此,如果我要 vim 一个文件并使用 来完成文件名,它将扩展为“vim /www/productX/subdomain_x/cgi-bin/internal/edit_filename.cgi”,而不仅仅是“vim cgi-bin /internal/edit_filename.cgi" 正如我所料。
  • 好的,您可以选择吊销我的执照或接受我的道歉。我完全忽略了变量后面有一个 slash 的事实。我很抱歉。我不认为有任何方法可以做你想做的事。最接近的方法是向$COMP_WORDBREAKS 添加一个斜杠,如下所示:COMP_WORDBREAKS=$COMP_WORDBREAKS/,这将阻止斜杠之前的变量被扩展,但它也不会使用它的值来完成。我查看了使用bind 创建键盘宏,但如果有可能,它会非常复杂。对不起。

标签: bash variables expansion bash-completion


【解决方案1】:

您可以尝试使用zsh 而不是bash。在zsh中,

vim $i[tab]

将 $i 扩展为相对路径

(另外Oh My Zsh 非常适合自定义zsh)

【讨论】:

  • zsh +1,尽管这并不能直接回答问题。
  • -1 一个不回答任何问题的答案...只是表明您对另一个外壳的偏好...更改外壳并非易事,具体取决于您的环境如何,谁使用它,谁对其进行维护...
【解决方案2】:

我不确定您在 bash 启动脚本中使用了哪些其他设置,但对我来说,以下 bash 命令可以解决问题:

complete -r -v

【讨论】:

    【解决方案3】:

    使用 shopt -u progcomp 为我工作,在此之后选项卡不再扩展变量。 商店文档 https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

    【讨论】:

    • 在 Linux 上似乎可以正常工作,但在 macOS / OS X 上,当 [TAB] 被点击时,变量仍然会扩展。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多