나는 M-x query-replace
Emacs( )를 많이 사용하며 다음 옵션 중에서 선택할 수 있는 유연성을 좋아합니다.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 매개변수를 고려하세요.