Bagaimana caranya memilih kolom lalu mengedit di GNU Emacs?


15

Saya telah menggunakan ViM, TextMate, dan GNU Emacs selama bertahun-tahun.

Misalnya di sini adalah teks yang ingin saya edit

foo
foo
foo

Dan inilah hasil teks yang ingin saya miliki

bar foo
bar foo
bar foo

Ketika saya di Vim, saya bisa melakukan "Ctrl v" pada baris pertama dan kolom pertama, lalu tekan "2 j", lalu tekan "i", lalu ketik "bar", selesai.

Ketika saya menggunakan Textmate, saya dapat menekan "Apple Command Option" saat memilih ke bawah (dengan mouse saya), lalu ketik "bar", selesai.

Tetapi ketika saya menggunakan GNU Emacs 23.1, saya tidak tahu bagaimana melakukannya. : ((

Saya mencari EmacsWiki dan mencari-cari di sekitar tetapi tidak mendapatkan solusinya. Tolong tuntun saya jika Anda tahu solusi saya. Akan bersyukur untuk itu.


@ Thomas Jackson dan @ kopi sederhana, dipecahkan, terima kasih banyak !!
Arie

Jawaban:


16

Dua pilihan muncul di benak. Yang pertama adalah persegi panjang (sebagaimana disebutkan dalam jawaban lain). Arahan eksplisit untuk itu adalah:

  1. goto baris pertama, kolom pertama
  2. C-SPC
  3. goto baris terakhir (kolom pertama)
  4. C-x r t bar SPC RET

Pilihan lain, yang menyediakan perintah pengeditan segi empat / kolom yang sangat bagus adalah mode CUA . Berikut ini adalah posting blog (pengungkapan: blog saya) yang menjelaskan cara menggunakannya. Untuk melihat kekuatan mode CUA, sangat layak menonton video tiga menit ini .

Saya mengintegrasikan mode CUA dengan yang berikut ini (karena saya lebih suka untuk tidak memiliki mode tanda sementara):

(setq cua-enable-cua-keys nil)
(setq cua-highlight-region-shift-only t) ;; no transient mark mode
(setq cua-toggle-set-mark nil) ;; original set-mark behavior, i.e. no transient-mark-mode
(cua-mode)

11

Dalam Emacs-24.4, dukungan dasar untuk persegi panjang telah sedikit ditingkatkan, jadi daripada menggunakan C-SPC diikuti C-x r t, Anda dapat melakukan:

C-x SPC
down down
C-t bar RET

Salah satu hal yang menyenangkan tentang itu dibandingkan dengan C-SPCmetode ini adalah Anda akan mendapatkan umpan balik visual tentang persegi panjang yang Anda pilih. Tentu saja cua-modemetode ini juga berfungsi (dan bekerja dengan cara yang sama).


sayangnya, menurut saya perbaikannya tidak cukup sama sekali: cua-modesudah lebih tepat ... Hanya untuk menyebutkan satu hal: di cua-mode, sementara persegi panjang disorot, saya bisa mengetik dan menambahkan teks. Di "dukungan basis" emacs bawaan saat ini, sorotan menghilang (pemilihannya "dibatalkan") dan input dimasukkan pada titik kursor. Ini kontra-intuitif dan bukan yang biasanya saya inginkan (dan biasakan bagaimana cua-modemelakukannya)
ShinTakezou

@ ShinTakezou: saat Anda menemukan penghitung persegi panjang-tanda-mode intuitif, saya menemukan penghitung perilaku cua intuitif. Untungnya, Anda bisa memilih. Jika Anda lebih suka dukungan cua, Anda dapat mengaktifkan mode-cua atau (jika Anda hanya ingin dukungan persegi panjangnya) (global-set-key [?\C-x ?\s] 'cua-rectangle-mark-mode).
Stefan

sebenarnya adalah apa yang saya lakukan: tetap menggunakan mode-cua. Ini berfungsi seperti: sorot kolom, ketik teks, selesai. Kalau tidak: sorot kolom, katakan Anda ingin menambahkan teks, ketik teks dalam minibuffer (Anda tidak akan melihatnya muncul di buffer saat Anda mengetik ...), ... selesai. Anda akan melihat kemudian salah ketik di karakter terakhir ... dalam mode-cua, saya bisa melihatnya saat saya mengetik, hapus (jangan batalkan seluruh sisipan), pikirkan kembali, masukkan karakter lain ... dan persegi panjang tetap disorot seperti yang saya butuhkan, btw, dan saya bisa mengecilkannya, memperbesarnya, mengetikkan lebih banyak teks, atau "memotong" persegi panjang baru itu ... jadi, bagi saya itu lebih intuitif, dan nyaman.
ShinTakezou

Saya senang Anda menyukainya ;-)
Stefan

BTW, dalam Emacs-25, C-toperasi rectange non-CUA (alias C-x r t) juga menunjukkan kepada Anda pratinjau teks yang baru disisipkan saat Anda mengetiknya.
Stefan

2

Dalam emacs, jenis kolom ini disebut sebagai 'persegi panjang'. Jadi ini adalah halaman dokumentasi yang relevan.

Semua perintah ini mengharuskan wilayah tersebut berisi kotak yang Anda operasikan. Jadi, Anda perlu mengatur tanda di karakter kiri atas dalam persegi panjang dan memperluas wilayah ke karakter kanan bawah dalam persegi panjang. Perintah yang Anda cari adalah M-x string-insert-rectangleyang kemudian meminta Anda untuk memasukkan string.


1

Jawaban terpendek: Mengaktifkan mode persegi panjang CUA via C-RET.

Jadi, untuk kasus Anda, itu akan terjadi

  1. Pergi ke baris pertama, kolom pertama dan tekan C-RETuntuk masuk ke mode CUA
  2. Pergi ke baris terakhir, kolom pertama dan cukup ketik barSPC
  3. Keluar dari mode CUA via ESCatau CG

Lihat jawaban @Trey untuk solusi yang lebih rumit dan tautan ke CUA.


2
Ya, reputasi saya terlalu sedikit untuk dikomentari. Saya tidak ingin mengulangi jawabannya, tetapi saya akan menambahkan beberapa info lagi dari CUA doc.
Martin

0

Anda dapat menggunakan ganti-regexp untuk ini:

  1. setel tanda ke baris terakhir -> C SPC dan pergi ke baris terakhir
  2. ketik Mx replace-regexp RET di minibuffer (saya punya kunci pengikat untuk Tn ini)
  3. Berikan ^ RET
  4. ketik bar dan tekan RET

Ini akan menambahkan bilah ke awal baris.

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.