주어진 텍스트를 지역을 감싸는 방법


11

종종 지역 주변에 텍스트를 적용해야하는 상황이 있습니다. HTML과 간단한 경우에는 이미 라이브러리가 있습니다. 그러나 일반적인 경우는 어떻습니까? 이 지역의 시작과 끝을 무엇을 삽입 할 것인지 묻고 싶습니다.


임의의 내용을 한 번 또는 소수의 쌍으로 여러 번 삽입하는 데 사용 하시겠습니까? 후자의 경우 smartparens와 같은 라이브러리가 유용 할 수 있으며 사용자 정의 쌍으로 확장 할 수 있습니다. 예를 들어, 페어 <?php...를 추가 한 ?>다음 영역과 유형 <?php(또는 키 바인딩) 을 선택할 때 페어를 감쌀 수 있습니다. 그러나 원샷 쌍이 많은 경우 이러한 라이브러리를 사용하는 쉬운 방법이 없습니다.
T. Verron

@ T.Verron : 나는 그것들이 존재한다는 것을 안다. 그러나 코드를 살펴보고 재사용 할 수있는 단일 기능에 가장 적합한 코드를 표시해야하는 특별한 순간을 위해
nperson325681

답변:


6

나는 주변을 둘러 보았고 John D. Cook이 게시물을 찾았 습니다 . 그는 간단한 대화식 함수를 작성하여 지역 주변의 HTML / XML 태그를 쉽게 얻는 방법을 보여줍니다. 그로부터 함수를 두 번 요청하도록 수정했습니다.

(defun tag-word-or-region (text-begin text-end)
  "Surround current word or region with given text."
  (interactive "sStart tag: \nsEnd tag: ")
  (let (pos1 pos2 bds)
    (if (and transient-mark-mode mark-active)
        (progn
          (goto-char (region-end))
          (insert text-end)
          (goto-char (region-beginning))
          (insert text-begin))
      (progn
        (setq bds (bounds-of-thing-at-point 'symbol))
        (goto-char (cdr bds))
        (insert text-end)
        (goto-char (car bds))
        (insert text-begin)))))

더 중요한 것은이 기능을 보조 도구로 사용할 수도 있습니다 (예 : 키를 바인딩하여 특정 텍스트 비트를 매핑하려는 경우).

(defun tag-php ()
  (interactive)
  (tag-word-or-region "<?php " "?>"))

Btw, 이것이 일부 경계 사례를 처리하는 방식은 최적이 아닙니다. 시작에 대한 검색이 때때로 실패하고 두 태그를 마지막에 남겨 둘 수 있습니다. 그것은 수 evil나는 여기에를 방해를 사용하는 것이. 아마도 유형의 기능이 interactive "r" 더 강력하게 작동 했을 까요?
nperson325681

4

다른 접근법을 제안합니다. 영역이있는 경우 정의에 따라 영역 point의 시작 (또는 끝)에 mark있어야하고 끝 (또는 시작)에 있어야합니다. exchange-point-and-markC-x C-x, 원하는 텍스트를 입력 한 다음을 사용 하여 영역의 다른 끝으로 이동할 수 있습니다. 래퍼의 후반부를 입력하면 완료됩니다.

삽입 텍스트를 묻는 메시지가 명시 적으로 표시되지는 않지만 적은 노력으로 동일한 작업을 수행 할 수있는 방법이있을 것이라고는 상상할 수 없습니다.


시작과 끝 텍스트가 동일 multiple-cursors하면 활성 영역의 시작과 끝에서 동시에 텍스트를 삽입하도록 조정할 수 있는지 궁금합니다 .
glucas

그것은 저급 편집자들이 어쨌든 강제로 수행하는 수동 방식과 같습니다. 어쨌든 나는 당신의 대답에서 매크로를 하위 텍스트로 사용하는 것을 읽었습니다. 당신의 스타일과 같은 I
nperson325681

1
@progo-감사합니다 :) 더 수동적 인 접근 방식처럼 들리지만 실제로는 다른 방법 보다 키 입력 횟수적습니다 . 줄 바꿈 텍스트 이외의이 방법을 사용하면 필요합니다 C-x C-x. 답을 사용하여 함수 ( C-c something) 를 호출 해야하며 return각 항목을 마친 후에도 적중해야합니다 . 당신이 무엇을하든, 당신은 두 번 더 키를 눌렀습니다. 즉, elisp에서 전화를 걸고 싶다면 도움이되지 않습니다.
Tyler

3

다양성을 위해서만 :

어떤 임의의 시작과 끝 텍스트로이 작업을 수행하는 또 다른 방법은 사용하는 것입니다 replace-regexp지역에 : 일치 .+와 교체 before \& after하거나 사용하려는 어떤 텍스트 beforeafter.

명령을 작성할 수는 있지만 주어진 파일에서 동일한 시작 / 종료 텍스트를 여러 곳에 적용하려는 경우를 생각하고 있습니다. 매크로를 기록하거나 미니 버퍼 기록을 사용하여 다른 지역에서 반복 할 수 있습니다.

물론 줄 바꿈하려는 텍스트를 정규 표현식으로 표현할 수 있으면 영역을 선택할 필요가없고 query-replace-regexp버퍼에서 수행 할 수 있지만 줄 바꿈하려는 텍스트는 그와 일치하지 않을 수 있습니다.

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