Как найти / заменить строку для всего буфера в Emacs, не возвращаясь к началу?


9

Это действительно неудобно, чтобы сначала вернуться к вершине буфера, а затем выполнить поиск / запрос. Что касается поиска, то относительно просто, что вы можете просто нажать C-sеще раз, чтобы обернуться, но для запроса / замены это утомительно.

Любой простой взлом, чтобы сделать это, не возвращаясь к вершине буфера для обеих операций?

Ответы:


6

Да, похоже, что вы не можете (взято отсюда , выделение мое):

Чтобы заменить каждый экземпляр «foo» после точки на «bar», используйте команду Mx replace-string с двумя аргументами fooи bar. Замена происходит только после точки, поэтому, если вы хотите покрыть весь буфер, вы должны сначала перейти к началу .

Лично я разделяю буфер на два ( C-x 2), перехожу в начало ( C-Home), затем запускаю команду замены, переключаюсь обратно на исходную панель ( C-x o) и убиваю вторую ( C-x 0). Не знаю, есть ли способ сделать это проще.


4
(defun my-replace-string ()
  (interactive)
  (save-excursion
    (beginning-of-buffer)
    (call-interactively 'replace-string)))

Работает хорошо, но запутывает запрос-замену в области / выделении (всегда делает во всем буфере).
Алекс


0

Я использую ниже для работы с Emacs 24+:

;; query replace all from buffer start
(fset 'my-query-replace-all 'query-replace)
(advice-add 'my-query-replace-all
            :around
            #'(lambda(oldfun &rest args)
               "Query replace the whole buffer."
               ;; set start pos
               (unless (nth 3 args)
                 (setf (nth 3 args)
                       (if (region-active-p)
                           (region-beginning)
                         (point-min))))
               (unless (nth 4 args)
                 (setf (nth 4 args)
                       (if (region-active-p)
                           (region-end)
                         (point-max))))
               (apply oldfun args)))
(global-set-key "\C-cr" 'my-query-replace-all)

Относительно региона заменить регистр, и все аргументы START и END пройдены.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.