쉘에서 실시간 텍스트 교체가 가능합니까?

쉘에서 실시간 텍스트 교체가 가능합니까?

zsh내 컴퓨터에서 실행 중 입니다 . 쉘에서 텍스트 교체가 가능한지 궁금합니다. 예를 들어 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또는 이와 유사한 설정을 사용하면 fntabspace해당 텍스트를 입력해야 합니다 function(또는 적어도 저에게는 zsh -f기존 구성과의 충돌을 피하기 위해 위의 줄을 zsh 5.3.1 실행에 입력해야 합니다). 입력을 줄이고 설정만 하면 됩니다 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

관련 정보