我注意到我喜欢按特定顺序执行某些操作。
钩,在我看来,基本上是“做一些事情发生后”,其中的事件,可能是与参数,如任何命令git clone
,git submodule add
,cd
,rm
或任何其他。
我想说,“如果git add
,做git status
”。例如,我总是:git add X; git status
,和cd X; ls -la
,我可以想到更多这样的组合,我想在我的工作流程中自动化。
别名 \ 函数在这里不容易工作的原因有 3 个:
我将用一个例子来说明我的意思:我使用了 Nathan Broadbent 的一些名为SCM Breeze 的zsh 脚本——这些脚本添加了一个 git() 函数来做事情。
假设现在我想自动化我的工作流程,并使其在每个 之后git clone
,有一个cd
到由上一个命令创建的目录(这是如何做到的)。为此,我将使用 git() 函数,对吗?
该函数将覆盖 SCM Breeze 命令,我将无法使用 SCM Breeze。
如果有帮助,我将 ZSH 与 OhMyZsh 一起使用。
现在,我正在使用 bash 脚本(别名和函数)来做这件事,但感觉好像我在做的工作很可能现在已经由其他人完成了。任何有项目的人都会这样做吗?有助于以整洁的方式促进“钩子”?
可能对您有帮助的事情:
在preexec
被执行的每个命令行之前(不是每个命令之前)钩函数被调用。
preexec() echo will execute: $1
Run Code Online (Sandbox Code Playgroud)
precmd
在每个提示之前。
precmd() echo executed: $history[$[HISTCMD-1]]
Run Code Online (Sandbox Code Playgroud)
你可以像这样扩展一个函数:
functions[git]='
(){ '$functions[git]'; } "$@"; local myret=$?
do-extra-stuff
return $myret'
Run Code Online (Sandbox Code Playgroud)
或者:
functions[git-old]=$functions[git]
git() {
git-old "$@"
local myret=$?
do-extra-stuff || return $myret
}
Run Code Online (Sandbox Code Playgroud)
所述DEBUG
捕集器在每个命令之后执行:
trap 'echo $ZSH_DEBUG_CMD returned with $?' DEBUG
Run Code Online (Sandbox Code Playgroud)
您可以重新定义accept-line
小部件(映射到Enter)以在其中执行操作:
accept-line() {
zle -R "going to run: $BUFFER"
sleep 1
zle .$WIDGET
}
zle -N accept-line
Run Code Online (Sandbox Code Playgroud)