![是否可以在 shell 中进行实时文本替换?](https://linux22.com/image/115766/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%20shell%20%E4%B8%AD%E8%BF%9B%E8%A1%8C%E5%AE%9E%E6%97%B6%E6%96%87%E6%9C%AC%E6%9B%BF%E6%8D%A2%EF%BC%9F.png)
我zsh
在我的机器上运行。我想知道是否可以在 shell 中进行文本替换。例如fn[SPACE/TAB]
应替换为function
.那里OSX
有键盘快捷键的选项,但它们不能在chrome
或上运行shell
。有没有办法调整操作系统,使其解释fn
为function
?
如果能够实现这一点,那就太神奇了。
答案1
zsh
提供了大量的绳索,其中一部分是_user_expand
提供随机输入到随机输出的所谓“用户扩展”的功能。例如。
# turn on completion system
autoload -U compinit
compinit
# how to mangle inputs; this is a hash or "associative array" of terms
declare -A manglements
manglements=( fn function )
# register mangler and enable _user_expand
zstyle ':completion:*:user-expand:*' user-expand '$manglements'
zstyle ':completion:*' completer _user_expand _complete _ignored
通过此设置.zshrc
或类似内容,键入fn
tabspace应该替换该文本function
(或者至少对我来说,将上述行输入到 zsh 5.3.1 run 以zsh -f
避免与任何现有配置发生冲突)。减少输入只需设置fn
tab设置add-space
zstyle ':completion:*:user-expand:*' add-space 1
但如果你真的想要一个神奇的space而不是tab完成,这需要空格键有一个绑定到它的小部件,这是一个稍微更重要(和危险)的变化。
declare -A manglements
manglements=( fn function )
function magic-space-bar {
local -a le_vlapoi
# split on words, see zshexpn(1)
le_vlapoi=(${(z)BUFFER})
# only mangle the first word, not surprisingly in middle of some
# "echo blah fn ..." sequence (this is the same as the `alias -g`
# rake problem waiting to whap you in the face)
if [[ $#le_vlapoi -eq 1 ]]; then
local romoi
romoi=$manglements[$le_vlapoi[-1]]
if [[ -n $romoi ]]; then
le_vlapoi[-1]=$romoi
BUFFER="$le_vlapoi"
fi
fi
# ensure the typed space happens regardless
BUFFER="$BUFFER ";
CURSOR=$#BUFFER
}
zle -N magic-space-bar
autoload -U compinit
compinit
bindkey ' ' magic-space-bar
bindkey -M isearch ' ' self-insert