Memilih teks tanpa memindahkan kursor

8

Saya ingin menumbuhkan pilihan tanpa memindahkan titik (kursor) dari lokasinya. Saya tahu saya selalu dapat menggunakan C-u C-spcuntuk pindah ke lokasi sebelumnya, tetapi saya ingin menghindari itu.

Lebih khusus lagi, saya ingin melakukan kedua operasi ini:

  • Pilih semua teks dalam buffer
  • Tambahkan baris / paragraf berikutnya ke seleksi secara bertahap

sambil menjaga kursor di tempatnya.

Apakah Emacs memiliki fungsi interaktif untuk ini? Apakah mereka terikat pada pintasan keyboard?

Amelio Vazquez-Reina
sumber
Anda selalu dapat kembali ke lokasi titik sebelumnya dengan C-u C-spc.
Malabarba
1
dapatkah Anda memberi tahu saya, apa kepentingan memilih teks tanpa memindahkan kursor?
Nsukami _

Jawaban:

12

Ada jawaban terpisah untuk setiap poin yang Anda cantumkan:

  1. Ikatan default emacs C-x hakan memilih seluruh buffer terlepas dari di mana kursor berada.

  2. Paket memperluas-wilayah akan membantu mencapai tujuan kedua secara bertahap memperluas seleksi. expand-regionpada akhirnya juga akan memilih seluruh buffer saat Anda terus memperluas wilayah. Lihatlah readme-nya di github untuk info lebih lanjut. Paket ini tersedia melalui MELPA.

Berikut adalah pengantar singkat untuk paket ini dari github-nya:

Perluas wilayah meningkatkan wilayah yang dipilih oleh unit semantik. Teruslah menekan tombol sampai ia memilih apa yang Anda inginkan.

Sebuah contoh:

 (setq alphabet-start "abc def") 

Dengan kursor di c, itu dimulai dengan menandai seluruh kata abc, kemudian memperluas ke isi dari kutipan abc def, kemudian ke seluruh kutipan "abc def", kemudian ke isi dari sexp setq abjad-mulai "abc def "dan akhirnya ke seluruh sexp.

Saya ingin menambahkan bahwa memodifikasi pemilihan wilayah dalam kedua kasus akan tetap memindahkan kursor.

Kaushal Modi
sumber
+1, tetapi perhatikan bahwa C-x htidak memindahkan kursor: ke ujung buffer dan kemudian ke awal buffer. Anda perlu C-u C-spcdua kali untuk kembali ke tempat Anda sebelumnya.
ShreevatsaR
9

Jika wilayah tumbuh maka kursor berubah posisi. Ini karena kursor selalu berada di salah satu ujung wilayah.

Jika Anda memilih semua teks buffer ( C-x hdan kemudian gunakan C-x C-xuntuk bertukar titik dan tandai, sehingga kursor berada di akhir teks), dan kemudian Anda mengetik beberapa teks lagi, maka Anda telah mencapai apa yang Anda inginkan: wilayah tersebut telah diperluas untuk memasukkan teks yang Anda ketikkan. (Ini mengasumsikan Anda tidak delete-selection-modedihidupkan.)

Wilayah juga telah dinonaktifkan, secara otomatis, sehingga teks wilayah tidak lagi disorot. Untuk mengaktifkan kembali wilayah, lakukan C-x C-x(yang dapat Anda ulangi, jika Anda ingin menjaga kursor di ujung penyangga.

Drew
sumber
4

Seperti disebutkan, expand-regionpaketnya bagus tapi saya juga merasa layak disebutkan easy-kill. Itu ditagih sebagai setetes pengganti kill-ring-saveyang mengubah M-w"salinan" normal menjadi perintah salin dinamis yang juga bertindak sebagai awalan untuk menyimpan berbagai hal. Sebagai contoh, M-wakan menyalin wilayah aktif, url, email atau baris saat ini (dalam urutan easy-kill-try-things) tetapi diikuti oleh "d" M-w ditu akan secara paksa menyalin pembelotan saat ini.

Ada juga metode memperluas / mengecilkan pilihan saat ini, agak seperti expand-region, serta perintah yang dipanggil easy-markuntuk menandai daerah tanpa mengubah titik Anda saat ini.

waymondo
sumber
1

Setelah menyalin sesuatu, Anda dapat menambahkan teks ke pilihan nanti dengan menggunakan C-M-w:

  • menyalin garis / wilayah
  • lakukan sesuatu yang lain
  • Anda ingin menambahkan sthg ke teks yang sebelumnya disalin: ketik C-M-w( append-next-kill) dan kemudian salin apa yang Anda inginkan ( M-w).
Ehvince
sumber
1

Sebagaimana dinyatakan dalam jawaban lain:

C-xh akan memilih seluruh buffer; (mark-whole-buffer)

Jika Anda ingin mengembangkan pilihan Anda, cara termudah adalah menggunakan mark-*perintah.

Sebagai contoh keybound:

C-M-SPC (mark-sexp)akan menandai sexp pada titik tersebut. Jika Anda mengulangi perintah, itu akan menambahkan sexp berikut ke seleksi. Kursor akan tetap pada posisi saat ini, atau pindah ke awal objek (paragraf / sexp) untuk memastikan itu sepenuhnya ditandai.

Jonathan Leech-Pepin
sumber
Prelude maps (mark-whole-buffer)ke <kbd> Cmd-a </kbd> di OSX untuk menjaga kesamaan dengan fungsionalitas OSX yang khas.
Aaron Lee
1

Jika Anda setuju menggunakan mouse, Anda dapat menggunakan pilihan kedua . Tekan Meta, lalu klik dan seret tombol kiri mouse ( M-drag-mouse-1). Ini tidak memindahkan intinya selama Anda hanya menyalin teks yang terlihat di layar. Anda dapat menyalin pilihan sekunder dengan M-mouse-3dan mencabutnya dengan M-mouse-2.

Terlepas dari pilihan kedua, Anda perlu memindahkan kursor untuk memilih teks yang berubah-ubah, karena kursor adalah salah satu ujung pilihan (yang lainnya adalah tanda).

Jika Anda ingin bekerja di buffer tanpa mempengaruhi titik, Anda dapat membuka buffer di jendela kedua ( C-x 2atauC-x 3 ). Setiap jendela memiliki poinnya sendiri. Setelah selesai memilih dan mengedit, tutup jendela ( C-x 0) dan kembali ke yang lain.

Untuk lebih fleksibel, Anda dapat mengkloning buffer saat ini. Jalankan M-x clone-indirect-buffer, atau C-x 4 cuntuk juga membuat jendela baru yang menunjukkan buffer itu. Klon memiliki teks yang sama dengan aslinya, tetapi memiliki tanda dan titik tersendiri.

Jika Anda telah membunuh beberapa teks, Anda dapat menambahkan lebih banyak teks dengan mengetikkan C-M-w( append-next-kill) dan kemudian menggunakan perintah kill. Misalnya, C-M-w C-ktambahkan ekor baris saat ini ke teks yang sudah ada di bagian depan cincin bunuh, dan hapus teks yang disalin. C-M-w M-wmenambahkan seleksi ke teks di bagian depan ring kill (berbeda dengan M-wyang mendorong teks yang dipilih sebagai entri baru pada ring kill).

Gilles 'SANGAT berhenti menjadi jahat'
sumber