ZSH:每张cd后自动运行ls

drm*_*oba 40 zsh

所以我现在已经让ZSH做了所有这些很酷的东西,但真正令人敬畏的是,如果我能在每次调用'cd'之后隐式运行'ls -a'.我想这必须放在.zlogin文件或.aliases文件中,我只是不确定最佳解决方案是什么.思考?参考资料?

ZyX*_*ZyX 59

将以下内容放入.zshrc:

function cd() {
    emulate -LR zsh
    builtin cd $@ &&
    ls -a
}
Run Code Online (Sandbox Code Playgroud)

编辑: 在查看文档(zshbuiltins,cd内置函数钩子函数的描述)之后,我发现了一种更好的方法:它使用以下任一chpwd函数:

function chpwd() {
    emulate -L zsh
    ls -a
}
Run Code Online (Sandbox Code Playgroud)

或使用chpwd_functions数组:

function list_all() {
    emulate -L zsh
    ls -a
}
chpwd_functions=(${chpwd_functions[@]} "list_all")
Run Code Online (Sandbox Code Playgroud)

  • 什么是`emulate -LR zsh`? (6认同)
  • @moo`man zshbuiltins`.重置一些选项(这里:对于当前函数的持续时间),这里并不是真的需要,但最好在每个函数的开头放置`emulate zsh` /`emulate -L zsh`,以便你知道这个函数永远不会独立于任何用户设置.`-R`是一种矫枉过正,它会重置所有选项. (6认同)

Joh*_*rry 8

简洁版本。

autoload -U add-zsh-hook
add-zsh-hook -Uz chpwd (){ ls -a; }
Run Code Online (Sandbox Code Playgroud)

快速解释这里发生的事情。

autoload -U add-zsh-hook
Run Code Online (Sandbox Code Playgroud)

该行基本上只是加载贡献函数add-zsh-hook

add-zsh-hook -Uz chpwd (){ ls -a; }
Run Code Online (Sandbox Code Playgroud)

每个特殊功能都有一个函数数组,当该函数被触发时(例如通过更改目录)将被调用。这行代码向该数组添加了一个函数。要分解...

add-zsh-hook -Uz chpwd
Run Code Online (Sandbox Code Playgroud)

这部分指定我们要向chpwd特殊功能添加新功能。的-Uz一般都是这样做的推荐的参数,它们传递给用于函数参数(即下位)的自动加载。

(){ ls -a; }
Run Code Online (Sandbox Code Playgroud)

第二部分是功能。它通常被称为匿名函数。该函数尚未分配名称。它不需要名称,因为它只是放在数组中。

  • 请注意,与下面使用 chpwd 相比,这样做的优点是,它允许您向其中一个特殊函数添加任意数量的新函数。除了这里提到的“ls”之外,我还执行诸如设置终端标题和检查本地历史文件之类的操作。 (2认同)

Rem*_*den 6

我不知道为什么会出现这种情况,或者这是否更好,但我发现这也适用于 .zshrc。似乎比大多数答案都短得多,尽管它可能缺少一些我不明白的东西。

chpwd() ls -a