Renommer le fichier en cours dans Vim

Comment dois-je renommer mon fichier actuel dans Vim?

Par exemple:

  • Je suis en person.html_erb_spec.rb éditer person.html_erb_spec.rb
  • Je voudrais qu’il soit renommé en person.haml_spec.rb
  • Je voudrais continuer à éditer person.haml_spec.rb

Comment pourrais-je y arriver, élégamment?

Il y a un petit plugin qui vous permet de faire cela.

La commande s’appelle :saveas , mais malheureusement elle ne supprimera pas votre ancien fichier, vous devrez le faire manuellement. voir :help saveas pour plus d’informations.

MODIFIER:

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 (je mapperais en fait une touche de fonction, c’est très pratique). Vous pouvez renommer des fichiers avec R ou les supprimer avec D , par exemple. Mais appuyer sur dans l’explorateur vous donnera un meilleur aperçu.

Si vous utilisez git et avez déjà le plugin tpope fugitive.vim alors simplement:

 :Gmove newname 

Cette volonté:

  1. Renommez votre fichier sur le disque.
  2. Renommez le fichier en git repo.
  3. Rechargez le fichier dans le tampon actuel.
  4. Préserver l’historique des annulations.

Si votre fichier n’a pas encore été ajouté à un repository git, ajoutez-le d’abord:

 :Gwrite 
  • Ecrivez le fichier lors de l’édition – :w newname – pour créer une copie.
  • Commencez à éditer la nouvelle copie – :e# .
  • (Facultativement) supprimez l’ancienne copie – :!rm oldname .

Sous Windows, la 3ème étape optionnelle change un peu:

  • (Facultatif) supprimer l’ancienne copie de Windows – :!del oldname .

Je le fais avec le plugin NERDTree:

 :NERDTreeFind 

puis appuyez sur m

Et ensuite, vous pouvez choisir entre supprimer, copier, déplacer, etc.

Je recommanderais :Rename de l’ eunuque de tpope pour cela.

Il comprend également un tas d’autres commandes pratiques.

La commande Renommer est définie comme suit actuellement (vérifiez les mises à jour pour les mises à jour!):

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

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 

Exigences de permission:

 :!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 Unverified

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

Vous pouvez aussi le faire en utilisant 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 

Tapez le nouveau nom, appuyez sur Entrée, appuyez sur y.

Court, sécurisé, sans plugin:

 :sav new_name :!rm # // or !del # for windows 

control + R , # étendra instantanément à un autre fichier (chemin précédemment modifié dans la fenêtre actuelle) avant d’appuyer sur Entrée . Cela nous permet de revoir exactement ce que nous allons supprimer. En utilisant un tuyau | dans un tel cas n’est pas sécurisé, car si sav échoue pour une raison quelconque, # indiquera toujours un autre endroit (ou à rien). Cela signifie que !rm # ou delete(expand(#)) peut supprimer un fichier complètement différent! Alors faites-le soigneusement à la main ou utilisez un bon script (ils sont mentionnés dans de nombreuses réponses ici).

Éducatif

… ou essayez de créer une fonction / commande / script vous-même. Commencez de sth simple comme:

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

après vimrc reload, 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, il supprime le fichier caché dans ‘#’!

Solution: vous pouvez utiliser par exemple. conditions ou déclaration comme ça:

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

Test de sécurité 1:: :Rename (sans argument) génère une erreur:

E471: Argument requirejs

Test de sécurité 2: Et si le nom était le même que le précédent?

Test de sécurité 3: Que se passe-t-il si le fichier se trouve dans un emplacement différent de votre réel?

Fixez-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() 

Remarques

  • !rm # vaut mieux que !rm old_name -> vous n’avez pas besoin de vous souvenir de l’ancien nom

  • !rm # vaut 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 de poubelle est mieux

  • call delete(expand('#')) vaut mieux que la commande shell (agnostique du système d’exploitation) mais plus longue à taper et impossible à utiliser avec control + R

  • try | code1 | code2 | tryend try | code1 | code2 | tryend -> quand une erreur survient pendant que code1, ne lance pas le code2

  • :sav (ou :saveas ) est équivalent à :f new_name | w :f new_name | w – voir file_f – et conserve l’historique des annulations

  • expand('%:p') donne l’intégralité du chemin de votre emplacement ( % ) ou l’emplacement de l’autre fichier ( # )

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

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 n :call RenameFile() 

Qu’en est-il (amélioré par la suggestion de Jake):

 :exe "!mv % newfilename" | e newfilename 

Vim a une fonction de rename , mais malheureusement, elle ne conserve pas l’historique.

Le moyen le plus simple de renommer un fichier sans perdre l’histoire serait:

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

expand('#:p') renvoie le chemin complet de l’ancien fichier.

Utilisez :bd # si vous souhaitez également supprimer l’ancien fichier de la liste des tampons.

Ou créer 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 rename_file() 

La commande Rename vous aidera à renommer rapidement un fichier.

Il y a un plugin visiblement plus gros appelé vim-eunuch par Tim Pope qui inclut une fonction de renommage ainsi que d’autres goodies (delete, find, save all, chmod, sudo edit, …).

Pour renommer un fichier dans vim-eunuch:

:Move filename.ext

Par rapport à rename.vim:

:rename[!] filename.ext

Enregistre quelques touches 🙂

Vous pouvez aussi utiliser: f suivi de: w

Je ne sais pas si c’est la méthode “la plus facile”, mais en supposant que vous ayez déjà enregistré votre fichier (: w), j’appellerais le shell (: sh) et ferais un simple 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 le travail est terminé.

 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 

Une autre méthode consiste à utiliser netrw, qui est une partie native de vim.

 :e path/to/whatever/folder/ 

Ensuite, il y a des options pour supprimer, renommer, etc.

Voici un keymap pour ouvrir netrw dans le dossier du fichier que vous éditez:

 map e :e =expand("%:p:h") . '/' 

:sav newfile | !rm #

Notez qu’il ne supprime pas l’ancien fichier de la liste des tampons. Si c’est important pour vous, vous pouvez utiliser ce qui suit:

:sav newfile | bd# | !rm #