2012-04-30 10 views
5

Często potrzebuję wykonać kilka zapytań i zastąpić operacje z rzędu, ponieważ na przykład chcę zmienić wszystkie wystąpienia od 23 do 24 w linii, następnie od 24 do 25 w następnym wierszu i tak dalej (zazwyczaj dlatego, że piszę wyrażenie w linii, którą wielokrotnie szarpam w kolejnych wierszach i muszę nieco zmodyfikować) ...Jak dodać dynamiczny dotyk do makr emacsa i/lub zapytania zastępuje?

Makro z Cx q lub zwykłym zamienianiem wielu zapytań nie wydaje się wystarczająco silne w takich sytuacjach Czy istnieje coś bardziej ogólnego/elastycznego do obsługi zmiennych zastępstw lub zmienne wariacje makro takie jak to, które mogę sprawdzić? Wierzę, że kiedyś natknąłem się na przykład w Internecie, gdzie wyrażenia lisp zostały wprowadzone do niektórych poleceń, aby były potężniejsze, ale nie pamiętam tego ani gdzie czytam o tym ..

+5

Być może myślisz o tej stronie, która opisuje bardzo potężne funkcje wyszukiwania/zamiany: http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html – Tyler

+0

Tak , brzmi, jakbyś szukał wyrażeń eliznych w wyszukiwaniu/zamianie, opisanym w tym wpisie na blogu. Inną bardzo przydatną rzeczą do wypróbowania jest połączenie makr klawiaturowych i elipsy: utwórz makro, które zapisuje wyrażenie, a następnie je ocenia - bardzo przydatne dla liczników i innych. –

+0

Ach tak, to blog, który widziałem, świetny! Dzięki. –

Odpowiedz

6

Nie jestem pewien, czy to całkowicie odpowiada na twoje pytanie, ale odkryłem, że rejestry są użytecznym narzędziem do budowania potężnych makr. Najważniejsze funkcje to:

  • Cx rnnumber-to-register skopiować numer w punkcie do rejestru
  • Cx R + przyrostyincrement-register wartość zapisana w rejestrze
  • Cx riinsert-register wstawia wartość rejestru do bufora

Korzystanie z tych funkcji, można rozwiązać problem zastąpienie numerów zwiększając w każdej linii z:

  • nasion pierwszy numer w rejestrze z number-to-register
  • uruchomić makro definicję
  • wybrać linię
  • replace-string , insert-register, increment-register, insert-register
  • Przejście do początku następnego wiersza
  • koniec definicja makra

Nie ma więcej informacji na temat rejestrów w instrukcji emacs: https://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html

3

Jak również schludne zastosowania istniejących poleceń, takich jak ten pokazany przez ataylor, makra klawiaturowe mogą być wykorzystywane do wykonywania prawie dowolnie złożone i dynamiczne zachowania.

Na szczególną uwagę, CuM-: będzie wstawić do bieżącego bufora wynik jakiejkolwiek formie elisp ty Enter - postaci, która może oczywiście być wykonane jako część makra - tak nawet jeśli nie ma żadnego polecenia dla konkretnej operacji, jest mało prawdopodobne, aby nie można było używać makr do osiągnięcia swoich celów.

(i oczywiście jeśli elisp nie jest odpowiedzią, C-u M- i C-uM- |! daje łatwy dostęp do wyposażonej w wyjście polecenia powłoki, jak również.)

Oczywiście istnieją przypadki, w których bardziej ukierunkowane rozwiązanie jest dostępne, a makro ma więcej problemów niż jest warte (technika "szukaj i zamień na elispę", do której dołączają komentarze, jest również niesamowicie potężna, a często idealne rozwiązanie); Jednak makra z klawiaturą oferują niesamowitą ilość mocy przy niewiarygodnie małym wysiłku i mogą z łatwością wykonywać pewne czynności, które mogą być trudne do implementacji w inny sposób.

Jednym z moich ulubionych przykładów jest użycie "starych -> nowych" danych mapowania w jednym buforze (w praktycznie dowolnym formacie, jaki można sobie wyobrazić) i użycie go do wykonania wyszukiwania i zamiany tych wartości w innym buforze. Szybkość, z jaką możesz wykonywać tego typu czynności na zasadzie ad-hoc, z niczym więcej niż prostym ruchem i edytowaniem klawiszy jest niesamowita.

Edytor makr ułatwia również dostrojenie makra, jeśli nie jest poprawne za pierwszym razem, bez konieczności ponownego zapisywania wszystkich kroków.

Raz przeczytałem kilka użytecznych porad, które polegały po prostu na tym, aby zawsze zastanawiać się, czy można osiągnąć zadanie za pomocą makr z klawiaturą za każdym razem, gdy natknęło się na coś niebanalnego. Im częściej ich używasz, tym bardziej zdajesz sobie sprawę z różnych sposobów ich wykorzystania i wkrótce otrzymasz nowe niezbędne narzędzie w swojej skrzynce narzędziowej.

2

Sytuacja, o którą pytasz, brzmi jak idealne miejsce do korzystania z query-replace-regexp.

M-x query-replace-regexp 
Regexp: \([0-9]+\) 
Replace with: \,(+ 1 (string-to-number \1)) 

że użycie znajdzie wszystkie zestawy jedna lub więcej cyfr (Wyrażenia regularne Emacs nie obsługują \d) i zastąpić je z ich przyrostem, co skłoniło każdym razem.

Główne dania na wynos to:

  • złapanych grupy są ciągi, które można nazwać w operacji zastępczej
  • można zszyć dowolnego kodu do obsługi zastępczej z \,
  • można używać grup przechwyconych jako argumenty w dowolnym kodzie, który utworzymy w ten sposób:
1

Oto inne możliwe rozwiązanie określonego problemu, przy użyciu zamiennika i licznik makr klawiatury, który można wysiać za pomocą argumentu liczbowego prefiksu.

(nie powiem to lepiej, ale to pokazuje inną dostępną opcję.)

Więc zakładając 23 został numer początkowy, można zdefiniować następujące makro, zaczynając od:

C-2C-3F3

C-SPC  ;; set-mark-command 
C-e   ;; move-end-of-line 
<<replace-regexp>> ;; replace-regexp 
<f3>  ;; kmacro-start-macro-or-insert-counter 
C--   ;; negative-argument 
[email protected]   ;; mark-word 
M-w   ;; kill-ring-save 
RET   ;; indent-new-comment-line 
\   ;; self-insert-command 
,(1+  ;; self-insert-command * 4 
SPC   ;; self-insert-command 
C-y   ;; yank 
)   ;; self-insert-command 
RET   ;; indent-new-comment-line 

i F4, aby zatrzymać nagrywanie.

(n.b. To makro zakłada, że ​​każda linia w regionie zawiera wartość w sekwencji.)

wtedy podświetlić pozostałe linie i użyć C-XC-KR aktualizować wszystkie przewody w tym regionie.

Możesz ponownie ustawić makro licznik do dowolnej wartości z C-xC-kC-C aby ponownie odtworzyć makro nad innym regionie.

W zależności od tego, jak naprawdę wyglądają twoje dane, prawdopodobnie możesz znacznie uprościć to przez całkowite wyeliminowanie funkcji replace-regexp, a zamiast tego po prostu przenieść się tam, gdzie znasz numer, usuwając istniejący numer i wstawiając wartość licznika Na swoim miejscu.