Как заменить слово в Emacs? - PullRequest
       7

Как заменить слово в Emacs?

7 голосов
/ 15 августа 2011

С учетом следующего предложения:

Это один два три.

Когда я перемещаю курсор в пространство между one и two , я хотел бы заменить two на XXX.Я знаю, что в vi есть способ пометить two как измененную строку, чтобы, когда я закончу ввод новой строки и новая строка заменит two на месте.

// Update-1 //

Соответствующей командой в vi является 'cw'

Ответы [ 5 ]

7 голосов
/ 15 августа 2011

Я бы, вероятно, просто использовал Md SPC XXX (если SPC необходим, зависит от того, находится ли курсор сразу после «один» или перед «двумя») или Mf M-DEL XXX , но, возможно, это не то, что вы ищете.

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

(defun change-word (n)
  (interactive "p")
  (lexical-let ((old-window-configuration (current-window-configuration)))
    (clone-indirect-buffer "*edit-word*" t)
    (narrow-to-region (point) (save-excursion
                                (forward-word n)
                                (point)))
    (overwrite-mode 1)
    (local-set-key (kbd "C-c C-c")
                   (lambda ()
                     (interactive)
                     (widen)
                     (let ((end-of-edit (point)))
                       (kill-buffer)
                       (set-window-configuration old-window-configuration)
                       (goto-char end-of-edit))))))

Вызвать M-x change-word (или связать его с нужной вам клавишей), отредактировать слово и набрать C-c C-c , когда вы закончите. Если вы хотите отредактировать следующие n слова, присвойте ему префиксный аргумент (например, M-3 M-x change-word для изменения следующих трех слов). Это не совсем то же самое - вы будете редактировать в другом буфере - но это близко. Попробуйте и посмотрите, нравится ли вам это. Это не очень сложное решение. Возможно, лучшим и наиболее подходящим в стиле emacs подходом было бы иметь что-то похожее на режим isearch, которое выделяет измененную область и так далее. Обратите внимание, что вам придется (require 'cl) из-за lexical-let.

Другая возможность будет выглядеть примерно так:

(defun change-word ()
  (interactive)
  (dotimes (i (- (save-excursion (end-of-thing 'word)) (point)))
    (insert (read-char))
    (delete-char 1)))

Но этот пример - очень грубый взлом - вы даже не сможете ориентироваться при редактировании своего слова. Может быть, кто-нибудь мог бы написать что-то, изменяющее поведение командной строки, но я не стал это рассматривать.

Я не знаю ни о какой встроенной функциональности, которая делает именно то, что вам нужно, но, конечно, есть встроенные Viper и другие режимы эмуляции Vi.

4 голосов
/ 15 августа 2011

С курсором перед буквой t в «двух» нажмите M - @ или CM-Space , чтобы выбрать слово «два», а затем введите XXX чтобы заменить его. В моем Emacs M - @ связан с mark-word, а C-M-Space связан с mark-sexp. Я считаю, что последний легче набрать, но первый, скорее всего, будет работать так, как задумано, в различных режимах.

Приятной особенностью этих команд является то, что повторное выполнение (через вышеупомянутые последовательности клавиш) расширяет выбор постепенно. В вашем случае первое нажатие M - @ выделяет «два»:

Это один | два три.

Нажатие M - @ снова подсвечивает «три»:

Это один | два три .

На клавиатуре мета-клавиша (обозначенная в этих примерах буквой «M») может быть связана с клавишей Alt.

1 голос
/ 15 августа 2011

Для общего редактирования документов в таких случаях, как это, вы можете использовать Mx delete-selection-mode.Вы можете просто выбрать второе слово и начать печатать.Используйте CM-SPACE (mark-sexp) для выбора.

1 голос
/ 15 августа 2011

следующий за SO ответ конкретно касается воспроизведения поведения маркировки слов в vim.Тогда нужно просто убить регион ( Cw ) перед тем, как напечатать.

0 голосов
/ 15 августа 2011

По вашему описанию, звучит так, что M-backspace удалит «два» и оставит курсор готовым ввести текст для замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...