Dán từ clipboard vào zsh hoặc bash shell được kích hoạt vi


15

Tôi muốn có thể dán từ bảng tạm hệ thống (hoặc chọn văn bản) vào dấu nhắc trình bao "vi giống như" của tôi bằng bàn phím. Tôi thường sử dụng zsh và đôi khi bash. Trong cả hai trường hợp, tôi có trình bao được thiết lập với hành vi giống vi ( bindkey -v/ set -o vi).

Trong vim, hành vi tôi đang tìm kiếm có sẵn với chuỗi khóa "+p. Chuỗi khóa đặc biệt này không hoạt động như mong đợi trong dấu nhắc trình bao kích hoạt vi. Có cách nào để kích hoạt tính năng này hoặc một hành vi tương tự, chỉ sử dụng bàn phím, trong khi vẫn còn các phím bấm giống như vi trong dấu nhắc vỏ zsh hoặc bash không?

-- biên tập --

Trường hợp sử dụng: Tôi thường điều hướng giữa Firefox với addon Pentadactyl , trình giả lập thiết bị đầu cuối và chính vim - sử dụng trình quản lý cửa sổ Xmonad với các phím tùy chỉnh để di chuyển. Tất cả ba chương trình đều có các phím bấm giống như vi, rất hiệu quả (đối với "bộ nhớ ngón tay"), do đó, đây sẽ là văn bản giao tiếp lý tưởng giữa chúng chỉ sử dụng cú pháp vim (hoặc một cú pháp rất giống nhau).

Câu trả lời:


9

Zsh không hỗ trợ bất cứ điều gì ngoại trừ các thanh ghi nội bộ và bash không hỗ trợ đăng ký theo như tôi biết. Bởi và lớn, shell hỗ trợ các lệnh vi, không phải lệnh vim.

Trong zsh, đây là một bằng chứng về khái niệm để truy cập lựa chọn X từ chế độ lệnh. Để sử dụng thực tế, bạn muốn giải thích những kỹ thuật này. Tôi sử dụng xselchương trình, bạn có thể sử dụng xclipthay thế; xem Cách sao chép từ một ví dụ vim sang một ví dụ khác bằng các thanh ghi . Bạn sẽ tìm thấy các tính năng tôi sử dụng trong hướng dẫn sử dụng zle .

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

Hàm vi-append-x-selectionchèn lựa chọn X hiện tại sau con trỏ (tương tự phoặc P). Hàm vi-yank-x-selectionsao chép văn bản bị giết hoặc bị giật lần cuối vào lựa chọn X. zle -Nkhai báo các hàm như các widget zle (tức là các lệnh phiên bản). bindkey -athiết lập các ràng buộc cho chế độ lệnh vi.


Điều này hoạt động hoàn hảo sau khi cài đặt xselvà sao chép mã được đề xuất của bạn với một sửa đổi nhỏ cho .zshrc của tôi (Tôi đã chọn '^ P' thay vì '^ X', ghi đè hành vi ban đầu của '^ P')
Dalker

4

Đây là một giải pháp cho zsh (chế độ vi) bao bọc các widget gốc để clipboard luôn được đồng bộ hóa

Thay thế xclipbằng công cụ clipboard ưa thích của bạn.

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

Điều này hoạt động như một nét duyên dáng trong xterm-termite.
Rotareti

3

Lựa chọn và bảng tạm là những thứ khác nhau trong X Window và IMHO "môi trường máy tính để bàn" có xu hướng làm cho vấn đề trở nên âm u hơn so với trước đây.

Liệu shift-insert có làm việc cho bạn không? Trên các ứng dụng X trần, nhất định sẽ dán lựa chọn khi thực hiện ràng buộc như vậy.


Lựa chọn và bảng tạm là khác nhau không thực sự phù hợp ở đây, một giải pháp hoạt động với cái này sẽ dễ dàng thích ứng với cái kia. Môi trường máy tính để bàn không thay đổi một điều; sự lây lan của chúng đã đi kèm với sự thay đổi trong sự cân bằng quyền lực khỏi sự lựa chọn và hướng tới bảng tạm.
Gilles 'SO- ngừng trở nên xấu xa'

shift-insert không hoạt động trong môi trường của tôi và chắc chắn sẽ rất tốt khi sử dụng khi ở một hệ thống khác. Tuy nhiên, tôi đang tìm kiếm một cái gì đó gần hơn với các phím bấm vim thực tế cho yank và / hoặc dán giữa các thiết bị đầu cuối, vim chính nó và các chương trình khác
Dalker

1

Giải pháp này hoạt động nếu bạn đã cài đặt oh-my-zshvà kích hoạt vi-mode plugin.

Gilles ' xselzlegiải pháp dựa trên không làm việc cho tôi. Tuy nhiên, vì tôi đã cấu hình vim để sử dụng bảng tạm hệ thống của mình theo mặc định ( set clipboard=unnamedplusin ~/.vimrc), tôi chỉ cần nhập vvào chế độ bình thường của thiết bị đầu cuối để mở lệnh hiện tại vimvà sau đó tôi có thể sao chép nó vào bảng tạm X bằng bất kỳ vimlệnh yank nào.


Làm thế nào điều này có liên quan đến ZSH? Bạn đang nói về việc nhúng :termcó sẵn trong các phiên bản mới của Neovim và Vim?
Doron Behar

@DoronBehar Nếu bạn đã bật chế độ vi trong zsh, bạn có thể nhập vở chế độ bình thường để chỉnh sửa lệnh hiện đang gõ bên trong vim thay vì tại dấu nhắc thiết bị đầu cuối.
joelostblom

Bạn nên đề cập đến thực tế là bạn đang nói về :termtính năng của Neovim và Vim trong câu trả lời của bạn, nếu không thì không rõ ràng gì cả.
Doron Behar

@DoronBehar Tôi không nói về :term. Tuy nhiên, tôi đã khám phá ra rằng chức năng mà tôi đang đề cập thực sự được cung cấp bởi oh-my-zsh. Tôi đã cập nhật câu trả lời cho phù hợp.
joelostblom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.