---
title: "Emacs dir-locals 상대경로 설정"
url: "https://notes.junghanacs.com/notes/20251124T160230"
author: "Junghan Kim"
date: "2025-11-24T16:02:00+09:00"
lastmod: "2025-11-24T16:02:00+09:00"
tags: ["denote","emacs"]
description: "다른 컴퓨터로 프로젝트를 옮길 때 dir-locals 절대 경로 문제를 상대 경로로 해결한 노트이다."
---

> [!abstract] 이 노트에 대하여
> 
> rsync나 git으로 프로젝트를 옮길 때 .dir-locals.el에 박힌 절대 경로가 깨지는 문제를 상대 경로 설정으로 해결한다. Emacs 프로젝트 이식성을 높이는 작은 실용 노트다.

## 문제 상황

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

```text
files--ensure-directory: Creating directory: Permission denied, /home/tbdhny
```

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

## 해결: 상대 경로 사용

### 잘못된 예 (절대 경로)

```emacs-lisp
(org-mode . (
  (denote-directory . "/home/tbdhny/repos/work/project/docs/")
))
```

### 올바른 예 (상대 경로)

```emacs-lisp
(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` 수정:

```emacs-lisp
((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/`)에도 절대 경로가 남지만, 빌드 시 재생성되므로 무관
