Çoklu İmleçlerin Temelleri


55

Geçenlerde öğrendim multiple-cursorsve çok kullanışlı bir paket gibi görünüyor. Orijinal repo ile ilgili belgelere baktım , ancak komutlar hala biraz belirsiz görünüyor.

Daha sonra videoyu Emacs Rocks! 'Ta izledim, ve video harika, ama çoğunlukla nasıl yapılacağına multiple-cursorsdeğil , ne yapabileceğine odaklanıyor .

En temel işlevselliğini gösteren herhangi bir örnek, öğretici veya örnek var mı?


4
multiple-cursorsSadece README dosyasını okuyarak çok hızlı bir şekilde çalışmaya başladım . Benim tavsiyem sadece öğrenmek mc/mark-next-like-this. Deneyin ve ne yaptığını öğrenin. Oradan, "Birden fazla imleç yapıp yapamayacağını merak ediyorum ..." ile başlayan bir sorunuz olduğunda README'ye geri dönün. Bunların hepsi Emacs Rocks'tan daha temel bir giriş olduğunu düşünüyorum. Video yeni başlayanlar için yararlı olacaktır.
nispio

Tamamen katılıyorum! Kesinlikle nasıl kullanılacağı belli değil. Sadece satırları maskeliyim ve sonra KBD ciltli mc / edit-satırı yapıyorum (Github'da belirtildiği gibi Mx üzerinden değil) Sonra Birden fazla imleç görüyorum ama herhangi bir metin girişinden sonra kayboluyorlar
Dima Fomin

Yanıtlar:


19

@Bastibe 'nın tarif ettiği kullanımlara ek olarak, bir satır grubunun başlangıcından / sonundan metin eklemek veya kaldırmak için çoklu imleç kullanıyorum:

  1. Noktayı ilgi alanının başlangıcına veya sonuna götür
  2. çağrı set-rectangular-region-anchor(ne tür bir tuşa bağlı olursanız olun, sanırım H-spacebir hiper tuşa sahipseniz, Magnars'ın önerisiydi )
  3. Düzenlemek istediğiniz her satırda bir imleç bulunana kadar noktayı satır ( C-nve C-p) ile ileri veya geri hareket ettirin
  4. Gerektiği gibi metni ekleyin veya silin, isteğe bağlı olarak satırın sonuna ( C-e) gidin ve burada değişiklik yapın.

Her satırdaki metin aynı olmasa bile, her satırdaki dördüncü sözcüğü düzenlemenizi sağlayan satırlar boyunca ileri ve geri gitmek için forward-word, forward sentencevb. Kullanabilirsiniz .

Örnek olarak, bu tür işleri her zaman yapıyorum:

  • C-u M-!ls / test veri / p5 / fsa *RETURN

    Bu, pp5 dizininin içeriğini arabelleğe ekler. !Listenin başında noktayı yerleştiririm :

!/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
  • Her satıra imleçlerini ekleyin H-space, C-nx 4
  • her satırı çoğalt 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
  • ilk bölümü M-dx 3 C-d C-fx3 M-dx3 ile değişken isimlerine dönüştürün <-

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
  • daha sonra asıl dosya adını fonksiyona yükleyin: 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")

Ve işte, o listeyi okumak için bir dosya listesini koda dönüştürdünüz. Tarif etmek aslında yapmaktan daha zor!


3
Aynı şeyi sık sık yaparsanız, bir klavye makrosuna sarabilirsiniz. Klavye makrolarını ve multiple-cursorsgerçekten güçlü bir kombinasyon oluşturabilir.
nispio

@ nispio kabul etti! Bazen aynı işlemi tekrarlıyorum ve bir makro yararlı olacaktır. Çoğunlukla, yine de, iş akışının ortasında, bir makroyu 'kıracak' küçük değişiklikler gerektiren küçük farklılıklar vardır.
Tyler

1
İmlecin bir regexp kullanarak atlama yapmasını istediğiniz konumu sıklıkla doğru bir şekilde tanımlayabilirsiniz. Bu gibi durumlarda, 18phi-searchM-f (x3)
29'da

@nispio elbette, duruma göre değişir. Tutarlı bir şekilde yapılandırılmış isimlerle kelimelere göre hareket etmek kolaydır. Dahili emacs arama komutları mc ile kırılgan olduğundan, çoklu imleçlerde arama yapmamıştım. Bilmiyordum phi-search, harika görünüyor!
Tyler

22

Temelde bunun için iki sık kullanım durumum var multiple-cursors:

  • Bazı dizeleri değiştirin. Bir dizenin bir örneğini işaretleyin , ardından işaretini daha fazla işaretlemek için mc/mark-next-like-thisve mc/mark-previous-like-thistuşlarını kullanın . Sonra hemen C-wher örneği silmek için isabet ettim ve bunun yerine yeni bir dize yazdım . Bunu sıklıkla koddaki bir değişkeni yeniden adlandırmak için kullanırım.
  • Birkaç yeri aynı anda düzenleyin. Ya dize gibi birkaç dize örneğini işaretleyin, ancak derhal kullanarak seçimi (ancak imleçleri değil) hemen iptal edin C-gveya farklı satırların aynı sütununa işaret ve noktayı yerleştirin ve mc/edit-linessatır başına bir imleç elde etmek için kullanın . Artık bu imleçlerin her biri için geçerli düzenli düzenleme komutlarını kullanabilirsiniz.

İlk kullanım durumu özellikle yararlıdır expand-region. Ben var er/expand-regionbağlı C-jve mc/mark-next-like-thisve mc/mark-previous-like-thiskarşı C->ve C-<. Bununla, noktanın açık olduğunu kolayca seçebilir ve o kelimenin bir sonraki / önceki cildini anında işaretleyebilirim.

İkinci kullanım durumu, benim için çoğu makro kullanımını değiştirdi. Bir makro kaydetmek ve bunu birkaç yere uygulamak yerine, her yere bir imleç yerleştiririm ve işlemi aynı anda tüm yerlere yapardım.


Teşekkürler @bastibe. Sizin için veya multiple-cursors önerdiğiniz herhangi bir ciltleme, örneğin mark-next-like-this& mark-previous-like-this?
Amelio Vazquez-Reina

yazı de tarif edilen @, kullandığım user815423426 C->ve C-<için mark-next-like-thisve mark-previous-like-this.
bastibe

neden aramak ve değiştirmek için standart M-% kullanmıyorsunuz ?
Dima Fomin

6

Bazen kullandığım bazı ekstraları eklemek istiyorum multiple-cursors.

Aşağıdakileri yararlı buldum:

iy-go-to-Char

Bazen, bir sonraki #veya bir sonraki ,veya bazı belirli sınırlayıcılara geçme ihtiyacı hissedersiniz. Bu, her imleç için farklı kelimeler arasında hareket etmeniz gerektiğinde özellikle kullanışlıdır. Bu işlevleri sağlar iy-go-to-charve iy-go-to-char-backwardsize bağlamak ve güzel kullanabilirsiniz.

genişletmek bölge

Bu, benzer sebeplerden ötürü gerçekten yararlıdır iy- her imlecin altında biraz farklı çizgiler olduğunda ve belki noktanın altına veya altına benzer bir alıntı yapmak isteyebilirsiniz.

özel şeyler

Bunlar benim konfigürasyonumda sadece elisp olan şeyler, fakat yararlı buluyorum. Muhtemelen benim tarafımdan yazılmadı.

Giriş istemi
Bunu, her imlecin altına farklı bir dizge koyma talebine yanıt olarak Magnars'tan aldım. Kod basittir, ancak bir şeye bağlamak ve çoklu imleçler için kullanmak, her yere biraz farklı şeyler eklemek için kullanışlı bir yoldur.

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


Noktadaki artış sayısı Bu ya SO'dan geldi ya da emacswiki. Hangisi olduğundan emin değil. Kendi başına ve ayrıca birlikte kullanıldığında oldukça kullanışlıdır.mc/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-change
Bu süper güçlü ve bazı gerçekten yararlı bit 'n' parçalarını mümkün kılıyor. Seksip'in arkasında ne olursa olsun, değerlendirilir ve değerlendirilmesinin sonucunu ekler. Örneğin, her iki hatta veya başka bir şeyden geçen bir dizi iktidar eklemek veya bir dizi
ile birleştirin . (Bunların her ikisini de faydalı bir şekilde yaptım) Veya bu sıkıcı java config'u varsayılan şeylerle yazmak için kullanın . Her birini yazıyorsun , sonra koşarak onu dönüştür .multiple-cursors-numbers0 1 2 0 1 2 0 1 2s.elCONFIG_VALUE_VARIABLECONFIG_VALUE_VARIABLE = "configValueVariable"s-camel-case

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))

iy-to-char süper yardımcı olur. Tam da aradığım şey.
Heinrich Hartmann

1
  1. Seçmek istediğiniz şeyin sonuna * gidin.
  2. Seçili kısmı alana kadar geri seçmek için C-S-bveya düğmesine basın M-S-b. Sol kaydırma ok tuşunu da kullanabilirsiniz.
  3. Ardından , birden fazla öğe seçilinceye kadar C->tuşuna basın (tuş >klavyenizin tepesindeyse shift tuşuna basın ).

* Geriye doğru seçim yapmak önemlidir, aksi halde ilk seçim imleci yanlış pozisyona getirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.