Cambiar el nombre del archivo actual en Vim


392

¿Cómo debo cambiar el nombre de mi archivo actual en Vim?

Por ejemplo:

  • Estoy editando person.html_erb_spec.rb
  • Me gustaría cambiarle el nombre a person.haml_spec.rb
  • Me gustaría continuar editando person.haml_spec.rb

¿Cómo haría para hacer esto, elegantemente?

Respuestas:


87

Hay un pequeño complemento que te permite hacer esto.


99
Esta versión actualizada de Rename.vim maneja CWD correctamente, siempre guarda el archivo en el directorio del original.
sickill

48
P: "¿qué tipo de bicho raro sociópata pone espacios en el nombre del directorio?" - R: el tipo que comenzó el proyecto hace mucho tiempo y que ahora es tu jefe ... ascendió de la codificación a su verdadera área de experiencia: siguiendo las modas de la metodología de desarrollo y forzándolas en el equipo.
Stabledog

3
@AaronMahan He arreglado Rename2.vim (sin tener en cuenta la versión DelvarWorld más inteligente pero más compleja) para permitir espacios en los caminos y lo bifurqué aquí: github.com/aehlke/vim-rename3 ¡No dude en enviar solicitudes de extracción para una funcionalidad aún más inteligente!
aehlke

44
@Stabledog Microsoft, aparentemente. Program Files (x86). Cada vez que se necesita trabajar con este directorio, se debe incluir entre comillas. Lo cual es mucho.
JackHasaKeyboard

55
@JackHasaKeyboard: +10. "Archivos de programa (x86)" gana el "peor nombre de directorio de todos los tiempos en un sistema operativo que carece de enlaces simbólicos". :)
Stabledog

451

Se llama al comando :saveas, pero desafortunadamente no eliminará su archivo anterior, tendrá que hacerlo manualmente. ver :help saveaspara más información.

EDITAR:

La mayoría de las instalaciones de vim tienen un explorador de archivos integrado, que puede usar para tales operaciones. Intente :Exploreen modo comando (en realidad lo asignaría a una tecla de función, es muy útil). Puede cambiar el nombre de los archivos Ro eliminarlos con D, por ejemplo. Pero presionar <F1>el explorador le dará una mejor visión general.


66
No creo que sea incómodo en comparación con otros editores donde normalmente no puedes mover un archivo. En su lugar, debe ir al administrador de archivos de su elección, cambiar el nombre del archivo y volver a su editor. Si tiene suerte, debe salir y reiniciar su editor si no recibió la notificación de cambio de nombre de archivo.
Rafael Bugajewski

130
También te puede
interesar

66
Además,: e abrirá explorar en el panel actual. Menos emocionante que: Sexo pero más eficiente;).
Josh

56
Para los intrépidos, vertical: El sexo es: Vex.
hobbes3

55
@ Josh: E funciona para mí, e no funciona para mí. Yo uso: e para editar otro archivo en la misma ventana.
omar

159

Si usa git y ya tiene el complemento tpope fugitive.vim , simplemente:

:Gmove newname

Esta voluntad:

  1. Cambie el nombre de su archivo en el disco.
  2. Cambie el nombre del archivo en git repo.
  3. Vuelva a cargar el archivo en el búfer actual.
  4. Preservar el historial de deshacer.

Si su archivo aún no se agregó a un repositorio de git, primero agréguelo:

:Gwrite

44
Lágrimas saliendo de mis ojos. La respuesta perfecta!
Farid Nouri Neshat

3
¡Sacrifiqué dos cabras en honor a esta respuesta! Pero tengo un pequeño problema, porque tienes que escribir la ruta desde la raíz del árbol de trabajo; y esto a menudo se vuelve bastante largo en cualquier proyecto. ¿Hay una solución para esto?
xor

1
¡Eso es genial! Sigo encontrando cosas nuevas que el fugitivo puede hacer.
Rich Churcher

8
@xxor: como se menciona en la respuesta de Mesco, puede usar Ctrl + R% para insertar el nombre de archivo actual, que luego puede editarse.
deltab

44
Para combinar algunos comentarios aquí: :Gmoverequiere la ruta relativa para el nuevo nombre de archivo. Una buena manera de hacerlo es escribir lo :Gmove <ctrl-r>%que agrega la ruta / nombre de archivo actual.
Shmup

80

Lo estoy haciendo con el complemento NERDTree:

:NERDTreeFind

entonces presione m

Para cambiar el nombre, puede elegir (m)ove the current nodey cambiar el nombre del archivo. También hay opciones como eliminar, copiar, mover, etc.


1
sabes qué, esa es la forma principal en la que renombro las cosas en estos días
Sam Saffron

2
Este funciona muy bien. Definitivamente lo recomiendo.
Matt Setter

Me encanta la idea Este será mi método principal de cambio de nombre de archivo ahora.
SLN

72
  • Escriba el archivo mientras edita - :w newname- para crear una copia.
  • Comience a editar la nueva copia - :e#.
  • (Opcionalmente) elimine la copia anterior - :!rm oldname.

En Windows, el tercer paso opcional cambia un poco:

  • (Opcionalmente) elimine la copia antigua de Windows - :!del oldname.

3
Utilizo este enfoque todo el tiempo, sin embargo, la desventaja es que pierdes tu árbol de deshacer, por lo que no puedes deshacer nada antes de: e
rampion el

77
Agradable. Aparentemente Ctrl-6 hace lo mismo que: e #
glenn jackman

También puede abrir el directorio, mover el cursor al archivo y presionar "D" para eliminar un archivo.
Peder

38
La forma más directa de imho es 1) cambiar el nombre del búfer actual :f newname2) guardarlo :w3) (opcionalmente) !rm oldname. La ventaja es que se conserva su historial de deshacer.
kynan

3
:saveases mejor en ese sentido, @rampion, y hace lo que escribió @kynan.
lericson

36

Si el archivo ya está guardado:

:!mv {file location} {new file location}
:e {new file location}

Ejemplo:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

Requisitos de permiso:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

Guardar como:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Para Windows sin verificar

:!move {file location} {new file location}
:e {new file location}

55
Al menos podría explicar por qué rechazó esta respuesta.
Benjamin

31

Lo recomendaría :Renamedel eunuco de tpope para esto.

También incluye un montón de otros comandos útiles.

El comando Renombrar se define de la siguiente manera actualmente (consulte el repositorio para ver si hay actualizaciones):

command! -bar -nargs=1 -bang -complete=file Rename :
  \ let s:file = expand('%:p') |
  \ setlocal modified |
  \ keepalt saveas<bang> <args> |
  \ if s:file !=# expand('%:p') |
  \   call delete(s:file) |
  \ endif |
  \ unlet s:file

31

También puedes hacerlo usando netrw

El comando explorar abre netrw en el directorio del archivo abierto

:E

Mueva el cursor sobre el archivo que desea renombrar:

R

Escriba el nuevo nombre, presione enter, presione y.


¡estupendo! Ni siquiera sabía sobre el netrw.
javadba

31

Corto, seguro, sin complemento:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control+ R, #se expandirá instantáneamente a un archivo alternativo (ruta previamente editada en la ventana actual) antes de presionar Enter. Eso nos permite revisar qué es exactamente lo que vamos a eliminar. El uso de tubería |en tal caso no es seguro, ya que si savfalla por algún motivo, #todavía apuntará a otro lugar (o nada). Eso significa !rm #o delete(expand(#))puede eliminar un archivo completamente diferente! Hágalo a mano con cuidado o use un buen script (se mencionan en muchas respuestas aquí).

Educativo

... o intente construir una función / comando / script usted mismo. Comience desde algo simple como:

command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #

después de recargar vimrc, simplemente escriba :Rename new_filename. ¿Cuál es el problema con este comando?

Prueba de seguridad 1: ¿Qué hace :Renamesin argumento?

Sí, elimina el archivo oculto en '#'.

Solución: puede usar, por ejemplo. condiciones o trydeclaraciones como esa:

command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry

Prueba de seguridad 1: :Rename (sin argumento) arrojará un error:

E471: Argumento requerido

Prueba de seguridad 2: ¿Qué pasa si el nombre será el mismo que el anterior?

Prueba de seguridad 3: ¿Qué sucede si el archivo estará en una ubicación diferente a la real?

Arreglalo tu mismo. Para facilitar la lectura, puede escribirlo de esta manera:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

notas

  • !rm #es mejor que !rm old_name-> no necesitas recordar el nombre antiguo

  • !rm <C-R>#es mejor que !rm #cuando lo haces a mano -> verás lo que realmente eliminas (razón de seguridad)

  • !rmgeneralmente no es muy seguro ... mva una ubicación de basura es mejor

  • call delete(expand('#'))es mejor que el comando shell (independiente del sistema operativo) pero más largo de escribir e imposible de usar control+R

  • try | code1 | code2 | tryend -> cuando se produce un error mientras código1, no ejecute código2

  • :sav(o :saveas) es equivalente a :f new_name | w- ver archivo_f - y conserva el historial de deshacer

  • expand('%:p')da la ruta completa de su ubicación ( %) o la ubicación del archivo alternativo ( #)


17
sav person.haml_spec.rb | call delete(expand('#'))

¡bonito! no sabía sobrecall delete(expand('#'))
Kyle Wild

10

Hay una función en .vimrc de Gary Bernhardt que maneja esto.

function! RenameFile()
let old_name = expand('%')
let new_name = input('New file name: ', expand('%'), 'file')
if new_name != '' && new_name != old_name
    exec ':saveas ' . new_name
    exec ':silent !rm ' . old_name
    redraw!
endif
endfunction
map <leader>n :call RenameFile()<cr>

55
Votame todo lo que quieras. Al menos puedo renombrar archivos.
Jezen Thomas

Esta es una gran respuesta, no se requiere ningún complemento adicional.
wpp

8
:!mv % %:h/new_name

El registro %contiene el nombre del archivo actual. '%:h'muestra el directorio 'head' que contiene el archivo actual, por ejemplo: %:hdevuelve /abc/defcuando la ruta completa de su archivo esabc/dev/my.txt


7

¿Qué tal esto (mejorado por la sugerencia de Jake):

:exe "!mv % newfilename" | e newfilename

Hmmm, debo aclarar que trabajó en MacVim ayer pero fue sshed en un servidor y lo intentó hoy y no parece que el segundo mandato dio a ser tratado como un comando de colon ...
murftown

1
En realidad, ahora tampoco funciona en MacVim. De vuelta a la mesa de dibujo! :)
murftown

2
Debería ser:exe "!mv % newfilename" | e newfilename
Jake

Gracias Jake, eso es un poco mejor que mi solución. Actualizado.
murftown

7

Vim tiene una renamefunción, pero desafortunadamente no retiene el historial.

La forma agnóstica más fácil del sistema operativo para cambiar el nombre de un archivo sin perder el historial sería:

:saveas new_file_name
:call delete(expand('#:p'))

expand('#:p') devuelve la ruta completa del archivo anterior.

Úselo :bd #si también desea eliminar el archivo anterior de la lista de búfer.

O crea un complemento

Si desea utilizar un comando rápido para cambiar el nombre del archivo, agregue un nuevo archivo en ~ / .vim / plugin con el siguiente contenido:

function! s:rename_file(new_file_path)
  execute 'saveas ' . a:new_file_path
  call delete(expand('#:p'))
  bd #
endfunction

command! -nargs=1 -complete=file Rename call <SID>rename_file(<f-args>)

El comando Renamelo ayudará a cambiar rápidamente el nombre de un archivo.


: la eliminación de llamadas ('<Cr> #') es más fácil de escribir.
MaikoID

7

Hay un complemento visualmente más grande llamado vim-eunuch por Tim Pope que incluye una función de cambio de nombre, así como algunas otras ventajas (eliminar, buscar, guardar todo, chmod, sudo edit, ...).

Para cambiar el nombre de un archivo en vim-eunuch:

:Move filename.ext

En comparación con rename.vim:

:rename[!] filename.ext

Guarda algunas teclas :)


¡Y de hecho tiene algunas otras funciones muy útiles!
Pierre-Adrien Buisson

5

Para cambiar el nombre del archivo existente sin usar complementos, debe usar el comando

:Explore

Este comando le permite explorar archivos en el directorio, eliminarlos o cambiarles el nombre. de lo que debe navegar al archivo necesario en el explorador que escribir el Rcomando que le permitirá cambiar el nombre del archivo


3

No sé si este es el método "más fácil", pero suponiendo que ya haya guardado su archivo (: w) invocaría el shell (: sh) y haría un simple cp foo foo.bak Para volver al editor use Ctrl-D / Salir. Lista útil de comandos del editor vi en este enlace


Esto copiará el archivo, no le cambiará el nombre.
innaM

Ah, leí mal "Me gustaría continuar editando person.haml_spec.rb" ¡Qué mal!
DBMarcos99

Supongo que podrías:! cp foo foo.new y luego: e foo.new?
DBMarcos99

3

También puede usar: f seguido de: w


3
Esto no elimina el archivo antiguo.
Keith Pinson

1

Este pequeño script no es perfecto (el retorno de carro adicional que tienes que presionar) pero hace el trabajo.

function Rename()
  let new_file_name = input('New filename: ')
  let full_path_current_file = expand("%:p")
  let new_full_path = expand("%:p:h")."/".new_file_name
  bd    
  execute "!mv ".full_path_current_file." ".new_full_path
  execute "e ".new_full_path
endfunction                                                                                                                                                                                                                                 

command! Rename :call Rename()
nmap RN :Rename<CR>

0

Otra forma es usar netrw, que es una parte nativa de vim.

:e path/to/whatever/folder/

Luego hay opciones para eliminar, renombrar, etc.

Aquí hay un mapa de teclas para abrir netrw en la carpeta del archivo que está editando:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>

0

:sav newfile | !rm #

Tenga en cuenta que no elimina el archivo antiguo de la lista de búfer. Si eso es importante para usted, puede usar lo siguiente en su lugar:

:sav newfile | bd# | !rm #

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.