복사 및 붙여넣기를 위해 vi 모드 bash 버퍼를 구성하는 방법은 무엇입니까?

복사 및 붙여넣기를 위해 vi 모드 bash 버퍼를 구성하는 방법은 무엇입니까?

전체적으로 : 풀(복사) 및 붙여넣기에 어떤 버퍼를 사용하도록 vi-mode bash를 구성하는 방법을 아는 사람이 있습니까?

긴 버전: 내가 이 라이브러리를 사용하는 프로그램 set editing-mode vi( 예: bash)은 vi와 유사한 키 바인딩을 사용합니다. 이와 관련 없이 시스템 클립보드를 사용하여 가져오기 및 붙여넣기를 사용하도록 vim 및 tmux를 설정했습니다..inputrcreadlineBash에서도 같은 작업을 수행하고 싶습니다.. 나는 주로 tmux를 통해 bash를 사용하기 때문에 불필요해 보이지만, 그럼에도 불구하고 (tmux 접두사를 사용하여) 유사한 것 p대신 클립보드에서 복사(일반 모드에서)를 사용할 수 있다면 좋을 것입니다 . C-a P그러나 이를 위해 bash를 구성하는 방법이나 bash가 끌어서 붙여넣기 위해 기본적으로 사용하는 버퍼에 대한 정보를 찾을 수 없습니다. vim 에서 실행할 때 해당 항목이 표시되지 않으므로 :registersvim이 표시하는 레지스터가 아닌 것 같습니다.

답변1

몇 가지 연구 결과에 따르면 bash는 이를 위해 기본 시스템 버퍼가 아닌 내부 변수를 사용하는 것으로 보입니다. bash 및 readline의 수동 항목에서는 "kill loop"라고 하며, 해당 구현을 읽을 수 있습니다.GitHub에서, 그리고 다른 곳. 어쩌면 시스템 클립보드를 사용하기 위해 이 메커니즘을 하이재킹하는 것이 가능할 수도 있지만, 지금으로서는 알아내기에는 너무 복잡해 보입니다.

bind대신 bash 매뉴얼 페이지(search bind \[) 에 설명되어 있는 bash 내장 명령을 사용하여 아래의 간단한 해결 방법을 선택했습니다 . 내 사용 사례는 꽤 잘 다루지만 vim 작업을 사용하여 고급 종료 및 잡아당기기를 다루지는 않습니다. 내 솔루션에서 문제를 발견하면 bash 스크립트 작성에 익숙하지 않으므로 알려 주시기 바랍니다.

~/.bashrc에서:

# Macros to enable yanking, killing and putting to and from the system clipboard in vi-mode. Only supports yanking and killing the whole line.
paste_from_clipboard () {
  local shift=$1

  local head=${READLINE_LINE:0:READLINE_POINT+shift}
  local tail=${READLINE_LINE:READLINE_POINT+shift}

  local paste=$(xclip -out -selection clipboard)
  local paste_len=${#paste}

  READLINE_LINE=${head}${paste}${tail}
  # Place caret before last char of paste (as in vi)
  let READLINE_POINT+=$paste_len+$shift-1
}

yank_line_to_clipboard () {
  echo $READLINE_LINE | xclip -in -selection clipboard
}

kill_line_to_clipboard () {
  yank_line_to_clipboard
  READLINE_LINE=""
}

bind -m vi-command -x '"P": paste_from_clipboard 0'
bind -m vi-command -x '"p": paste_from_clipboard 1'
bind -m vi-command -x '"yy": yank_line_to_clipboard'
bind -m vi-command -x '"dd": kill_line_to_clipboard'

편집 1: 두 번 연속 키를 누르는 바인딩 "yy" 및 "dd"는 keyseq-timeoutreadline 설정의 영향을 받습니다. 기본값은 500밀리초입니다. 이는 첫 번째 문자 이후 500밀리초 이내에 두 번째 문자를 입력해야 함을 의미합니다. 따라서 훨씬 낮은 값으로 설정하면 keyseq-timeout문제가 발생할 수 있습니다.

편집 2: vim 동작을 보다 정확하게 시뮬레이션하기 위해 붙여넣기를 업데이트했습니다.

관련 정보