여러 줄 명령의 이전 줄로 이동

여러 줄 명령의 이전 줄로 이동

여러 줄 명령을 편집할 때 이스케이프된 줄 바꿈을 사용하면 줄을 위로 이동할 수 없습니다.

echo \예를 들어, 한 줄을 입력하고 을 누른 다음 해당 명령의 일부를 Enter편집하고 싶다고 가정해 보겠습니다 . echo \를 눌러도 Up첫 번째 명령줄로 돌아가지 않습니다.

이는 개행 문자를 래핑하는 긴 명령에는 작동하지만 개행 문자를 이스케이프하는 명령에는 작동하지 않습니다.

_physical_up_line()   { zle backward-char -n $COLUMNS }
_physical_down_line() { zle forward-char  -n $COLUMNS }
zle -N physical-up-line _physical_up_line
zle -N physical-down-line _physical_down_line
bindkey -M vicmd "R" physical-up-line
bindkey -M vicmd "N" physical-down-line

답변1

Enter( 명령)을 누르면 accept-line현재 행이 구문 분석되고 실행되도록 예약됩니다. 행의 구문이 불완전한 경우(예: echo \또는 for x in foo) 실행되지 않지만 이미 저장됩니다. PS2일반적인 프롬프트 대신 프롬프트가 표시되기 때문에 이 상태에서 zsh를 볼 수 있습니다 PS1.

내가 아는 한, 저장된 행을 편집할 수 있는 기본 제공 방법은 없습니다. 현재 라인을 실행하지 않고 저장하고, 편집을 위해 이전 히스토리 라인을 호출함으로써 가능해야 합니다.

이전 줄을 가져오는 가장 쉬운 방법은 현재 줄이 완료되지 않았는지 확인하고(예: \끝에 입력) 이를 수락(누르기 Enter)한 다음 취소( Ctrl+ 누르기 C)하는 것입니다. 그런 다음 를 눌러 저장된 전체 명령을 단일 히스토리 라인으로 단일 여러 라인 버퍼로 불러올 수 있습니다 Up.

답변2

기본 emacs 키 바인딩이 있다고 가정하고 일반 대신 Alt+를 사용하여 행 실행을 예약해 보세요. 저는 이런 식으로 선을 추가할 때 쉽게 선을 위아래로 이동할 수 있습니다. 예를 들어 zsh 터미널 프롬프트가 나타나면 다음과 같습니다.EnterEnter

% cat << EOF<ALT-ENTER>
first line<ALT-ENTER>
second line<ALT-ENTER>
thi
   ^ 
   pressing <UP> moves up a line like you would expect

답변3

중 하나Zsh 사용자 가이드줄 바꿈을 생성하려는 경우 Escape이전 줄을 더 이상 편집할 수 없는 다중 프롬프트(PS2)로 들어가는 것을 피하기 위해 팔로우를 누를 수 있다고 언급했습니다.Enter

이는 기본 emacs 키 바인딩에서만 작동합니다.

그러나 나는 the_velour_fog의 답변이 더 우아하기 때문에 허용되는 답변으로 표시되어야 한다는 것을 알았습니다!

답변4

ZSH: ctrl-g를 사용하여 커서를 프롬프트의 0행/위치 0으로 이동합니다(vi 모드/삽입 모드에서 테스트됨).

zsh-move-to-first-line() {
  local line_count=$(echo "$BUFFER" | wc -l)
  local current_line=1
  while [ "$current_line" -lt "$line_count" ]; do
    zle up-line-or-history
    current_line=$((current_line+1))
  done
  zle beginning-of-line
}

zle -N zsh-move-to-first-line
bindkey '^G' zsh-move-to-first-line

역:행 0의 위치 0부터 마지막 ​​행의 마지막 위치까지입니다. Ctrl-h를 사용하세요

zsh-move-to-last-line() {
  local line_count=$(echo "$BUFFER" | wc -l)
  local current_line=1
  while [ "$current_line" -lt "$line_count" ]; do
    zle down-line-or-history
    current_line=$((current_line+1))
  done
  zle end-of-line
}

zle -N zsh-move-to-last-line
bindkey '^H' zsh-move-to-last-line

출처: ChatGpt4

관련 정보