스페이스맥스 / ORG-ROAM으로 블로깅하기

2022/01/06

이맥스와 이맥스의 모드를 이용해 블로그를 만들어보자. Roam Research라는 노트앱을 쓰다보니 조금 더 본격적으로 정리해보고 싶어 환경을 찾아보았다. 많은 기능을 제공하는 노트앱이 이미 많지만, 조금 더 재밌게 해보고 싶어 평소 관심있던 emacs를 써보기로 한다.

emacs 배포판은 spacemacs를 사용한다. 맨땅에서 시작하기를 시도했으나 도저히 안될 것 같아 포기한다.

모드

roam-research와 비슷한 경험을 만들어보고 싶어 아래 모드를 설치하기로 한다.

설정

spacemacs는 레이어를 추가하면 간단하게 모드 세팅이 되는 듯 하다. 아래 설정은 구글링을 통해 어디선가 보고 작성해두었는데, 다시 찾으려니 안나온다.

SPC f e d 를 눌러 init.el 문서를 열어 dotspacemacs/layers 함수에 아래 코드를 추가한다

(org :variables
     org-enable-roam-support t
     org-enable-hugo-support t)

org 레이어가 추가되며, ox-hugo와 org-roam도 추가 설치된다.

org-roam 관련 설정을 dotspacemacs/user-config 에 추가한다.

  (use-package org-roam
    :after org
    :ensure t
    :init
    (setq org-directory (file-truename "~/org")
          org-roam-directory (file-truename "~/org/roam")
          org-roam-completion-everywhere t)
    :config
    (org-roam-db-autosync-mode)
    (org-roam-setup)

    (setq org-roam-capture-templates
          '(
            ("n" "notes" plain "%?"
           :target (file+head "note/%<%Y%m%d%H%M%S>-${slug}.org"
                              "#+SETUPFILE:./hugo_setup.org
#+HUGO_SLUG: ${slug}
#+HUGO_SECTION: notes
#+TITLE: ${title}\n")
           :unnarrowed t)
            ("b" "blogs" plain "%?"
             :target (file+head "blog/%<%Y%m%d%H%M%S>-${slug}.org"
                                "#+SETUPFILE:./hugo_setup.org
#+HUGO_SLUG: ${slug}
#+HUGO_SECTION: blog
#+TITLE: ${title}\n")
             :unarrowed t)
             ("p" "private" plain "%?"
              :target (file+head "private/%<%Y%m%d%H%M%S>-${slug}.org"
                                 "#+TITLE: ${title}\n")
              :unnarrowed t)
             )
          )
    )

use-package를 사용해 패키지 관련 설정을 해보자. org-directory, org-roam-directory를 미리 만들어두고 세팅해둔다.

org-roam의 template으로 note, blog, private을 설정했다. note는 wiki 개념으로, blog는 블로그 발행글이다. private은 개인 보관용으로 export하지 않는다.

template 설정 시 HUGO_SLUG, HUGO_SECTION과 같이 필요한 사항을 템플릿에 포함시킬 수 있다. hugo 관련 설정은 ox-hugo에서 볼 수 있다.

hugo_setup 파일 설정을 추가하면 관련 설정을 hugo_setup 파일에서 가져오는 듯 하다.

ox-hugo 모드 설정을 한다.

(use-package ox-hugo
  :after org
  :ensure t
  :after ox
  :custom
  (org-hugo-base-dir (file-truename "~/blog")))

export 할 hugo 블로그 디렉토리를 설정한다.

org-roam 관련 설정을 추가하자.

(with-eval-after-load 'org-roam
  (defun koo/sync-hugo-tags ()
    "org의 filetags를 설정한 경우, 저장 시 이를 hugo_tags 설정에도 반영한다"
    (interactive)
    (let ((filetags (car (cdr (car (org-collect-keywords '("filetags"))))))
          )
      (if filetags
          (org-roam-set-keyword "hugo_tags"
                                (mapconcat 'identity
                                           (cdr (split-string filetags ":"))
                                           " "))
        (org-roam-erase-keyword "hugo_tags"))
      )
    )

  (defun koo/org-roam-export-all ()
    "org-roam 디렉토리 문서 중 hugo_setup.org를 포함한 문서를 모두 내보내기한다"
    (interactive)
    (org-roam-update-org-id-locations)
    (dolist (f (org-roam-list-files))
      (with-current-buffer (find-file f)
        (when (s-contains? "hugo_setup.org" (buffer-string))
          (org-hugo-export-wim-to-md)
          ))))

  (add-hook 'before-save-hook 'koo/sync-hugo-tags)
  )

이제 설정을 리로드한다.

문서 작성

org-roam 문서를 추가해보자. SPC a o r c 로 지정된 템플릿을 선택해 문서를 추가할 수 있다. 작성이 완료되면 koo/org-roam-export-all 함수를 호출해 내보내기 한다.

블로그 생성

hugo 문서를 참고하자.

결과