Fondamenti di cursori multipli


55

Di recente ho appreso multiple-cursorse sembra un pacchetto molto utile. Ho esaminato la documentazione sul repository originale , ma i comandi mi sembrano ancora un po 'oscuri.

Ho quindi guardato il video in Emacs Rocks !, e il video è fantastico, ma si concentra principalmente su ciò che multiple-cursorsè in grado di fare, piuttosto che su come farlo.

Esistono passaggi, esercitazioni o esempi che illustrano le sue funzionalità più basilari?


4
Sono stato in grado di mettermi in moto multiple-cursorsmolto velocemente leggendo il file README. La mia raccomandazione è di imparare mc/mark-next-like-this. Provalo e acquisisci familiarità con ciò che fa. Da lì fai riferimento al README ogni volta che hai una domanda che inizia con "Mi chiedo se più cursori possono fare ..." Detto questo, penso che un'introduzione più basilare di Emacs Rocks! il video sarebbe utile per i principianti.
nispio,

Completamente d'accordo! Assolutamente non chiaro come usarlo. Ho appena mascherato le linee e poi ho creato mc / edit-lines con KBD associato (non tramite Mx come notato su Github) Poi vedo più cursori ma scompaiono dopo ogni input di testo
Dima Fomin

Risposte:


19

Oltre agli usi descritti da @bastibe, utilizzo più cursori per aggiungere o rimuovere testo dall'inizio / fine di un gruppo di righe:

  1. Spostare il punto all'inizio o alla fine dell'area di interesse
  2. call set-rectangular-region-anchor(associato a qualsiasi tasto ti piaccia, penso che il suggerimento di Magnars fosse H-space, se hai un tasto ipertestuale )
  3. Sposta il punto in avanti o indietro per linea ( C-ne C-p) fino a quando non si trova un cursore su ogni linea che si desidera modificare
  4. Inserisci o elimina il testo in base alle esigenze, facoltativamente spostandoti alla fine della riga ( C-e) per apportare modifiche lì.

Puoi usare forward-word, forward sentenceecc. Per spostarti avanti e indietro lungo le righe, il che ti consente di modificare la quarta parola in ogni riga, anche se il testo su ciascuna riga non è identico.

Ad esempio, faccio sempre questo tipo di lavoro:

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

    Ciò inserisce i contens della directory pp5 nel buffer. Posiziono il punto !all'inizio dell'elenco:

!/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
  • Aggiungi i cursori a ogni riga con H-space, C-nx 4
  • duplicare ogni riga con 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
  • tagliare la prima sezione in nomi di variabili con 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
  • quindi avvolgere il nome file effettivo nella funzione per caricarlo: 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")

E voilà, hai convertito un elenco di file nel codice per leggerlo. In realtà è molto più difficile da descrivere che da fare davvero!


3
Se fai spesso la stessa cosa, puoi avvolgerla in una macro di tastiera. Tastiera macro e multiple-cursorspuò fare una combinazione davvero potente.
nispio,

@nispio d'accordo! A volte sto ripetendo lo stesso processo e una macro sarebbe utile. Spesso, tuttavia, ci sono piccole differenze nel mezzo del flusso di lavoro che richiedono lievi modifiche che "spezzerebbero" una macro.
Tyler,

1
Spesso puoi descrivere accuratamente la posizione in cui vuoi che il cursore salti usando una regexp. In tali casi, l'utilizzo phi-searchpuò essere più M-f (x3)
efficace

@nispio certo, dipende dalla situazione. Con nomi coerentemente strutturati è facile spostarsi a parole. Non avevo usato la ricerca in più cursori poiché i comandi di ricerca di emacs integrati sono fragili con mc. Non lo sapevo phi-search, sembra fantastico!
Tyler,

22

Fondamentalmente ho due casi d'uso frequente per multiple-cursors:

  • Sostituisci una stringa. Contrassegnare un'istanza di una stringa, quindi utilizzare mc/mark-next-like-thise mc/mark-previous-like-thisper contrassegnarne altre. Quindi premo immediatamente C-wper eliminare ogni istanza e scrivo invece una nuova stringa. Lo uso spesso per rinominare una variabile nel codice.
  • Modifica più luoghi contemporaneamente. O contrassegna diverse istanze di una stringa come prima, ma annulla immediatamente la selezione (ma non i cursori) utilizzando C-goppure posiziona il segno e il punto nella stessa colonna di linee diverse e utilizza mc/edit-linesper ottenere un cursore per riga. Ora puoi usare i normali comandi di modifica che operano su ognuno di questi cursori.

Il primo caso d'uso è particolarmente utile con expand-region. Mi sono er/expand-regionlegato a C-j, e mc/mark-next-like-thise mc/mark-previous-like-thisa C->e C-<. Con ciò, posso facilmente selezionare il punto in cui è attiva la parola e contrassegnare immediatamente la ricorrenza successiva / precedente di quella parola.

Il secondo caso d'uso ha sostituito per me la maggior parte degli usi delle macro. Invece di registrare una macro e quindi applicarla in più punti, posizionerei un cursore su ogni punto e farei l'operazione in tutti i punti contemporaneamente.


Grazie @bastibe. Eventuali associazioni particolari che tu o multiple-cursors consigli per, ad es. mark-next-like-this& mark-previous-like-this?
Amelio Vazquez-Reina,

@ user815423426 come indicato nel post, io uso C->e C-<per mark-next-like-thise mark-previous-like-this.
bastibe

perché non usare lo standard M-% per cercare e sostituire ?
Dima Fomin,

6

Vorrei aggiungere alcuni extra con cui a volte uso multiple-cursors.

Ho trovato utile quanto segue:

iy-go-to-char

A volte ti ritrovi a dover passare al successivo #o al successivo ,o ad alcuni delimitatori specifici. Ciò è particolarmente utile quando è necessario spostarsi tra diversi numeri di parole per ciascun cursore. Fornisce le funzioni iy-go-to-chare iy-go-to-char-backward, che è possibile associare e utilizzare bene.

expand-regione

Questo è davvero utile per ragioni simili a iy- quando ci sono linee leggermente diverse sotto ciascun cursore e potresti voler selezionare la stringa tra virgolette sotto il punto o simile.

roba personalizzata

Queste sono cose che sono semplicemente elisp nella mia configurazione, ma le trovo utili. Probabilmente non scritto da me.

Richiesta di input
Ho ricevuto questo da Magnars in risposta a una richiesta di inserire una stringa diversa sotto ciascun cursore. Il codice è semplice, ma associarlo a qualcosa e l'utilizzo per più cursori è un modo pratico per inserire elementi leggermente diversi in ogni posizione.

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

Incrementa il numero nel punto
Questo proviene da SO, o emacswiki. Non so quale. È abbastanza utile da solo, e anche se usato in combinazione conmc/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
Questo è super potente e consente alcuni bit 'n' pezzi davvero utili. Valuta qualunque sexp sia dietro il cursore e inserisce il risultato della valutazione.
Combinalo con multiple-cursors-numbersper esempio inserire potenze di due o una serie che 0 1 2 0 1 2 0 1 2attraversa ogni linea o qualcosa del genere. (Ho fatto entrambe queste cose utilmente) O usalo con s.elper scrivere quella noiosa configurazione Java con cose predefinite. Scrivi ciascuno CONFIG_VALUE_VARIABLE, quindi trasformalo CONFIG_VALUE_VARIABLE = "configValueVariable"eseguendolo s-camel-case.

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

iy-go-to-char è molto utile. Proprio quello che stavo cercando.
Heinrich Hartmann,

1
  1. Vai alla fine * di ciò che desideri selezionato.
  2. Premere C-S-bo M-S-bper selezionare all'indietro fino a quando non viene selezionata una parte. Puoi anche usare la freccia sinistra dello spostamento.
  3. Quindi premere C->(premere MAIUSC se il tasto si >trova sopra il tasto della tastiera) fino a quando non si seleziona più di un elemento.

* È importante selezionare all'indietro o la prima selezione posizionerà il cursore nella posizione errata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.