이맥스와 이맥스의 모드를 이용해 블로그를 만들어보자. 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 문서를 참고하자.
결과
- org 모드 문서 작성이 꽤 편하다
- emacs는 어렵다. 하지만 spacemacs는 쉬운 편이다.