클립보드에서 vi 지원 zsh 또는 bash 쉘에 붙여넣기

클립보드에서 vi 지원 zsh 또는 bash 쉘에 붙여넣기

키보드를 사용하여 시스템 클립보드(또는 텍스트 선택)에서 "vi와 같은" 쉘 프롬프트로 붙여넣을 수 있기를 원합니다. 나는 보통 zsh를 사용하고 때로는 bash를 사용합니다. 두 경우 모두 bindkey -vvi와 유사한 동작( / )으로 쉘을 설정했습니다 set -o vi.

vim에서 내가 찾고 있는 동작은 키 시퀀스를 통해 얻을 수 있습니다 "+p. 그러나 이 특정 키 시퀀스는 vi 지원 쉘 프롬프트에서 예상대로 작동하지 않습니다. zsh 또는 bash 쉘 프롬프트에서 vi와 유사한 키 바인딩을 유지하면서 키보드만 사용하여 이와 유사한 동작을 활성화할 수 있는 방법이 있습니까?

- 편집하다 -

사용 사례: 저는 종종 Firefox 사이를 탐색합니다.다섯 손가락 플러그인, 터미널 에뮬레이터 및 vim 자체 - 사용시모네이드창 관리자에는 제거 가능한 사용자 정의 키가 제공됩니다. 세 가지 프로그램 모두 vi와 유사한 키 바인딩을 갖고 있어 매우 효율적입니다("손가락 메모리"용). 따라서 vim 구문(또는 매우 유사한 구문)을 사용하여 이들 사이에 텍스트를 전달하는 것이 이상적입니다.

답변1

내가 아는 한, Zsh는 내부 레지스터 외에는 아무것도 지원하지 않으며, bash는 레지스터를 전혀 지원하지 않습니다. 일반적으로 쉘은 vi 명령을 지원하지만 vim 명령은 지원하지 않습니다.

zsh에서 다음은 명령 모드에서 X 선택 항목에 액세스하기 위한 개념 증명입니다. 실제로 사용하려면 이러한 기술에 대해 자세히 설명해야 합니다. 내가 사용하는 프로그램은 xsel여러분 xclip도 사용할 수 있습니다.레지스터를 사용하여 한 vim 인스턴스에서 다른 vim 인스턴스로 복사하는 방법. 내가 사용하는 기능을 찾을 수 있습니다링글 매뉴얼.

vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; }
zle -N vi-append-x-selection
bindkey -a '^X' vi-append-x-selection
vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; }
zle -N vi-yank-x-selection
bindkey -a '^Y' vi-yank-x-selection

이 함수는 vi-append-x-selection현재 X 선택을 커서 뒤에 삽입합니다( p또는 와 유사 P). 이 기능은 vi-yank-x-selection마지막으로 삭제되거나 가져온 텍스트를 X 선택 항목에 복사합니다. zle -N함수를 zle 위젯(예: 편집 명령)으로 선언합니다. bindkey -avi 명령 모드에 대한 바인딩을 설정합니다.

답변2

다음은 클립보드가 항상 동기화되도록 원본 위젯을 래핑하는 zsh(vi 모드)에 대한 솔루션입니다.

xclip즐겨 사용하는 클립보드 도구로 교체하세요 .

function x11-clip-wrap-widgets() {
    # NB: Assume we are the first wrapper and that we only wrap native widgets
    # See zsh-autosuggestions.zsh for a more generic and more robust wrapper
    local copy_or_paste=$1
    shift

    for widget in $@; do
        # Ugh, zsh doesn't have closures
        if [[ $copy_or_paste == "copy" ]]; then
            eval "
            function _x11-clip-wrapped-$widget() {
                zle .$widget
                xclip -in -selection clipboard <<<\$CUTBUFFER
            }
            "
        else
            eval "
            function _x11-clip-wrapped-$widget() {
                CUTBUFFER=\$(xclip -out -selection clipboard)
                zle .$widget
            }
            "
        fi

        zle -N $widget _x11-clip-wrapped-$widget
    done
}


local copy_widgets=(
    vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
)
local paste_widgets=(
    vi-put-{before,after}
)

# NB: can atm. only wrap native widgets
x11-clip-wrap-widgets copy $copy_widgets
x11-clip-wrap-widgets paste  $paste_widgets

답변3

ZSH 플러그인을 추천합니다:https://github.com/kutsan/zsh-system-clipboard. 도착하다설치하다그것은 작동한다:

git clone https://github.com/kutsan/zsh-system-clipboard ~/.zsh/plugins/zsh-system-clipboard

그런 다음 파일을 다음 위치에 소스로 제공합니다 .zshrc.

source "$HOME/.zsh/plugins/zsh-system-clipboard/zsh-system-clipboard.zsh"

이 플러그인은 다음을 지원합니다.Tmux 버퍼 사용클립보드가 저장된 위치를 찾아보세요.대체 키 바인딩 구성잘라내기/붙여넣기/복사 기능을 제공합니다.

플러그인이 이미 처리하고 있는 작은 세부 사항 중 하나는 시스템 클립보드 내용을 차별화하는 것입니다.예, 아니오새 줄(참조섭외). 클립보드 입력에 대한 이 작은 확인을 통해 모든 유형의 콘텐츠를 붙여넣는 경험이 Vim/Neovim에서와 동일하다는 것을 확인할 수 있습니다.

답변4

oh-my-zsh이 솔루션은 설치하고 활성화한 경우 작동합니다.vi-mode 끼워 넣다.

Giles xselzlegit 기반 솔루션은 나에게 적합하지 않았습니다. 그러나 기본적으로( Terminal Normal Mode set clipboard=unnamedplus에서 ~/.vimrc) 시스템 클립보드를 사용하도록 vim을 구성했기 때문에 v터미널 일반 모드에서 현재 명령을 입력하기만 하면 됩니다. vim그런 다음 yank 명령을 사용하여 X 클립보드에 복사할 수 있습니다. vim.

관련 정보