선택한 지역에만 명령 적용


18

다음과 같은 코드가 있습니다.

(defun some-function ()
  (interactive)
  ;; do something
  )

이제 some-function버퍼의 선택된 영역에서만 작동 하고 싶습니다 . 어떻게해야합니까? 또한 일부 지역을 선택한 경우 다른 작업을 수행하고 선택하지 않은 경우 다른 작업을 수행하기위한 별도의 코드 경로가 두 개있을 수 있습니다.

답변:


22
(defun some-function (beginning end)
  (interactive "r")
  (if (use-region-p)
      (message "The region is active, and is from %d to %d" beginning end)
    (message "The region is still there (from % d to %d), but it is inactive" 
             beginning end)))

사용은 함수가 호출 될 때 (interactive "r")매개 변수 beginningend영역 시작 및 영역 끝의 값을 각각 자동으로 수신함 을 의미합니다 . ( region-beginningregion-end각각을 사용하여 언제든지 해당 값을 얻을 수도 있습니다.)

영역은 항상 존재하지만 (현재 버퍼에 마크가있는 경우) 생각하지 않을 수 있습니다. 영역은 강조 표시 될 때 활성화 됩니다 (텍스트가 선택됨). 술어를 사용하여 영역이 활성 상태인지 테스트 할 수 있습니다 region-active-p. 그러나 더 나은 테스트는 일반적으로 영역이 활성화되고 비어 있지 않은 경우에만 use-region-p(기본적으로) true (비 nil)를 반환하므로 (포인트와 마크가 다름) 더 나은 테스트입니다 .

원래 지역의 하이라이트는 없었습니다. 오랫동안 강조 표시를 사용할 수 있었지만 기본 동작은 아니 었습니다. 강조 표시가 발생하려면 transient-mark-mode켜져 있거나 최소한 일시적으로 켜져 있어야합니다 . transient-mark-mode최신 Emacs 버전에서는 기본적 으로 켜져 있습니다.

술어의 정의를 보는 것이 도움이됩니다 use-region-p.

(defun use-region-p ()
  (and (region-active-p)
       (or use-empty-active-region
           (> (region-end) (region-beginning)))))

use-empty-active-region기본값은 nil(true) 인 사용자 옵션으로, use-region-p영역이 비어 있으면 기본적으로 true를 반환하지 않습니다. 이 경우 true를 반환하려면 영역의 끝이 시작보다 커야합니다 (위에서 설명한 동작).

그리고 우리가 정의를 보면 region-active-p:

(defun region-active-p ()
  (and transient-mark-mode
       mark-active
       (mark)))

우리 nil는 이것들이 모두 참일 때 참 (non- )을 반환한다는 것을 알 수 있습니다 :

  • transient-mark-mode 켜져 있습니다.
  • 마크가 활성화되었습니다 ( mark-active).
  • 현재 버퍼에 마크가 있습니다.

활성화 된 마크는 실제로 활성화 된 영역의 모든 것입니다. 활성화 transient-mark-mode되어 있고 현재 버퍼에 마크가 있다고 가정 하면 영역이 강조 표시됩니다.


마크가 포인트로 설정되면, 즉 영역이 확장되지 않으면 마크-액티브는 nil입니다. 따라서 마크-액티브 및 트랜지언트-마크-모드 만이 이러한 중복 기능에 가치를 더하는 것입니다.
Andreas Röhler

1
@ AndreasRöhler : 아뇨. C-SPC M-: mark-active=> t. 그럼에도 불구하고 빈 영역을 활성화 할 수 있습니다.
Drew

괜찮 감사. 여전히 0으로 확장되는 것으로 정의 된 mark-active 및 region-active-p가 모두 필요하다고 생각합니다.
Andreas Röhler 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.