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ść?


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-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")

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


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.


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))))

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.