Bagaimana cara mengganti kata saat ini di bawah kursor di Emacs

25

Bagaimana cara mengganti kata saat ini di bawah kursor di Emacs?

Saya tahu bahwa saya bisa menggunakan query-replace atau replace-string tetapi setiap kali saya melakukannya saya harus mengetik seluruh string yang akan diganti, ini hanya mengganggu.

Vi memiliki perintah setara kata dan saya bisa menggunakan jalan pintas untuk menarik kata di bawah kursor untuk penggantian:

nmap <leader>z :%s#\<<C-r>=expand("<cword>")<CR>\>#

Adakah yang tahu bagaimana melakukannya dengan Emacs?

Think Pl
sumber

Jawaban:

2

Gunakan copy-paste: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Jika Anda sudah mulai penggantian, Anda dapat beralih kembali ke buffer asli untuk melakukan copy-paste dengan jendela biasa atau buffer perintah beralih: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Anda dapat menggunakan argumen awalan pada M-d(misalnya ESC 4 2 M-d) untuk mengganti beberapa kata.

Jika Anda berencana untuk mengganti satu atau lebih kata pada kursor, Anda dapat mulai dari pencarian bertahap ( C-s), gunakan C-wuntuk mulai mencari kata di bawah kursor, lalu tekan M-%untuk beralih ke replace-string.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
26

Pencarian tambahan memiliki fitur ini, tetapi fungsi ganti tidak. Untungnya, pencarian tambahan memang memiliki cara untuk mengganti untuk mengganti mode setelah Anda memilih istilah pencarian. Begitu:

  • Tekan C-suntuk beralih ke mode pencarian tambahan
  • Tekan C-wuntuk menarik kata saat ini ke dalam buffer pencarian Anda dapat terus menekannya untuk menambahkan beberapa kata, dan Anda juga dapat menggunakan C-M-yuntuk menarik karakter individu dan C-yuntuk menarik seluruh baris
  • Tekan M-%untuk beralih untuk mengganti mode menggunakan buffer pencarian yang sudah Anda buat

Seperti yang mungkin Anda ketahui dari menggunakan secara M-%normal, ini adalah mode ganti permintaan yang meminta Anda untuk melakukan apa dengan setiap kecocokan. Jika Anda hanya ingin mengganti semuanya, tekan !pada pertandingan pertama

Michael Mrozek
sumber
9
;; query-replace current word
(defun qrc (replace-str)
   (interactive "sDo query-replace current word with: ")
   (forward-word)
   (let ((end (point)))
      (backward-word)
      (kill-ring-save (point) end)
      (query-replace (current-kill 0) replace-str) ))
Emanuel Berg
sumber
1
Solusi ini berfungsi dengan baik dan jauh lebih berguna daripada diberi tahu cara melakukannya secara manual. Aku terlalu malas untuk diganggu dengan copy-and-paste.
Paul Coccoli
2

Saya benar-benar baru untuk emacs tetapi saya dapat menyarankan yang berikut ini:

M-b       to move backward over a word
M-d       to kill up to the end of the word

Sekarang Anda dapat menulis kata baru. Bekerja hampir seperti cwdi vim

2r2w
sumber
1

Jika Anda masuk ke pencarian dan ganti dengan M-S-%hanya menekan M-nmengisi kata di bawah kursor, menekannya lagi membungkusnya dalam "pembatas simbol".

dolzenko
sumber
1

Saya berjuang dan menginginkan hal yang sama sejak pindah dari Vim ke Emacs.

Setelah beberapa penelitian dan percobaan, saya menemukan fungsi di bawah ini yang memungkinkan Anda untuk melakukan hal yang sama dengan paket Evil diinstal atau menggunakan spacemacs.

Ia juga bekerja dengan region aktif (atau pemilihan visual dalam istilah vim) dan itu bisa sangat berguna untuk mengganti kata seperti abc-def-hij:

; replace current word or selection using vim style for evil mode
(defun evil-replace-word-selection()
(interactive)
(if (use-region-p)
    (let (
            (selection (buffer-substring-no-properties (region-beginning) (region-end))))
        (if (= (length selection) 0)
        (message "empty string")
        (evil-ex (concat "'<,'>s/" selection "/"))
        ))
    (evil-ex (concat "%s/" (thing-at-point 'word) "/"))))

lalu di init.el Anda, tentukan pengikatan kunci yang sama:

(global-set-key (kbd "\C-co") 'evil-replace-word-selection)

keybinding sedikit berbeda dari vim yang merupakan "space z" tapi saya belum tahu bagaimana memetakan itu di emacs ketika mode jahat ada. terus mengeluh bukan awalan dll dan saya relatif baru untuk emacs. Tapi masih tidak terlalu buruk dan saya senang dengan solusi ini saat ini.

xiaoming wu
sumber
0

Ini sudah dijawab dan saya tidak bisa berkomentar karena saya belum memiliki reputasi yang cukup. Tapi apa yang Anda cari ada ciwdi vim.

Dalam emacs yang paling dekat dengan saya adalah kombinasi ini:

M-b M-d

Ini kembali ke awal kata kursor aktif dan kemudian menghapus kata.

Jamesy Dimmick May
sumber