是否可以在 shell 中进行实时文本替换?

是否可以在 shell 中进行实时文本替换?

zsh在我的机器上运行。我想知道是否可以在 shell 中进行文本替换。例如fn[SPACE/TAB]应替换为function.那里OSX有键盘快捷键的选项,但它们不能在chrome或上运行shell。有没有办法调整操作系统,使其解释fnfunction

如果能够实现这一点,那就太神奇了。

答案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或类似内容,键入fntabspace应该替换该文本function(或者至少对我来说,将上述行输入到 zsh 5.3.1 run 以zsh -f避免与任何现有配置发生冲突)。减少输入只需设置fntab设置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

相关内容