sao chép và dán zsh như emacs


10

Tôi đã nhận thấy rằng zsh có rất nhiều thứ tôi thấy trong emacs. Tôi có thể thực hiện lựa chọn với ctrl + dấu cách và chọn một vùng. Tôi có thể tạo các bản sao giống như trong emacs trong khi tôi ở trong zsh. Trong emacs tôi có thể sử dụng bảng tạm hệ thống của mình (trước đây có một số cấu hình bổ sung cần thiết nhưng giờ đây nó hoạt động tốt hơn trong emacs). Trong zsh tôi dường như không thể dán từ bảng ghi tạm của mình bằng Cy và sao chép từ zsh vào bảng điều khiển hệ thống của tôi có cùng một vấn đề. Có cách nào để giái quyết vấn đề này không?

Câu trả lời:


11

Zsh's có một bảng tạm tích hợp không giao tiếp với các ứng dụng khác. Vì nó rất có kịch bản, bạn có thể làm cho nó giao tiếp với một vài dòng trong của bạn ~/.zshrc. Bạn sẽ cần xclip hoặc xsel . Xem Dán từ bảng tạm sang zsh hoặc bash shell được kích hoạt để biết bằng chứng về khái niệm ở chế độ vi. Đây là mã tương ứng cho chế độ emacs (có thể bạn sẽ muốn làm một cái gì đó tương tự như các kill-*vật dụng khác ).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Điều này sử dụng bảng tạm X11 (thường được truy cập bằng Ctrl+ C/ Ctrl+ V); thay vào đó, loại bỏ -btùy chọn sử dụng lựa chọn chính X11 (sao chép tự động khi chọn và dán bằng nút chuột giữa).


Nếu bạn sử dụng vi chế độ, chỉ cần thay thế kill-regionvới vi-deleteyankvới vi-put-after, vv Tương tự quấn vi-yank, và những người khác. (Tôi chưa tìm được cách nào để tập trung hơn)
olejorgenb

4

Tôi đã muốn tích hợp bộ đệm cắt của Zsh với bảng tạm X. Tôi đã thử http://stchaz.free.fr/mouse.zsh đã nói ở trên nhưng tôi thấy tôi không thích tất cả các hoạt động Zsh của mình điền vào bảng tạm. Chẳng hạn, đôi khi tôi sẽ sao chép một cái gì đó trong trình duyệt, sau đó vào shell và chỉnh sửa dòng lệnh và sau đó dán. Nhưng thường chỉnh sửa dòng lệnh - ví dụ như xóa một từ - sửa đổi bộ đệm cắt Zsh. Dù tốt hay xấu, X chỉ có một bảng tạm, không phải vòng diệt, vì vậy khi thao tác chỉnh sửa Zsh ghi đè lên bảng tạm, điều tôi muốn dán bị mất - Tôi không thể bật nó (Cy My) như tôi có thể làm trong Zsh hoặc Emacs.

Vì vậy, những gì tôi đã làm thay vào đó là tạo ra các tổ hợp phím đặc biệt mới để tương tác với bảng tạm X qua zsh. Hóa ra "^ Xw" và "^ Xy" không được sử dụng trong cả Emacs và Zsh, vì vậy tôi có thể có được giao diện nhất quán bằng cách ràng buộc chúng trong cả hai ứng dụng. Bằng cách này, các hoạt động chỉnh sửa thông thường, cutbuffer và kill ring được để lại một mình. Nếu tôi muốn sao chép một cái gì đó vào bảng tạm, tôi đặt vùng và thực hiện "^ Xw" (hoặc nếu tôi đã giết nó và vùng đó không hoạt động, tôi chỉ có thể thực hiện "^ Xw" để sao chép bộ đệm đã cắt). Việc dán từ bảng tạm được thực hiện với "^ Xy".

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

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.