Как заменить текущее слово под курсором в Emacs

25

Как заменить текущее слово под курсором в Emacs?

Я знаю, что могу использовать query-replace или replace-string, но каждый раз, когда я делаю это, мне приходится вводить всю строку для замены, это просто раздражает.

Vi имеет эквивалентное командное слово, и я могу использовать ярлык, чтобы вытянуть слово под курсором для замены:

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

Кто-нибудь знает, как это сделать с Emacs?

Думаю пл
источник
Проверьте stackoverflow.com/questions/8257009/…
Эмануэль Берг

Ответы:

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

2r2w
источник
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, которое называется "пробел z", но я не выяснил, как отобразить это в emacs, когда есть режим зла. Продолжайте жаловаться, не префикс и т. д., и я относительно новичок в Emacs. Но все еще не так уж и плохо, и я доволен этим решением на данный момент.

Сяомин Ву
источник
0

На этот вопрос уже ответили, и я не могу комментировать, потому что у меня еще недостаточно репутации. Но то, что вы ищете, ciwв Vim.

В emacs наиболее близка к этой комбинации:

M-b M-d

Это возвращает к началу слова, на котором находится курсор, а затем удаляет слово.

Джеймси Диммик Мэй
источник