Podstawy wielu kursorów

55

Niedawno się o tym dowiedziałem multiple-cursorsi wygląda na bardzo przydatny pakiet. Przejrzałem dokumentację oryginalnego repozytorium , ale polecenia wciąż wydają mi się nieco niejasne.

Potem obejrzałem wideo w Emacs Rocks !, i jest świetne, ale skupia się głównie na tym, co multiple-cursorsjest w stanie zrobić, a nie na tym, jak to zrobić.

Czy są jakieś instrukcje, samouczki lub przykłady, które ilustrują jego najbardziej podstawową funkcjonalność?

Amelio Vazquez-Reina
źródło
4
Byłem w stanie multiple-cursorsbardzo szybko zacząć i czytać plik README. Moje zalecenie to po prostu nauczyć się mc/mark-next-like-this. Wypróbuj i zapoznaj się z tym, co robi. Stamtąd wracaj do README za każdym razem, gdy masz pytanie, które zaczyna się od: „Zastanawiam się, czy wielu kursorów może to zrobić ...” Wszystko to powiedziało, myślę, że to bardziej podstawowe wprowadzenie niż Skały Emacsa! wideo byłoby pomocne dla początkujących.
nispio
Kompletnie się zgadzam! Absolutnie niejasne, jak go używać. Właśnie zamaskowałem linie, potem wykonałem mc / edit-linie z powiązanym KBD (nie przez Mx, jak napisano na Githubie). Potem widzę wiele kursorów, ale one znikają po każdym wprowadzeniu tekstu
Dima Fomin

Odpowiedzi:

19

Oprócz opisów użycia @bastibe używam wielu kursorów, aby dodawać lub usuwać tekst z początku / końca grupy wierszy:

  1. Przesuń punkt na początek lub koniec interesującego nas obszaru
  2. połączenie set-rectangular-region-anchor(powiązane z dowolnym klawiszem, który lubisz, myślę, że sugestią Magnars było H-space, jeśli masz hiperklucz )
  3. Przesunięty punkt do przodu lub do tyłu o linię ( C-ni C-p), aż na każdej linii, którą chcesz edytować, znajduje się kursor
  4. W razie potrzeby wstaw lub usuń tekst, opcjonalnie przechodząc na koniec wiersza ( C-e), aby wprowadzić tam zmiany.

Możesz użyć forward-word, forward sentenceitp., Aby poruszać się w przód iw tył wzdłuż linii, co pozwala edytować czwarte słowo w każdym wierszu, nawet jeśli tekst w każdym wierszu nie jest identyczny.

Na przykład cały czas wykonuję ten rodzaj pracy:

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

    To wstawia zawartość katalogu pp5 do bufora. Umieszczam punkt !na początku aukcji:

!/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
  • Dodaj kursory do każdej linii za pomocą H-space, C-nx 4
  • powiel każdą linię za pomocą 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
  • przytnij pierwszą sekcję do nazw zmiennych za pomocą 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
  • następnie zawiń rzeczywistą nazwę pliku w funkcji, aby go załadować: read.file ( C-dC-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")

I voila, przekonwertowałeś listę plików na kod, aby odczytać tę listę. Jest to o wiele trudniejsze do opisania niż do zrobienia!

Tyler
źródło
3
Jeśli często robisz to samo, możesz zawinąć je w makro klawiatury. Makra klawiatury i multiple-cursorsmogą tworzyć naprawdę potężne kombinacje.
nispio
@nispio zgodził się! Czasami powtarzam ten sam proces i przydatne byłoby makro. Często jednak w środku przepływu pracy występują niewielkie różnice, które wymagają niewielkich zmian, które „złamałyby” makro.
Tyler
1
Często możesz dokładnie opisać lokalizację, do której ma przeskakiwać kursor, używając wyrażenia regularnego. W takich przypadkach używanie phi-searchmoże być bardziej niezawodne niż nawigowanie za pomocą poleceń takich jakM-f (x3)
nispio
@nispio jasne, to zależy od sytuacji. Dzięki konsekwentnie ustrukturyzowanym nazwom można łatwo przenosić słowo. Nie użyłem wyszukiwania w wielu kursorach, ponieważ wbudowane polecenia wyszukiwania emacs są łamliwe w mc. Nie wiedziałem o phi-searchtym, wygląda świetnie!
Tyler
22

Zasadniczo mam dwa częste przypadki użycia dla multiple-cursors:

  • Zamień ciąg znaków. Zaznacz jedno wystąpienie ciągu, a następnie użyj mc/mark-next-like-thisi, mc/mark-previous-like-thisaby zaznaczyć więcej wystąpień tego ciągu. Następnie natychmiast uderzyłem, C-waby usunąć każdą instancję i zamiast tego napisałem nowy ciąg. Często używam tego do zmiany nazwy zmiennej w kodzie.
  • Edytuj kilka miejsc jednocześnie. Albo zaznacz kilka wystąpień łańcucha, jak poprzednio, ale anuluj zaznaczenie (ale nie kursory) natychmiast, używając C-g, lub umieść znak i wskaż tę samą kolumnę różnych linii i użyj, mc/edit-linesaby uzyskać jeden kursor na linię. Teraz możesz używać regularnych poleceń edycji, które działają na każdym z tych kursorów.

Pierwszy przypadek użycia jest szczególnie przydatny w przypadku expand-region. Mam er/expand-regionzwiązany C-j, a mc/mark-next-like-thisi mc/mark-previous-like-thisdo C->a C-<. Dzięki temu mogę łatwo wybrać słowo punkt jest włączone i natychmiast zaznaczyć następne / poprzednie wystąpienie tego słowa.

Drugi przypadek użycia zastąpił dla mnie większość zastosowań makr. Zamiast rejestrować makro, a następnie stosować je w kilku miejscach, umieściłem kursor w każdym miejscu i po prostu wykonam operację we wszystkich miejscach jednocześnie.

bastibe
źródło
Dzięki @bastibe. Jakieś szczególne wiązania, które Ty lub multiple-cursors polecasz dla np. mark-next-like-this& mark-previous-like-this?
Amelio Vazquez-Reina
@ user815423426 zgodnie z opisem w poście, używam C->i C-<dla mark-next-like-thisi mark-previous-like-this.
bastibe
dlaczego nie użyć standardowego M-% do wyszukiwania i zamiany ?
Dima Fomin,
6

Chciałbym dodać dodatki, których czasem używam multiple-cursors.

Przydatne okazały się:

iy-go-to-char

Czasami musisz przejść do następnego, #następnego ,lub określonego ogranicznika. Jest to szczególnie przydatne, gdy trzeba przewijać różne liczby słów dla każdego kursora. Zapewnia funkcje iy-go-to-chari iy-go-to-char-backward, które można ładnie powiązać i używać.

rozwiń region

Jest to bardzo przydatne z podobnych powodów iy- gdy masz nieco inne linie pod każdym kursorem i być może chcesz wybrać cytowany ciąg pod punktem lub podobnie.

niestandardowe rzeczy

Są to rzeczy, które są po prostu elisp w mojej konfiguracji, ale uważam je za przydatne. Prawdopodobnie nie napisane przeze mnie.

Pytaj o dane wejściowe
Dostałem ten od Magnars w odpowiedzi na prośbę o umieszczenie innego ciągu pod każdym kursorem. Kod jest prosty, ale powiązanie go z czymś i użycie wielu kursorów to wygodny sposób na wstawienie nieco innych rzeczy w każdym miejscu.

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

Numer przyrostowy w punkcie
Pochodzi z SO lub emacswiki. Nie jestem pewien który. Jest to całkiem przydatne samo w sobie, a także w połączeniu zmc/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
To jest super mocne i umożliwia kilka naprawdę użytecznych bitów i kawałków. Ocenia jakąkolwiek płeć za kursorem i wstawia wynik jej oceny.
Połącz to z, multiple-cursors-numbersaby np. Wstawić potęgę dwóch lub szeregu, który przechodzi 0 1 2 0 1 2 0 1 2przez każdą linię lub coś. (Zrobiłem oba te pożytecznie) Lub użyj go, s.elaby zapisać tę żmudną konfigurację Java z domyślnymi rzeczami. Zapisujesz każdy CONFIG_VALUE_VARIABLE, a następnie przekształcasz CONFIG_VALUE_VARIABLE = "configValueVariable"go, uruchamiając s-camel-case.

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))
Kałamarnica
źródło
iy-go-to-char jest bardzo pomocny. Właśnie tego szukałem.
Heinrich Hartmann
1
  1. Idź na koniec * tego, co chcesz wybrać.
  2. Naciśnij C-S-blub, M-S-baby wybrać do tyłu, dopóki nie zostanie wybrany fragment. Możesz także użyć strzałki w lewo Shift.
  3. Następnie naciśnij C->(naciśnij klawisz Shift, jeśli klawisz >znajduje się nad klawiszem klawiatury), dopóki nie zostanie wybrany więcej niż jeden element.

* Ważne jest, aby wybrać do tyłu, w przeciwnym razie pierwszy wybór umieści kursor w niewłaściwej pozycji.

morishi
źródło