Fundamental multi-kursor

55

Saya baru-baru ini belajar tentang multiple-cursors, dan sepertinya paket yang sangat berguna. Saya membaca dokumentasi pada repo asli , tetapi perintahnya masih terlihat agak tidak jelas bagi saya.

Saya kemudian menonton video di Emacs Rocks !, dan videonya bagus, tetapi sebagian besar berfokus pada apa multiple-cursorsyang mampu dilakukan, bukan pada bagaimana melakukannya.

Adakah walk-through, tutorial, atau contoh yang menggambarkan fungsi dasarnya?

Amelio Vazquez-Reina
sumber
4
Saya bisa bangun dan berjalan dengan multiple-cursorssangat cepat hanya dengan membaca file README. Rekomendasi saya adalah belajar saja mc/mark-next-like-this. Cobalah, dan kenali apa yang dilakukannya. Dari sana merujuk kembali ke README setiap kali Anda memiliki pertanyaan yang dimulai dengan "Saya ingin tahu apakah banyak kursor dapat melakukan ..." Semua itu mengatakan, saya pikir itu pengantar yang lebih mendasar daripada Emacs Rocks! video akan sangat membantu bagi pemula.
nispio
Setuju! Benar-benar tidak jelas cara menggunakannya. Saya baru saja menyamarkan baris kemudian melakukan mc / edit-baris dengan KBD diikat (tidak melalui MX sebagaimana dicatat pada Github) Lalu saya melihat beberapa kursor tetapi mereka hanya menghilang setelah input teks apa pun
Dima Fomin

Jawaban:

19

Selain penggunaan @bastibe menjelaskan, saya menggunakan beberapa kursor untuk menambah atau menghapus teks dari awal / akhir sekelompok baris:

  1. Pindahkan titik ke awal atau akhir bidang yang diminati
  2. panggilan set-rectangular-region-anchor(terikat pada tombol apa pun yang Anda suka, saya pikir saran dari Magnars adalah H-space, jika Anda memiliki kunci hiper)
  3. Pindah titik maju atau mundur dengan baris ( C-ndan C-p) sampai Anda memiliki kursor pada setiap baris yang ingin Anda edit
  4. Sisipkan atau hapus teks sesuai kebutuhan, secara opsional pindah ke akhir baris ( C-e) untuk membuat perubahan di sana.

Anda dapat menggunakan forward-word, forward sentencedll untuk bergerak bolak-balik di sepanjang baris, yang memungkinkan Anda untuk mengedit kata keempat di setiap baris, bahkan jika teks pada setiap baris tidak identik.

Sebagai contoh, saya melakukan pekerjaan semacam ini sepanjang waktu:

  • C-u M-!ls / test-dat / pp5 / * fsaRETURN

    Ini memasukkan isi direktori pp5 ke buffer. Saya menempatkan poin !pada awal daftar:

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa
/test-dat/pp5/QCJB-22-5_Frag#90.fsa
/test-dat/pp5/ONGL-1-5_Frag#102.fsa
/test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • Tambahkan kursor ke setiap baris dengan H-space, C-nx 4
  • duplikat setiap baris dengan C-k C-y space C-y C-a

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa /test-dat/pp5/ONAB-6-5_Frag#89.fsa
!/test-dat/pp5/QCJB-22-5_Frag#90.fsa /test-dat/pp5/QCJB-22-5_Frag#90.fsa
!/test-dat/pp5/ONGL-1-5_Frag#102.fsa /test-dat/pp5/ONGL-1-5_Frag#102.fsa
!/test-dat/pp5/ONGL-1-5_Frag#78.fsa /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • potong bagian pertama menjadi nama variabel dengan M-dx 3 C-d C-fx3 M-dx3 <-

ONAB-6-5 <-! /test-dat/pp5/ONAB-6-5_Frag#89.fsa
QCJB-22-5 <-! /test-dat/pp5/QCJB-22-5_Frag#90.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#102.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • kemudian bungkus nama file aktual dalam fungsi untuk memuatnya: read.file ( C-d" C-e")RETURN

ONAB-6-5 <- read.file("/test-dat/pp5/ONAB-6-5_Frag#89.fsa")
QCJB-22-5 <- read.file("/test-dat/pp5/QCJB-22-5_Frag#90.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#102.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#78.fsa")

Dan voila, Anda telah mengonversi daftar file ke dalam kode untuk membaca daftar itu. Sebenarnya jauh lebih sulit untuk digambarkan daripada benar-benar melakukannya!

Tyler
sumber
3
Jika Anda sering melakukan hal yang sama, Anda bisa membungkusnya dengan makro keyboard. Makro keyboard dan multiple-cursorsdapat membuat kombinasi yang sangat kuat.
nispio
@nispio setuju! Terkadang saya mengulangi proses yang sama dan makro akan berguna. Namun, seringkali ada perbedaan kecil di tengah alur kerja yang membutuhkan sedikit perubahan yang akan 'memecah' makro.
Tyler
1
Anda sering dapat secara akurat menggambarkan lokasi yang Anda inginkan agar kursor melompat menggunakan regexp. Dalam kasus seperti itu, menggunakan phi-searchbisa lebih kuat daripada menavigasi dengan perintah sepertiM-f (x3)
nispio
@nispio yakin, itu tergantung situasi. Dengan nama yang terstruktur secara konsisten, mudah untuk digerakkan oleh kata. Saya belum pernah menggunakan pencarian dalam banyak kursor karena perintah pencarian emacs bawaan rapuh dengan mc. Saya tidak tahu phi-search, itu terlihat hebat!
Tyler
22

Saya pada dasarnya memiliki dua kasus penggunaan yang sering untuk multiple-cursors:

  • Ganti beberapa string. Tandai satu instance string, lalu gunakan mc/mark-next-like-thisdan mc/mark-previous-like-thisuntuk menandai lebih banyak instance. Saya kemudian segera menekan C-wuntuk menghapus setiap contoh, dan menulis string baru sebagai gantinya. Saya sering menggunakan ini untuk mengubah nama variabel dalam kode.
  • Edit beberapa tempat secara bersamaan. Entah menandai beberapa contoh string seperti sebelumnya, tetapi membatalkan pemilihan (tetapi bukan kursor) segera menggunakan C-g, atau tempatkan tanda dan titik di kolom yang sama dari garis yang berbeda, dan gunakan mc/edit-linesuntuk mendapatkan satu kursor per baris. Anda sekarang dapat menggunakan perintah pengeditan reguler yang beroperasi pada setiap kursor ini.

Kasus penggunaan pertama sangat berguna dengan expand-region. Saya er/expand-regionterikat pada C-j, dan mc/mark-next-like-thisdan mc/mark-previous-like-thiske C->dan C-<. Dengan itu, saya dapat dengan mudah memilih titik kata aktif, dan menandai kemunculan kata berikutnya / sebelumnya secara instan.

Kasus penggunaan kedua menggantikan sebagian besar penggunaan makro untuk saya. Alih-alih merekam makro, dan kemudian menerapkannya di beberapa tempat, saya akan menempatkan kursor di setiap tempat, dan hanya melakukan operasi di semua tempat sekaligus.

bastibe
sumber
Terima kasih @bastibe. Adakah binding khusus yang Anda atau multiple-cursors rekomendasikan untuk eg mark-next-like-this& mark-previous-like-this?
Amelio Vazquez-Reina
@ user815423426 sebagaimana diuraikan dalam posting, saya menggunakan C->dan C-<untuk mark-next-like-thisdan mark-previous-like-this.
bastibe
mengapa tidak menggunakan standar M-% untuk mencari dan mengganti ?
Dima Fomin
6

Saya ingin menambahkan beberapa tambahan yang terkadang saya gunakan multiple-cursors.

Saya menemukan yang berikut ini berguna:

iy-go-to-char

Terkadang, Anda merasa perlu berpindah ke pembatas #berikutnya ,atau berikutnya atau tertentu. Ini sangat berguna ketika Anda perlu berpindah ke sejumlah kata yang berbeda untuk setiap kursor. Ini menyediakan fungsi iy-go-to-chardan iy-go-to-char-backward, yang dapat Anda ikat dan gunakan dengan baik.

memperluas wilayah

Ini sangat berguna untuk alasan yang mirip dengan iy- ketika Anda memiliki garis yang sedikit berbeda di bawah setiap kursor, dan Anda mungkin ingin memilih string yang dikutip di bawah titik atau serupa.

barang-barang khusus

Ini adalah hal-hal yang hanya perlu di konfigurasi saya, tetapi saya menemukan berguna. Mungkin tidak ditulis oleh saya.

Anjuran untuk input
Saya mendapatkan yang ini dari Magnars sebagai tanggapan atas permintaan untuk meletakkan string yang berbeda di bawah setiap kursor. Kode ini sederhana, tetapi mengikatnya dengan sesuatu dan menggunakan banyak kursor adalah cara praktis untuk memasukkan barang yang sedikit berbeda di setiap tempat.

(defun prompt-for-insert ()
  (interactive)
  (insert (read-string "Insert: ")))

Angka
kenaikan pada titik Ini berasal dari SO, atau emacswiki. Tidak yakin yang mana. Ini cukup berguna dengan sendirinya, dan juga ketika digunakan bersamamc/insert-numbers

(defun my-increment-number-decimal (&optional arg)
  "Increment the number forward from point by 'arg'."
  (interactive "p*")
  (save-excursion
    (save-match-data
      (let (inc-by field-width answer)
        (setq inc-by (if arg arg 1))
        (skip-chars-backward "0123456789")
        (when (re-search-forward "[0-9]+" nil t)
          (setq field-width (- (match-end 0) (match-beginning 0)))
          (setq answer (+ (string-to-number (match-string 0) 10) inc-by))
          (when (< answer 0)
            (setq answer (+ (expt 10 field-width) answer)))
          (replace-match (format (concat "%0" (int-to-string field-width) "d")
                                 answer)))))))

eval-and-replace
Ini sangat kuat, dan memungkinkan beberapa bit 'n' yang sangat berguna. Ini mengevaluasi apa pun sexp yang ada di belakang kursor, dan memasukkan hasil mengevaluasinya.
Gabungkan dengan multiple-cursors-numbersmisalnya menyisipkan kekuatan dua, atau seri yang 0 1 2 0 1 2 0 1 2melintasi setiap baris atau sesuatu. (Saya sudah melakukan keduanya ini dengan berguna) Atau menggunakannya s.eluntuk menuliskan konfigurasi java yang membosankan dengan hal-hal default. Anda menulis masing-masing CONFIG_VALUE_VARIABLE, kemudian mengubahnya menjadi CONFIG_VALUE_VARIABLE = "configValueVariable"dengan menjalankan s-camel-case.

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))
Squidly
sumber
iy-go-to-char sangat membantu. Apa yang saya cari.
Heinrich Hartmann
1
  1. Pergi ke akhir * dari apa yang ingin Anda pilih.
  2. Tekan C-S-batau M-S-buntuk memilih mundur hingga Anda mendapatkan bagian yang dipilih. Anda dapat menggunakan panah kiri bergeser juga.
  3. Kemudian tekan C->(tekan shift jika tombol >ada di atas tombol keyboard Anda) sampai Anda mendapatkan lebih dari satu item yang dipilih.

* Penting untuk memilih mundur atau pilihan pertama akan menempatkan kursor pada posisi yang salah.

morishi
sumber