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.
sumber
backwards
danregion-noncontiguous-p
) dalam panggilanperform-replace
membuatnya berfungsi di sini (emacs 24.3). Saya akan mengujinya di emacs 25 ketika saya mendapatkan kesempatan sebelum mengedit jawaban lainnya.Jawaban:
Untuk kasus interaktif query-replace-regexp (CM-%) dapat melakukan ini, menggunakan \ yang relatif tidak diketahui, untuk penggantian.
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
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
atau bahkan
sumber
\,(if \1 "string2" "string1")
, menggunakan regexp\(string1\)\|string2
.(emacs) Regexp Replace
.Yah, mungkin dengan makro ini akan mudah:
F3C-s
a
RETC-bM-tF4. Menggunakan makro ini pada pertanyaan Anda meneriakkan hasil ini:Saya mengubah posisi antara kata apa pun setelah kata
a
dan 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.sumber