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?

Sam Azafrán
fuente

Respuestas:

87

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

innaM
fuente
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.

soulmerge
fuente
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
ISQ
fuente
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.

woto
fuente
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.
gimel
fuente
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}
Benjamín
fuente
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
Gavin Gilmour
fuente
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.

Ben
fuente
¡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 ( #)

Mesco
fuente
17
sav person.haml_spec.rb | call delete(expand('#'))
Maxim Kim
fuente
¡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>
Jezen Thomas
fuente
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

Yossarian42
fuente
7

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

:exe "!mv % newfilename" | e newfilename
Murftown
fuente
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.

Alex
fuente
: 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 :)

sh78
fuente
¡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

Наглый Спамер
fuente
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

DBMarcos99
fuente
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


fuente
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>
Jonas Geiregat
fuente
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>
Dechimp
fuente
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 #

sitaktif
fuente