vim의 sed 스타일 대체 명령과 동등한 기능이 있습니까?


14

vim에서 놓친 것 중 하나는 예를 들어 여러 줄에서 작동하는 대체 명령을 입력 할 수 있다는 것입니다.

:/begin/,/end/s/foo/bar/g

위 명령은 "begin"을 포함하는 첫 번째 줄로 시작하고 "end"를 포함하는 다음 줄로 끝나는 "bar"를 "foo"로 대체합니다.

이맥스에서 비슷한 것을 할 수있는 방법이 있습니까?

답변:


7

evil은 삭감 된 버전을 제공 ex하므로 정확한 드롭 인이 아니라고 가정하는 것이 가장 좋습니다. 그러나 해당 예가 첫 번째 선 (예 : 선 ) 앞에 있는 경우 제공 한 예는 기본적으로 작동합니다 begin.


vim에서 검색도 시작되어 내가 찾던 것과 같은 소리가납니다. 감사!
Larry Coleman

8

내장 기능 만 사용하는 한 가지 방법이 있습니다.

  1. 의 첫 번째 항목이 포함 된 줄에 점이 있으면를 begin누릅니다 C-SPC.

  2. 다음 항목으로 이동 end:

    C-s end RET

  3. 교체 foobar:

    M-% foo RET bar RET !

이것은 query-replace버퍼가있는 경우 전체 버퍼 대신 활성 영역에서 작동 한다는 사실을 이용합니다 .


물론 사용자 정의 명령을 정의 할 수도 있습니다.

(defun replace-from-to (beg end str repl)
  (interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
  (save-excursion
    (goto-char (point-min))
    (let ((start-pos (search-forward beg))
          (end-pos (search-forward end)))
      (replace-string str repl nil start-pos end-pos))))

이 명령은 항상 버퍼의 시작 부분부터 검색하므로 호출 할 때 begin/ foo/ 뒤에 포인트가있을 수 있습니다 end.

다음을 통해 키 바인딩을 설정하십시오.

(global-set-key (kbd "C-c r") 'replace-from-to)

5

일반적으로 이것은 당신이 사용할 것 narrow-to-region입니다.

커서를 영역의 시작 부분으로 이동하고 (예 : 검색)을 누른 C-SPC다음 영역의 끝으로 이동하여을 입력 M-x narrow-to-region합니다. 이제 원하는 검색 및 바꾸기 명령을 실행할 수 있으며 버퍼의 좁은 부분에만 적용됩니다. 완료되면 입력 M-x widen하여 버퍼 내용을 복원하십시오.


4
begin/ end가 프로그래밍 언어의 구분 기호 인 경우 하나의 명령으로 영역을 선택 하기 C-M-Space위해 실행할 수 있습니다 mark-sexp.
dgtized

1
기본 바인딩 : C-x n n( narrow-to-region) 및 C-x n w( widen).
itsjeyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.