zle 위젯을 사용하여 전체 버퍼를 선택하는 방법은 무엇입니까?

zle 위젯을 사용하여 전체 버퍼를 선택하는 방법은 무엇입니까?

다음과 같은 zle 위젯이 있습니다.

_ctrl-a() {
  CURSOR=0
  if ((MARK == 0)); then
    zle set-mark-command
  fi

  if [ "$BUFFERLINES" -gt 1 ]; then
    zle end-of-buffer-or-history
  else
    zle end-of-line
  fi
}

zle -N _ctrl-a
bindkey '^A' _ctrl-a # Ctrl+A

전체 버퍼를 선택합니다. 내 말은 커서를 버퍼의 시작 부분에 놓고 마커를 시작한 다음 커서를 버퍼의 끝에 둔다는 것입니다.

여기에서 여러 줄 명령에 사용하는 위젯은 end-of-buffer-or-history이지만, 로 만들고 싶습니다 end-of-buffer.

그래서 저는 다음을 교체하고 싶습니다:

if [ "$BUFFERLINES" -gt 1 ]; then
  zle end-of-buffer-or-history
else
  zle end-of-line
fi

그리고

zle end-of-buffer

하지만 그렇지 않은 것 같습니다 end-of-buffer.

어떡해?

폴리스티렌변수를 사용하여 전체 버퍼를 선택할 수 있다면 좋은 학습 경험이 될 것입니다 MARK.

답변1

존재하다위젯 코드MARK, CURSOR, BUFFER등 의 변수를 읽을 수 있을 뿐만 아니라 수정할 수도 있습니다 .

커서를 버퍼 끝으로 이동하려면 다음을 수행하십시오.

CURSOR=$#BUFFER

마커가 시작에 있고 커서가 끝에 있는 전체 버퍼를 선택하려면 위젯을 호출할 필요가 없습니다. 적절한 변수를 설정하기만 하면 됩니다.

function _ctrl-a {
  MARK=0
  CURSOR=$#BUFFER
  REGION_ACTIVE=1
}

관련 정보