您使用哪些 zsh 功能?

您使用哪些 zsh 功能?

我经常在终端上工作,因此我了解了很多我选择的 shell,zsh。你使用 zsh 的哪些功能来提高工作效率?我最喜欢的功能之一是多​​目录自动完成。这样cd /fo{tab}/ba{tab}/ba{tab}我就不用打字了,只需执行cd /fo/ba/ba{tab}并节省大量击键!

答案1

刚刚发现这颗小宝石:

cd old new

这种形式的用 替换当前目录的完整路径中cd所有出现的,并尝试将工作目录更改为结果路径。oldnew

例如,如果您的工作目录是/home/larry/code/backrub/server,而您想要切换到/home/sergei/code/backrub/server,那么您需要做的就是:

cd larry sergei

答案2

我会坚持做那些据我所知 bash 无法做到的事情。

  • 精美的补全。是的,bash 有一些,但 zsh 知道更多命令,通常更精确,并且具有更多配置可能性。

  • **例如,glob会递归**/foo查找foo子目录中的文件。(并且***/foo还会跟踪符号链接。)两个字符而不是一个长find命令(如果某些文件名包含空格和引号等特殊字符,则很难正确执行)。

  • 不太常见的是,glob 限定符如foo*(*)(类似foo*,但只保留可执行文件)、foo(.)(仅常规文件,而不是目录)、foo(-@) (仅悬空符号链接)、foo*(m-5)(仅在过去 5 分钟内修改的文件)、foo*(om[1])(最近修改的文件)等。

  • autocd:将目录名称作为命令输入会更改为该名称(cdpushd取决于您如何配置它)。该cd命令太长了三个字符!我使用 bash 超过三十秒就会感到很痛苦。我还有几个单字符函数,例如

功能 - {
  如果 [[ $# -eq 0 ]]; 那么
    cd“$OLDPWD”
  别的
    内置-“$@”
}
  • 内置zmv的,和
别名 zcp='noglob zmv -C'
别名 zln='noglob zmv -L'
别名 zmv='noglob zmv'
  • 当我这样做的时候,noglob内置的。

  • precmd和钩子函数preexec:我用来preexec设置终端的标题以包含正在运行的命令,并precmd用其退出代码替换该命令。例如

term_title_base='@%l: %1~'
预执行 () {
  打印 -nr $'\e]2;'"${(%)term_title_base} $*"'$\a'
}
前置命令 () {
  打印 -nr $'\e]2;'"${(%)term_title_base} ($?)"'$\a'  
}
  • Ctrl+Z:
    • 在空的命令行上运行bg(这样 Ctrl+Z Ctrl+Z 会暂停程序并立即在后台恢复它)。
    • 在非空命令行上,暂停当前命令版本:让我输入另一个命令,当第二个命令行完成时,我返回第一个要编辑的命令。
    • 这使用以下函数:
花式-ctrl-z () {
  如果 [[ $#BUFFER -eq 0 ]]; 那么
    背景
    zle 重新显示
  别的
    zle 推送输入
}
zle -N fancy-ctrl-z
绑定键 '^Z' fancy-ctrl-z
  • 最重要的与完成无关的选项:setopt append_history autocd extended_glob no_match

答案3

zsh 能够自动完成文件和目录以外的内容。

例如,安装了 git 包后,git-sh{tab} 会显示:

- git 命令 -
shortlog——总结 git log 输出
show-branch——显示分支及其提交
show-index——显示包 idx 文件的内容

答案4

正如其他人所说,zsh 的自动完成功能非常出色。

您也可以为自定义命令设置自己的自动完成功能,而不必花费太多精力。要将完整的用户名作为 finger 的参数,请执行以下操作:

# ~/.zshrc
function userlist {
        reply=(`users | tr ' ' '\n' |sort -u `);}
compctl -K userlist finger
set COMPLETE_ALIASES

我喜欢设置的其他选项:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber

Pushd 和 popd 也非常方便。

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME

令人恼火的是,home 和 end 键在 zsh 上默认不起作用,就像在其他 shell 上一样,但你可以解决这个问题。

# Make home and end keys work.
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line

相关内容