我该如何阅读关于内置zsh命令的文档?

96

当我执行man bindkey命令时,出现以下信息:

BUILTIN(1)                BSD General Commands Manual               BUILTIN(1)
NAME builtin, !, %, ., :, @, {, }, alias, alloc, bg, bind, bindkey, break, breaksw, builtins, case, cd, chdir, command, complete, continue, default, dirs, do, done, echo, echotc, elif, else, end, endif, endsw, esac, eval, exec, exit, export, false, fc, fg, filetest, fi, for, foreach, getopts, glob, goto, hash, hashstat, history, hup, if, jobid, jobs, kill, limit, local, log, login, logout, ls-F, nice, nohup, notify, onintr, popd, printenv, pushd, pwd, read, readonly, rehash, repeat, return, sched, set, setenv, settc, setty, setvar, shift, source, stop, suspend, switch, telltc, test, then, time, times, trap, true, type, ulimit, umask, unalias, uncomplete, unhash, unlimit, unset, unsetenv, until, wait, where, which, while -- shell内建命令
SYNOPSIS builtin [-options] [args ...]
DESCRIPTION Shell内建命令是可以在运行shell进程中执行的命令。请注意,在man手册中往往难以找到这些内部命令的文档。

有没有一种简便的方式来查找这些命令的文档呢?


1
我把问题改成了“zsh”,而不是“shell”,因为jcomeau_ictx对于bash的答案很好,但对于zsh不起作用... - John Bachir
2
这个问题可能应该移动到unix.se。 - Warren Young
6
在bash中,相应的命令是“help command”,而不是“man command”。 - Flimm
2
man zsh tells how to find more details, such as man zshbuiltins to find how to use bindkey - DawnSong
11个回答

47

要获得更有用的帮助工具,关键信息实际上已经包含在Zsh中,只是需要找到关键的、难以发现的手册页:man zshcontrib网站上的链接),其中描述了 run-help widget:

默认情况下,run-helpman 命令的别名,因此当命令单词为 shell 内置命令或用户定义函数时,它通常会失败。通过重新定义 run-help 别名,可以改进Shell提供的在线帮助。

它进一步解释了如何使用内建改进替换它。

# Remove the default of run-help being aliased to man
unalias run-help.
# Use zsh's run-help, which will display information for zsh builtins.
autoload run-help

设置完成后,调用run-help获取内置函数、自动完成等内容的名称时,将会尝试显示提取的文档,或者显示包含相关信息的手册页等。例如,执行run-help bindkey将输出:

bindkey
   See the section `Zle Builtins' in zshzle(1).

这个方法还有改进的空间。更好的例子是,run-help history 显示了 history 命令下面的 Zsh 手册部分所依赖的 fc 命令。

另外要注意的是: 在当前输入行上按下 ESC-h 将调用 run-help 来显示命令的帮助信息。

我猜这个设置不是默认的,因为提取细致的帮助数据并将 HELPDIR 设置为指向它可能是留给操作系统发行版的打包决策。这也是用户选择的一种:即使没有设置 HELPDIRautoload run-help 实用程序也很有用。它似乎能够帮助你跳转到正确的手册页面,即使它不能精确地跳转到某个项目的详细部分。有些人可能更喜欢这种方式,而不是像上面的 bindkey 示例那样浪费时间。 (我不明白他们为什么默认为 alias run-help=man )。

对于 Zsh 版本 5.0.3 或更新版本

helpfiles 提取很可能已经包含在 Zsh 发行版中。只需要在系统上找到它们并设置 HELPDIR,如果您愿意的话——可能的候选位置是 /usr/share/zsh/usr/local/share/zsh 目录下的 help 子目录。

对于早于 5.0.3 版本的 Zsh

你可能需要按照 man zshcontrib 中详细介绍的流程自己生成帮助文件。这可能有点麻烦,但是很快和无痛的。

使用 zsh --version 找到已安装的版本,并从 sourceforge archive 获取相应的源代码包。然后按照手册页中所示运行 helpfiles 脚本,并在您的 ~/.zshrc 中将目标设置为 HELPDIR


5
好消息是最新的快照版本已经在配置期间添加了帮助文件的生成功能。可能会在5.0.3中提供。请查看此处链接 - xuhdev
1
对于那些使用vi模式的人,ESC-h并不像上面描述的那样起作用。您可以输入ESC进入命令模式,然后输入:run-help。或者,您可以将alias help=run-help添加到您的.zshrc文件(或任何您保存别名的地方)。 - Coren
@ntc2 您的编辑似乎不完整——“在5.0.3之前”的部分现在以一个无意义的句子片段开头。 - ches
@ches:抱歉,已经修复了。 - ntc2
1
已在相同的环境/版本中确认。不确定在这里该怎么做,因为“对于ZSH版本5.0.3或更高版本”部分是一个不是我自己编辑的内容,因此可能应该是一个新答案。一旦我可以尝试在另一个环境中确认行为,我想重新编辑以纠正它,但不想为lendenmc的答案负责。如果我无法验证它,我想最坏的情况是只需删除该部分即可。 - ches
显示剩余5条评论

41

尝试使用以下任意一种方法:

man zshbuiltins
或者
man zshall

zsh的手册被分成了不同主题,man zsh 主要是目录和介绍,而 man zshall 则包含了所有内容(在我的系统上有24628行,而相比之下 man bash 只有5242行)。

至于 bindkey,可以参考 man zshbuiltins 的指引查看 man zshzle


最近有改变吗?我的 zsh(5.0.2)没有任何相关的 man 页面(自动补全只建议 zsh5,尝试 man zsh5 的结果是:man: warning: /usr/share/man/man1/zsh5.1.gz is a dangling symlink)。我不得不安装 Ubuntu 包 zsh-doc 才能执行 info zsh,然后进入 Builtins 部分最终获取有关 echo 的信息。 - anol
@anol:在13.10和14.04中,显然这是一个错误,但在14.10中已经修复。您可以从源代码安装它们(链接提供了信息),或在线查看它们(例如这里)。 - Dennis Williamson

23
你可以将这些行添加到你的.zshrc配置文件中:
unalias run-help 2>/dev/null
autoload run-help
HELPDIR=/path/to/zsh_help_directory
alias help=run-help

其中/path/to/zsh_help_directory必须替换为您的zsh帮助文件夹。如果您在使用Homebrew安装zsh的OS X上,则此文件夹为/usr/local/share/zsh/help

这将为zsh启用类似于bash的帮助。

应该指出,如果您的zsh登录shell的默认安装路径存在并包含所需的文件,则第三行HELPDIR=/path/to/zsh_help_directory将不需要。

源化您的.zshrc($ source .zshrc),并检查一切是否正常运行,例如(选择任何您想要的zsh内置命令,这里我选择了autoload):

$ help autoload

请注意,2>/dev/null部分是必需的,因为如果没有它,每次您源代码中的.zshrc文件而run-help已被取消别名时,标准错误'unalias: no such hash table element: run-help'将会发生。


7
这很有效。zsh希望我们以什么方式访问这些帮助文档?为什么我们必须取消别名run-help,再次autoload它,然后告诉它文档在哪里? - John Bachir
2
对于使用默认的OS X zsh的任何人来说,帮助路径是/usr/share/zsh/5.0.5/help - John Bachir
2
此外,在 OS X 上使用默认系统安装,似乎根本不需要显式设置 HELPDIR。对我来说,没有这一步也可以工作。 - ches
2
@JohnBachir,run-help并没有真正的“重新自动加载”(就像你所说的“再次自动加载”)。正如@ches的回答中所解释的那样,run-help一开始只是man命令的别名。因此,一旦这个别名被删除,那么你需要第一次自动加载run-help函数才能使用它...如果这有意义的话。 - lendenmc
1
对于任何平台或架构上的Homebrew用户,您可以使用以下命令:HELPDIR=$(command brew --prefix)/share/zsh/help - dijonkitchen
显示剩余6条评论

19
其他答案太长了...
通过将以下内容添加到您的.zshrc文件中,设置run-help函数:
unalias run-help
autoload run-help

提示:使用. ~/.zshrc重新加载配置。
现在当你运行run-help bindkey时,应该会看到一个手册条目。如果不起作用,你需要查看更多关于访问在线帮助的说明(man zshcontrib)。
在某些情况下,run-help找不到手册条目,你需要通过man zshall进行搜索。
如果run-help无法滚动到特定命令,你需要覆盖HELPDIR以匹配你的zsh安装。

为什么我无法在“历史记录”命令上使用“运行帮助历史记录(run-help history)”?就像原帖中提到的一样,这真是令人沮丧。 - Sridhar Sarnobat
2
当我运行 run-help history 时,我看到了 fc 的文档。滚动到底部,它说 _history:与 fc -l 相同_。 - cambunctious
1
就macOS 10.15及以上版本而言,run-help似乎可以直接使用... ¯_(ツ)_/¯ - uchuugaka
默认情况下,run-help 别名为 man,但它们并不相同。运行 which run-help 进行检查。 - cambunctious
这两行代码在当今的 macOS 系统上完全足够,非常方便。为了适应我的 bash 快捷键习惯,我会添加 alias help=run-help 到代码中。 - conny
显示剩余2条评论

8

我终于受够了每次需要获取Zsh信息时都要在man手册和在线搜索中翻找。我浏览了所有Zsh的man手册,并组合成了一个相当全面的“帮助”函数。

要使用它,您需要在fpath中创建一个名为“help”的文件,并在zshrc中添加autoload -Uz help

# better help function than zsh's crappy run-help
local ZSHPAGE=zshall LESSQUERY
LESS="-RM~gIsw"
LESS_TERMCAP_mb=$'\E[01;31m'
LESS_TERMCAP_md=$'\E[01;31m'
LESS_TERMCAP_me=$'\E[0m'
LESS_TERMCAP_se=$'\E[0m'
LESS_TERMCAP_so=$'\E[01;44;33m'
LESS_TERMCAP_ue=$'\E[0m'
LESS_TERMCAP_us=$'\E[01;32m'

case "$@" in
    ""|--help|-h)
        local cmds='
RESERVED WORDS
do done esac then elif else fi for case if while function  repeat  time until  select  coproc nocorrect foreach end ! [[ { } declare export float integer local readonly typeset

BUILTIN COMMANDS
- . : [ [[ alias autoload bg bindkey break builtin bye cap cd chdir clone command comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues continue declare dirs disable disown echo echotc echoti emulate enable eval exec exit export false fc fg float functions getcap getln getopts hash history integer jobs kill lets limit local log logout noglob popd print printf pushd pushln pwd r read readonly rehash return sched set setcap setopt shift source stat suspend test times trap true ttyctl type typeset ulimit umask unalias unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp
        '
        if whence -p fold >/dev/null; then
            fold -sw$COLUMNS <<< $cmds
        else
            print -- $cmds
        fi
        return;;
    '-- '*)
        shift
        LESSQUERY="$@";;
    loop*|while|do|done|if|then|elif|else|fi|until)
        LESSQUERY='^COMPLEX COMMANDS$'
        ZSHPAGE=zshmisc;;
    for)
        LESSQUERY='^       for name \.\.\. '
        ZSHPAGE=zshmisc;;
    foreach|end)
        LESSQUERY='^       foreach name \.\.\.'
        ZSHPAGE=zshmisc;;
    case|esac)
        LESSQUERY='^       case word'
        ZSHPAGE=zshmisc;;
    coproc)
        LESSQUERY='coproc'
        ZSHPAGE=zshmisc;;
    repeat)
        LESSQUERY='^       repeat word do'
        ZSHPAGE=zshmisc;;
    select)
        LESSQUERY='^       select name \[ in word'
        ZSHPAGE=zshmisc;;
    time)
        LESSQUERY='^       time \[ pipeline \]'
        ZSHPAGE=zshmisc;;
    list|'('*|'{'*|subshell)
        LESSQUERY='^       time \[ pipeline \]'
        ZSHPAGE=zshmisc;;
    '!'|not)
        LESSQUERY='^       \! exp  true if exp is false\.'
        ZSHPAGE=zshmisc;;
    .)
        LESSQUERY='^       \. file \[ arg \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    :)
        LESSQUERY='^       : \['
        ZSHPAGE=zshbuiltins;;
    alias)
        LESSQUERY='^       alias \['
        ZSHPAGE=zshbuiltins;;
    autoload)
        LESSQUERY='^       autoload \['
        ZSHPAGE=zshbuiltins;;
    *autoload*)
        LESSQUERY='^AUTOLOADING FUNCTIONS$'
        ZSHPAGE=zshmisc;;
    bg)
        LESSQUERY='^       bg \['
        ZSHPAGE=zshbuiltins;;
    bindkey)
        LESSQUERY='^ZLE BUILTINS$'
        ZSHPAGE=zshzle;;
    break)
        LESSQUERY='^       break \[ n \]'
        ZSHPAGE=zshbuiltins;;
    -|exec|command|noglob|nocorrect|builtin|precommand*)
        LESSQUERY='^PRECOMMAND MODIFIERS$'
        ZSHPAGE=zshmisc;;
    bye)
        LESSQUERY='^       bye    Same as exit\.'
        ZSHPAGE=zshbuiltins;;
    cap)
        LESSQUERY='^The zsh/cap Module$'
        ZSHPAGE=zshmodules;;
    cd)
        LESSQUERY='^       cd \[ -qsLP \] \[ arg \]'
        ZSHPAGE=zshbuiltins;;
    chdir)
        LESSQUERY='^       chdir  Same as cd\.'
        ZSHPAGE=zshbuiltins;;
    clone)
        LESSQUERY='^The zsh/clone Module'
        ZSHPAGE=zshmodules;;
    compargu*)
        LESSQUERY='^       comparguments$'
        ZSHPAGE=zshmodules;;
    compcall)
        LESSQUERY='^       compcall \[ -TD'
        ZSHPAGE=zshcompwid;;
    compctl)
        LESSQUERY='^       compctl \[ -CDT'
        ZSHPAGE=zshcompctl;;
    compdes*)
        LESSQUERY='^       compdescribe$'
        ZSHPAGE=zshmodules;;
    compfiles)
        LESSQUERY='^       compfiles$'
        ZSHPAGE=zshmodules;;
    compgroups)
        LESSQUERY='^       compgroups$'
        ZSHPAGE=zshmodules;;
    compquote)
        LESSQUERY='^       compquote$'
        ZSHPAGE=zshmodules;;
    comptags)
        LESSQUERY='^       comptags$'
        ZSHPAGE=zshmodules;;
    comptry)
        LESSQUERY='^       comptry$'
        ZSHPAGE=zshmodules;;
    compvalues)
        LESSQUERY='^       compvalues$'
        ZSHPAGE=zshmodules;;
    continue)
        LESSQUERY='^       continue \[ n \]'
        ZSHPAGE=zshbuiltins;;
    dirs)
        LESSQUERY='^       dirs \[ -c \]'
        ZSHPAGE=zshbuiltins;;
    disable)
        LESSQUERY='^       disable \[ -afmprs \]'
        ZSHPAGE=zshbuiltins;;
    disown)
        LESSQUERY='^       disown \[ job \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    echo)
        LESSQUERY='^       echo \[ -neE \]'
        ZSHPAGE=zshbuiltins;;
    echotc)
        LESSQUERY='^The zsh/termcap Module$'
        ZSHPAGE=zshmodules;;
    echoti)
        LESSQUERY='^The zsh/terminfo Module$'
        ZSHPAGE=zshmodules;;
    emulate)
        LESSQUERY='^       emulate \[ -LR \]'
        ZSHPAGE=zshbuiltins;;
    enable)
        LESSQUERY='^       enable \[ -afmprs \]'
        ZSHPAGE=zshbuiltins;;
    eval)
        LESSQUERY='^       eval \[ arg \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    exit)
        LESSQUERY='^       exit \[ n \]'
        ZSHPAGE=zshbuiltins;;
    export)
        LESSQUERY='^       export \[ name'
        ZSHPAGE=zshbuiltins;;
    fc)
        LESSQUERY='^       fc \[ -e ename \] \[ -LI \]'
        ZSHPAGE=zshbuiltins;;
    fg)
        LESSQUERY='^       fg \[ job \.\.\. \]S'
        ZSHPAGE=zshbuiltins;;
    functions)
        LESSQUERY='^       functions \[ \{\+\|-\}UkmtTuz'
        ZSHPAGE=zshbuiltins;;
    getcap)
        LESSQUERY='^The zsh/cap Module$'
        ZSHPAGE=zshmodules;;
    getln)
        LESSQUERY='^       getln \[ -AclneE \]'
        ZSHPAGE=zshbuiltins;;
    getopts)
        LESSQUERY='^       getopts optstring name'
        ZSHPAGE=zshbuiltins;;
    hash)
        LESSQUERY='^       hash \[ -Ldfmrv \]'
        ZSHPAGE=zshbuiltins;;
    history)
        LESSQUERY='^HISTORY EXPANSION$';;
    integer)
        LESSQUERY='^       integer \[ \{\+\|-\}Hghlprtux'
        ZSHPAGE=zshbuiltins;;
    jobs)
        LESSQUERY='^       jobs \[ -dlprs \]'
        ZSHPAGE=zshbuiltins;;
    kill)
        LESSQUERY='^       kill \[ -s signal_name'
        ZSHPAGE=zshbuiltins;;
    limit)
        LESSQUERY='^       limit \[ -hs \]'
        ZSHPAGE=zshbuiltins;;
    local)
        LESSQUERY='^       local \[ \{\+\|-\}AHUahlprtux '
        ZSHPAGE=zshbuiltins;;
    log)
        LESSQUERY='^       log    List all'
        ZSHPAGE=zshbuiltins;;
    logout)
        LESSQUERY='^       logout \[ n \]'
        ZSHPAGE=zshbuiltins;;
    popd)
        LESSQUERY='^       popd \[ -q \]'
        ZSHPAGE=zshbuiltins;;
    print)
        LESSQUERY='^       print \[ -abcDilmnNoOpPrsSz \]'
        ZSHPAGE=zshbuiltins;;
    printf)
        LESSQUERY='^       printf format \[ arg \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    pushd)
        LESSQUERY='^       pushd \[ -qsLP \]'
        ZSHPAGE=zshbuiltins;;
    pushln)
        LESSQUERY='^       pushln \[ arg \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    pwd)
        LESSQUERY='^       pwd \[ -rLP \]'
        ZSHPAGE=zshbuiltins;;
    r)
        LESSQUERY='^       r      Same as fc -e -\.'
        ZSHPAGE=zshbuiltins;;
    read)
        LESSQUERY='^       read \[ -rszpqAclneE \]'
        ZSHPAGE=zshbuiltins;;
    readonly)
        LESSQUERY='^       readonly$'
        ZSHPAGE=zshbuiltins;;
    rehash)
        LESSQUERY='^       rehash Same as hash -r\.'
        ZSHPAGE=zshbuiltins;;
    return)
        LESSQUERY='^       return \[ n \]'
        ZSHPAGE=zshbuiltins;;
    sched|'sched module')
        LESSQUERY='^THE ZSH/SCHED MODULE$'
        ZSHPAGE=zshmodules;;
    set)
        LESSQUERY='^       set \[ \{\+\|-\}options'
        ZSHPAGE=zshbuiltins;;
    setcap)
        LESSQUERY='^The zsh/cap Module$'
        ZSHPAGE=zshmodules;;
    setopt)
        LESSQUERY='^       setopt \[ \{\+\|-\}options'
        ZSHPAGE=zshbuiltins;;
    shift)
        LESSQUERY='^       shift \[ -p \]'
        ZSHPAGE=zshbuiltins;;
    source)
        LESSQUERY='^       source file \[ arg'
        ZSHPAGE=zshbuiltins;;
    stat|zstat|'stat module')
        LESSQUERY='^The zsh/stat Module$'
        ZSHPAGE=zshmodules;;
    times)
        LESSQUERY='^       times  Print'
        ZSHPAGE=zshbuiltins;;
    test|'[['*|'['*)
        LESSQUERY='^CONDITIONAL EXPRESSIONS$'
        ZSHPAGE=zshmisc;;
    trap)
        LESSQUERY='^       trap \[ arg \] \[ sig \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    true)
        LESSQUERY='^       true \[ arg \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    ttyctl)
        LESSQUERY='^       ttyctl \[ -fu \]'
        ZSHPAGE=zshbuiltins;;
    type)
        LESSQUERY='^       type \[ -wfpamsS \]'
        ZSHPAGE=zshbuiltins;;
    typeset|declare)
        LESSQUERY='^       typeset \[ \{\+\|-\}AHUaghlmprtux \]'
        ZSHPAGE=zshbuiltins;;
    ulimit)
        LESSQUERY='^       ulimit \[ -HSa \] \['
        ZSHPAGE=zshbuiltins;;
    umask)
        LESSQUERY='^       umask \[ -S \] \[ mask \]'
        ZSHPAGE=zshbuiltins;;
    unalias)
        LESSQUERY='^       unalias \[ -ams \]'
        ZSHPAGE=zshbuiltins;;
    unfunction)
        LESSQUERY='^       unfunction$'
        ZSHPAGE=zshbuiltins;;
    unhash)
        LESSQUERY='^       unhash \[ -adfms \]'
        ZSHPAGE=zshbuiltins;;
    unset)
        LESSQUERY='^       unset \[ -fmv \]'
        ZSHPAGE=zshbuiltins;;
    unsetopt)
        LESSQUERY='^       unsetopt \[ \{\+\|-\}options'
        ZSHPAGE=zshbuiltins;;
    vared)
        LESSQUERY='^       vared \[ -Aache \]'
        ZSHPAGE=zshzle;;
    wait)
        LESSQUERY='^       wait \[ job \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    whence)
        LESSQUERY='^       whence \[ -vcwfpamsS \]'
        ZSHPAGE=zshbuiltins;;
    where)
        LESSQUERY='^       where \[ -wpmsS \]'
        ZSHPAGE=zshbuiltins;;
    which)
        LESSQUERY='^       which \[ -wpamsS \]'
        ZSHPAGE=zshbuiltins;;
    zcompile)
        LESSQUERY='^       zcompile \[ -U \] \[ -z \|'
        ZSHPAGE=zshbuiltins;;
    zformat)
        LESSQUERY='^       zformat -f param format'
        ZSHPAGE=zshmodules;;
    zftp|'ftp module')
        LESSQUERY='^The zsh/zftp Module$'
        ZSHPAGE=zshmodules;;
    zle)
        LESSQUERY='^       zle -l \[ -L \| -a \] \[ string \.\.\. \]'
        ZSHPAGE=zshzle;;
    widget)
        LESSQUERY='^              widget \[ -n num \] \[ -Nw \]'
        ZSHPAGE=zshzle;;
    zmodload)
        LESSQUERY='^       zmodload \[ -dL \] \[ \.\.\. \]'
        ZSHPAGE=zshbuiltins;;
    zparseopts)
        LESSQUERY='^       zparseopts \[ -DKME \]'
        ZSHPAGE=zshmodules;;
    zprof|'zprof module')
        LESSQUERY='^THE ZSH/ZPROF MODULE$'
        ZSHPAGE=zshmodules;;
    zpty|'zpty module')
        LESSQUERY='^THE ZSH/ZPTY MODULE$'
        ZSHPAGE=zshmodules;;
    zregexparse)
        LESSQUERY='^       zregexparse$'
        ZSHPAGE=zshmodules;;
    zsocket|(net|socket)' module')
        LESSQUERY='^THE ZSH/NET/SOCKET MODULE$'
        ZSHPAGE=zshmodules;;
    zstyle|'zutil module')
        LESSQUERY='^The zsh/zutil Module$'
        ZSHPAGE=zshmodules;;
    ztcp|'tcp module')
        LESSQUERY='^THE ZSH/NET/TCP MODULE$'
        ZSHPAGE=zshmodules;;
    attr*mod*|zgetattr|zsetattr|zdelattr|zlistattr)
        LESSQUERY='^THE ZSH/ATTR MODULE$'
        ZSHPAGE=zshmodules;;
    complist*mod*)
        LESSQUERY='^THE ZSH/COMPLIST MODULE'
        ZSHPAGE=zshmodules;;
    computil*mod*)
        LESSQUERY='^THE ZSH/COMPUTIL MODULE'
        ZSHPAGE=zshmodules;;
    curses*|zcurses)
        LESSQUERY='^THE ZSH/CURSES MODULE'
        ZSHPAGE=zshmodules;;
    datetime*|strftime)
        LESSQUERY='^THE ZSH/DATETIME MODULE'
        ZSHPAGE=zshmodules;;
    (db|gdbm)*|ztie|zuntie)
        LESSQUERY='^THE ZSH/DB/GDBM MODULE'
        ZSHPAGE=zshmodules;;
    delto*|delete-to-char|zap-to-char)
        LESSQUERY='^THE ZSH/DELTOCHAR MODULE'
        ZSHPAGE=zshmodules;;
    example*)
        LESSQUERY='^THE ZSH/EXAMPLE MODULE'
        ZSHPAGE=zshmodules;;
    files*mod*|chgrp|chown|ln|mkdir|mv|rm|rmdir|sync)
        LESSQUERY='^THE ZSH/FILES MODULE'
        ZSHPAGE=zshmodules;;
    langinfo*)
        LESSQUERY='^THE ZSH/LANGINFO MODULE'
        ZSHPAGE=zshmodules;;
    mapfile*)
        LESSQUERY='^THE ZSH/MAPFILE MODULE'
        ZSHPAGE=zshmodules;;
    mathfunc*mod*)
        LESSQUERY='^THE ZSH/MATHFUNC MODULE'
        ZSHPAGE=zshmodules;;
    param*mod*)
        LESSQUERY='^THE ZSH/PARAMETER MODULE'
        ZSHPAGE=zshmodules;;
    pcre*)
        LESSQUERY='^THE ZSH/PCRE MODULE'
        ZSHPAGE=zshmodules;;
    regex*mod*)
        LESSQUERY='^THE ZSH/REGEX MODULE'
        ZSHPAGE=zshmodules;;
    system*mod*|syserror|sysopen|sysread|sysseek|syswrite|zsystem*)
        LESSQUERY='^THE ZSH/SYSTEM MODULE'
        ZSHPAGE=zshmodules;;
    zselect*)
        LESSQUERY='^THE ZSH/ZSELECT MODULE'
        ZSHPAGE=zshmodules;;
    start*flag*|invok*|initial*)
        LESSQUERY='^INVOCATION$'
        ZSHPAGE=zsh;;
    (start|shut)*file*|*zshenv|*zshrc|*zprofile|*zlogin|*zlogout|*zdotdir*|*ZDOTDIR*)
        LESSQUERY='^STARTUP/SHUTDOWN FILES$'
        ZSHPAGE=zsh;;
    subscript*)
        LESSQUERY='^   Subscript Flags'
        ZSHPAGE=zshparam;;
    simple*|pipe*)
        LESSQUERY='^SIMPLE COMMANDS & PIPELINES'
        ZSHPAGE=zshmisc;;
    function*)
        LESSQUERY='^       function word'
        ZSHPAGE=zshmisc;;
    alt*)
        LESSQUERY='^ALTERNATE FORMS$'
        ZSHPAGE=zshmisc;;
    reserv*)
        LESSQUERY='^RESERVED WORDS$'
        ZSHPAGE=zshmisc;;
    error*)
        LESSQUERY='^ERRORS$'
        ZSHPAGE=zshmisc;;
    alias*)
        LESSQUERY='^ALIASING$'
        ZSHPAGE=zshmisc;;
    quot*)
        LESSQUERY='^QUOTING$'
        ZSHPAGE=zshmisc;;
    redirect*|*'>'*|*'<'*|*'&>'*|*'2>'*|*'>>'*|*'<<'*)
        LESSQUERY='^REDIRECTION$'
        ZSHPAGE=zshmisc;;
    file*desc*)
        LESSQUERY='^OPENING FILE DESCRIPTORS USING PARAMETERS$'
        ZSHPAGE=zshmisc;;
    multios)
        LESSQUERY='^MULTIOS$'
        ZSHPAGE=zshmisc;;
    anon*func*)
        LESSQUERY='^ANONYMOUS FUNCTIONS$'
        ZSHPAGE=zshmisc;;
    hook*)
        LESSQUERY='^   Hook Functions$'
        ZSHPAGE=zshmisc;;
    trap*)
        LESSQUERY='^   Trap Functions$'
        ZSHPAGE=zshmisc;;
    job*)
        LESSQUERY='^JOBS$'
        ZSHPAGE=zshmisc;;
    math*|'(('*|'$(('|let*|arith*)
        LESSQUERY='^ARITHMETIC EVALUATION$'
        ZSHPAGE=zshmisc;;
    prompt|promptinit|prompt*theme*)
        LESSQUERY='^       prompt \[ -c \| -l \]'
        ZSHPAGE=zshcontrib;;
    PS1|prompt*|PROMPT*)
        LESSQUERY='^SIMPLE PROMPT ESCAPES$'
        ZSHPAGE=zshmisc;;
    history*)
        LESSQUERY='^HISTORY EXPANSION$'
        ZSHPAGE=zshexpn;;
    proc*sub*|*'<('*|*')>'*)
        LESSQUERY='^PROCESS SUBSTITUTION$'
        ZSHPAGE=zshexpn;;
    param*flag*)
        LESSQUERY='^   Parameter Expansion Flags$'
        ZSHPAGE=zshexpn;;
    param*rule*|nested*sub*)
        LESSQUERY='^   Rules$'
        ZSHPAGE=zshexpn;;
    param*ex*)
        LESSQUERY='^   Examples$'
        ZSHPAGE=zshexpn;;
    param*|'${')
        LESSQUERY='^PARAMETER EXPANSION$'
        ZSHPAGE=zshexpn;;
    brace*expan*)
        LESSQUERY='^BRACE EXPANSION$'
        ZSHPAGE=zshexpn;;
    filename*expan*)
        LESSQUERY='^FILENAME EXPANSION$'
        ZSHPAGE=zshexpn;;
    expan*|subst*)
        LESSQUERY='^       zshexpn - zsh expansion and substitution$'
        ZSHPAGE=zshexpn;;
    dyn*dir*)
        LESSQUERY='^   Dynamic named directories$'
        ZSHPAGE=zshexpn;;
    static*dir*)
        LESSQUERY='^   Static named directories$'
        ZSHPAGE=zshexpn;;
    approx*match*)
        LESSQUERY='^   Approximate Matching$'
        ZSHPAGE=zshexpn;;
    recurs*glob*)
        LESSQUERY='^   Recursive Globbing$'
        ZSHPAGE=zshexpn;;
    glob*qual*)
        LESSQUERY='^   Glob Qualifiers$'
        ZSHPAGE=zshexpn;;
    glob*flag*)
        LESSQUERY='^   Globbing Flags$'
        ZSHPAGE=zshexpn;;
    glob*)
        LESSQUERY='^   Glob Operators$'
        ZSHPAGE=zshexpn;;
    ksh*glob*)
        LESSQUERY='^   ksh-like Glob Operators'
        ZSHPAGE=zshexpn;;
    array*sub*)
        LESSQUERY='^   Array Subscripts$'
        ZSHPAGE=zshparam;;
    array*)
        LESSQUERY='^ARRAY PARAMETERS$'
        ZSHPAGE=zshparam;;
    positional*)
        LESSQUERY='^POSITIONAL PARAMETERS$'
        ZSHPAGE=zshparam;;
    shell*(param*|var*)|env*)
        LESSQUERY='^PARAMETERS SET BY THE SHELL$'
        ZSHPAGE=zshparam;;
    watchfmt*)
        LESSQUERY='^       WATCHFMT$'
        ZSHPAGE=zshparam;;
    set*|(shell|spec)*op*)
        LESSQUERY='^SPECIFYING OPTIONS$'
        ZSHPAGE=zshoptions;;
    single*opt*|short*flag*|single*letter*)
        LESSQUERY='^SINGLE LETTER OPTIONS$'
        ZSHPAGE=zshoptions;;
    (shell|zsh)*builtin*)
        LESSQUERY='^SHELL BUILTIN COMMANDS$'
        ZSHPAGE=zshbuiltins;;
    key*)
        LESSQUERY='^KEYMAPS$'
        ZSHPAGE=zshzle;;
    widget*)
        LESSQUERY='^USER-DEFINED WIDGETS$'
        ZSHPAGE=zshzle;;
    highlight*)
        LESSQUERY='^CHARACTER HIGHLIGHTING$'
        ZSHPAGE=zshzle;;
    comp*wid*)
        LESSQUERY='^       zshcompwid - zsh completion widgets'
        ZSHPAGE=zshcompwid;;
    complet*param*|*PREFIX*|*CURRENT*|*SUFFIX*)
        LESSQUERY='^COMPLETION SPECIAL PARAMETERS$'
        ZSHPAGE=zshcompwid;;
    compstate)
        LESSQUERY='^       compstate$'
        ZSHPAGE=zshcompwid;;
    compadd)
        LESSQUERY='^       compadd \[ -akqQfenUlo12C '
        ZSHPAGE=zshcompwid;;
    compset)
        LESSQUERY='^       compset -p number'
        ZSHPAGE=zshcompwid;;
    compcall)
        LESSQUERY='^       compcall \[ -TD'
        ZSHPAGE=zshcompwid;;
    *match*)
        LESSQUERY='^COMPLETION MATCHING CONTROL$'
        ZSHPAGE=zshcompwid;;
    *compsys*)
        LESSQUERY='^       zshcompsys - zsh completion system'
        ZSHPAGE=zshcompsys;;
    compdef*)
        LESSQUERY='^       compdef \[ -ane \]'
        ZSHPAGE=zshcompsys;;
    '#'compdef*)
        LESSQUERY='^       #compdef name'
        ZSHPAGE=zshcompsys;;
    *completer*)
        LESSQUERY='^       completer$'
        ZSHPAGE=zshcompsys;;
    *complet*|*'zstyle '*)
        LESSQUERY='^COMPLETION SYSTEM CONFIGURATION$'
        ZSHPAGE=zshcompsys;;
    utility*func*|_argu*|_descr*)
        LESSQUERY='^UTILITY FUNCTIONS$'
        ZSHPAGE=zshcompsys;;
    control*func*|_func*)
        LESSQUERY='^CONTROL FUNCTIONS$'
        ZSHPAGE=zshcompsys;;
    calendar*)
        LESSQUERY='^       calendar \[ -abdDsv'
        ZSHPAGE=zshcalsys;;
    calsys*)
        LESSQUERY='^       zshcalsys - zsh calendar system'
        ZSHPAGE=zshcalsys;;
    tcp*)
        LESSQUERY='^       zshtcpsys - zsh tcp system'
        ZSHPAGE=zshtcpsys;;
    ftp*|zftp*)
        LESSQUERY='^       zshzftpsys - zftp function front-end'
        ZSHPAGE=zshzftpsys;;
    contrib*)
        LESSQUERY='^       zshcontrib - user contributions to zsh'
        ZSHPAGE=zshcontrib;;
    special*func*)
        LESSQUERY='^SPECIAL FUNCTIONS'
        ZSHPAGE=zshmisc;;
    color*comp*)
        LESSQUERY='^   Colored completion listings'
        ZSHPAGE=zshmodules;;
    colors)
        LESSQUERY='^       colors This  function'
        ZSHPAGE=zshcontrib;;
    vcs*|version*control*)
        LESSQUERY='^GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS$'
        ZSHPAGE=zshcontrib;;
    zle*)
        LESSQUERY='^ZLE FUNCTIONS$'
        ZSHPAGE=zshzle;;
    mime*)
        LESSQUERY='^MIME FUNCTIONS$'
        ZSHPAGE=zshcontrib;;
    zcalc*)
        LESSQUERY='^       zcalc \[ -ef'
        ZSHPAGE=zshcontrib;;
    zmathfuncdef)
        LESSQUERY='^       zmathfuncdef \['
        ZSHPAGE=zshcontrib;;
    other*func*)
        LESSQUERY='^OTHER FUNCTIONS'
        ZSHPAGE=zshcontrib;;
    zargs)
        LESSQUERY='       zargs \[ option'
        ZSHPAGE=zshcontrib;;
    tetris*)
        LESSQUERY='^       tetris Zsh'
        ZSHPAGE=zshcontrib;;
    zed)
        LESSQUERY='^       zed \[ -f'
        ZSHPAGE=zshcontrib;;
    zmv|zcp|zln|zkbd)
        LESSQUERY='^       zmv \[ -finq'
        ZSHPAGE=zshcontrib;;
    zstyle+)
        LESSQUERY='^       zstyle\+ context'
        ZSHPAGE=zshcontrib;;
    file*)
        LESSQUERY='^FILES$'
        ZSHPAGE=zsh;;
    except*|throw|catch|always)
        LESSQUERY='^EXCEPTION HANDLING$'
        ZSHPAGE=zshcontrib;;
    *)
        LESSQUERY="$@";;
esac
man --pager="less -p'$LESSQUERY'" "$ZSHPAGE"

它使用less作为分页程序,并启用less的termcap支持以显示彩色手册页。执行没有参数的help,或者--help-h,将列出保留字和内置命令。在这些单词之一后键入help,即可直接跳转到适当手册页中的条目。我筛选了特定手册页中的条目,以优化速度/效率,而不是只使用man ... zshall。此帮助函数不仅可以找到保留字和内置命令,还可以定位模块、模块命令、某些重要的完成命令(如compadd、compset等)的条目。

键入help mathhelp complethelp glob, help arrays, help env, help except,即可查看有关算术、完成、通配符、数组、环境变量、异常处理等方面的许多部分。通配符和多个匹配项使帮助函数更加友好。它是一个相当简单的case语句,具有超过210个匹配条件。如果没有匹配项,则默认为zshall搜索。如果匹配条件没有显示您要查找的内容或似乎妨碍了您的查找,请键入help --,然后输入搜索项以绕过所有匹配。

我包含了许多Zsh手册页涵盖的内容,但可以通过包括下划线前缀的完成函数等内容来使其更智能或更完整。


编辑:我为^[h(esc/alt+h)创建了一个bindkey函数。默认情况下,在那里绑定了run-help,这将取代它。

_helpprefix(){
    OLDBUFFER="$BUFFER"
    zle backward-kill-word
    BUFFER="help $CUTBUFFER"
    zle accept-line
    zle -U "$OLDBUFFER"
}
zle -N _helpprefix _helpprefix
bindkey '^[h' _helpprefix

这个功能是删除最后一个输入的单词,然后使用该单词执行help命令,最后将原始行重新添加回去。因此,您可以在类似以下命令中使用它来运行read的帮助文档:

find /usr -print0 | while IFS= read

在查看 read 条目之后,你仍然会停留在你的命令结尾处。

还值得注意的是,如果您需要了解特定内置命令的标志,您可以在命令后添加 - 并按 tab 键以查看每个标志的简短说明,例如: read - + tab 将打印出如下信息:

-A  -- first name is taken as an array
-E  -- input read is echoed
-d  -- specify delimiter to terminate input instead of newline
-e  -- input read is echoed and not assigned
-k  -- specify number of characters to read
-q  -- read y or n character from terminal
-r  -- raw mode
-s  -- suppress terminal echoing
-t  -- test if input is available before reading
-u  -- specify file descriptor to read from
-z  -- read entry from editor buffer stack

7

使用Bash,"help"命令是有效的:

jcomeau@intrepid:~/etc/apache2$ help until
until: until COMMANDS; do COMMANDS; done
    只要测试不成功,就会执行命令。
在`until'命令的最后一个命令的退出状态不为零时,扩展并执行COMMANDS。
退出状态: 返回最后执行的命令的状态。

但是由于我的系统没有“bindkey”,所以不确定这个答案是否有帮助。 - jcomeau_ictx
7
请注意,对原帖进行点踩的人:原帖只提到了“shell”,并没有提到zsh。 - jcomeau_ictx

6

我从bash转到zsh,却错过了"help"内置命令。于是我写了一个别名来调用它。然后我发现了更好的方法。虽然有时候我需要按下"n"键一次或多次才能找到我需要的手册页面。

help(){
    #This function used to call the "bash" builtin.
    #bash -c "help $@"

    #Better way: look it up in the man pages. I often look up "test" which doesn't give a usefull result,
    #so I added that as a special case.
    if [[ $1 == "test" ]]; then
        man --pager="less -p'^CONDITIONAL EXPRESSIONS$'" zshall
    else
        man --pager="less -p'^ *$@ '" zshall
    fi
}

4

虽然在过去这需要更多的操作,但自2017年(Zsh v5.4)起, 让一个非常快速和方便的帮助热键随手可得就像把以下内容放入您的.zshrc文件(或等效设置文件)一样简单:

unalias run-help
autoload run-help
bindkey "^[h" run-help

现在,您可以直接开始键入要调用的完整命令(忽略选项/参数——例如,“hello”):
print hello«Alt-h»

然后您将看到run-help列表。

print [ -abcDilmnNoOpPrsSz ] [ -u n ] [ -f format ] [ -C cols ]
  [ -v name ] [ -xX tabstop ] [ -R [ -en ]] [ arg ... ]
   With the `-f' option the arguments are printed as  described  by
   printf...

大多数命令都有简短的列表,可从zshbuiltins(1)中提取。我在系统上看到109个命令在/usr/share/zsh/5.4.2/help/中得到了记录。喜欢Zsh的这个特性!
请注意,并非所有内容都集成到run-help中,有时需要查找zshall(1)才能找到您要查找的内容。
% run-help zargs
zargs is an autoload shell function
No manual entry for zargs

这种 Alt-h(或者如果你喜欢,M-h)模式已经取代了通常需要使用 man 命令查看 Zsh 命令或其他内容的方式,这非常棒。例如,你可以使用以下替代方式:

% foo - # oh wait, how does this work
% foo -^C
% ^p^a  # recall, go to beginning of line
% man foo

现在只需要:

% foo -«Alt-h»

Emacs/vterm等用户注意:M-h可能绑定到mark-paragraph,因此本解决方案将无法使用。但是您可以改为使用S-M-h(即添加Shift),以获得期望的行为。


1
我在想:unalias run-help 是否总是必要的?也许不是,但这可能更明智、更安全,因为在我的系统上(至少是这样,很可能还有其他系统),run-help 被别名为 run-help=man。因此,在某些情况下,首先取消别名是必要的。既然在这里取消别名不会有任何影响,我认为包括它是一个好主意。 - David J.

2

对我而言,设置HELPDIR是关键。

[ -d /usr/share/zsh/help ] && HELPDIR=/usr/share/zsh/help
[ -d /usr/local/share/zsh/help ] && HELPDIR=/usr/local/share/zsh/help

alias help=run-help
bindkey '^[^H' run-help  # ctrl alt h.  Because of zsh-vi-mode  delete-forward-word, I can't use ^[^H] here

结尾


更智能地使用run-help 的方法

只需添加:

autoload -Uz run-help-sudo  # A very simple example
autoload -Uz run-help-ip  # A good example
autoload -Uz run-help-git

在输入sudo ls后,按下ctrl+alt+h,您将看到ls的手册页面。

然而,这并不会显示我们期望的内容(可能是因为在run-help中使用了shift?)/usr/share/zsh/functions/Misc/run-help sudo ls

您可以将此放入.zshrc文件中,而不是autoload -Uz run-help-sudo

run-help-sudo(){
if [ $# -eq 0 ]; then
    man sudo
else
    man $1
fi
}

喜欢tldr胜过man?想找到bin文件?

h(){
    /usr/bin/tldr $1 | bat
    # todo https://zsh.sourceforge.io/Doc/Release/Expansion.html#Parameter-Expansion-Flags
    # parameter expansion
    VAR="$(/usr/bin/tldr $1)"
    if [[ ${VAR} == *"No tldr entry for"* ]]
    then
        PAGER=LESS run-help $1
    fi

    echo ''
    whence -ca $1

    # todo
    # man --pager="less --pattern 'MY_key word' " zshcontrib
    # man --pager="less --pattern 'keyboard definition'" zshcontrib

    # todo
    # use run-help-git etc
}

来自 https://zsh.sourceforge.io/Doc/Release/User-Contributions.html

如果 cmd 是一个文件系统路径,则首先将其缩减为最右侧的组件(文件名)。

首先通过在 HELPDIR 参数命名的目录中查找名为 cmd 的文件来寻求帮助。如果没有找到文件,则会寻找名为 run-help-cmd 的辅助函数、别名或命令。如果找到,则使用当前命令行中命令名称 cmd 之后的其余部分作为其参数执行该辅助程序。当既未找到文件也未找到辅助程序时,运行外部命令 'man cmd'。如果没有找到文件,则会寻找名为 run-help-cmd 的辅助函数、别名或命令。

run-help 的作用是:

(可能已经涵盖了此答案的功能?)

#!/bin/zsh
#
# Figure out where to get the best help, and get it.
#
# Install this function by placing it in your FPATH and then
# adding to your .zshrc the lines:
#   unalias run-help
#   autoload -Uz run-help
#

emulate -RL zsh

local HELPDIR=${HELPDIR:-/usr/share/zsh/help}

[[ $1 == "." ]] && 1="dot"
[[ $1 == ":" ]] && 1="colon"

# Check whether Util/helpfiles has been used to generate zsh help
if [[ $# == 0 || $1 == "-l" ]]
then
    if [[ -d $HELPDIR ]]
    then
    echo "Here is a list of topics for which special help is available:"
    echo ""
    print -rc $HELPDIR/*(:t)
    else
    echo "There is no list of special help topics available at this time."
    fi
    return 0
elif [[ -n "${HELPDIR:-}" && -r $HELPDIR/$1 && $1 != compctl ]]
then
    ${=PAGER:-/usr/bin/pager} $HELPDIR/$1
    return $?
fi

# No zsh help; use "whence" to figure out where else we might look
local what places noalias newline='
'
integer i=0 didman=0

places=( "${(@f)$(builtin whence -va $1)}" )
if [[ $places = *"not found"* && $1 != ${(Q)1} ]]; then
  # Different when unquoted, so try stripping quotes.
  places=( "${(@f)$(builtin whence -va ${(Q)1})}" )
  if (( ${#places} )); then
      set -- "${(Q)@}"
  fi
  # Quotation is significant to aliases, so suppress lookup.
  noalias=1
fi

{
while ((i++ < $#places))
do
    what=$places[$i]
    [[ -n $noalias && $what = *" is an alias "* ]] && continue
    builtin print -r $what
    case $what in
    (*( is an alias for (noglob|nocorrect))*)
    [[ ${what[(w)7]:t} != ${what[(w)1]} ]] &&
      run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)7]:t}
    ;;
    (*( is an alias)*)
    [[ ${what[(w)6]:t} != ${what[(w)1]} ]] &&
      run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)6]:t}
    ;;
    (*( is a * function))
    case ${what[(w)1]} in
    (comp*) man zshcompsys;;
    (zf*) man zshftpsys;;
    (run-help) man zshcontrib;;
    (*) builtin functions ${what[(w)1]} | ${=PAGER:-/usr/bin/pager};;
    esac;;
    (*( is a * builtin))
    case ${what[(w)1]} in
    (compctl) man zshcompctl;;
    (comp*) man zshcompwid;;
    (bindkey|vared|zle) man zshzle;;
    (*setopt) man zshoptions;;
    (cap|getcap|setcap) ;&
    (clone) ;&
    (ln|mkdir|mv|rm|rmdir|sync) ;&
    (sched) ;&
    (echotc|echoti|sched|stat|zprof|zpty|zsocket|zstyle|ztcp) man zshmodules;;
    (zftp) man zshftpsys;;
    (*) man zshbuiltins;;
    esac
    ;;
    (*( is hashed to *))
    man ${what[(w)-1]:t}
    ;;
    (*( is a reserved word))
    man zshmisc
    ;;
    (*)
    if ((! didman++))
    then
        if whence "run-help-$1:t" >/dev/null
        then
        local cmd_args
        builtin getln cmd_args
        builtin print -z "$cmd_args"
        cmd_args=( ${(z)cmd_args} )
        # Discard environment assignments, etc.
        while [[ $cmd_args[1] != ${run_help_orig_cmd:-$1} ]]
        do
            shift cmd_args || return 1
        done
        eval "run-help-$1:t ${(q@)cmd_args[2,-1]}"
        else
        POSIXLY_CORRECT=1 man $@:t
        fi
    fi
    ;;
    esac
    if ((i < $#places && ! didman))
    then
    builtin print -nP "%SPress any key for more help or q to quit%s"
    builtin read -k what
    [[ $what != $newline ]] && echo
    [[ $what == [qQ] ]] && break
    fi
done
} always {
  unset run_help_orig_cmd
}


0

你的shell的manpage可能会告诉你。

如果在shell中阅读,请使用分页器的搜索功能(或浏览器的查找功能)。对于less,可以使用/search string开始搜索,使用n移动到下一个匹配项。


1
在zsh手册中不要提到bindkeyalias(我选择了一个常见的) - John Bachir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接