您使用什么zsh功能?[关闭]


33

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


2
我不知道该功能,我将不得不尝试该功能!
罗伊·里科

1
该目录自动完成是哪个选项?
09年

Answers:


50

刚发现这个小宝石:

cd old new

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

例如,如果您的工作目录为,/home/larry/code/backrub/server而您想切换到/home/sergei/code/backrub/server,则只需执行以下操作:

cd larry sergei

7
好的,那条规则。
09年

21

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

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

  • **水珠,例如,**/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内置的。

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

term_title_base ='@%l:%1〜'
preexec(){
  打印-nr $'\ e] 2;'“ $ {(%)term_title_base} $ *”'$ \ a'
}
precmd(){
  打印-nr $'\ e] 2;'“ $ {(%)term_title_base}($?)”'$ \ a'  
}
  • Ctrl + Z:
    • 在空的命令行上运行bg(以便Ctrl + Z Ctrl + Z挂起程序并立即在后台恢复它)。
    • 在非空的命令行上,暂停当前的命令版本:让我键入另一个命令,当第二个命令行完成时,我取回第一个命令进行编辑。
    • 这使用以下功能:
fancy-ctrl-z(){
  如果[[$#BUFFER -eq 0]]; 然后
    bg
    重新显示
  其他
    zle推入式输入
  科幻
}
zle -N fancy-ctrl-z
绑定键'^ Z'fancy-ctrl-z
  • 最重要的非完成相关选项: setopt append_history autocd extended_glob no_match

3
爱^ Z ^ Z技巧,谢谢!最初是寻找superuser.com/questions/378018将其绑定到单键的解决方案,但是^ Z ^ Z更具意义
Evgeniy Dolzhenko 2012年

13

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

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

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

1
是的,这太好了!当我不太确定命令行开关是什么,但是我不需要深入研究man文件时,也可以使用它。
Frew Schmidt

我相信bash也具有此功能。
基思·汤普森

10

我真的很喜欢全局别名

alias -g L='|less
alias -g DN='>/dev/null'

让我做类似的事情

somecommand file arg L

并获取分页。


我也喜欢G for grep。
Frew Schmidt,2009年

7

正如其他人提到的,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

推和弹出也很方便。

# 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

2
我倾向于发现拼写纠正比实际有用更令人讨厌。
Frew Schmidt

@Frew heh,您不是第一个对我这样说的人。更正的更好功能之一是它将更正的版本纳入历史记录,因此您不会意外地再次运行同一件事。
theotherre

5

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

显示其他信息的正确提示。


确实!我有一个非常复杂但简短的提示。主机名[当前行] <错误编号>%
Frew Schmidt,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.