Cambiar el nombre del archivo actual en Vim
Pregunta
¿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 gustaria seguir editando
person.haml_spec.rb
¿Cómo haría esto con elegancia?
Solución
Hay un pequeño complemento que le permite hacer esto.
Otros consejos
El comando se llama :saveas
, pero desafortunadamente no eliminará su archivo anterior, tendrá que hacerlo manualmente. consulte :help saveas
para obtener más información.
EDIT:
La mayoría de las instalaciones de vim tienen un explorador de archivos integrado, que puede usar para tales operaciones. Pruebe :Explore
en modo comando (en realidad lo asignaría a una tecla de función, es muy útil). Puede cambiar el nombre de los archivos con R
o eliminarlos con D
, por ejemplo. Pero presionar <F1>
en el explorador le dará una mejor visión general.
Si usa git y ya tiene el complemento de tpope fugitive.vim entonces simplemente:
:Gmove newname
Esto:
- Cambie el nombre de su archivo en el disco.
- Cambie el nombre del archivo en git repo.
- Vuelva a cargar el archivo en el búfer actual.
- Conservar el historial de deshacer.
Si su archivo aún no se agregó a un repositorio de git, primero agréguelo:
:Gwrite
- 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
.
Lo estoy haciendo con el complemento NERDTree:
:NERDTreeFind
entonces presione metro
Para cambiar el nombre puedes elegir (m)ove the current node
y cambiar el nombre del archivo.También hay opciones como borrar, copiar, mover, etc...
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}
Recomiendo :Rename
de eunuch de tpope para esto.
También incluye muchos otros comandos útiles.
El comando Cambiar nombre se define de la siguiente manera en este momento (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
Corto, seguro, sin complemento:
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
control + R , # se expandirá instantáneamente a un alternate-file (ruta previamente editada en la ventana actual) antes de presionar Enter . Eso nos permite revisar qué es exactamente lo que vamos a eliminar.
Usar pipe |
en tal caso es no seguro, porque si sav
falla por alguna razón, #
aún señalará a otro lugar (o nada). ¡Eso significa que !rm #
o delete(expand(#))
pueden eliminar archivos completamente diferentes!
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 la recarga de vimrc, simplemente escriba :Rename new_filename
.
¿Cuál es el problema con este comando?
Prueba de seguridad 1: ¿Qué significa :Rename
sin argumento?
Sí, elimina el archivo oculto en '#'!
Solución: puede usar, por ejemplo. condiciones o try
declaración como esa:
command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry
Prueba de seguridad 1:
!rm old_name
(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 tú 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 <C-R>#
es mejor que!rm
- > no necesitas recordar el antiguo nombre -
mv
es mejor quecall delete(expand('#'))
cuando lo haces a mano - > verá lo que realmente elimina (razón de seguridad) -
try | code1 | code2 | tryend
generalmente no es muy seguro ...:sav
a una ubicación de basura es mejor -
:saveas
es mejor que el comando de shell (sistema operativo independiente) pero más largo para escribir e imposible de usar control + R -
:f new_name | w
- > cuando se produce un error mientras el código1, no ejecute el código2 -
expand('%:p')
(o%
) es equivalente a <=> - vea file_f - y conserva el historial de deshacer -
<=> proporciona la ruta completa de su ubicación (<=>) o la ubicación del archivo alternativo (<=>)
También puedes hacerlo usando netrw
El comando de exploración abre netrw en el directorio del archivo abierto
:E
Mueva el cursor sobre el archivo que desea renombrar:
R
Escriba el nuevo nombre, presione Intro, presione y.
sav person.haml_spec.rb | call delete(expand('#'))
Hay & # 8217; una función en Gary Bernhardt & # 8217 ; s .vimrc 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>
¿Qué tal esto (mejorado por la sugerencia de Jake):
:exe "!mv % newfilename" | e newfilename
Vim tiene una función rename
, pero desafortunadamente no retiene el historial.
La forma más fácil de 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.
Use :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 Rename
lo ayudará a cambiar rápidamente el nombre de un archivo.
Hay un complemento visiblemente más grande llamado vim-eunuch de Tim Pope que incluye una función de cambio de nombre como así como algunas otras cosas (eliminar, buscar, guardar todo, chmod, sudo edit, ...).
Para cambiar el nombre de un archivo en vim-eunuch:
:Move filename.ext
Comparado con rename.vim:
:rename[!] filename.ext
Guarda algunas teclas :)
También puede usar: f seguido de: w
No sé si este es el & "; el más fácil &"; método, 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 / Exit. Lista útil de los comandos del editor vi en este enlace
:!mv % %:h/new_name
Registrarse %
contiene el nombre del archivo actual. '%:h'
muestra el directorio 'head' que contiene el archivo actual, por ejemplo: %:h
devuelve /abc/def
cuando la ruta completa de su archivo es abc/dev/my.txt
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>
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>
: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 #