Як замінити поточне слово під курсором у Emacs


25

Як замінити поточне слово під курсором у Emacs?

Я знаю, що я можу використовувати запит-заміну або заміна рядка, але кожен раз, коли я це роблю, мені доводиться вводити цілу рядок, яку потрібно замінити, це просто дратує.

У Vi є еквівалентний командний шнур, і я можу використовувати ярлик, щоб перетягнути слово під курсор для заміни:

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

Хтось знає, як це зробити з Emacs?


Відповіді:


2

Використання копіювання і вставки: M-d C-_ M-x replace-string RET C-y( kill-word, undo, replace-string, yank). Якщо ви вже почали заміну, ви можете переключитися назад у вихідний буфер , щоб зробити копіпаст зі звичайним вікном або буфер перемикання команд: M-x replace-string RET … C-x o M-d C-_ C-x o C-y. Ви можете використовувати аргумент префікса на M-d(наприклад ESC 4 2 M-d) для заміни кількох слів.

Якщо ви плануєте замінити одне або декілька слів курсором, замість цього ви можете почати з поступового пошуку ( C-s), скористайтеся C-wдля початку пошуку слова під курсором, а потім натисніть, M-%щоб перейти до replace-string.


26

Поступовий пошук має цю особливість, але функції заміни не мають. До щастя, покроковий пошук дійсно є спосіб перемикання в режимі заміни , як тільки ви вибрали слово для пошуку. Так:

  • Натисніть, C-sщоб перейти в режим додаткового пошуку
  • Натисніть, C-wщоб витягнути поточне слово в пошуковий буфер. Ви можете продовжувати натискати на нього, щоб додати кілька слів, а також можете використовувати C-M-yдля витягування окремих символів та C-yвитягування цілих рядків
  • Натисніть M-%для переключення для заміни режиму за допомогою буфера пошуку, який ви вже створили

Як ви, напевно, знаєте із M-%звичайного використання , це режим заміни запитів, де він пропонує вам, що робити з кожним матчем. Якщо ви просто хочете замінити їх усіх, натисніть !на перший матч


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) ))

1
Це рішення прекрасно працює і набагато корисніше, ніж розповідати, як це зробити вручну. Я занадто лінивий, щоб морочитися копіюванням та вставкою.
Пол Кокколі

2

Я абсолютно новачок у emacs, але можу запропонувати наступне:

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

Тепер ви можете написати нове слово. Працює майже як cwу vim


1

Якщо ви переходите до пошуку та заміни M-S-%просто натисканням M-nзаповнення слова під курсором, натискання його знову загортає його в "роздільник символів".


1

Я боровся і хотів того ж, що з моменту переходу з Vim до Emacs.

Після деяких досліджень та експериментів я придумав функцію, яка дозволяє вам робити те ж саме, що встановлено з пакетом Evil або з використанням Spacemacs.

Він також працює з регіоном активним (або візуальним виділенням у терміні vim), і це може бути дуже корисно замінити таке слово, як 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) "/"))))

то у своєму init.el визначте ту саму клавішну прив'язку:

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

прив'язка клавіш дещо відрізняється від vim, який є "пробілом", але я не зрозумів, як відобразити це в emacs, коли злий режим є. продовжуйте скаржитися не на префікс тощо, і я відносно новачок у emacs. Але все-таки не надто погано, і зараз я задоволений цим рішенням.


0

На це вже відповіли, і я не можу коментувати, тому що в мене ще недостатньо репутації. Але те, що ви шукаєте, - це ciwvim.

У emacs найближче до мене прийшло це поєднання:

M-b M-d

Це повернеться до початку слова, на якому курсор увімкнено, а потім видалить слово.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.