1 minute read

원하는 URL을 조합해 웹브라우저로 여는 대화형 함수 만들기 - elixir 문서 편하게 검색 글로 적은 것처럼 emacs에서 elixir 문서 검색 단어를 입력받아 주소를 조합해 웹브라우저로 여는 함수를 만들어 사용하고 있다. 써보니 편해서 이걸 더 확장했다.

대화형(interactive) 함수에서 선택 영역 혹은 문자열 입력을 받기 기능을 사용해서 선택 영역이 있으면 그걸 그대로 검색 단어로 쓰게 기능을 추가했다. 선택 영역이 없으면 프롬프트(prompt)로 검색 문자를 받게 한다.

(map! :leader
      (:prefix-map ("S" . "custom search")
       :desc "google"           "g"     #'my/search-google
       :desc "naver"            "n"     #'my/search-naver
       :desc "dict"             "d"     #'my/search-dict
       :desc "dotnet"           "D"     #'my/search-dotnet
       :desc "core dict"        "c"     #'my/search-core-dictionary
       :desc "onelook"          "e"     #'my/search-onelook
       :desc "thesaurus"        "t"     #'my/search-thesaurus
       :desc "elixir"           "x"     #'my/search-elixir
       :desc "flutter"          "f"     #'my/search-flutter
       :desc "my blogs"         "b"     #'my/search-blogs
       )
      )

elixir뿐만 아니라 google, naver, 사전 등 자주 쓰는 사이트에 대한 검색을 추가했다. doom emacs 함수를 사용해서 키 바인딩도 했다. SPC S g 키를 누르면 구글 검색이 되는 식이다.

(defun my/search-google ()
  (interactive)
  (let ((search-terms (my/search--use-region-or-read-user-input)))
    (my/search--browse "https://google.com/search"
                       `(("q" ,search-terms)))))

(defun my/search-dict ()
  (interactive)
  (let ((search-terms (my/search--use-region-or-read-user-input)))
    (my/search--browse "https://dict.naver.com/search.dict"
                       `(("query" ,search-terms)))))

(defun my/search--browse (base-url query-string-list)
  (let* ((query-string (url-build-query-string query-string-list))
         (url (format "%s?%s" base-url query-string)))
    (browse-url url)))

(defun my/search--use-region-or-read-user-input ()
  (if (doom-region-active-p)
      (buffer-substring (doom-region-beginning) (doom-region-end))
    (read-string "Enter your search terms: ")))

여러 검색 함수에서 공통으로 사용하는 함수를 추출했다. my/search--browse 함수는 쿼리 문자열(query string)을 조합해 웹브라우저로 사이트를 여는 역할을 한다. my/search--use-region-or-read-user-input 함수는 선택한 영역이 있으면 거기서 문자열을 추출하고 없다면 프롬프트(prompt)를 띄워 사용자 입력을 받는다. 이 함수를 구현할 때 doom emacs에서 evil mode 비주얼 모드(visual mode) 선택 영역을 잘 검출하게 수정한 함수를 사용했다. doom emacs를 쓰지 않는다면 region-active-p, region-beginning, region-end 함수를 사용하면 된다.

링크

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