텍스트 교체를위한 검색 / 바꾸기 기능


12

나는 자주 자신이 예를 대체하려고 찾아 foobarbarfoo버퍼에.

내가 보통하는 방법은 다음 중 하나입니다.

  • 3 쿼리 대체한다 : aaa -> @@@, bbb -> aaa,@@@ -> bbb
  • 자동화를 포기하고 손으로 교체하십시오.

일치하는 문자열이 또는 인지 테스트하기 위해 ,구문을 사용하여 작동하는 것을 얻을 수 있다고 가정합니다 . 그러나 결과 구문은 너무 번거로울 수 있으므로 실제로 시도하지 않았습니다.query-replace-regexpaaabbb

문제는 작업이 얼마나 일반적인지를 감안할 때 내장 또는 기존 패키지로 더 나은 단일 단계의 작업 방법이 있어야한다고 생각합니다. 있습니까?


단일 단계 방법이있을 수 있지만 첫 번째 방법은 나쁘지 않습니다 (IMO). 그리고 교체 문자열을 바로 선택하면 두 번째 패스에 대해 쿼리하지 않고 교체 할 수 있습니다.
Drew

@Drew 정기적으로 query-replace, 나는 M-% str1 str2포인트를 옮기고 손으로 변경하는 것보다 일반적으로 빠르다는 것을 알고 있습니다. 한 번만 발생하더라도 가장 빠른 것을 생각하는 데 시간을 낭비 할 필요가 없기 때문에 좋습니다 str1. 이상적으로는 텍스트 반전이 빠른 속도로 수행되기를 원하므로 그것에 대해 생각하지 않고도 사용할 수 있습니다.
T. Verron

누군가 간단한 답변을 제공 할 것입니다. 예를 들어 교체 할 Lisp 표현식을 사용하여 교체 할 텍스트를 참조하여 원하는 작업을 수행 할 수 있습니다. 예를 들어, 교환 숙어와 비슷한 것을 사용하십시오 (setq a (prog1 b (setq b a))). 그리고 더 간단한 방법이있을 수도 있습니다.
Drew

2
나는 \,(if \1 "b" "a")특히 못생긴 (정규 표현식에 대해) 찾지 \(a\)\|b못하지만 단어가 두 번 입력되어야합니다.
politza

2
왜 안돼 \(aaa\)\|bbb?
politza

답변:


8

다음은이 작업을 수행하는 작은 명령입니다.

(defun query-swap-strings (from-string to-string &optional delimited start end)
  "Swap occurrences of FROM-STRING and TO-STRING."
  (interactive
   (let ((common
          (query-replace-read-args
           (concat "Query swap"
                   (if current-prefix-arg
                       (if (eq current-prefix-arg '-) " backward" " word")
                     "")
                   (if (use-region-p) " in region" ""))
           nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
           (if (use-region-p) (region-beginning))
           (if (use-region-p) (region-end)))))
  (perform-replace
   (concat "\\(" (regexp-quote from-string) "\\)\\|" (regexp-quote to-string))
   `(replace-eval-replacement replace-quote (if (match-string 1) ,to-string ,from-string))
   t t delimited nil nil start end))

고마워요. 제가 저술 한 것보다 더 정교합니다! 구현 된 기능을 자세히 설명 할 수 있습니까? 접두사 인수를 사용하면 필요한 경우 지역에서만 바꾸기를 수행한다는 것을 알 수 있습니다 ... 또는 query-replace반전을 다시 작성하여 모든 기능을 유지합니까? 내 이맥스의 정의와 100 % 일치하지는 않지만, 여전히 24.5입니다.
T. Verron

@ T.Verron query-replace최신 버전의 기능 군 에서 제공하는 표준 본체 이므로 모든 기능을 유지합니다. 기능 끝에 Emacs 매뉴얼에 언급 된 권장되는 문자열 교체 방법을 추가했습니다.
link0ff

아마 너무 빨리 받아 들였다. 이 기능은 내가 주석 경우 (24.3 이맥스) 여기서 일하는 backwardregion-noncontiguous-p호출에서 perform-replace. 일반적인 문제입니까, 아니면 perform-replace버전간에 인터페이스 가 변경 되었음을 의미 합니까?
T. Verron

예, 인터페이스가 최신 버전에 추가 된이 두 가지 인수로 변경되었으므로 이전 인수에는 존재하지 않습니다.
link0ff

2
이 솔루션은 이제 괜찮은 것 같습니다.
이름 :

9

plur 설치

명령을 실행 plur-query-replace

입력 {foo,bar}및 교체{bar,foo}

y원하는대로 발생을 바꾸려면 적중 하십시오.

이 명령에는 비 대화식 및 isearch와 유사한 변형도 있습니다.


감사! plur의 목적은 때때로 내가 찾던 것입니다. 분명히 그것을 볼 것입니다. 내 유일한 망설임은 위 패키지의 저자의 의견에서 비롯된 것입니다.;)
T. Verron

1
plur필요합니다 emacs 24.4.
T. Verron 8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.