대화형(interactive) 함수에서 선택 영역 혹은 문자열 입력을 받기

1 minute read

emacs에서 문자열 입력을 받아서 웹 브라우저로 검색하는 대화형 함수를 짜고 있다. 문자열 입력뿐만 아니라 선택 영역도 지원하고 싶어서 찾아보게 됐다. 선택 영역이 있으면 그걸 사용하고 없으면 문자열 입력을 받게 하고 싶다.

대화형 함수에서 선택 영역을 입력으로 사용

(defun interactive-region-func (begin end)
  (interactive "r")
  (let ((selected (buffer-substring begin end)))
    (message selected)
    )
  )

r 대화형 코드(interactive code)를 사용하면 인자로 begin, end 를 받을 수 있다. buffer-string 함수를 호출해 선택한 문자열을 가져온다.

단 저렇게만 하면 아무것도 선택을 안 했을 때, 커서가 있는 줄이 beginend 로 넘어온다.

(defun interactive-region-func (begin end)
  (interactive "r")
  (if (region-active-p)
      (let ((selected (buffer-substring begin end)))
        (message selected))
    (message "a region is deactive")
    )
  )

region-active-p 함수를 사용해 선택한 영역이 있는지를 확인하면 된다.

선택 영역이 있으면 사용하고 없다면 문자열 입력을 받게 한다

(defun interactive-region-or-string-func ()
  (interactive)
  (let ((selected_or_input
         (if (region-active-p)
             (buffer-substring (region-beginning) (region-end))
           (read-string "input: "))))
    (message selected_or_input))
  )

분기를 타야 한다. 선택 영역이 있는지 검사하고 없다면 사용자 입력을 받아야 한다. 대화형 코드를 사용하지 않고 직접 read-string 함수를 호출해서 선택적으로 사용자 입력을 받게 했다.

참고

C-x C-s C-x C-c