Emacs Mx 쿼리가 포장 문서를 바꾸시겠습니까?

Emacs Mx 쿼리가 포장 문서를 바꾸시겠습니까?

나는 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매우 중요한 기능이므로 전체적으로 변경할 의향이 없습니다. 내가 한 일은 그것을 새로운 함수에 복사하는 것이었고 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)

답변2

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 매개변수를 고려하세요.

관련 정보