在輸入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
簡單
警告:這redfines你的shell的(最)重要組成部分雖然沒有什麼不妥每? SE(否則我就不會在這裏貼吧),它具有非常現實的機會,使你的shell不可用,如果my-accept-line
不完美運行。例如,如果zle accept-line
人失蹤,你不能使用輸入確認任何命令(例如重新定義my-accept-line
或啓動編輯器),請在將它放入您的~/.zshrc
之前對其進行測試
此外,默認情況accept-line
勢必Ctrl鍵 + Ĵ,太。我會建議離開它,以便有一個簡單的方法來運行默認accept-line
。
嘗試改變'[ 「$ 1」 -eq 「」]]''到[ 「$ 1」 -eq 「」]'並把代碼放到'precmd',而不是'preexec'。 – user12341234
謝謝。更新。如果我使用'$ 1',它始終是空的,如果我使用'$ 0',我仍然得到'壞模式:[zsh' ... –
所以我贊同的'$ 0'內容,'$ 1'和'$ 2' 。這裏就是我有'preexec:$ 0 = preexec,$ 1 = 11,$ 2 = LS --color = tty的-lh'和'PRECMD:$ 0 = zsh中,$ 1 = $ 2 = 「」'。同樣重要的是要注意:按空字符串時不會調用「preexec」。而'precmd'不知道以前的命令。不知道我能在這裏實現我想要的... –