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))
)
)
)