ZSH:在每次cd之后自动运行ls

59

我现在已经让 ZSH 做了很酷的事情,但如果我能让它在每次调用 'cd' 后自动隐式运行 'ls -a',那就真的太棒了。我想这应该放在 .zlogin 文件或 .aliases 文件中,只是我不确定最好的解决方案是什么。你有什么想法?参考资料呢?

4个回答

73

编辑: 在查看文档(zshbuiltinscd内置命令的描述或钩子函数)后,我找到了更好的方法:使用chpwd函数:

function chpwd() {
    emulate -L zsh
    ls -a
}

或者使用chpwd_functions数组:

function list_all() {
    emulate -L zsh
    ls -a
}
chpwd_functions=(${chpwd_functions[@]} "list_all")
把以下内容放入.zshrc文件中:

function cd() {
    emulate -LR zsh
    builtin cd $@ &&
    ls -a
}

1
这个方法非常好用,我忘了提到我已经开启了auto_cd,所以只有在显式调用“cd”时才能使用此方法。有没有办法让它在任何更改目录时都能自动生效? - drmanitoba
12
emulate -LR zsh 是用来做什么的? - moo
10
@moo man zshbuiltins。重置一些选项(在这里:为当前函数的持续时间),这并不是必需的,但是在每个函数的开头加上emulate zsh/emulate -L zsh是很好的,这样您就会知道这个函数不会因为用户设置而独立崩溃。 -R是过度操作,它会重置所有选项。 - ZyX
这对我很有效,我想继续使用它,但我的一台电脑非常慢,所以我不想使用它。如果我已经从另一个点文件中“source”了它,我该如何覆盖它?我假设我只需将该函数复制到特定于主机的.zshrc中并删除ls -a即可。 - Sridhar Sarnobat
最后一种选项的缺点是每次你执行 source .zshrc 都会将 list_all 添加到 chpwd_functions 中,导致额外调用 ls -a - jameh
使用此命令在 cd 到包含 .git 目录的文件夹上运行 git fetch --all --prune - javafueled

22

简短版本。

autoload -U add-zsh-hook
add-zsh-hook -Uz chpwd (){ ls -a; }

这里简要解释一下正在发生的事情。

autoload -U add-zsh-hook

这行代码基本上只是加载了贡献的函数add-zsh-hook

add-zsh-hook -Uz chpwd (){ ls -a; }

每个特殊函数都有一个函数数组,当该函数被触发时(例如更改目录),将调用该数组中的函数。此行代码将一个函数添加到该数组中。具体来说...

add-zsh-hook -Uz chpwd

这部分内容指定我们向chpwd特殊函数添加一个新函数。 -Uz通常是此操作的推荐参数,它们传递给用于函数参数的autoload(即下一部分)。

(){ ls -a; }

这是第二部分,即函数的部分。通常称之为匿名函数,即没有被赋予名称的函数。它不需要名称,因为它只是放在数组中。


哇!这个能用,但是脏得让我花了几个小时来挖掘man手册才理解。根据zsh文档,第二行应该将函数体“ls -a;”分配给多个名称:add-zsh-hook、-Uz和chpwd(它确实这样做了)。但同时,它真正执行了原始的“add-zsh-hook”并带有所有那些参数。为什么?http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html#Simple-Commands-_0026-Pipelines - ratijas
2
请注意,这种方法的优点在于它允许您向其中一个特殊函数添加任意数量的新函数,而不是像下面使用chpwd那样。除了这里提到的“ls”之外,我还会执行其他操作,例如设置终端标题和检查本地历史文件。 - John Eikenberry
我该如何禁用它? - Aman Agarwal

6

我不知道为什么会这样,或者这是否更好,但我发现这在.zshrc中也有效。看起来比大多数答案都要短,但也许缺少了我不理解的一些东西。

chpwd() ls -a


0

chpwd()ls -a是两个单独的命令,它们可以在命令行中一起使用。

chpwd()在大多数shell中不是有效的命令,但在zsh shell中,它是一个函数,每当当前工作目录更改时就会被调用。它可用于定义用户浏览到新目录时应执行的操作。

ls -a是一个命令,用于列出目录的内容,包括隐藏文件和目录(那些以点.开头的文件)。-a选项告诉ls显示所有文件,包括隐藏文件。

因此,当它们一起使用时,chpwd() ls -a将在当前工作目录更改时执行ls -a命令。例如,这可用于在用户导航到目录时自动列出目录的内容。但值得注意的是,chpwd()不是标准命令,并且并非所有shell都可用,因此在某些情况下,此用法可能无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接