외부 편집기를 사용하여 Zsh 명령을 편집하고 원래 명령을 바꿉니다.

외부 편집기를 사용하여 Zsh 명령을 편집하고 원래 명령을 바꿉니다.

Zsh를 사용하고 있습니다. 다음을 입력하여 Neovim에서 현재 명령을 편집하기 위한 키 바인딩을 설정했습니다 .zshrc.

bindkey -v
export VISUAL=nvim
autoload edit-command-line; zle -N edit-command-line
bindkey -M vicmd v edit-command-line

이렇게 하면 편집 명령을 완료하면 아래 스크린샷과 같이 최종 결과가 원래 결과 아래에 배치됩니다.

각각 명령이 포함된 두 줄이 포함된 예입니다.

내가 원하는 것은 최종 결과이다.바꾸다오리지널 라인. 주된 이유는 Powerlevel10k를 사용하기 때문입니다.즉시 알림활성화되었습니다. 이 기능은 이 특별한 경우에는 작동하지 않습니다.

답변1

면책 조항: 저는 Powerlevel10k의 저자입니다.

임시 힌트가 활성화되면 Powerlevel10k~해야 한다외부 편집기에서 명령 편집을 마친 후 프롬프트가 잘립니다. 그러나 그렇지 않습니다. 지금 막 나는수리하다신고해 주셔서 감사합니다.

이제 원래 질문으로 돌아갑니다.

내가 원하는 것은 최종 결과이다.바꾸다오리지널 라인.

이를 위해서는 사용자 정의 zle 위젯을 정의해야 합니다. 구현은 다음과 같습니다.

function edit-command-line-inplace() {
  if [[ $CONTEXT != start ]]; then
    if (( ! ${+widgets[edit-command-line]} )); then
      autoload -Uz edit-command-line
      zle -N edit-command-line
    fi
    zle edit-command-line
    return
  fi
  () {
    emulate -L zsh -o nomultibyte
    local editor=("${(@Q)${(z)${VISUAL:-${EDITOR:-vi}}}}") 
    case $editor in
      (*vim*)
        "${(@)editor}" -c "normal! $(($#LBUFFER + 1))go" -- $1
      ;;
      (*emacs*)
        local lines=("${(@f)LBUFFER}") 
        "${(@)editor}" +${#lines}:$((${#lines[-1]} + 1)) $1
      ;;
      (*)
        "${(@)editor}" $1
      ;;
    esac
    BUFFER=$(<$1)
    CURSOR=$#BUFFER
  } =(<<<"$BUFFER") </dev/tty
}

다음과 같은 방법으로 바인딩할 수 있습니다 edit-command-line.

zle -N edit-command-line-inplace
bindkey -M vicmd v edit-command-line-inplace

이는 명령줄을 제자리에서 업데이트할 수 없는 경우 edit-command-line-inplace에 따라 달라집니다 . edit-command-line예를 들어 을 입력하고 echo 'first line을 클릭한 Enter다음 을 호출해 보십시오 edit-command-line-inplace. 명령의 첫 번째 줄은 업데이트할 수 없으므로 edit-command-line-inplace처럼 동작합니다 edit-command-line.

edit-command-line-inplace편집: 내가 게시한 첫 번째 버전은 nvim명령줄 편집을 위해 명시적으로 호출되었습니다. VISUAL환경 변수를 존중하도록 코드를 업데이트했습니다 EDITOR.

관련 정보