2012-01-24 6 views
14

Im emacs, voglio eseguire "touch" sul file a cui fa riferimento il buffer corrente (in particolare si desidera modificare l'ora di modifica). Io uso guard per eseguire alcuni test dopo che i file sono stati modificati, ma a volte voglio richiamarlo manualmente. Non mi interessa eseguire il vero tocco di utilità della shell fintanto che è impostato mtime."Tocca" il file corrente in emacs

+2

Questo non è un duplicato di quella domanda. Non voglio che il file venga salvato, voglio solo che il file mtime sia aggiornato (da qui la necessità di touch, non la pura soluzione emacs di @jtahlborn) – spike

+1

Vorrei che le persone non chiudessero le domande senza leggerle attentamente . Questa è in realtà una buona domanda. – Nemo

risposta

7

Naturalmente, si presume che sul percorso sia presente un comando denominato touch.

(defun touch() 
    "updates mtime on the file for the current buffer" 
    (interactive) 
    (shell-command (concat "touch " (shell-quote-argument (buffer-file-name)))) 
    (clear-visited-file-modtime)) 

In modalità dired c'è un comando touch vincolati per default T. Questo comando non è così facile da usare, anche perché richiede all'utente un timestamp. Suppongo che sia molto generale, ma non è un modo molto conveniente per fare ciò che è in genere inteso dal "tocco".

+0

bello, non ero sicuro di come ottenere il nome del file nel comando. – spike

+2

Cosa succede se il nome del buffer contiene degli spazi? O termina con "; rm -rf /"? Suggerirei di usare '(argomento-shell-quote (nome-file-buffer))' – Nemo

+0

Se contiene degli spazi, allora alcune virgolette lo faranno - lo aggiungerò. Se stai nominando i tuoi file con "; rm -rf /" allora ti meriti quello che ottieni! :) Mi ricorda questo: http://xkcd.com/327/ –

3

Io faccio così: inserisci uno spazio, alla fine cancelli di nuovo lo spazio e salvo. Questo cambia il mtime.

+2

sì, è quello che sto facendo anche io, ma ci deve essere un modo emacs – spike

+0

sì, è più o meno quello che faccio anch'io, ma ho scritto una funzione lisp che ti aiuterà (vedi la mia risposta a questa domanda). –

4

Ecco un modo emacs pura per farlo:

(defun touch-file() 
    "Force modification of current file, unless already modified." 
    (interactive) 
    (if (and (verify-visited-file-modtime (current-buffer)) 
      (not (buffer-modified-p))) 
     (progn 
     (set-buffer-modified-p t) 
     (save-buffer 0)))) 
+1

Mi piace la soluzione elisp" pura "che non richiede la chiamata alla shell, ma questo approccio cambia semplicemente il timestamp o scrive l'intero buffer al file? Anche il comando touch della modalità dired richiama la shell per richiamare il comando touch. Ciò di cui abbiamo veramente bisogno è una funzione elisp che invochi utime() in C dal processo di Emacs. –

+0

@GregMattes: fondamentalmente equivale a "modificare" il buffer e quindi a salvarlo (senza effettivamente modificare il contenuto del buffer). – jtahlborn

+1

Sì, esattamente. Questo potrebbe causare un sacco di I/O se vengono toccati molti file perché l'intero contenuto viene salvato. Ad esempio, il richiedente domanda è interessato a toccare i file per forzare i test. Potrei immaginare che potrebbe scrivere qualche elis per toccare automaticamente un insieme di file, possibilmente un grande insieme di file. Quindi scrivere l'intero file invece di solo mutare il mtime nell'inode potrebbe essere molto significativo. Non sto dicendo che il tuo approccio sia sbagliato. In effetti, è davvero bello avere tutto in un elisp indipendente dalla piattaforma senza invocare un comando di shell esterno. –

6

forse più sequenze di tasti di una funzione personalizzata, ma si può fare questo fuori dalla scatola con C-u M-~ poi C-x C-s.

M-~ è vincolato per default not-modified, che cancella bandiera modifica del tampone, a meno che chiama con un argomento (C-u prefisso), nel qual caso fa il contrario. Quindi basta salvare il buffer.

+1

Tip cool, stessi commenti come nella risposta di @ jtahlborn – spike

+0

@spike, ho notato quel commento dopo la pubblicazione, e sono d'accordo, il tatto è meglio. – harpo

Problemi correlati