2010-04-07 12 views
56

Come posso creare un file vuoto da emacs, idealmente da un buffer diretto?Come posso creare un file vuoto in emacs?

Ad esempio, ho appena aperto un modulo Python in modalità dired, ho creato una nuova directory, l'ho aperta in dired e ora devo aggiungere un file vuoto __init__.py nella directory.

Se utilizzo C-x C-f __init__.py RET C-x C-s, emacs non crea il file perché non sono state apportate modifiche. Dovrei digitare il file, salvarlo, cancellare la mia digitazione e quindi salvarlo nuovamente affinché funzioni.

Grazie

+3

Io vivo con questo deadlock: Emacs è un potente editor di testo che può anche integrare un compilatore Scala, ecc. Ecc. Ma molte volte cose molto semplici sono complicate. Trovo più facile "toccare/percorso/su/nomefile" e successivamente aprirlo in Emacs piuttosto che provare a creare un nuovo file all'interno di Emacs, in particolare quando c'è un altro file con lo stesso nome o anche un nome simile. Emacs "cerca di aiutarmi" aprendo il file sbagliato. Per favore, non "cercare di aiutarmi!" ... fai semplicemente quello che ti ho detto che dovrebbe essere fatto! Sono abbastanza sicuro che ci debba essere un "plugin" (forse diretto) che lo faccia. Troppo complicata! ancora! –

+0

@RichardGomes Dopo aver usato la soluzione di phils per un paio d'anni, trovo molto più semplice scrivere semplicemente "_" e mi chiede un nome per il file. Emacs è decisamente molto complicato, ma non penso che sia troppo complicato. Molto di quello che ho fatto negli ultimi 5 anni è stato renderlo più complicato, oltre a radere tutti quei fastidiosi angoli. Ho sofferto esattamente dello stesso problema con il completamento come te, ma è risolvibile se puoi essere preso la briga di passare qualche anno a conoscere il sistema. – Singletoned

+1

'C-x C-f __init__.py RET C-x C-s' funziona bene per me (versione' 24.5.1'), quindi forse il problema è stato risolto da quando questa domanda era stata originariamente richiesta. – Jian

risposta

9

Ecco un adattamento di dired-create-directory. Funziona allo stesso modo, così come un semplice nome file, puoi anche specificare nuove directory madri (da creare nella directory corrente) per il file (ad esempio foo/bar/filename).

(eval-after-load 'dired 
    '(progn 
    (define-key dired-mode-map (kbd "C-c n") 'my-dired-create-file) 
    (defun my-dired-create-file (file) 
     "Create a file called FILE. 
If FILE already exists, signal an error." 
     (interactive 
     (list (read-file-name "Create file: " (dired-current-directory)))) 
     (let* ((expanded (expand-file-name file)) 
       (try expanded) 
       (dir (directory-file-name (file-name-directory expanded))) 
       new) 
     (if (file-exists-p expanded) 
      (error "Cannot create file %s: file exists" expanded)) 
     ;; Find the topmost nonexistent parent dir (variable `new') 
     (while (and try (not (file-exists-p try)) (not (equal new try))) 
      (setq new try 
       try (directory-file-name (file-name-directory try)))) 
     (when (not (file-exists-p dir)) 
      (make-directory dir t)) 
     (write-region "" nil expanded t) 
     (when new 
      (dired-add-file new) 
      (dired-move-to-filename)))))) 
+3

Anche se ho specificato un binding riservato dall'utente nel codice, in realtà ho associato a '_' che sul mio layout di tastiera è la sequenza spostata accanto a' + ', che significa le chiavi per" nuova directory "e" nuovo file "in dired sono uno accanto all'altro. – phils

+0

Ho cambiato questo per essere la risposta, in quanto è quella che sto usando a lungo termine. – Singletoned

52

È possibile utilizzare il comando touch:

M-! touch __init__.py RET 
+1

@ offby1, se lo aggiungi come risposta corretta, lo sceglierò, poiché è quello che funziona meglio per me. Usa perfino qualunque directory in cui si trova come cwd. – Singletoned

+1

Anche a me piace molto! Non mi piace digitare il M-! un po ', ma credo di poter cambiare la combinazione di tasti :) – Vivi

11

Emacs non vi permetterà di salvare un buffer a meno che non pensa che i contenuti sono cambiati. Il più veloce, anche se probabilmente non più pulito, è aprire il file usando C-x C-f, quindi premere (dire) spazio e backspace, quindi dovresti essere in grado di salvare un file senza contenuti.

Ci sono altri modi per cambiare il flag "buffer è stato modificato", ma non credo che sia più facile.

20

Se si vuole Emacs per il trattamento di tutti i nuovi file, come modificato, è possibile automatizzare la soluzione di questo tipo:

(add-hook 'find-file-hooks 'assume-new-is-modified) 
(defun assume-new-is-modified() 
    (when (not (file-exists-p (buffer-file-name))) 
    (set-buffer-modified-p t))) 
+0

Mi piace, e penso che probabilmente lo imposterò ugualmente, perché sembra un saner nel caso generale, ma il 'M-! touch __init __. py' è più breve e non implica l'apertura e la chiusura di un buffer. – Singletoned

+0

Utilizzato solo questo, grazie! :) – Josh

+0

@Singletoned: non è necessario inserirlo ogni volta. Inseriscilo nel tuo file init e ogni volta che crei un nuovo file con 'C-x C-f' apparirà in dired. È più veloce che digitare un comando di shell ('touch') ogni volta. – metakermit

26

le seguenti opere:

C-x b __init__.py RET C-x C-w RET

Se siete in un dired tamponare il file sarà salvato nella directory mostra qui.

Il trucco è innanzitutto creare un buffer vuoto passando a un nome che non esiste. Quindi scrivi il file.

+0

Questo metodo è ottimo perché crea un nuovo file, avvisa se esiste già e finisce con il nuovo file in un buffer aperto. Questo corrisponde al 99% dei casi d'uso. –

2

(shell-command (concat "touch " (buffer-file-name))) farà quello che vuoi, se hai già aperto il file vuoto.

5

Utilizzare il comando tattile.

M-! touch __init__.py RET 
0

Ho modificato risposta da MrBones e la funzione personalizzata creata con combinazione di tasti:

; create empty __init__.py at the place 
(defun create-empty-init-py() 
    (interactive) 
    (shell-command "touch __init__.py") 
) 
(global-set-key (kbd "C-c p i") 'create-empty-init-py) 

Questo è molto utile per non trascorrere del tempo sulla ricorrenti azione di creazione init .py ovunque in nuova Python cartella del progetto.

1

È possibile contrassegnare un buffer vuoto come modificato eseguendo set-buffer-modified-p. Quindi quando lo salvi, Emacs scriverà il file.

M-;       ; Eval 
(set-buffer-modified-p t) ; Mark modified 
C-x C-s      ; Save buffer 
2

In aggiunta alle altre risposte sulla pagina, è possibile utilizzare f.el 's funzione f-touch:

M-:(f-touch "__init__.py")RET

8

Programatically e senza alcuna dipendenza da touch, è abbastanza semplice:

(with-temp-buffer (write-file "path/to/empty/file/")) 
+0

Questo, AFAIC, è la risposta corretta – yPhil

0

L'opzione migliore sarebbe:

(with-temp-file "filename" 
    (insert "")) 
4

La via più breve

M-!> __init__.pyRET

+0

Questo è abbastanza intelligente e decisamente più breve dell'utilizzo del tocco. Sebbene la soluzione che sto usando sia @phils che la rende semplicemente '_' seguita da' __init __. Py'. – Singletoned

0

Io uso il seguente legato alla t in Dired.

(defun my-dired-touch (filename) 
    (interactive (list (read-string "Filename: " ".gitkeep"))) 
    (with-temp-buffer 
    (write-file filename))) 

;; optionally bind it in dired 
(with-eval-after-load 'dired 
    (define-key dired-mode-map "t" 'my-dired-touch)) 
Problemi correlati