Guardar el archivo actual con un nombre ligeramente diferente

17

Mis archivos tienen nombres largos y una parte del nombre de archivo es una fecha y un número de versión. A menudo me gustaría guardar el archivo en el búfer usando casi el mismo nombre, solo cambie el número de versión o la fecha.

Esto sería mucho más fácil si tuviera un comando que coloque el nombre de archivo del búfer actual en el anillo de eliminación, de modo que pueda abrir un archivo, luego escribir C-x C-w(escribir archivo), extraer el nombre actual con Cy, cambiarlo y guardar eso.

Estoy usando Emacs 24.3 en Windows y 24.4 en Linux. Tengo que usar diferentes nombres de archivo y no git por varias razones. Estaría feliz si este comando funcionara con AUCTeX / LaTeX como modo principal.


Editar 1:

Cometí un error: no quiero escribir C-x C-f(= buscar archivo), pero C-x C-w(= escribir archivo). He corregido esto arriba.

Edición 2:

Encontré una pregunta y respuesta duplicadas: /unix//a/45381 ¡ Pero no hay mejor respuesta!

Edición 3:

Aquí: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html es una función, que selecciona la parte "no directiva" del nombre de archivo:

Función: nombre-archivo-nondirectory nombrearchivo

This function returns the nondirectory part of filename.

          (file-name-nondirectory "lewis/foo")
               ⇒ "foo"
          (file-name-nondirectory "foo")
               ⇒ "foo"
          (file-name-nondirectory "lewis/")
               ⇒ ""

Si tan solo supiera lisp ...

Keks Dose
fuente
Oh, hola Keks :) Me he preguntado esto muchas veces ... buena pregunta. Y Lisp es fácil ......
Sean Allred
Acabo de encontrar esta pregunta ... Por curiosidad: ¿hay "varias razones" relacionadas con el asesor / coautor ...?
mbork
1
@mbork Soy abogado y escribo cartas y contratos. Abrir una carta reciente a alguien, renombrarla, borrar el contenido y comenzar a escribir una nueva para la misma persona es más rápido que comenzar desde cero. Pero con respecto a los contratos, renombrarlos es un mal sustituto de un cvs, pero nunca he conocido a otro abogado que use LaTeX y Git, por lo que tengo que darle a una nueva versión de un contrato un nuevo nombre de archivo ...
Keks Dose
Lo suficientemente justo. ¿Qué hay de YASnippet? Parece muy adecuado para su caso de uso.
mbork
@mbork Sí, para mis plantillas estoy usando YASnippets, desde hace años. LaTeX, Emacs, orgmode, YASnippets hacen que mi PC sea mucho más confiable que Word y Outlook. Bien, estoy escribiendo esto en una máquina Linux, pero eso es algo que realmente no se puede esperar del servicio de asistencia de TI habitual: admitir Linux en lugar de Windows.
Keks Dose

Respuestas:

23

No hay necesidad de hacer todo eso.

Simplemente:

  1. Aún en el archivo original, presiona C-x C-w. Se le solicitará un nuevo nombre de archivo.
  2. Presione M-n, y el nombre de archivo actual se insertará por usted.
  3. Edita lo que quieras y presiona RETpara guardar el archivo con este nuevo nombre.

Aún tendrá el archivo original. Si desea volver a él, simplemente visítelo nuevamente con C-x C-f.

Malabarba
fuente
Eché un vistazo al manual de Emacs sobre Archivos / Guardar, pero no encontré este truco. ¿Como lo descubriste? ¡Excelente!
Keks Dose
44
No estoy seguro. Es una cosa general sobre los avisos de minibúfer. Golpear Mp pasa por la historia, y golpear Mn te da la opción "actual".
Malabarba
55
Si está usando ido, hágalo C-fprimero y luego M-n.
Kaushal Modi
1
Wow, nunca supe esto. ¡Gracias! (Perdón por el comentario "gracias, yo también", pero este es un gran ejemplo de aprender algo simple pero útil. Viva la emacs.stackexchange!
Mark Aufflick
3

Copiar el nombre del archivo en el búfer actual

Aquí hay una función que uso del blog de Cameron Desautels que copia el nombre del archivo de búfer actual y lo muestra en el minibúfer.

 
;; Fuente: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  "Muestra la ruta completa al archivo actual en el minibúfer y también cópialo en el anillo de eliminación".
  (interactivo)
  (let ((nombre-archivo (nombre-archivo-buffer)))
    (si nombre-archivo
        (progn
          (nombre de archivo del mensaje)
          (kill-new-file-name))
      (error "El búfer no visita un archivo"))))

Renombrar el nombre del archivo en el búfer actual

Magnar Sveen ha implementado la siguiente función en uno de sus blogs que convenientemente renombra el búfer actual de una sola vez. Esto no es lo que solicitó, pero pensé que podría estar relacionado con su caso de uso.

;; Fuente: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Renombra el búfer actual y el archivo que está visitando".
  (interactivo)
  (let ((nombre (nombre del búfer))
        (nombre de archivo (nombre-archivo-búfer)))
    (if (not (y filename (file-exist-p filename)))
        (error "nombre de búfer '% s' no está visitando un archivo!")
      (let ((new-name (read-file-name "New name:" filename)))
        (if (get-buffer new-name)
            (error "¡Ya existe un buffer llamado '% s'!" new-name)
          (renombrar-archivo nombrearchivo nombre-nuevo 1)
          (rename-buffer new-name)
          (nombre-archivo-visitado-nuevo nombre-nuevo)
          (set-buffer-modified-p nil)
          (mensaje "El archivo '% s' se renombró correctamente a '% s'".
                   nombre (nombre-archivo-nuevo-no-directorio))))))))
Kaushal Modi
fuente
La solución de Magnar Sveen elimina el archivo original y solo habrá el archivo renombrado después. Esto es útil, pero necesito mantener el archivo antiguo y el renombrado. La función de Cameron Desautel copia el nombre del archivo con toda la ruta. Esto está bastante cerca de la solución que necesito. ¿Sabes cómo cambiar esta función, de modo que solo derrame el nombre de archivo sin la ruta? Sin embargo, muchas gracias.
Keks Dose
1
@KeksDose simplemente cambia (buffer-file-name)a (file-name-nondirectory (buffer-file-name))en la primera función para obtener el nombre de archivo sin directorio.
nispio