Zamień dwa ciągi ze sobą


9

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.



@ T.Verron Próbowałem użyć zaakceptowanej odpowiedzi linku, aby zamienić „To” na „to” w buforze scratch, ale to nie działa.
Imię

Może zaakceptowałem zbyt szybko. Komentowanie dwóch ostatnich argumentów ( backwardsi region-noncontiguous-p) w wywołaniu perform-replacesprawia, że ​​tutaj działa (emacs 24.3). Przetestuję to na emacs 25, kiedy dostanę okazję przed edycją drugiej odpowiedzi.
T. Verron

@ T.Verron natomiast inne rozwiązanie sugerujące użycie plur pakietu. Wydaje się, że działa w tej sytuacji bez problemu.
Imię

Zmieniłem zaakceptowaną odpowiedź w innym pytaniu. Jeśli chodzi o google, tak, również miałem problem ze znalezieniem słów kluczowych, które mogłyby przekazać to, co próbowałem zrobić. I tak, duplikaty są dobre! blog.stackoverflow.com/2010/11/…
T.

Odpowiedzi:


11

W przypadku interaktywnego przypadku zapytanie-zamień-regexp (CM-%) może to zrobić, używając względnie nieznanego \, do zamiany.

C-M-% \(string1\)\|\(string2\)
\,(if (equal \& "string1") "string2" "string1")

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

\, (jeśli \ 1 „ciąg2” „ciąg1”)

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

\(string1\|string2\)

lub nawet

string1\|string2

2
Niektóre komentarze w zduplikowanym kandydacie sugerowały prostszą składnię \,(if \1 "string2" "string1"), używając wyrażenia regularnego \(string1\)\|string2.
T. Verron,

Zobacz dwa ostatnie akapity (emacs) Regexp Replace.
Basil

-1

Cóż, może z makrem byłoby to łatwe:

F3C-saRETC-bM-tF4. Użycie tego makra do twojego pytania krzyczy ten wynik:

Chciałbym zmienić wszystkie wystąpienia ciągu a (powiedzmy string1) na inny ciąg (powiedzmy string2) i na odwrót. Mówiąc ściślej 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.

Transponuję pozycje między dowolnym słowem po tym ai 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.


1
Nie sądzę, aby pytanie dotyczyło transponowania słów.
T. Verron

@ T.Verron Tak, ale wygląda na to, że chce bardziej zautomatyzowanego podejścia.
shackra

1
Makro wymienia (transponuje) każde „a” z następnym słowem. „ciąg”> „ciąg a” itp. To, co chce zrobić, to np. zastąpić każde „a” słowem „the” i każde „the” słowem „a”.
T. Verron,
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.