Misalkan saya sudah memilih beberapa teks dalam buffer saat ini. Apakah mungkin untuk memilih rangkaian teks lainnya, sambil tetap mempertahankan pilihan sebelumnya (dan seterusnya)?
Ditambahkan : Salah satu motivasi untuk fungsi ini adalah sebagai berikut: Asumsikan bahwa saya memiliki beberapa teks yang terlihat seperti ini:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Saya ingin menghapus beberapa paragraf (mis. 2, 4 dan 6) dan menyisipkannya sebelum paragraf 1.
multiple-cursors
dapat memberi Anda solusi.Jawaban:
Anda dapat menggunakan
append-next-kill
(terikatC-M-w
secara default) untuk mengakumulasi teks yang ingin Anda masukkan di atasparagraph 1
:Bunuh
paragraph 2
seperti biasa.Tandai
paragraph 4
dan tekanC-M-w
sebelum membunuhnya. Ulangi langkah ini untuk semua paragraf yang ingin Anda pindahkan sebelumnyaparagraph 1
.Setelah selesai, Anda dapat menarik teks akumulasi sebelumnya
paragraph 1
.sumber
Anda dapat menggunakan register yang dikombinasikan dengan cincin tanda. Dorong tanda saat ini dengan
C-<SPC> C-<SPC>
, pulihkan denganC-u C-<SPC>
, atau simpan dalam register, katakanb
, viaC-x r <SPC> b
, dan lompati kembali nantiC-x r j b
.Sekarang tandai wilayah lain.
C-u C-x r s a
akan menyalin wilayah yang ditandai untuk mendaftara
dan menghapus teks. Kemudian tandai wilayah berikutnya danC-u C-x r + a
akan menambahkan pilihan lain ke register itua
dan menghapusnya.Anda kemudian dapat memasukkan konten dengan
C-x r i a
.Lihat bagian "Menyimpan Teks di Register" pada manual Emacs.
sumber
Dukungan wilayah-persegi panjang baru di Emacs-24.4 sebenarnya memperkenalkan (sebagian besar) infrastruktur yang diperlukan untuk fungsi ini [setelah semua, wilayah persegi panjang adalah wilayah yang tidak bersebelahan].
Jadi, sekarang mungkin untuk mengimplementasikan paket "wilayah terpisah" yang hanya menyediakan fungsionalitas yang Anda minta.
Memang, banyak perintah Emacs masih belum diadaptasi untuk menggunakan infrastruktur baru (mis. Perintah seperti upcase-region, atau undo-in-region, query-replace, ...) dan karenanya belum bekerja dengan baik pada persegi panjang. (jadi mereka juga tidak akan bekerja dengan baik pada "wilayah terpisah"), tetapi ini adalah bug yang semestinya diperbaiki dari waktu ke waktu.
sumber
Instal browse-kill-ring.el
menyalin dan membunuh semua wilayah yang diminati.
Harus menunjukkan di mana penyisipan ulang harus dimulai.
M-x
browse-kill-ring
RET akan membuka buffer dan menempatkan kursor di dalamnya.Ketik nuntuk melakukan perjalanan.
RET akan ada masukkan chunk pada titik di buffer asli / lainnya.
sumber
Jika garis yang ingin Anda manipulasi dapat dibedakan melalui pencocokan regex, Anda dapat menggunakan mode-terjadi untuk melihatnya di jendela baru. Anda kemudian dapat menggunakan mode terjadi-edit untuk mengeditnya, dengan buffer asli mencerminkan perubahan yang Anda buat di buffer Occur.
Ini berfungsi sangat baik, misalnya, dalam kombinasi dengan mode multi-kursor : karena garis yang Anda pilih untuk muncul di buffer Occur ditampilkan secara berdekatan terlepas dari seberapa jauh mereka berada di buffer asli, Anda dapat menandai semuanya atau subset lalu aktifkan
mc/edit-lines
dan edit semuanya sekaligus. (Ya, saya tahu beberapa kursor dapat melakukan ini dengan sendirinyamc/mark-all-like-this
, tetapi senang memiliki opsi.)Operasi pengeditan lainnya yang akan lebih mudah dilakukan jika Anda hanya melihat baris yang ingin Anda kerjakan, seperti menyiapkan pencarian dan penggantian regex yang rumit, atau makro yang perlu dijalankan pada setiap baris buffer pada gilirannya, bisa juga dilakukan dengan cara ini.
sumber
Ini menanggapi pertanyaan umum Anda, tetapi tidak terutama untuk kasus penggunaan yang Anda sebutkan (memindahkan bit kode).
Emacs sekarang memiliki apa yang disebutnya wilayah yang tidak bersebelahan , yang merupakan jenis seleksi yang Anda tanyakan. Vanilla Emacs tidak menyediakan cara khusus untuk membuat wilayah yang tidak bersebelahan, kecuali jika itu adalah persegi panjang . Tapi perpustakaan Zona tidak.
Zona Perpustakaan memungkinkan Anda menentukan beberapa zona dalam buffer Anda. Sebuah daftar zona adalah daerah noncontiguous . Anda juga bisa menganggapnya sebagai beberapa wilayah, tergantung pada bagaimana Anda ingin menggunakannya. Anda dapat memiliki beberapa daftar zona yang ditentukan kapan saja, masing-masing ditugaskan ke variabel zona yang berbeda, dan Anda dapat beralih di antaranya.
Jika Anda juga menggunakan perpustakaan Bookmark + maka Anda dapat menyimpan daftar zona secara terus-menerus dan mengembalikannya di sesi Emacs nanti. Bookmark + juga memungkinkan Anda menetapkan tag sewenang-wenang ke bookmark. Ini berarti Anda dapat menandai daftar zona.
Zona-zona dalam daftar zona tertentu biasanya di buffer yang sama, tetapi mereka tidak perlu. Dalam hal ini, daftar zona lebih umum daripada wilayah yang tidak berdekatan. Ini juga lebih umum karena setiap zona dapat berisi informasi tambahan, selain hanya batas zona, dan dapat memiliki pengidentifikasi.
Ada beberapa cara untuk membuat zona. Salah satu yang paling mudah adalah dengan menggunakannya
C-x n a
: ia mendefinisikan zona dari wilayah aktif, dan menambahkannya ke set zona saat ini. (C-x n n
(narrow-to-region
) juga melakukan ini, selain penyempitan.)Ini adalah beberapa hal yang dapat Anda lakukan dengan satu set (daftar) zona:
facemenu+.el
.Lihat juga Narrow Indirect , yang memungkinkan Anda membuat buffer tidak langsung yang merupakan klon dari buffer yang diberikan dan yang dipersempit ke bagian yang berbeda.
sumber
Pilihan lain: Transposing paragraf
Demi kelengkapan, Anda dapat mencapai pemesanan ulang paragraf (berurutan) dengan wilayah yang ditandai dan
M-0 M-x transpose-paragraph
(argumen nol membuattra-par
swap paragraf di mana titik dan tanda berada, yaitu wilayah dimulai dan berakhir)!Ngomong-ngomong ini berfungsi untuk semua
transpose-.*
perintah (-words, -sexp, -sentences, ...) dan sangat berguna dalam banyak situasi.sumber
Cara lain adalah dengan menggunakan paket keberatan (saya penulis). Anda dapat menandai objek teks apa pun dengan
m
titik dipindahkan ke objek berikutnya dari tipe saat ini secara otomatis. Hapus tanda objek apa pun dengan menavigasi ke sana dan tekan m lagi. Berikut ini adalah contoh screencast (menunjukkan garis tanda tetapi berfungsi untuk objek lain seperti paragraf, defun ... juga):sumber
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
kemudianM-x package-install
.