プロジェクト ファイルを次の形式で設定しています。
/home/user/proj/source
/home/user/proj/source/src1
/home/user/proj/source/src1
/home/user/proj/header ...etc
ソースファイルを表示するときにプロジェクトパスを見つける方法があります
"/home/user/proj"
また、(buffer-file-name) は、指定されたソース ファイルの完全な絶対パスを示します。
ソースファイルの相対パスを抽出する Lisp 関数の書き方は?
つまり、私が見ている場合
/home/user/proj/source/src1/file.c
パスが欲しい
"source/src1/file.c"
次の関数は、プロジェクト パスを提供します。
(defun upward-find-file (filename &optional startdir)
(let ((dirname (expand-file-name
(if startdir startdir ".")))
(found nil) ; found is set as a flag to leave loop if we find it
(top nil)) ; top is set when we get
; to / so that we only check it once
; While we've neither been at the top last time nor have we found
; the file.
(while (not (or found top))
; If we're at / set top flag.
(if (string= (expand-file-name dirname) "/")
(setq top t))
; Check for the file
(if (file-exists-p (expand-file-name filename dirname))
(setq found t)
; If not, move up a directory
(setq dirname (expand-file-name ".." dirname))))
; return statement
(if found (concat dirname "/") nil)))
メインのプロジェクトフォルダには常に「Makefile」があるので、
(setq dirname (upward-find-file "Makefile" startdir))
それを大事にします。