Envoltório de substituição de consulta M-x do Emacs ao redor do documento?

6

Eu uso M-x query-replace no Emacs ( M-% ) com bastante frequência, e gosto que eu tenha a flexibilidade de escolher entre essas opções:

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

Existe uma maneira de:

  • Volta para o começo do documento depois que chegamos ao final do documento?

  • Inverta a direção da pesquisa e substituição no meio da execução do comando.

por Amelio Vazquez-Reina 15.09.2012 / 21:47

2 respostas

2

query-replace é uma função muito importante, por isso estou relutante em alterá-lo globalmente. O que eu fiz em vez disso é copiar isso para uma nova função, my-query-replace , que inicialmente tem o mesmo comportamento. Então eu aconselho essa função para repetir a busca de substituição de consulta no início do buffer, uma vez que atinge o final. Isso pode ser excessivamente cauteloso - você pode modificar o conselho para aplicar a query-replace em vez de my-query-replace e habilitar esse comportamento globalmente.

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

Depois de avaliar esse código, você pode chamar a pesquisa empacotada com M-x my-query-replace ou vinculá-la a algo conveniente para você:

(global-set-key "\C-cq" 'my-query-replace)
    
por 11.10.2012 / 00:58
2

Estou usando abaixo para trabalhar com o 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)

Considere o caso de substituição da região e quaisquer argumentos START e END transmitidos.

    
por 03.12.2016 / 04:11

Tags