我想使用preexec()在运行之前修改某些命令,但我需要能够评估当前输入的命令。在执行之前是否有包含整个命令的变量?我知道!!
是最后一个命令,但在将其保存到历史记录之前我需要当前行。
我想做的一个例子可能会有所帮助
ls -l /root bitch
然后我想让preexec看到我在最后写了婊子并用
替换它 sudo ls -l /root
我认为像
preexec() {
if [[ $CURRENT_LINE =~ bitch$ ]]; then
$CURRENT_LINE="sudo ${CURRENT_LINE% bitch}"
fi
会工作但我无法在zsh中找到一个给我正确$ CURRENT_LINE的变量
对于奖励积分,我也希望能够在一行上输入bitch
并使其运行sudo !!
但我可能会使用某种形式的别名。
我认为制作一个bitch
函数可能会更好,我可以管理一个命令,但我不认为它也可以运行,因为命令会运行并失败(之前在用sudo再次运行之前。管道)。
答案 0 :(得分:4)
据我所知,preexec
不适合修改要执行的命令。我们无法更改要从preexec
函数内部执行的命令...
虽然要执行的实际命令是$1
,$2
和$3
。
preexec
在读取命令后即将执行并执行。如果历史记录机制处于活动状态(并且未从历史缓冲区中删除该行),则用户键入的字符串将作为第一个参数传递,否则它将为空字符串。将要执行的实际命令(包括扩展别名)以两种不同的形式传递:第二个参数是命令的单行大小限制版本(函数体之类的东西被省略);第三个参数包含正在执行的全文。
例如:
alias ls='ls -sF --color=auto'
preexec () {
print ">>>preexec<<<"
print -l ${(qqq)@}
}
如果我在~/.zshrc
以上,那么我会得到以下内容:
% echo test preexec<Esc-Return>
ls<Return>
;# outputs below
>>>preexec<<<
"echo test preexec
ls"
"echo test preexec; ls -sF --color=auto"
"echo test preexec
ls -sF --color=auto"
test preexec
total 1692
...
您可以将自己的zle小部件函数添加到zsh行编辑器以操作行编辑器缓冲区。 (zshzle(1)
)
您可以添加zle小部件功能来更改按 Enter 的行为。
my-accept-line () {
if [[ "$BUFFER" == *" bitch" ]]; then
BUFFER="sudo ${BUFFER% bitch}"
fi
zle .accept-line
}
zle -N accept-line my-accept-line
上述代码段将accept-line
的功能从内置行为更改为此处定义的my-accept-line
。
添加缩写也有帮助,如下所述:
克隆vim的缩写功能
- “examples:zleiab [ZshWiki]” - http://zshwiki.org/home/examples/zleiab