web-dev-qa-db-fra.com

Renommer le fichier actuel dans Vim

Comment dois-je renommer mon fichier actuel dans Vim?

Par exemple:

  • Je suis en train d'éditer person.html_erb_spec.rb
  • Je voudrais qu'il soit renommé person.haml_spec.rb
  • J'aimerais continuer à éditer person.haml_spec.rb

Comment pourrais-je m'y prendre, avec élégance?

376
Sam Saffron

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

88
innaM

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. Mais appuyer sur _<F1>_ dans l'explorateur vous donnera un meilleur aperçu.

425
soulmerge

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 dans git repo.
  3. Rechargez le fichier dans le tampon actuel.
  4. Préservez l'historique des annulations.

Si votre fichier n'a pas encore été ajouté à un dépôt Git, ajoutez-le d'abord:

:Gwrite
146
ISQ

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 existe également des options telles que supprimer, copier, déplacer, etc.

71
woto
  • Ecrivez le fichier lors de l'édition - :w newname - pour créer une copie.
  • Commencez à éditer la nouvelle copie - :e#.
  • (Facultatif) supprimez l'ancienne copie - :!rm oldname.

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

  • (Facultatif) supprimer l'ancienne copie Windows - :!del oldname.
71
gimel

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}
31
Benjamin

Court, sécurisé, sans plugin:

:sav new_name
:!rm <C-R>#  // or !del <C-R># for windows

control + R# va instantanément se transformer en fichier alternatif (chemin précédemment modifié dans la fenêtre courante) avant d'appuyer sur Enter. Cela nous permet de revoir ce que nous allons supprimer exactement. Utiliser le tuyau | dans un tel cas est pas sécurisé , car si sav échoue pour une raison quelconque, # pointera toujours vers un autre endroit. (ou à 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 par qc 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: Qu'est-ce que :Rename sans argument?

Oui, cela supprime le fichier caché dans '#'!

Solution: vous pouvez utiliser par exemple. conditions ou try instruction comme ça:

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

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

E471: Argument requis

Test de sécurité 2: Que faire si le nom sera identique au précédent?

Test de sécurité 3: Que se passera-t-il si le fichier sera à un emplacement différent de votre 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>)

notes

  • !rm # est meilleur que !rm old_name -> vous n'avez pas besoin de vous rappeler l'ancien nom

  • !rm <C-R># est meilleur que !rm # quand vous le faites à la main -> vous verrez ce que vous enlevez réellement (raison de sécurité)

  • !rm n'est généralement pas très sécurisé ... mv à l'emplacement de la corbeille, c'est mieux

  • call delete(expand('#')) est meilleur que la commande Shell (indépendant du système d'exploitation) mais plus long à taper et impossible à utiliser control + R

  • try | code1 | code2 | tryend -> quand une erreur survient en code1, n'exécutez pas code2

  • :sav (ou :saveas) équivaut à :f new_name | w - voir file_f - et conserve l'historique d'annulation.

  • expand('%:p') donne le chemin complet de votre emplacement (%) ou l'emplacement du fichier de remplacement (#)

29
Mesco

Je recommanderais :Rename de tpope's eunuque pour cela.

Il comprend également un tas d'autres commandes utiles.

La commande Renommer est actuellement définie comme suit (recherchez dans le dépôt les 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
28
Gavin Gilmour

Vous pouvez aussi 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.

25
Ben
sav person.haml_spec.rb | call delete(expand('#'))
17
Maxim Kim

Il existe 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>
10
Jezen Thomas

Que diriez-vous de cela (amélioré par la suggestion de Jake):

:exe "!mv % newfilename" | e newfilename
7
murftown

Vim a une fonction rename, mais malheureusement, il ne conserve pas l'historique.

La manière la plus simple, agnostique sur le système d’exploitation, de renommer un fichier sans perdre l’historique 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 <SID>rename_file(<f-args>)

La commande Rename vous aidera à renommer rapidement un fichier.

6
Alex

Il y a un plugin plus grand qui s'appelle vim-eunuch de Tim Pope qui inclut une fonction de changement de nom ainsi que d'autres goodies (supprimer, trouver, tout sauvegarder, chmod, éditer Sudo, ...).

Pour renommer un fichier dans vim-eunuch:

:Move filename.ext

Par rapport à rename.vim:

:rename[!] filename.ext

Enregistre quelques frappes :)

6
sh78
:!mv % %:h/new_name

Register % contient le nom du fichier actuel .'%:h' montre le répertoire 'head' contenant le fichier actuel, par exemple: %:hretourne /abc/def lorsque le chemin complet de votre fichier est abc/dev/my.txt

5
Yossarian42

Vous pouvez également utiliser: f suivi de: w

3
user320487

Je ne sais pas s'il s'agit de la méthode "la plus facile", mais en supposant que vous ayez 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

3
DBMarcos99

Ce petit script n'est pas parfait (vous devez appuyer sur le retour de chariot supplémentaire), 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>
1
Jonas Geiregat

:sav newfile | !rm #

Notez que cela ne supprime pas l'ancien fichier de la liste des tampons. Si cela est important pour vous, vous pouvez utiliser les éléments suivants:

:sav newfile | bd# | !rm #

0
sitaktif

Une autre façon 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 une carte pour ouvrir netrw au dossier du fichier que vous éditez:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
0
dechimp