我在git仓库中/.git
,即我的文件系统的根目录。
当我进入/etc/foo/
并执行操作时git status
,git告诉我该文件../fstab
已更改。
当我想使用zsh
完成git
命令(仍在/ etc / foo /中)时,即:
git diff ../fs<TAB>
这样可行。但是当我使用绝对路径时,即:
git diff /etc/fs<TAB>
则zsh
无法完成绝对路径。
我如何知道zsh
完整的绝对路径以及相对路径?
我在Debian Buster上使用zsh
版本5.7.1-1
。
ZSH完成:
Zsh补全使用通常位于/usr/share/zsh/5.5/functions/Completion/Unix
每个命令_commandName
补全的脚本名称处的脚本来完成(可能会有所不同),Zsh包含/处理那些环境变量$fpath
类似于变量$PATH
的脚本,在这种情况下,使用的脚本为_git
,位置顺序在$fpath
为岩组使用的第一个重要的_git
脚本,它找到并忽略其他如果存在的话(也类似$PATH
)。
脚本编写:
像在此质量检查中所解释的那样,并以一个示例为例,以下函数$PWD/
在将其传递给之前_files
是在任何相对路径之前添加的,这是文件的常规完成功能。
_absolute_files () {
local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion}
if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then
PREFIX="\$PWD/$PREFIX"
fi
_files "$@";
}
这在许多常见情况下都有效,包括识别以~/
和开头的路径,例如绝对...
解决方案:
默认git
完成行为不包括相对路径,我们可以修改它的脚本并添加一个功能类似的解释,一个上面添加支持相对路径,或者我们可以简单地替换默认git
与完成插件完成gitfast
从ohmyzsh下面的步骤:
将ohmyzsh克隆到某个位置(假设/location
):
git clone https://github.com/ohmyzsh/ohmyzsh.git
编辑~/.zshrc
并在配置文件的底部添加以下内容,以包括gitfast
:
fpath=( /location/ohmyzsh/plugins/gitfast $fpath )
顺序很重要,如之前和此处所述。
通过删除所有~/.zcompdump*
然后运行来更新完成缓存compinit
。
替代解决方案:
/usr/share/zsh/5.5/functions/Completion/Unix/_git
通过在_git-diff
功能上应用以下补丁进行编辑:
--- _git
+++ _git
@@ -766,6 +766,12 @@
case $state in
(from-to-file)
+
+ if [[ $line[1] == *\/* ]]; then
+ _alternative 'files::_files' && ret=0
+ return ret
+ fi
+
# If "--" is part of $opt_args, this means it was specified before any
# $words arguments. This means that no heads are specified in front, so
# we need to complete *changed* files only.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句