1 minute read

redmine 이슈 번호를 #1234 같은 식으로 사용한 문서가 있다. 이슈 번호를 복사하고 웹페이지를 열어 /issues 주소 뒤에 1234 이슈 번호를 붙여서 확인하는 게 귀찮아서 간단한 함수를 만들었다. 이슈 번호가 있는 줄에서 #숫자 를 찾아서 URL을 생성해 웹브라우저로 열어주는 함수다.

(require 'subr-x)
(defun open-issue-page ()
  (interactive)
  (when (not (boundp 'issue-base-page)) (throw 'issue-base-page "not bound"))
  (let* ((line (thing-at-point 'line))
         ;; issue number를 못 찾았을 때, number가 nil이 돼야 하는데, 공백 문자가 들어간다
         ;; 원인을 못 찾아서 string trim을 한 후 길이를 재서 검사한다.
         (number (find-issue-number line)))
    (if (> (length (string-trim number)) 0)
        (browse-url (format "%s/%s" issue-base-page number))
      (message "failed find issue number - %s" line))))

(defun find-issue-number (line)
  (save-match-data
    (string-match "#\\([0-9]+\\)" line)
    (match-string 1 line)))

open-issue-page 라는 함수를 만들었다. 대화형(interactive) 함수로 만들어서 M-x open-issue-page 로 쉽게 호출할 수 있다.

issue-base-page 변수를 사용한다. 간편하게 변수를 빼서 조금의 확장성을 추가한다. (setq issue-base-page "https://mycompany/issues") 같은 식으로 설정해서 사용한다. redmine을 위해 만들었지만, 주소를 gitlab으로 바꾸면 gitlab에서도 사용할 수 있다.

thing-at-point 함수를 사용해서 커서 위치에 라인 문자열을 가져온다.

가져온 문자열에서 이슈 번호를 찾기 위해 정규식(regular expression)을 사용한다. string-match 함수를 사용하고 \\( \\) 를 사용해 만든 그룹에 접근하려고 match-string 함수를 사용한다. match 함수는 전역 변수(global variable)를 사용하는데, 다른 match 함수 호출에 영향을 주지 않으려고 save-match-data 함수를 사용해서 match 데이터를 복원해준다.

이제 url을 만들어서 browse-url 함수로 웹브라우저로 연다.

링크

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