답변:
(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")
매개 변수 beginning
및 end
영역 시작 및 영역 끝의 값을 각각 자동으로 수신함 을 의미합니다 . ( region-beginning
및 region-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
되어 있고 현재 버퍼에 마크가 있다고 가정 하면 영역이 강조 표시됩니다.
C-SPC
M-: mark-active
=> t. 그럼에도 불구하고 빈 영역을 활성화 할 수 있습니다.