zsh salin dan tempel seperti emacs


10

Saya perhatikan bahwa zsh memiliki banyak hal yang saya lihat di emacs. Saya dapat membuat pilihan dengan ruang ctrl + dan memilih wilayah. Saya dapat membuat salinan seperti di emacs sementara saya tetap di dalam zsh. Di emacs saya dapat menggunakan clipboard sistem saya (sebelumnya dengan beberapa konfigurasi tambahan yang diperlukan tetapi ini bekerja di luar kotak sekarang di emacs). Di zsh saya tidak bisa menempel dari clipboard saya menggunakan Cy dan menyalin dari zsh ke cliipboard sistem saya memiliki masalah yang sama. Apakah ada jalan keluarnya?

Jawaban:


11

Zsh's memiliki clipboard bawaan yang tidak berkomunikasi dengan aplikasi lain. Karena sangat bisa skrip, Anda dapat membuatnya berkomunikasi dengan beberapa baris di ~/.zshrc. Anda membutuhkan xclip atau xsel . Lihat Menempel dari clipboard ke zsh atau bash shell yang diaktifkan untuk bukti konsep dalam mode vi. Berikut kode yang sesuai untuk mode emacs (Anda mungkin ingin melakukan sesuatu yang mirip dengan kill-*widget lain ).

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

Ini menggunakan papan klip X11 (biasanya diakses dengan Ctrl+ C/ Ctrl+ V); hapus -bopsi untuk menggunakan pemilihan utama X11 sebagai gantinya (salinan otomatis pada pilih, dan rekatkan dengan tombol tengah mouse).


Jika Anda menggunakan mode vi, cukup ganti kill-regiondengan vi-deletedan yankdengan vi-put-afterdll. Membungkus serupa vi-yank, dan lainnya. (Saya belum menemukan cara untuk melakukannya secara lebih terpusat)
olejorgenb

4

Saya ingin mengintegrasikan buffer cut Zsh dengan clipboard X. Saya mencoba http://stchaz.free.fr/mouse.zsh yang disebutkan di atas, tetapi saya merasa saya tidak suka memiliki semua operasi Zsh saya mengisi clipboard. Misalnya, kadang-kadang saya akan menyalin sesuatu di browser, dan kemudian pergi ke shell dan edit baris perintah dan kemudian tempel. Tetapi sering mengedit baris perintah - menghapus kata, misalnya - memodifikasi buffer cut Zsh. Baik atau buruk, X hanya memiliki clipboard, bukan ring kill, jadi ketika operasi pengeditan Zsh menimpa clipboard, hal yang ingin saya tempelkan hilang - saya tidak dapat mencabutnya (Cy My) semampu saya lakukan di Zsh atau Emacs.

Jadi yang saya lakukan adalah membuat keybindings khusus baru untuk berinteraksi dengan clipboard X melalui zsh. Ternyata "^ Xw" dan "^ Xy" tidak digunakan di Emacs dan Zsh, jadi saya bisa mendapatkan antarmuka yang konsisten dengan mengikatnya di kedua aplikasi. Dengan cara ini operasi pengeditan normal, cutbuffer, dan kill dibiarkan sendiri. Jika saya ingin menyalin sesuatu ke clipboard saya mengatur wilayah dan melakukan "^ Xw" (atau jika saya sudah membunuhnya dan wilayah tidak aktif saya bisa melakukan "^ Xw" untuk menyalin buffer cut). Menempel dari clipboard dilakukan dengan "^ 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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.