ZSH:输入时的行为
ZSH: Behavior on Enter
我意识到,当我在我的终端时,我希望在空输入时按 Enter
来生成 ls
或 git status
当我在git 回购。
我怎样才能做到这一点?我的意思是,在 zsh 中对 Empty input -> Enter
有自定义行为?
编辑:感谢您的帮助。这是我对 preexec
...
的看法
precmd() {
echo [=10=];
if ["[=10=]" -eq ""]; then
if [ -d .git ]; then
git status
else
ls
fi;
else
fi;
}
在我的 .zshrc
中,我使用了在这里找到的 precmd 和 preexec 的组合:
http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions
我还发现 git-提示非常有用:
On Enter zsh 调用 accept-line
小部件,这会导致缓冲区作为命令执行。
您可以编写自己的小部件以实现您想要的行为并重新绑定输入:
my-accept-line () {
# check if the buffer does not contain any words
if [ ${#${(z)BUFFER}} -eq 0 ]; then
# put newline so that the output does not start next
# to the prompt
echo
# check if inside git repository
if git rev-parse --git-dir > /dev/null 2>&1 ; then
# if so, execute `git status'
git status
else
# else run `ls'
ls
fi
fi
# in any case run the `accept-line' widget
zle accept-line
}
# create a widget from `my-accept-line' with the same name
zle -N my-accept-line
# rebind Enter, usually this is `^M'
bindkey '^M' my-accept-line
虽然仅在实际存在命令的情况下 运行 zle accept-line
就足够了,但 zsh 不会在输出。虽然可以使用 zle redisplay
重绘提示,但如果您使用多行提示,这可能会覆盖输出的最后一行。 (当然也有解决方法,但没有什么比使用 zle accept-line
.
更简单的了
警告:这重新定义了 shell 的(最重要的?)重要部分。虽然这本身没有任何问题(否则我不会在这里发布它),但如果 my-accept-line
没有完美地 运行,它很有可能使你的 shell 无法使用。例如,如果缺少 zle accept-line
,您不能使用 Enter 来确认任何命令(例如重新定义 my-accept-line
或启动编辑器)。所以,请在将其放入 ~/.zshrc
之前对其进行测试。
此外,默认情况下 accept-line
也绑定到 Ctrl+J。我建议保持这种状态,以便有一个简单的方法 运行 默认值 accept-line
。
我意识到,当我在我的终端时,我希望在空输入时按 Enter
来生成 ls
或 git status
当我在git 回购。
我怎样才能做到这一点?我的意思是,在 zsh 中对 Empty input -> Enter
有自定义行为?
编辑:感谢您的帮助。这是我对 preexec
...
precmd() {
echo [=10=];
if ["[=10=]" -eq ""]; then
if [ -d .git ]; then
git status
else
ls
fi;
else
fi;
}
在我的 .zshrc
中,我使用了在这里找到的 precmd 和 preexec 的组合:
http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions
我还发现 git-提示非常有用:
On Enter zsh 调用 accept-line
小部件,这会导致缓冲区作为命令执行。
您可以编写自己的小部件以实现您想要的行为并重新绑定输入:
my-accept-line () {
# check if the buffer does not contain any words
if [ ${#${(z)BUFFER}} -eq 0 ]; then
# put newline so that the output does not start next
# to the prompt
echo
# check if inside git repository
if git rev-parse --git-dir > /dev/null 2>&1 ; then
# if so, execute `git status'
git status
else
# else run `ls'
ls
fi
fi
# in any case run the `accept-line' widget
zle accept-line
}
# create a widget from `my-accept-line' with the same name
zle -N my-accept-line
# rebind Enter, usually this is `^M'
bindkey '^M' my-accept-line
虽然仅在实际存在命令的情况下 运行 zle accept-line
就足够了,但 zsh 不会在输出。虽然可以使用 zle redisplay
重绘提示,但如果您使用多行提示,这可能会覆盖输出的最后一行。 (当然也有解决方法,但没有什么比使用 zle accept-line
.
警告:这重新定义了 shell 的(最重要的?)重要部分。虽然这本身没有任何问题(否则我不会在这里发布它),但如果 my-accept-line
没有完美地 运行,它很有可能使你的 shell 无法使用。例如,如果缺少 zle accept-line
,您不能使用 Enter 来确认任何命令(例如重新定义 my-accept-line
或启动编辑器)。所以,请在将其放入 ~/.zshrc
之前对其进行测试。
此外,默认情况下 accept-line
也绑定到 Ctrl+J。我建议保持这种状态,以便有一个简单的方法 运行 默认值 accept-line
。