我正在开发一个git项目.由于我有很多文件夹深度,我想改进我的自动完成以使用文件名而不仅仅是路径.
这是一个例子:
$git status 1 ? ?master
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: app/src/main/java/fr/pasteque/client/BaseFlavor.java
modified: app/src/main/java/fr/pasteque/client/widgets/RestaurantTicketsAdapter.java
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
我显然必须添加一个文件:
git add app/src/main/java/fr/pasteque/client/BaseFlavor.java
但我很乐意写: git add BaseFlavor.java
git add **/BaseFlavor.java 作品!
但完成,就像git add **/Base<tab>,不..
任何想法如何完成?
提前致谢!
我经常使用命令在 Mac 上打开应用程序open -a <application-name>。我最近也一直在使用选项卡自动完成来完成我的命令。例如,我尝试在编写open -a或后执行此操作open -a Safa,但是当我点击选项卡时,zsh 挂起,我无法在窗口中输入任何其他内容。这也没有提供应有的自动完成选项。我在终端和 iTerm2 中都尝试过此操作,但问题仍然存在。
我使用的是 zsh 5.7.1。我的电脑上还安装了 Oh My Zsh。
以防万一有帮助,这是我的.zshrc文件:
# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH
# Path to your oh-my-zsh installation.
export ZSH="/Users/noahwilder/.oh-my-zsh"
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to …Run Code Online (Sandbox Code Playgroud) 我正在使用 zsh,哦我的 zsh,我对在哪里放置完成文件有点困惑。
例如,安装时kind,我这样做:
brew install kind
kind complete zsh > ~/.oh-my-zsh/cache/completions/_kind
Run Code Online (Sandbox Code Playgroud)
我预计竣工kind工作将开始进行。我是否将它们放在错误的目录中?
如果我autoload -U compinit && compinit在当前终端中执行此操作,则完成工作将一直持续到我重新启动终端为止。
我认为我的.zshrc水平相当标准,这基本上就是我所拥有的:
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
export ZSH="$HOME/.oh-my-zsh"
DISABLE_MAGIC_FUNCTIONS="true"
plugins=(
git
gh
docker …Run Code Online (Sandbox Code Playgroud) 有时我想要一个文件名而不是zsh为我猜测的.例如,我有一个没有正确.png后缀的PNG文件,这使得zsh认为它不是图片,并且当我输入Tab完成参数时不会列出它display.
我想知道是否有是完成了一个文件名的任何地方上下文,就像一个键序列^XC的_correct_filename,或者如何配置的zsh做的事情吗?
我使用 afuse 通过 sshfs 将其他主机自动挂载到我的本地文件系统。像这样:
afuse -o timeout=30 -o mount_template=sshfs -C %r:/ %m -o unmount_template=fusermount -u -z %m ~/remote/
Run Code Online (Sandbox Code Playgroud)
这很好用,但我希望能够使用我的 ~/remote 目录自动完成/TAB 命令。Zsh 认为 ~/remote 是空的,这是可以理解的,因为 afuse 是一个神奇的虚拟 FUSE 文件系统。一旦我手动输入主机,子目录就可以正常工作。例如 ~/remote/host/[TAB] 工作正常。
大多数 zsh compdef 教程都专注于为您的自定义命令构建自定义完成程序。那不是我想要的。
我一直在尝试使用 compdef 将特定目录的完成覆盖到我的主机文件中(使用内置的 _hosts 完成功能),但据我所知, compdef 基于每个命令工作。我希望我的完成者能够处理所有试图在该目录上执行普通文件/目录完成的命令。
感觉它是如此基本,以至于它是单线的,如果我知道的话。我怎样才能做到这一点?
我是一个非常开心的zsh用户,尤其欣赏它的完成子系统.最近我试图增强一些完成命令,特别是那些我经常使用的命令(例如rm).在zsh中使用以下命令:
rm <TAB>
Run Code Online (Sandbox Code Playgroud)
使zsh按预期完成当前目录的文件.我想要做的是使zsh完成以下变体:
rm -r <TAB>
Run Code Online (Sandbox Code Playgroud)
只有目录.
任何知道如何参数完成的zsh Guru,以便考虑(-r)参数?
所有shell都理解这些命令:
$ cd .
$ cd ..
Run Code Online (Sandbox Code Playgroud)
zsh也会理解:
$ cd ...
$ cd ....
Run Code Online (Sandbox Code Playgroud)
如果你说:
$ alias -g ...='../..'
$ alias -g ....='../../..'
Run Code Online (Sandbox Code Playgroud)
现在,当我开始输入时,如何才能使其完成正确的制表工作cd ..../<TAB>?我记得它是在oh-my-zsh中实现的,但我现在已经停止使用了.
如果它不仅可以用于cd我想要执行,那么也将不胜感激cat ..../a/b/..../c/d | less.
请参阅git.plugin.zsh 文件中的这一行:
compdef _git gdv=git-diff
Run Code Online (Sandbox Code Playgroud)
在zsh 用户 compdef 教程中,compdef引用现有命令的解释如下:
compdef cmd1=cmd2
Run Code Online (Sandbox Code Playgroud)
显而易见的问题:为什么_git需要?
问题:
有时,当我尝试在 zsh 中执行操作时,它不会完成我想要的文件名,因为它们不适用于当前上下文。两个例子:
git diff比较硬盘上的两个任意文件。这些文件不驻留在任何存储库中,但谁在乎?!git diff --no-index是区分任意两个文件的好方法。但是因为它们不在 repo 中,所以 zsh 不会完成它们。建议的解决方案:
我可以简单地编辑源代码控制上下文来完成所有文件名,而不管它们的源代码控制状态如何。但是有几个限制:
所以,我决定改为绑定一个快捷键来强制正常的、上下文无关的文件完成。
到目前为止我所拥有的:
Zsh 显然有一种简单的方法可以做到这一点,如本问题所述。所以我在我的中添加了以下几行.zshrc:
zle -C complete complete-word complete-files
bindkey '^[[Z' complete
complete-files () { compadd - $PREFIX* }
Run Code Online (Sandbox Code Playgroud)
这会导致shift-tab启动文件完成。它在标准 zsh 中运行良好!但是嘘,由于某种原因,当我获取 oh-my-zsh 时它不起作用。:-(
那么有没有办法让它与 oh-my-zsh 一起工作,或者是否有我可能会觉得满意的替代解决方案?
我想为具有虚拟文件树的工具创建 zsh 完成。例如,我的文件树如下所示:
/
|- foo/
| |- bar
| |- baz/
| |- qux
|- foobar
Run Code Online (Sandbox Code Playgroud)
我的工具mycmd有一个用于列出当前目录的子命令:
$ mycmd ls
foo/
foobar
$ mycmd ls foo/
bar
baz/
Run Code Online (Sandbox Code Playgroud)
我实际的 zsh 完成看起来是这样的:
_mycmd_ls() {
if [ ! -z "$words[-1]" ]; then
dir=$(dirname /$words[-1])
lastpart=$(basename $words[-1])
items=$(mycmd ls $dir | grep "^$lastpart")
else
items=$(mycmd ls)
fi
_values -s ' ' 'items' ${(uozf)items}
}
_mycmd() {
local -a commands
commands=(
'ls:list items in directory'
)
_arguments -C -s -S -n …Run Code Online (Sandbox Code Playgroud) zsh ×10
zsh-completion ×10
oh-my-zsh ×3
git ×2
shell ×2
zshrc ×2
autocomplete ×1
command-line ×1
fuse ×1
sshfs ×1
terminal ×1
zsh-zle ×1