Cara menyalin kotak terbunuh ke cincin bunuh

11

Saya sering mengekstrak persegi panjang teks dari buffer, tetapi kemudian menemukan saya ingin menarik teks seolah-olah itu bukan persegi panjang. Apakah ada cara untuk menambahkan persegi panjang yang terbunuh saat ini ke cincin bunuh?

The GNU Emacs Pedoman telah mengatakan ini:

"Membunuh" persegi panjang tidak membunuh dalam arti biasa; persegi panjang tidak disimpan di cincin bunuh, tetapi di tempat khusus yang hanya mencatat persegi panjang terakhir yang terbunuh. Ini karena menarik persegi panjang sangat berbeda dari menarik teks linear sehingga perintah yank yang berbeda harus digunakan. Yap-popping tidak didefinisikan untuk persegi panjang.

Namun, pada dasarnya saya bisa mendapatkan perilaku yang saya inginkan

  • M-> pergi ke akhir buffer
  • C-x r y menyentak persegi panjang
  • C-x C-x titik dan tanda tukar (pilih jalur yang baru diseret)
  • C-w bunuh seleksi ke ring bunuh

Apakah ada cara yang lebih baik untuk mengubah persegi panjang yang terbunuh menjadi entri cincin bunuh?

nispio
sumber
Solusi yang ditautkan bukan apa yang Anda minta, tetapi itu menarik persegi panjang seperti yang Anda inginkan: emacs.stackexchange.com/a/46352/15749
jue

Jawaban:

6

Jika saya memahami pertanyaan Anda, Anda mencari sesuatu seperti ini:

(defun youngfrog/copy-rectangle-to-kill-ring (start end)
  "Saves a rectangle to the normal kill ring. Not suitable for yank-rectangle."
  (interactive "r")
  (let ((lines (extract-rectangle start end)))
    (with-temp-buffer
      (while lines ;; insert-rectangle, but without the unneeded stuff
        ;; (most importantly no push-mark)
        (insert-for-yank (car lines))
        (insert "\n")
        (setq lines (cdr lines)))
      (kill-ring-save (point-min) (point-max)))))

Atas perkenan ErgoEmacs

Nsukami _
sumber
3

Tidak yakin apa yang istimewa tentang memiliki persegi panjang di kill-ring, tetapi jika Anda meningkatkan ke Emacs-24.4, maka Anda dapat melakukan: C-x SPC .... M-wuntuk memilih persegi panjang dan meletakkannya di kill-ring. Setelah itu C-yakan menarik persegi panjang itu (sama seperti itu C-x r y, tho).

Stefan
sumber
Ada dua hal tentang cincin pembunuhan yang "istimewa." Yang paling penting (bagi saya) adalah cara barang-barang dari cincin pembunuhan disentak. Sederhananya, yank menggeser teks yang ada ke bawah alih-alih menggesernya ke kanan. Menggunakan cincin bunuh juga memiliki manfaat tambahan untuk mempertahankan riwayat teks yang terbunuh. Kedengarannya seperti 24.4 mungkin memberikan manfaat kedua tetapi bukan yang pertama.
nispio
Ah, memang, dalam hal itu perilaku baru 24,4 meningkatkan bagian tentang yang Anda tidak peduli.
Stefan
1

Saya awalnya terganggu oleh kurangnya solusi built-in untuk masalah ini, kemudian menyadari bahwa ada solusi built-in: kill-rectangle.

Katakanlah Anda memiliki teks seperti

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Tetapi ingin bagian 'B' dari teks di tempat lain, seperti antara baris C dan D ini:

CCCCC
CCC
DDDD
DD

Jika Anda menyalin persegi panjang B ( C-x r M-w) dan kemudian menempatkan titik pada 'D' pertama, lalu menarik kembali persegi panjang ( C-x r y), Anda berakhir dengan

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

di mana Anda benar-benar ingin

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Mungkin tampak wajar untuk menyalin persegi panjang 'B's dan mencabutnya ke lokasi baru, tetapi solusi yang lebih baik adalah dengan menyalin garis-garis' A dan 'B' dan dan mencabutnya secara keseluruhan antara 'C' dan ' Garis D.

Kemudian, tandai kotak yang berisi 'A's dan gunakan kill-rectangle( C-x r k) untuk mengakhiri dengan hasil yang diinginkan.

Colin Fraizer
sumber