您使用哪些 zsh 功能?

Fre*_*idt 33 zsh shell command-line

我在终端上做了很多工作,所以我学到了很多关于我选择的 shell,zsh。您使用 zsh 的哪些功能来提高自己的工作效率?我的最爱之一是多目录自动完成。因此,cd /fo{tab}/ba{tab}/ba{tab}我可以不用打字,而是可以cd /fo/ba/ba{tab}保存那么多的击键!

Agn*_*ian 50

刚刚发现这个小宝石:

cd old new
Run Code Online (Sandbox Code Playgroud)

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

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

cd larry sergei
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这是规定。 (7认同)

Gil*_*il' 22

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

  • 花哨的完成。是的,bash 有一些,但 zsh 知道更多的命令,通常更精确,并且有更多的配置可能性。

  • **水珠,例如,**/foo查找一个名为文件foo子目录中递归。(并且***/foo还遵循符号链接。)两个字符而不是长find命令(如果某些文件名包含特殊字符,如空格和引号,则很难正确理解)。

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

  • autocd:键入目录名称作为命令更改为它(cdpushd取决于您的配置方式)。该cd命令是三个字符太长了!我不能使用 bash 超过 30 秒而不感到疼痛。我还有一些单字符函数,比如

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

  • precmdpreexec钩子函数:我使用的preexec设置我的终端的标题,包括正在运行的命令,precmd以取代其退出代码的命令。就像是

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

  • 喜欢 ^Z ^Z 技巧,谢谢!最初是在 http://superuser.com/questions/378018/ 寻找将其绑定到单个键的解决方案,但 ^Z ^Z 更有意义 (3认同)

Mar*_*man 13

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

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

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


hom*_*ast 10

我真的很喜欢全局别名所以

alias -g L='|less
alias -g DN='>/dev/null'
Run Code Online (Sandbox Code Playgroud)

让我做这样的事情

somecommand file arg L
Run Code Online (Sandbox Code Playgroud)

并获得分页。


the*_*ive 7

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

您也可以轻松地为自定义命令设置自己的自动完成功能。将完整的用户名作为参数的 tab 键:

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

我喜欢设置的其他选项:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber
Run Code Online (Sandbox Code Playgroud)

Pushd 和 popd 也很方便。

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME
Run Code Online (Sandbox Code Playgroud)

令人讨厌的是,默认情况下,home 和 end 键不像在其他 shell 上那样在 zsh 上工作,但您可以解决这个问题。

# 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
Run Code Online (Sandbox Code Playgroud)

  • 我倾向于发现拼写更正比实际有用更烦人。 (2认同)

小智 5

scp在远程服务器上使用时启用自动完成。

显示附加信息的正确提示。