Question
Comment dois-je renommer mon fichier actuel dans Vim?
Par exemple:
- je suis en train de modifier
person.html_erb_spec.rb
- Je voudrais qu'il soit renommé
person.haml_spec.rb
- je voudrais continuer à éditer <=>
Comment pourrais-je m'y prendre, avec élégance?
La solution
Un petit plugin vous permet de le faire.
Autres conseils
La commande s'appelle :saveas
, mais malheureusement, votre ancien fichier ne sera pas supprimé, vous devrez le faire manuellement. voir :help saveas
pour plus d'informations.
EDIT:
La plupart des installations de vim ont un explorateur de fichiers intégré, que vous pouvez utiliser pour de telles opérations. Essayez :Explore
en mode commande (en fait, je mapperais cela sur une touche de fonction, c'est très très pratique). Vous pouvez renommer des fichiers avec R
ou les supprimer avec D
, par exemple. En appuyant sur <F1>
dans l’explorateur, vous obtiendrez un meilleur aperçu.
Si vous utilisez git et que vous disposez déjà du fugitive.vim du plugin tpope, il vous suffit alors de:
:Gmove newname
Cela va:
- Renommez votre fichier sur le disque.
- Renommez le fichier dans git repo.
- Rechargez le fichier dans le tampon actuel.
- Conserver l'historique d'annulation.
Si votre fichier n'a pas encore été ajouté à un dépôt Git, ajoutez-le d'abord:
:Gwrite
- Écrivez le fichier lors de l'édition -
:w newname
- pour créer une copie. - Commencez à modifier la nouvelle copie -
:e#
. - (facultatif) supprimer l'ancienne copie -
:!rm oldname
.
Sous Windows, la 3ème étape facultative change un peu:
- (Facultatif) supprimez l'ancienne copie Windows -
:!del oldname
.
Je le fais avec le plugin NERDTree:
:NERDTreeFind
puis appuyez sur m
Pour renommer, vous pouvez choisir (m)ove the current node
et modifier le nom du fichier. Il existe également des options telles que supprimer, copier, déplacer, etc ...
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 requises:
:!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
d'après eunuque de tpope pour cela.
Il comprend également un tas d'autres commandes utiles.
La commande Renommer est actuellement définie comme suit (vérifiez si le référentiel contient des mises à 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
Court, sécurisé, sans plugin:
:sav new_name
:!rm <C-R># // or !del <C-R># for windows
contrôle + R , # deviendra instantanément un le fichier alternatif (chemin d'accès précédemment modifié dans la fenêtre courante) avant d'appuyer sur Entrée . Cela nous permet de revoir ce que nous allons supprimer exactement.
L'utilisation de la conduite |
dans ce cas n'est pas sécurisée, car si sav
échoue pour une raison quelconque, #
pointera toujours vers un autre endroit (ou vers rien). Cela signifie que !rm #
ou delete(expand(#))
peut supprimer un fichier complètement différent!
Alors faites-le à la main avec précaution ou utilisez un bon script (ils sont mentionnés dans de nombreuses réponses ici).
Éducatif
... ou essayez de créer vous-même une fonction / commande / script. Commencez à partir de choses simples 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: Qu'est-ce que :Rename
sans argument?
Oui, cela supprime le fichier caché dans '#'!
Solution: vous pouvez utiliser par exemple. conditions ou try
déclaration comme celle-ci:
command! -nargs=1 Rename try | saveas <args> | call delete(expand('#')) | bd # | endtry
Test de sécurité 1:
!rm old_name
(sans argument) générera une erreur:
E471: Argument requis
Test de sécurité 2: Que se passera-t-il si le nom sera le même que le précédent?
Test de sécurité 3: Que se passera-t-il si le fichier sera à un emplacement différent de celui de votre fichier actuel?
Faites les réparations 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>)
notes
-
!rm <C-R>#
est meilleur que!rm
- > vous n'avez pas besoin de vous rappeler l'ancien nom -
mv
est meilleur quecall delete(expand('#'))
quand le faire à la main - > vous verrez ce que vous supprimez réellement (raison de sécurité) -
try | code1 | code2 | tryend
n'est généralement pas très sécurisé ...:sav
à l'emplacement de la corbeille est préférable -
:saveas
est meilleur que la commande shell (indépendant du système d'exploitation) mais plus long à taper et impossible à utiliser control + R -
:f new_name | w
- > quand une erreur se produit pendant que code1, n'exécute pas code2 -
expand('%:p')
(ou%
) est équivalent à <=> - voir file_f - et conserve l'historique d'annulation -
<=> donne le chemin complet de votre emplacement (<=>) ou de l'emplacement du fichier de remplacement (<=>)
Vous pouvez également le faire avec netrw
La commande explorer ouvre netrw dans le répertoire du fichier ouvert
:E
Déplacez le curseur sur le fichier que vous souhaitez renommer:
R
Saisissez le nouveau nom, appuyez sur Entrée, appuyez sur y.
sav person.haml_spec.rb | call delete(expand('#'))
Il y a & # 8217; une fonction dans Gary Bernhardt & # 8217 ; s .vimrc 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>
Qu'en est-il de cela (amélioré par la suggestion de Jake):
:exe "!mv % newfilename" | e newfilename
Vim a une fonction rename
, mais malheureusement, il ne conserve pas l'historique.
La méthode la plus simple, agnostique sur le système d’exploitation, pour renommer un fichier sans perdre l’historique serait:
:saveas new_file_name
:call delete(expand('#:p'))
expand('#:p')
renvoie le chemin d'accès complet de l'ancien fichier.
Utilisez :bd #
si vous souhaitez également supprimer l'ancien fichier de la liste des tampons.
Ou créez un plugin
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 existe un plugin plus volumineux appelé vim-eunuch de Tim Pope, qui inclut une fonction de changement de nom en tant que ainsi que d’autres bonus (supprimer, trouver, sauvegarder tout, chmod, sudo edit, ...).
Pour renommer un fichier dans vim-eunuch:
:Move filename.ext
Comparé à rename.vim:
:rename[!] filename.ext
Enregistre quelques frappes:)
Vous pouvez également utiliser: f suivi de: w
Je ne sais pas s'il s'agit de la " plus facile & "; méthode, mais en supposant que vous avez déjà enregistré votre fichier (: w), je voudrais appeler le shell (: sh) et faire 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
:!mv % %:h/new_name
Register %
contient le nom du fichier actuel. '%:h'
indique le répertoire 'head' contenant le fichier actuel, par exemple: %:h
renvoie /abc/def
lorsque le chemin d'accès complet de votre fichier est abc/dev/my.txt
Ce petit script n’est pas parfait (vous devez appuyer sur le retour chariot supplémentaire), mais c’est le travail que vous devez faire.
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 solution consiste simplement à utiliser netrw, qui est une partie native de vim.
:e path/to/whatever/folder/
Ensuite, il existe des options pour supprimer, renommer, etc.
Voici un mappage de touches pour ouvrir netrw dans le dossier du fichier que vous modifiez:
map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
:sav newfile | !rm #
Notez que l'ancien fichier n'est pas supprimé de la liste des tampons. Si cela est important pour vous, vous pouvez utiliser les éléments suivants à la place:
:sav newfile | bd# | !rm #