我经常在终端上工作,因此我了解了很多我选择的 shell,zsh。你使用 zsh 的哪些功能来提高工作效率?我最喜欢的功能之一是多目录自动完成。这样cd /fo{tab}/ba{tab}/ba{tab}
我就不用打字了,只需执行cd /fo/ba/ba{tab}
并节省大量击键!
答案1
刚刚发现这颗小宝石:
cd old new
这种形式的用 替换当前目录的完整路径中cd
所有出现的,并尝试将工作目录更改为结果路径。old
new
例如,如果您的工作目录是/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
:将目录名称作为命令输入会更改为该名称(cd
或pushd
取决于您如何配置它)。该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