我可以使用:shell输入当前目录并运行命令.bash_completion工作正常.
但是如何让bash_completion工作:命令或:r!命令案例?
注意.我是Emacs用户和Emacs M-!命令不允许这样的事情(也是Mx shell,你需要Mx术语来获得bash_completion).
有没有办法控制在 bash4 命令提示符下键入的第一个命令的完成?
我可以使用完整的 -E 来控制“空行”的补全,但是一旦输入了一些字符,bash(或可能是 readline)就会给我来自 PATH、内置命令(if、then、else...)和函数的所有文件名完成尝试 (TAB)。
我能够通过在 PROMPT_COMMAND 中取消设置 PATH 并通过将函数绑定到陷阱 DEBUG 来恢复它来避免 PATH 条目,但是没有摆脱 bash bultin 命令完成的运气。
有任何想法吗?
我在〜/ .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.
假设我有一个包含文件的文件夹,其名称如下:
log_1.loglog_2.loglog_2.gz我想在log_2.gz上执行一些操作,比如说移动.
在Windows cmd.exe中,我习惯于执行以下步骤:
move(没有别的)log_2.gzdestination但是在bash shell中(在Mac OS X 10.8.3上的iTerm2中),我必须做这样的事情:
mv llog_去做一个恼人的哔哔声2log_2.去做一个恼人的哔哔声glog_2.gz,并且令人满意地保持沉默destination正如您所看到的,即使您知道目标文件名,bash也需要更多步骤,但想象一下您不确定文件名究竟是什么的场景(可能ls太长了).我经常发现自己在这种情况下经过一些tab+键入后被迫放弃命令,ls再次运行,复制文件名,甚至可以运行一个pwd与文件夹连接,然后从我离开的地方继续.这非常烦人.
我正在为点文件管理实用程序的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) 我在命令行上使用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完成函数(可能通过在我的自定义函数中添加一个钩子)?
无法kubectl在 Mac 上完成 bash。我bash-completion用brewie安装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但重新获取配置文件后仍然出现错误。
我的系统是基于 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:这些文件之间存在一些镜像(无意义)差异,无论如何这没有帮助。我有更多的想法要测试...
在我看来.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)
在尝试配置可编程完成时,我遇到了一个我不理解的行为.
鉴于这三种完成方案,这是我理解它们的方式:
$<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-completion ×10
bash ×7
autocomplete ×2
git ×2
macos ×2
command ×1
iterm2 ×1
kubernetes ×1
linux ×1
sudo ×1
ubuntu ×1
vim ×1