2010-04-07 22 views
56

¿Cómo puedo crear un archivo vacío de emacs, idealmente desde un búfer directo?¿Cómo creo un archivo vacío en emacs?

Por ejemplo, acabo de abrir un módulo de Python en modo directo, creé un nuevo directorio, lo abrí en dired y ahora necesito agregar un archivo __init__.py vacío en el directorio.

Si uso C-x C-f __init__.py RET C-x C-s, entonces emacs no crea el archivo porque no se han realizado cambios en él. Tendría que escribir el archivo, guardarlo, borrar mi tipeo y luego guardarlo nuevamente para que funcione.

Gracias

+3

Vivo con este punto muerto: Emacs es un poderoso editor de texto que incluso puede integrar un compilador de Scala, etc., pero muchas veces las cosas muy simples son muy complicadas. Me resulta más fácil "tocar/ruta/a/nombre de archivo" y más tarde abrirlo en Emacs que tratar de crear un nuevo archivo dentro de Emacs, en particular cuando hay otro archivo con el mismo nombre o incluso un nombre similar. Emacs "intenta ayudarme" abriendo el archivo incorrecto. Por favor, ¡no intentes ayudarme! ¡Haz lo que te dije que se debe hacer! Estoy bastante seguro de que debe haber un "complemento" (quizás directo) que hace eso. ¡Sobrecomplicado! ¡de nuevo! –

+0

@RichardGomes Después de haber estado usando la solución de phils durante un par de años, me resulta mucho más fácil escribir "_" y me pide un nombre de archivo. Emacs es definitivamente muy complicado, pero no creo que sea demasiado complicado. Mucho de lo que le he hecho durante los últimos 5 años ha sido hacerlo más complicado, así como eliminar todos esos rincones molestos. Sufrí exactamente el mismo problema con la finalización que tú, pero es reparable si puedes molestarte en pasar unos años conociendo el sistema. – Singletoned

+1

'C-x C-f __init__.py RET C-x C-s' funciona bien para mí (versión' 24.5.1'), así que tal vez el problema se haya resuelto ya que esta pregunta fue hecha originalmente. – Jian

Respuesta

9

Aquí hay una adaptación de dired-create-directory. Funciona de la misma manera, por lo que, además de un nombre de archivo simple, también puede especificar nuevos directorios principales (que se crearán en el directorio actual) para el archivo (por ejemplo, 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

Aunque he especificado un enlace reservado por el usuario en el código, de hecho lo he vinculado a '_', que en mi distribución de teclado es la secuencia desplazada junto a' + ', que significa las teclas para" nuevo directorio "y" nuevo archivo "en dired están uno al lado del otro. – phils

+0

He cambiado esto para ser la respuesta, ya que es el que estoy usando a largo plazo. – Singletoned

52

Puede utilizar el comando touch:

M-! touch __init__.py RET 
+1

@ offby1, si agrega eso como una respuesta correcta, lo elegiré, ya que es el que mejor funciona para mí Incluso utiliza el directorio en el que se encuentra la dirección como cwd. – Singletoned

+1

¡Me gusta mucho, también! ¡Simplemente no me gusta escribir el M-! poco, pero creo que puedo cambiar la combinación de teclas :) – Vivi

11

Emacs no le permitirá guardar una memoria intermedia a menos que piense que los contenidos han cambiado. El más rápido, aunque posiblemente no es el más limpio, es abrir el archivo usando C-x C-f, luego presionar (decir) el espacio y retroceder, entonces usted debería poder guardar un archivo sin contenido.

Existen otras formas de cambiar el indicador "buffer is modified", pero no creo que sea más fácil.

20

Si desea Emacs para el tratamiento de todos los archivos nuevos como modificados, puede automatizar la solución de la siguiente manera:

(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

Me gusta esto, y creo que probablemente lo configuro de todos modos, porque parece ser más sensato en el caso general, pero el 'M-! touch __init __. py' es más corto y no implica abrir y cerrar un buffer. – Singletoned

+0

Acabo de utilizar esto, gracias! :) – Josh

+0

@Singletoned - no tiene que ingresar esto cada vez. Simplemente colóquelo en su archivo init y cada vez que cree un nuevo archivo con 'C-x C-f' se mostrará en directo. Eso es más rápido que escribir un comando de shell ('touch') cada vez. – metakermit

26

las siguientes obras:

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

Si estás en un DIRED amortiguar el archivo se guardará en el directorio mostrar aquí.

El truco es crear primero un búfer vacío cambiando a un nombre que no existe. Luego escribe el archivo.

+0

Este método es excelente porque crea un archivo nuevo, advierte si ya existe y termina con el nuevo archivo en un búfer abierto. Esto coincide con el 99% de mis casos de uso. –

2

(shell-command (concat "touch " (buffer-file-name))) hará lo que quiera, si ya ha abierto el archivo vacío.

5

Use el comando táctil.

M-! touch __init__.py RET 
0

He modificado respuesta de MrBones y la función personalizada creada con la combinación de teclas:

; 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) 

Esto es muy útil para no perder tiempo en los recurrentes acción de crear init .py en todas partes de nuevo Python carpeta de proyecto.

1

Puede marcar un búfer vacío modificado mediante la ejecución de set-buffer-modified-p. Luego, cuando lo guarde, Emacs escribirá el archivo.

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

Además de otras respuestas en la página, puede utilizar f.el 's función f-touch:

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

8

Programatically y sin ninguna dependencia de touch, es bastante fácil:

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

Esto, AFAIC, es la respuesta correcta – yPhil

0

La mejor opción sería:

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

El camino más corto

M-!> __init__.pyRET

+0

Eso es bastante inteligente, y definitivamente más corto que usar el tacto. Aunque la solución que estoy usando es @phils, lo que hace que sea '_' seguido de' __init __. Py'. – Singletoned

0

utilizo el siguiente unido a t en 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)) 
Cuestiones relacionadas