소스 광산(source mine)을 만들어 언어별 코드 사용법을 쉽게 검색

1 minute read

소스 광산(source mine)이란 뭔가?

I’d recommend creating an elixir folder and cloning all of the open-source projects I reference below into it. Makes it very easy to grep (I’d recommend ripgrep, which is much better than grep) for various API usage patterns.

Building a Elixir & Phoenix Application - Michael Bianco - mikebian.co

참고할 만한 소스 코드를 로컬에 받아놓고 쉽게 찾아볼 수 있게 한다는 아이디어다. 좋은 아이디어 같아서 나도 시작했다. 뭔가를 캐낼 수 있는 광산이 떠올라서 소스 광산이라고 이름을 붙였다.

ripgrep을 쌩으로 왜 쓰냐? 내겐 emacs가 있는데. emacs에 해당 기능을 구현해보기로 했다.

참고할 만한 프로젝트를 선정하고 clone

이후에 늘려가기로 하고 C#은 .NET 런타임 소스 코드인 dotnet/runtime 프로젝트를 clone했고 elixir는 웹프레임워크인 phoenixframework/phoenix 프로젝트를 클론했다.

각각 ~/source_mine/csharp, ~/source_mine/elixir 디렉터리 밑에 clone했다.

소스 광산 디렉터리에서 검색하는 함수

(defun my/source-mine-csharp ()
  (interactive)
  (my/source-mine--do "csharp"))

(defun my/source-mine--do (lang)
  (let ((search-terms (my/source-mine--use-region-or-empty))
        (dir (my/source-mine--dir lang)))
    (+vertico/project-search t search-terms dir)))

(defun my/source-mine--use-region-or-empty ()
  (if (doom-region-active-p)
      (buffer-substring (doom-region-beginning) (doom-region-end))
    ""))

doom emacs에서 구현한 +vertico/project-search-from-cwd 함수 덕에 아주 손쉽게 구현했다. 선택한 영역이 있으면 그걸 초기 쿼리 문자열로 사용하고 없다면 비워서 시작한다. my/source-mine--dir 함수 인자로 언어를 넘기면 해당 언어에 해당하는 소스 광산 디렉터리를 리턴하게 했다.

소스 광산 언어별 디렉터리 구하기

(defun my/source-mine--dir (lang)
  (funcall
   (plist-get
    (nth 0 (auth-source-search
            :host "source_mine"
            :user lang
            :requires '(:secret)))
    :secret))
  )

로컬 디렉터리를 사용해서 설정으로 뺐다. 이런 로컬 설정을 담아두는 파일을 분리하기 귀찮아서 auth-source로 다 퉁쳤다. 쓸데없는 암호화 되겠다.

machine source_mine login csharp password ~/source_mine/csharp
machine source_mine login elixir password ~/source_mine/elixir

~/authinfo 파일에 위와 같은 방식으로 설정하면 된다.

검색 함수 키바인딩

M-x my/source-mine-csharp, M-x my/source-mine-elixir 같은 식으로 함수를 호출해도 되지만 하는 김에 키를 바인딩했다.

(map! :leader
      (:prefix-map ("S" . "custom search")
                   (:prefix-map ("m" . "source mine")
                    :desc "csharp" "c" #'my/source-mine-csharp
                    :desc "elixir" "x" #'my/source-mine-elixir
                    )))

emacs로 웹브라우저 검색을 편하게 하자와 동일한 prefix 키로 시작하고 m prefix 키를 하나 더 추가해서 키 바인딩을 했다. elixir 소스 광산을 검색하려면 SPC S m x 키를 누르면 된다.

링크

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