문제 상황

rsync나 git으로 프로젝트를 다른 컴퓨터에 복사했을 때, .dir-locals.el 에 하드코딩된 절대 경로 때문에 에러 발생:

files--ensure-directory: Creating directory: Permission denied, /home/goqual

원인: .dir-locals.el 에 다른 컴퓨터의 홈 디렉토리 경로가 포함됨.

해결: 상대 경로 사용

잘못된 예 (절대 경로)

(org-mode . (
  (denote-directory . "/home/goqual/repos/work/project/docs/")
))

올바른 예 (상대 경로)

(org-mode . (
  (eval . (setq-local denote-directory
                      (expand-file-name "docs/"
                        (locate-dominating-file default-directory ".dir-locals.el"))))
))

핵심 함수

  • locate-dominating-file : 현재 디렉토리에서 상위로 올라가며 특정 파일을 찾음
  • expand-file-name : 상대 경로를 절대 경로로 확장
  • setq-local : 버퍼 로컬 변수 설정

적용 사례

~/repos/work/sks-gateway-forked/.dir-locals.el 수정:

((nil . ())
 (org-mode . (
   (eval . (setq-local denote-directory
                       (expand-file-name "docs/"
                         (locate-dominating-file default-directory ".dir-locals.el"))))
   (denote-known-keywords . ("solution" "test" "analysis"))
   (eval . (eldoc-mode -1))
   (eval . (org-indent-mode 1))
 )))

참고

  • .dir-locals.el 은 프로젝트별 Emacs 설정 파일
  • 여러 컴퓨터에서 공유하는 프로젝트는 반드시 상대 경로 사용
  • CMake 빌드 캐시(build/)에도 절대 경로가 남지만, 빌드 시 재생성되므로 무관