2009-06-03 20 views
58

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

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 –

+9

Nota: le prime due funzioni sono fornite con Emacs, sono denominate 'nome-file-estensione e' nome-file-sans-extension –

risposta

79

provare file-exists-p

"ritorno t se il file esiste il nome del file (anche se non si può leggere.) "

+2

Perché questo non la funzione appare quando faccio una ricerca "CH a" per essa? Ho provato a cercare il file e passare attraverso i risultati per "esiste", e non ci sono assolutamente corrispondenze per esiste! –

+0

sì, ho provato a cercare "esiste" in quel modo, poi ho trovato la funzione 'find-file-existing' in files.el, l'ho aperta e ho trovato il file-exists-p. Non so perché non compare sotto C-H a – cobbal

+12

file -esist-p non appare sotto "C-H a" perché non è una funzione "interattiva". Dovrebbe comunque apparire sotto "M-x apropos". – Edric

14
  • a seconda di che cosa avete bisogno, si potrebbe desiderare file-readable-p invece di file-exists-p.

  • Apropos ti porterà solo lontano. Icicles fornisce apropos completion e progressive completion che consentono di trovare facilmente la guida per i nomi comando, funzione, variabile, ecc. Che corrispondono alle sottoparti in un ordine arbitrario (è file-exists-p o exists-file-p?).

7

Utilizzare f.el, libreria moderna per la manipolazione di file e directory. È possibile utilizzare f-exists?, f-file?, e molti altri predicati. La libreria è migliore delle funzioni standard, perché è ogni funzione relativa ai file di cui avrai mai bisogno in uno spazio dei nomi.

Problemi correlati