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
risposta
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".
bello, non ero sicuro di come ottenere il nome del file nel comando. – spike
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
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/ –
Io faccio così: inserisci uno spazio, alla fine cancelli di nuovo lo spazio e salvo. Questo cambia il mtime.
sì, è quello che sto facendo anche io, ma ci deve essere un modo emacs – spike
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). –
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))))
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. –
@GregMattes: fondamentalmente equivale a "modificare" il buffer e quindi a salvarlo (senza effettivamente modificare il contenuto del buffer). – jtahlborn
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. –
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. Come ottenere informazioni sul buffer/file corrente in emacs?
- 2. Come caricare il buffer corrente nell'interprete Python in Emacs?
- 3. emacs keybinding per compilare il file C
- 4. Emacs: sistema di codifica del buffer corrente
- 5. goto-file in Emacs
- 6. Ottieni il percorso del file di script emacs corrente quando viene caricato con il parametro -l
- 7. Trova il file corrente in IntelliJ
- 8. Percorso file negli appunti in Emacs
- 9. Vim: esegue il file corrente?
- 10. Delete corrente (non-atomico) s-espressione in Emacs
- 11. Come posso verificare se esiste un buffer corrente in Emacs?
- 12. Emacs: dove inserire il file psvn.el?
- 13. come aprire il file * .info in emacs in modalità info?
- 14. Come posso eliminare la riga corrente in Emacs?
- 15. Elimina dalla posizione corrente all'inizio della riga in emacs?
- 16. Come inserire l'ora corrente in emacs org-mode
- 17. Come accedere ai contenuti della regione corrente in Emacs Lisp?
- 18. In Emacs come eliminare dalla riga corrente alla fine del file?
- 19. Il file init.el Emacs non viene caricato
- 20. Come sostituire una stringa in un file esistente in Perl, mentre non tocca i file non modificati
- 21. Come ottengo il file corrente, la classe corrente e il metodo corrente con Python?
- 22. Come posso accedere al percorso della directory corrente in un file di variabili di directory emacs?
- 23. Android: rilevare quando ScrollView tocca il fondo
- 24. elisp: comando di chiamata sul file corrente
- 25. Emacs: problema con il file dei tag?
- 26. Emacs: controllare il sistema senza finestra in .emacs
- 27. Comando Emacs per la ricerca nei file
- 28. Come aprire il file in Emacs tramite eshell?
- 29. Gedit - Strumenti esterni specificano il file corrente
- 30. Come trovo il nome file eseguibile corrente?
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
Vorrei che le persone non chiudessero le domande senza leggerle attentamente . Questa è in realtà una buona domanda. – Nemo