Обертання Emacs Mx із запитом замінити навколо документа?


7

Я використовую M-x query-replaceEmacs ( M-%) досить часто, і мені подобається, що у мене є можливість вибирати між цими параметрами:

Spacebar               Replace text and find the next occurrence
Del                    Leave text as is and find the next occurrence
. (period)             Replace text, then stop looking for occurrences
! (exclamation point)  Replace all occurrences without asking
^ (caret)              Return the cursor to previously replaced text

Чи є спосіб:

  • Після повернення до кінця документа повертаємося до початку документа?

  • Поверніть напрямок пошуку і заміни в середині виконання команди.


1
query-replace-string(і його зворотний стіл), якщо ви рухаєтесь лише вперед, вам доведеться переписати великий фрагмент коду, щоб повернутися назад. Немає можливості обгортати (там десь може бути пакет), але це легко обійти: M-<( beginning-of-buffer), зробіть заміну, C-2 C-SPC(поверніться до встановленої останньої позначки (за M-<)).
Жиль

Цікава ідея. Може бути досить зручно. Запитайте гуру emacs . Їм це може подобатися досить, тому вони реалізують це.
Том

1
Напевно, ви повинні змінити свою посаду, щоб не бентежити всіх: це query-replace(що стосується вашого питання, не можу вам допомогти.)
Емануель Берг

Відповіді:


2

query-replaceце дуже важлива функція, тому я неохоче міняю її глобально. Що я зробив замість цього - скопіювати це в нову функцію my-query-replace, яка спочатку має таку саму поведінку. Тоді я раджу цю функцію повторити пошук заміни запитів на початку буфера, як тільки він досягне кінця. Це може бути надмірно обережним - ви можете змінити поради, які слід застосовувати query-replaceзамість my-query-replace, та активізувати цю поведінку в усьому світі.

;; copy the original query-replace-function 
(fset 'my-query-replace 'query-replace)

;; advise the new version to repeat the search after it 
;; finishes at the bottom of the buffer the first time:    
(defadvice my-query-replace 
  (around replace-wrap 
          (FROM-STRING TO-STRING &optional DELIMITED START END))
  "Execute a query-replace, wrapping to the top of the buffer 
   after you reach the bottom"
  (save-excursion
    (let ((start (point)))
      ad-do-it
      (beginning-of-buffer)
      (ad-set-args 4 (list (point-min) start))
      ad-do-it)))

;; Turn on the advice    
(ad-activate 'my-query-replace)

Оцінивши цей код, ви можете зателефонувати на завершений пошук M-x my-query-replaceабо прив'язати його до чогось зручного для вас:

(global-set-key "\C-cq" 'my-query-replace)

1

Я використовую нижче для роботи з 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 (use-region-p)
                           (region-beginning)
                         (point-min))))
               (unless (nth 4 args)
                 (setf (nth 4 args)
                       (if (use-region-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.