标签: bash-completion

是否可以为:启用bash_completion:或者:r!在VIM?

我可以使用:shell输入当前目录并运行命令.bash_completion工作正常.

但是如何让bash_completion工作:命令:r!命令案例?

注意.我是Emacs用户和Emacs M-!命令不允许这样的事情(也是Mx shell,你需要Mx术语来获得bash_completion).

vim bash-completion

6
推荐指数
1
解决办法
215
查看次数

键入“第一个命令”时 Bash 可编程完成

有没有办法控制在 bash4 命令提示符下键入的第一个命令的完成?

我可以使用完整的 -E 来控制“空行”的补全,但是一旦输入了一些字符,bash(或可能是 readline)就会给我来自 PATH、内置命令(if、then、else...)和函数的所有文件名完成尝试 (TAB)。

我能够通过在 PROMPT_COMMAND 中取消设置 PATH 并通过将函数绑定到陷阱 DEBUG 来恢复它来避免 PATH 条目,但是没有摆脱 bash bultin 命令完成的运气。

有任何想法吗?

bash command bash-completion

6
推荐指数
1
解决办法
665
查看次数

为什么在bash中反斜杠?

我在〜/ .bashrc中导出了一个变量,如下所示(后跟source~/.bashrc)

export w=/home/user/workspace/
Run Code Online (Sandbox Code Playgroud)

当我在命令行上时,我尝试以下列方式访问$ w的子目录

user$ vi $w/
Run Code Online (Sandbox Code Playgroud)

在此之后,当我按Tab键时,会出现一个神秘的反斜杠

user$ vi \$w/
Run Code Online (Sandbox Code Playgroud)

它禁用进一步的制表符完成.为什么?可能不vi具体,因为它甚至发生ls.

Bash版本4.2.24(1)-release(i686-pc-linux-gnu)运行Ubuntu 11.04

编辑 解决方法:在点击选项卡之前按Esc + Ctrl + E.

bash ubuntu bash-completion

6
推荐指数
1
解决办法
2062
查看次数

如何使bash tab-completion像windows'cmd.exe一样工作?

假设我有一个包含文件的文件夹,其名称如下:

  • log_1.log
  • log_2.log
  • log_2.gz

我想在log_2.gz上执行一些操作,比如说移动.

在Windows cmd.exe中,我习惯于执行以下步骤:

  1. 输入move(没有别的)
  2. tabtabtab 遍历制表符完成选项,直到我到达 log_2.gz
  3. 类型 destination

但是在bash shell中(在Mac OS X 10.8.3上的iTerm2中),我必须做这样的事情:

  1. 类型 mv l
  2. tab它带我log_去做一个恼人的哔哔声
  3. 类型 2
  4. tab它带我log_2.去做一个恼人的哔哔声
  5. 类型 g
  6. tab带我去log_2.gz,并且令人满意地保持沉默
  7. 类型 destination

正如您所看到的,即使您知道目标文件名,bash也需要更多步骤,但想象一下您不确定文件名究竟是什么的场景(可能ls太长了).我经常发现自己在这种情况下经过一些tab+键入后被迫放弃命令,ls再次运行,复制文件名,甚至可以运行一个pwd与文件夹连接,然后从我离开的地方继续.这非常烦人.

macos bash bash-completion iterm2

6
推荐指数
1
解决办法
1572
查看次数

Bash完成:compgen一个wordlist就好像它们是路径 - 只建议直到下一个斜线

我正在为点文件管理实用程序的bash完成脚本工作.该工具有一个命令dots diff [filename],用于显示已安装的点文件和源点文件之间的差异.它还有一个命令dots files,列出所有托管点文件的路径(相对于源目录).我想用files命令的输出完成diff命令.

这是文件输出的示例

X11/xkb/symbols/evan-custom
X11/xorg.conf.d/10-dual-monitors.conf
X11/xorg.conf.d/10-keylayout.conf
bash/aliases
bash/bashrc
bash/completion.d/dots
bash/profiles/standard-user
bash/profiles/systemd-user
bspwm/bspwmrc
compton/compton.conf
fontconfig/fonts.conf
git/config
git/ignore
gtk-2.0/gtkrc
gtk-3.0/settings.ini
mysql/config
mysql/grcat
ncmpcpp/config
pulse/client.conf
pulse/daemon.conf
pulse/default.pa
ssh/config
sublime-text-3/Packages/User/Preferences.sublime-settings
sxhkd/sxhkdrc
termite/config
transmission-daemon/settings.json
vim/vimrc
Run Code Online (Sandbox Code Playgroud)

使用这样的东西

COMPREPLY=( $(compgen -W "$(dots files)" -- $cur) )
Run Code Online (Sandbox Code Playgroud)

但是,当readline列出可用选项时,它会列出完整路径(上面的列表).

我希望它将这些单词视为文件路径,并且列出建议时只列出第一个正斜杠.

例如,如果我键入dots diff [tab][tab]以下应该打印

X11/
bash/
bspwm/
compton/
fontconfig/
git/
gtk-2.0/
gtk-3.0/
mysql/
ncmpcpp/
pulse/
ssh/
sublime-text-3/
sxhkd/
termite/
transmission-daemon/
vim/
Run Code Online (Sandbox Code Playgroud)

例如,如果我然后键入dots diff bash/[tab][tab]然后它会显示

aliases
bashrc
completion.d/
profiles/ …
Run Code Online (Sandbox Code Playgroud)

bash autocomplete tab-completion bash-completion

6
推荐指数
1
解决办法
2529
查看次数

bash完成和git commit --message

我在命令行上使用Git.我经常在git分支中开发新功能,这些功能以与它们相关的Jira问题(维基百科:JIRA)命名,例如,用于Jira票证"NEW-123"的分支"new-123".

我有一个本地git prepare-commit-msg钩子,它将通过从Jira获取Jira票证的主题来创建提交消息.例如"完成#NEW-123:酷新功能".

但是,我更喜欢直接从命令行提交:

git commit -m "Finished #NEW-123: Cool new feature".

我想仅通过按[TAB]来创建引用的提交消息.

我知道bash完成机制(Bash:可编程完成简介).但是如何将它与现有的命令完成一起使用(git在bash中有其他优秀的完成)?我可以"完成"链接吗?

或者我是否需要重新编程git完成函数(可能通过在我的自定义函数中添加一个钩子)?

git bash-completion

6
推荐指数
1
解决办法
563
查看次数

kubectl -bash:_init_completion:找不到命令

无法kubectl在 Mac 上完成 bash。我bash-completionbrewie安装brew install bash-completion,然后按照安装说明,将其添加到~/.bash_profile

if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi

kubectl -bash: _init_completion: command not found但重新获取配置文件后仍然出现错误。

macos bash-completion kubernetes

6
推荐指数
1
解决办法
4554
查看次数

使用 sudo 对人类友好的 bash 自动完成

我的系统是基于 Arch Linux 的 Manjaro Linux,我使用 bash 和bash-completion.

当我以普通用户身份输入内容时,它运行良好(否sudo

$ rfkill <TAB><TAB>
block    event    help     list     unblock 
Run Code Online (Sandbox Code Playgroud)

但是当我用 sudo 输入时

$ sudo rfkill <TAB><TAB>
Display all 3811 possibilities? (y or n)
Run Code Online (Sandbox Code Playgroud)

显然,它试图完成sudo命令,但我希望它完成rfkill

我知道我可以通过编辑/usr/share/bash-completion/completions/sudo文件来改变这种行为,但我不知道如何说如果第二个词不是 sudo 的标志,然后对下一个词使用补全

你有?

UPD:我正在Ubuntu 16.04虚拟机中进行测试,我看到它按预期工作。/usr/share/bash-completion/completions/sudo如果有的话,我会检查 ubuntu 的文件和我的文件之间的区别。

UPD2:这些文件之间存在一些镜像(无意义)差异,无论如何这没有帮助。我有更多的想法要测试...

linux bash sudo autocomplete bash-completion

6
推荐指数
2
解决办法
3015
查看次数

Git自动完成自定义bash功能

在我看来.bash_profile,我有很多git的功能快捷方式.例如:

function gitpull() {
    branch="$1"

    if [[ -z $branch ]]; then
        current_branch=`git symbolic-ref -q --short HEAD`
        git pull origin $current_branch;
    elif [[ -n $branch && $branch == "m" ]]; then
        git pull origin master;
    else
        git pull origin $branch;
    fi;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在终端中键入它时,我希望它能自动完成git分支.我该怎么做呢?(我已经在使用了.git-completion.bash)

git bash bash-completion

6
推荐指数
1
解决办法
587
查看次数

为什么"$ <space> <tab> <tab>"执行文件名完成?

在尝试配置可编程完成时,我遇到了一个我不理解的行为.

鉴于这三种完成方案,这是我理解它们的方式:


$<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

行的开头 - >使用complete -E- >如果它不存在,使用complete -D- >如果它不存在,使用默认的Bash完成 - >行上没有单词 - >使用命令完成.


$com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

尝试完成第一个单词 - >使用命令完成.


$command argu<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

该行至少有一个单词 - >试图完成一个参数 - >使用complete给定的命令 - >如果它不存在,使用complete -D- >如果它不存在,使用默认的Bash完成 - >行上至少有一个单词,所以不要使用命令完成 - >不能启动$,~或者@执行文件名完成.


我的问题是为什么在这种情况下执行文件名完成而不是命令完成,即使该行上还没有单词:

$<SPACE><TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

由于下面的命令完成按预期执行,因此更加令人困惑:

$<SPACE>com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

我很可能误解了手册,我会非常感谢任何解释.


注意: $表示提示,而不是文字美元符号.

bash tab-completion bash-completion

6
推荐指数
1
解决办法
205
查看次数