Emacsで、開いたときに読み取り専用として生成されたファイルにマークを付けたいのですが。私が見逃しているパズルの部分は、ファイルが「存在する」かどうかを確認する方法です。私は現在次のものを持っています:
;;
;; get file extension
;;
(defun get-ext (file-name)
(car (cdr (split-string file-name "\\."))))
;;
;; get the base name of the file
;;
(defun base-name (file-name)
(car (split-string file-name "\\.")))
;;
;; if an 'lzz' file exists for this header, mark it as read only
;;
(defun mark-read-only ()
(if (string= (get-ext (cur-file)) "h")
(if ( ??file-exists??? (concat (base-name (cur-file)) ".lzz") )
(toggle-read-only))))
「??? file-exists ???」には何を使用できますか?
これを見つけたら、適切なフック(find-file-hookだと思う)に「mark-read-only」を追加します。
[〜#〜]背景[〜#〜]
C/C++開発プロセスを簡略化するために、コードジェネレーターとして lzz を使用します。簡単に言うと、lzzは単一の入力ファイル(C/C++に非常に似ている)を受け取り、必要に応じてヘッダーファイルとソースファイルを生成します。
デフォルトでは、lzzには#lineディレクティブが含まれているため、デバッガーは生成されたソースではなく元のソースをポイントしますが、コンパイルの依存関係を減らすために、通常ヘッダーファイルでこれらのディレクティブを無効にします。その結果、テンプレートまたはインライン関数をデバッグするとき、デバッガーは通常、元のソースファイルではなく、生成されたヘッダーファイルを指します。
これは大した問題ではありませんが、最近、デバッグ時に表示されたファイルにすばやく変更を加えてから再構築することがわかりました。もちろん、これは通常、編集したファイルが生成され、ライブラリの再構築中に変更が「吹き飛ばされる」ため、行った変更が消えることを意味します。
[〜#〜]ソリューション[〜#〜]
皆さんの助けとコメントに感謝します。使用する正しい関数を指摘してくれた cobbal に特に感謝します。
これが結果のコードです(ここの他のコメントにも基づいて更新されています):
(defun cur-file ()
"Return the filename (without directory) of the current buffer"
(file-name-nondirectory (buffer-file-name (current-buffer)))
)
(defun mark-generated-as-read-only ()
"Mark generated source files as read only.
Mark generated files (lzz or gz) read only to avoid accidental updates."
(if
(or (string= (file-name-extension (cur-file)) "h")
(string= (file-name-extension (cur-file)) "cpp"))
(cond
(
(file-exists-p (concat (file-name-sans-extension (cur-file)) ".lzz"))
(toggle-read-only))
(
(file-exists-p (concat (file-name-sans-extension (cur-file)) ".gz") )
(toggle-read-only))
)
)
)
file-exists-p
「ファイルfilenameが存在する場合(それを読み取ることができるかどうかにかかわらず)tを返します。」