Desidero che emacs contrassegni i file che vengono generati come di sola lettura quando vengono aperti. La parte del puzzle che mi manca è come verificare se un file "esiste". Attualmente ho il seguente:Come posso verificare se un file esiste usando Emacs Lisp?
;;
;; 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))))
Cosa posso usare per "??? file-exists ???"?
Una volta trovato questo, aggiungerò "mark-read-only" al gancio appropriato (che penso sia il find-file-hook).
BASSA
Usiamo lzz come generatore di codice per semplificare il nostro processo di sviluppo C/C++. In breve, lzz prende un singolo file di input (che assomiglia molto a C/C++) e genera i file di intestazione e origine come appropriato.
Per impostazione predefinita, lzz include le direttive #line in modo che il debugger punti all'origine originale e non all'origine generata, tuttavia, per ridurre le dipendenze di compilazione, di solito queste direttive vengono disabilitate nei file di intestazione. Il risultato è che durante il debug di modelli o funzioni inline, il debugger punta normalmente al file di intestazione generato e non al file di origine originale.
Questo non è un grosso problema, tuttavia, recentemente ho scoperto che durante il debug eseguirò una rapida modifica al file visualizzato e quindi lo ricostruirò. Ovviamente questo normalmente significa che la modifica apportata scompare perché il file che ho modificato viene generato e quindi le modifiche vengono "spazzate via" durante la ricostruzione della libreria.
SOLUZIONE
Grazie a tutti per l'aiuto e commenti. Un ringraziamento speciale a cobbal per indicare la funzione corretta da utilizzare.
Ecco il codice risultante (con aggiornamenti in base agli altri commenti anche qui):
(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))
)
)
)
Invece di inserire commenti sopra le tue funzioni, in Elisp puoi scriverli nella prima riga di una dichiarazione di funzione. Ha chiamato il "docstring". Vedi http: //www.gnu.org/software/emacs/elisp/html_node/Documentation-Basics.html –
Nota: le prime due funzioni sono fornite con Emacs, sono denominate 'nome-file-estensione e' nome-file-sans-extension –