Ganti dua string dengan satu sama lain


9

Saya ingin mengubah semua kemunculan string (katakanlah string1) dengan string lain (katakanlah string2) dan sebaliknya. Lebih tepatnya saya memiliki dokumen yang panjang dan string ini terjadi berkali-kali. Apa yang saya lakukan saat ini, adalah mengganti string1 -> string3, lalu string2 -> string1 dan akhirnya string3 -> string2.

Saya bertanya-tanya apakah sudah ada fungsi di emacs yang melakukan ini. Solusi lain disambut.

Sunting : Ini sebenarnya adalah duplikat dari pertanyaan yang ditautkan dalam komentar. Tetapi masalahnya adalah bahwa jawaban yang diterima dari pertanyaan itu tidak selalu berhasil (lihat komentar di bawah). Saya pikir lebih baik menunggu sampai penulis jawaban yang diterima mengoreksi jawabannya atau solusi lain keluar. Kedua sebelum memposting pertanyaan saya, saya mencari pertanyaan di Google dan pertanyaan itu tidak muncul. Saya pikir memiliki dua pertanyaan duplikat kadang berguna karena mereka menggunakan kata-kata yang berbeda dan jika pengguna menemukan yang duplikat, ia dapat menemukan yang tepat.

Sunting 2: Jawaban yang diterima dari fitur Pencarian / ganti-suka untuk bertukar teks tampaknya baik-baik saja sekarang.


4
Kemungkinan duplikat fitur Cari / ganti-suka untuk bertukar teks
T. Verron

@ T. Verron Saya mencoba menggunakan jawaban yang diterima dari tautan Anda untuk mengganti "Ini" dengan "itu" di buffer awal tetapi tidak berhasil.
Sebutkan

Mungkin saya menerima terlalu cepat. Mengomentari dua argumen terakhir yang keluar ( backwardsdan region-noncontiguous-p) dalam panggilan perform-replacemembuatnya berfungsi di sini (emacs 24.3). Saya akan mengujinya di emacs 25 ketika saya mendapatkan kesempatan sebelum mengedit jawaban lainnya.
T. Verron

@ T.Verron sebaliknya, solusi lain menyarankan untuk menggunakan paket plur. Tampaknya berfungsi dalam situasi ini tanpa masalah.
Sebutkan

Saya telah mengubah jawaban yang diterima dalam pertanyaan lain. Mengenai google, ya, saya juga kesulitan menemukan kata kunci untuk menyampaikan apa yang saya coba lakukan. Dan ya, duplikat itu bagus! blog.stackoverflow.com/2010/11/...
T. Verron

Jawaban:


11

Untuk kasus interaktif query-replace-regexp (CM-%) dapat melakukan ini, menggunakan \ yang relatif tidak diketahui, untuk penggantian.

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

Jika teks pengganti berisi \, diikuti oleh ekspresi pelat, ia menggunakan nilai ekspresi itu sebagai pengganti. Dalam hal ini ekspresi adalah "jika" yang mengambil kondisi dan nilai pengembalian untuk kasus benar dan salah.

Dalam komentar disarankan untuk digunakan

\, (jika \ 1 "string2" "string1")

Ini berfungsi karena \ 1 akan menjadi "string1" jika polanya cocok dengan string1, dan akan menjadi nol. Lisp menganggap nilai non-nil sebagai benar. Sementara ini berfungsi dan lebih pendek, saya pikir jawaban saya lebih bermanfaat. Saya pikir kode lebih mudah dibaca oleh seseorang yang pengetahuannya terbatas. Ini memiliki keuntungan kedua karena masih berfungsi jika pola "dari" diberikan sebagai

\(string1\|string2\)

atau bahkan

string1\|string2

2
Beberapa komentar dalam kandidat rangkap menyarankan sintaksis yang lebih sederhana \,(if \1 "string2" "string1"), menggunakan regexp \(string1\)\|string2.
T. Verron

Lihat dua paragraf terakhir dari (emacs) Regexp Replace.
Basil

-1

Yah, mungkin dengan makro ini akan mudah:

F3C-saRETC-bM-tF4. Menggunakan makro ini pada pertanyaan Anda meneriakkan hasil ini:

Saya ingin mengubah semua kemunculan string a (katakanlah string1) dengan string lain (katakanlah string2) dan sebaliknya. Lebih tepatnya saya punya dokumen panjang dan string ini terjadi berkali-kali. Apa yang saya lakukan saat ini, adalah mengganti string1 -> string3, lalu string2 -> string1 dan akhirnya string3 -> string2.

Saya bertanya-tanya apakah sudah ada fungsi dalam emacs yang melakukan ini. Solusi lain disambut.

Saya mengubah posisi antara kata apa pun setelah kata adan kata itu. Anda kemudian dapat mengedit makro untuk mengubah kata lain juga tanpa perlu mendefinisikan ulang seluruh makro, Anda dapat mengedit makro dengan C-xC-kRET.


1
Saya tidak berpikir pertanyaannya terkait dengan transposing kata-kata.
T. Verron

@ T. Verron Ya, tapi dia menginginkan pendekatan yang lebih terotomatisasi, sepertinya.
shackra

1
Apa yang dilakukan oleh makro Anda adalah bertukar (transposing) masing-masing "a" dengan kata berikutnya. "a string"> "string a" dll. Yang ingin dia lakukan adalah misalnya mengganti setiap "a" dengan "the" dan masing-masing "the" dengan "a".
T. Verron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.