Chciałbym zmienić wszystkie wystąpienia ciągu (powiedzmy string1) na inny ciąg (powiedzmy string2) i odwrotnie. Mówiąc dokładniej, mam długi dokument i ciągi te występują wiele razy. To, co obecnie robię, to zamiana string1 -> string3, następnie string2 -> string1 i wreszcie string3 -> string2.
Zastanawiam się, czy w emacsie jest już funkcja, która to robi. Inne rozwiązania są mile widziane.
Edycja : W rzeczywistości jest to duplikat pytania połączonego w komentarzu. Problem polega jednak na tym, że zaakceptowana odpowiedź na to pytanie nie zawsze działa (patrz komentarz poniżej). Myślę, że lepiej poczekać, aż autor tej zaakceptowanej odpowiedzi poprawi swoją odpowiedź lub wyjdzie jakieś inne rozwiązanie. Po drugie, zanim opublikowałem moje pytanie, przeszukałem go i to pytanie się nie pojawiło. Wydaje mi się, że posiadanie dwóch zduplikowanych pytań jest czasem przydatne, ponieważ używają innego sformułowania, a jeśli użytkownik znajdzie duplikat, może znaleźć właściwe.
Edycja 2: Wydaje się, że akceptowana odpowiedź funkcji wyszukiwania / zamiany na zamianę tekstu jest teraz w porządku.
źródło
backwards
iregion-noncontiguous-p
) w wywołaniuperform-replace
sprawia, że tutaj działa (emacs 24.3). Przetestuję to na emacs 25, kiedy dostanę okazję przed edycją drugiej odpowiedzi.Odpowiedzi:
W przypadku interaktywnego przypadku zapytanie-zamień-regexp (CM-%) może to zrobić, używając względnie nieznanego \, do zamiany.
Jeśli tekst zastępujący zawiera \, a po nim wyrażenie lisp, użyje wartości tego wyrażenia jako zamiennika. W tym przypadku wyrażenie to „jeśli”, które przyjmuje warunek i wartość zwracaną dla przypadków prawdziwych i fałszywych.
W komentarzach sugeruje się użycie
Działa to, ponieważ \ 1 będzie „string1”, jeśli wzorzec pasuje do string1, w przeciwnym razie będzie zerowy. Lisp przyjmuje każdą wartość inną niż zero za prawdziwą. Chociaż to działa i jest krótsze, myślę, że moja odpowiedź jest bardziej przydatna. Myślę, że kod jest bardziej czytelny dla kogoś, kogo wiedza na temat seplenienia jest ograniczona. Ma drugą zaletę, ponieważ nadal działa, jeśli wzorzec „z” jest podany jako
lub nawet
źródło
\,(if \1 "string2" "string1")
, używając wyrażenia regularnego\(string1\)\|string2
.(emacs) Regexp Replace
.Cóż, może z makrem byłoby to łatwe:
F3C-s
a
RETC-bM-tF4. Użycie tego makra do twojego pytania krzyczy ten wynik:Transponuję pozycje między dowolnym słowem po tym
a
i tym słowem. Możesz później edytować takie makro, aby transponować również inne słowa, bez potrzeby ponownego definiowania całego makra, możesz edytować makro za pomocą C-xC-kRET.źródło