Comment renommer mon fichier actuel dans Vim?
Par exemple:
- J'édite
person.html_erb_spec.rb
- J'aimerais qu'il soit renommé
person.haml_spec.rb
- Je voudrais continuer à éditer
person.haml_spec.rb
Comment pourrais-je faire cela avec élégance?
Comment renommer mon fichier actuel dans Vim?
Par exemple:
person.html_erb_spec.rb
person.haml_spec.rb
person.haml_spec.rb
Comment pourrais-je faire cela avec élégance?
Réponses:
Il y a un petit plugin qui vous permet de faire cela.
Program Files (x86)
. Chaque fois que ce répertoire doit être utilisé, il doit être entouré de guillemets. Ce qui est euh, beaucoup.
La commande est appelée :saveas
, mais malheureusement elle ne supprimera pas votre ancien fichier, vous devrez le faire manuellement. voir :help saveas
pour plus d'informations.
ÉDITER:
La plupart des installations vim ont un explorateur de fichiers intégré, que vous pouvez utiliser pour de telles opérations. Essayez :Explore
en mode commande (je mapperais cela à une touche de fonction, c'est très pratique). Vous pouvez renommer des fichiers avec R
ou les supprimer avec D
, par exemple. Mais en appuyant <F1>
sur l'explorateur, vous aurez un meilleur aperçu.
Si vous utilisez git et avez déjà le plugin tpope fugitive.vim alors simplement:
:Gmove newname
Cette volonté:
Si votre fichier n'a pas encore été ajouté à un dépôt git, ajoutez-le d'abord:
:Gwrite
:Gmove
nécessite le chemin relatif pour le nouveau nom de fichier. Une bonne façon de le faire est de taper :Gmove <ctrl-r>%
qui ajoute le chemin / nom de fichier actuel.
Je le fais avec le plugin NERDTree:
:NERDTreeFind
puis appuyez m
Pour renommer, vous pouvez choisir (m)ove the current node
et modifier le nom du fichier. Il y a aussi des options comme supprimer, copier, déplacer, etc ...
:w newname
- pour créer une copie.:e#
.:!rm oldname
.Sous Windows, la 3e étape facultative change un peu:
:!del oldname
.:f newname
2) l'enregistrer :w
3) (éventuellement) !rm oldname
. L'avantage est que votre historique d'annulation est préservé.
:saveas
est mieux à cet égard, @rampion - et fait ce que @kynan a écrit.
Si le fichier est déjà enregistré:
:!mv {file location} {new file location}
:e {new file location}
Exemple:
:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala
Conditions d'autorisation:
:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
Enregistrer sous:
:!mv {file location} {save_as file location}
:w
:e {save_as file location}
Pour Windows non vérifié
:!move {file location} {new file location}
:e {new file location}
Je recommanderais :Rename
de l' eunuque de tpope pour cela.
Il comprend également un tas d'autres commandes pratiques.
La commande Renommer y est définie comme suit actuellement (vérifiez le dépôt pour toute mise à jour!):
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
Vous pouvez également le faire en utilisant netrw
La commande explore ouvre netrw dans le répertoire du fichier ouvert
:E
Déplacez le curseur sur le fichier que vous souhaitez renommer:
R
Tapez le nouveau nom, appuyez sur entrée, appuyez sur y.
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
control+ R, #s'étendra instantanément à un autre fichier (chemin précédemment modifié dans la fenêtre actuelle) avant d'appuyer sur Enter. Cela nous permet de revoir exactement ce que nous allons supprimer. Utiliser un tuyau |
dans un tel cas n'est pas sûr, car en cas d' sav
échec pour une raison quelconque, #
il pointera toujours vers un autre endroit (ou vers rien). Cela signifie !rm #
ou delete(expand(#))
peut supprimer un fichier complètement différent! Faites-le donc à la main avec soin ou utilisez un bon script (ils sont mentionnés dans de nombreuses réponses ici).
... ou essayez de créer vous-même une fonction / commande / script. Commencez par quelque chose de simple comme:
command! -nargs=1 Rename saveas <args> | call delete(expand('#')) | bd #
après le rechargement de vimrc, tapez simplement :Rename new_filename
. Quel est le problème avec cette commande?
Test de sécurité 1: que faire :Rename
sans argument?
Oui, il supprime le fichier caché dans '#'!
Solution: vous pouvez utiliser par exemple. conditions ou try
déclaration comme ça:
command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry
Le test de sécurité 1:
:Rename
(sans argument) générera une erreur:
E471: Argument requis
Test de sécurité 2: que faire si le nom sera le même que le précédent?
Test de sécurité 3: que se passe-t-il si le fichier se trouve à un emplacement différent de votre emplacement réel?
Réparez-le vous-même. Pour plus de lisibilité, vous pouvez l'écrire de cette manière:
function! s:localscript_name(name):
try
execute 'saveas ' . a:name
...
endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)
Remarques
!rm #
vaut mieux que !rm old_name
-> vous n'avez pas besoin de vous souvenir de l'ancien nom
!rm <C-R>#
est mieux que !rm #
quand le faire à la main -> vous verrez ce que vous retirez réellement (raison de sécurité)
!rm
n'est généralement pas très sécurisé ... mv
vers un emplacement poubelle c'est mieux
call delete(expand('#'))
est meilleur que la commande shell (OS agnostique) mais plus long à taper et impossible à utiliser control+R
try | code1 | code2 | tryend
-> lorsque l'erreur se produit pendant le code1, ne pas exécuter le code2
:sav
(ou :saveas
) est équivalent à :f new_name | w
- voir file_f - et préserve l'historique des annulations
expand('%:p')
donne le chemin complet de votre emplacement ( %
) ou l'emplacement d'un autre fichier ( #
)
Il y a une fonction dans .vimrc de Gary Bernhardt qui gère cela.
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>
:!mv % %:h/new_name
Register %
contient le nom du fichier actuel. '%:h'
affiche le répertoire 'head' contenant le fichier actuel, par exemple: %:h
retourne /abc/def
lorsque le chemin complet de votre fichier estabc/dev/my.txt
Que diriez-vous de cela (amélioré par la suggestion de Jake):
:exe "!mv % newfilename" | e newfilename
:exe "!mv % newfilename" | e newfilename
Vim a une rename
fonction, mais malheureusement il ne conserve pas l'historique.
Le moyen le plus simple de renommer un fichier sans perdre l'historique serait de:
:saveas new_file_name
:call delete(expand('#:p'))
expand('#:p')
renvoie le chemin complet de l'ancien fichier.
À utiliser :bd #
si vous souhaitez également supprimer l'ancien fichier de la liste des tampons.
Si vous souhaitez utiliser une commande rapide pour renommer le fichier, ajoutez un nouveau fichier sous ~ / .vim / plugin avec le contenu suivant:
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>)
La commande Rename
vous aidera à renommer rapidement un fichier.
Il y a un plugin visuellement plus grand appelé vim-eunuch par Tim Pope qui inclut une fonction de renommage ainsi que d'autres goodies (supprimer, trouver, enregistrer tout, chmod, sudo edit, ...).
Pour renommer un fichier dans vim-eunuch:
:Move filename.ext
Par rapport à rename.vim:
:rename[!] filename.ext
Enregistre quelques frappes :)
Pour renommer un fichier existant sans utiliser de plugins, vous devez utiliser la commande
:Explore
Cette commande vous permet d'explorer des fichiers dans le répertoire, de les supprimer ou de les renommer. que vous devez naviguer vers le fichier neccessary dans l'explorateur que la R
commande de type qui vous permettra de renommer le nom du fichier
Je ne sais pas si c'est la méthode "la plus simple", mais en supposant que vous avez déjà enregistré votre fichier (: w) j'invoquerais le shell (: sh) et ferais un simple cp foo foo.bak Pour revenir à l'éditeur utilisez Ctrl-D / Exit. Liste utile des commandes de l'éditeur vi sur ce lien
Ce petit script n'est pas parfait (le retour chariot supplémentaire que vous devez appuyer) mais il fait le travail.
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>
Une autre façon est d'utiliser simplement netrw, qui est une partie native de vim.
:e path/to/whatever/folder/
Ensuite, il y a des options pour supprimer, renommer, etc.
Voici une carte-clé pour ouvrir netrw dans le dossier du fichier que vous modifiez:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>