Renommer le fichier actuel dans Vim

392

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?

Sam Saffron
la source

Réponses:

87

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

innaM
la source
9
Cette version mise à jour de Rename.vim gère correctement CWD - enregistre toujours le fichier dans le répertoire d'origine.
2011
48
Q: "quel genre de bizarre sociopathique met des espaces dans le nom dir?" - A: le gars qui a commencé le projet il y a longtemps et qui est maintenant votre patron ... promu hors du codage dans son véritable domaine d'expertise: suivre les modes de développement et les forcer dans l'équipe.
Stabledog
3
@AaronMahan J'ai corrigé Rename2.vim (sans tenir compte de la version DelvarWorld plus intelligente mais plus complexe) pour autoriser les espaces dans les chemins et je l'ai fourchue ici: github.com/aehlke/vim-rename3 N'hésitez pas à soumettre des demandes d'extraction pour une fonctionnalité encore plus intelligente!
aehlke
4
@Stabledog Microsoft, apparemment. Program Files (x86). Chaque fois que ce répertoire doit être utilisé, il doit être entouré de guillemets. Ce qui est euh, beaucoup.
JackHasaKeyboard
5
@JackHasaKeyboard: +10. "Program Files (x86)" remporte le "pire nom de répertoire jamais enregistré dans un système d'exploitation dépourvu de liens symboliques". :)
Stabledog
451

La commande est appelée :saveas, mais malheureusement elle ne supprimera pas votre ancien fichier, vous devrez le faire manuellement. voir :help saveaspour 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 :Exploreen mode commande (je mapperais cela à une touche de fonction, c'est très pratique). Vous pouvez renommer des fichiers avec Rou les supprimer avec D, par exemple. Mais en appuyant <F1>sur l'explorateur, vous aurez un meilleur aperçu.

soulmerge
la source
6
Je ne pense pas que ce soit gênant par rapport aux autres éditeurs où vous ne pouvez normalement pas déplacer un fichier. Au lieu de cela, vous devez aller dans le gestionnaire de fichiers de votre choix, renommer le fichier et revenir à votre éditeur. Si vous êtes chanceux, vous devez quitter et redémarrer votre éditeur s'il n'a pas reçu la notification de changement de nom de fichier.
Rafael Bugajewski
130
Vous aimerez aussi: Sexe (raccourci pour split explore :-))
Peter Jankuliak
6
En outre,: e ouvrira Explorer dans le volet actuel. Moins excitant que: le sexe mais plus efficace;).
Josh
56
Pour l'intrépide, vertical: Le sexe est: Vex.
hobbes3
5
@Josh: E fonctionne pour moi,: e cela ne fonctionne pas pour moi. J'utilise: e pour éditer un autre fichier dans la même fenêtre.
omar
159

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. Conserver l'histoire de l'annulation.

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

:Gwrite
ISQ
la source
4
Des larmes coulaient de mes yeux. La réponse parfaite!
Farid Nouri Neshat
3
J'ai sacrifié deux chèvres en l'honneur de cette réponse! Mais j'ai un petit problème avec ça, car il faut taper le chemin depuis la racine de l'arbre de travail; et cela devient souvent assez long dans n'importe quel projet. Y a-t-il une solution à cela?
XOR
1
C'est génial! Je continue de trouver de nouvelles choses que les fugitifs peuvent faire.
Rich Churcher
8
@xxor: comme mentionné dans la réponse de Mesco, vous pouvez utiliser Ctrl + R% pour insérer le nom de fichier actuel, qui peut ensuite être modifié.
deltab
4
Pour combiner quelques commentaires ici: :Gmovené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.
shmup
80

Je le fais avec le plugin NERDTree:

:NERDTreeFind

puis appuyez m

Pour renommer, vous pouvez choisir (m)ove the current nodeet modifier le nom du fichier. Il y a aussi des options comme supprimer, copier, déplacer, etc ...

woto
la source
1
vous savez quoi, c'est la façon principale dont je renomme des trucs ces jours-ci
Sam Saffron
2
Celui-ci fonctionne vraiment bien. Je le recommande vraiment.
Matt Setter
J'adore l'idée. Ce sera ma principale méthode de changement de nom de fichier maintenant.
SLN
72
  • Écrivez 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 3e étape facultative change un peu:

  • (Facultatif) supprimer l'ancienne copie de Windows - :!del oldname.
gimel
la source
3
J'utilise cette approche tout le temps, cependant, l'inconvénient est que vous perdez votre arbre d'annulation - vous ne pouvez donc rien annuler avant le: e
rampion
7
Agréable. Apparemment, Ctrl-6 fait la même chose que: e #
glenn jackman
vous pouvez également ouvrir le répertoire, déplacer le curseur sur le fichier et appuyer sur "D" pour supprimer un fichier.
Peder
38
La manière la plus simple à mon humble avis est 1) renommer le tampon actuel :f newname2) l'enregistrer :w3) (éventuellement) !rm oldname. L'avantage est que votre historique d'annulation est préservé.
kynan
3
:saveasest mieux à cet égard, @rampion - et fait ce que @kynan a écrit.
lericson
36

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}
Benjamin
la source
5
Vous pourriez au moins expliquer pourquoi vous avez rejeté cette réponse.
Benjamin
31

Je recommanderais :Renamede 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
Gavin Gilmour
la source
31

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.

Ben
la source
génial! je ne connaissais même pas le netrw.
javadba
31

Court, sécurisé, sans plugin:

: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).

Éducatif

... 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 :Renamesans argument?

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

Solution: vous pouvez utiliser par exemple. conditions ou trydé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é)

  • !rmn'est généralement pas très sécurisé ... mvvers 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 ( #)

Mesco
la source
17
sav person.haml_spec.rb | call delete(expand('#'))
Maxim Kim
la source
agréable! ne savait pascall delete(expand('#'))
Kyle Wild
10

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>
Jezen Thomas
la source
5
Votez-moi tout ce que vous aimez. Au moins, je peux renommer des fichiers.
Jezen Thomas
C'est une excellente réponse, aucun plugin supplémentaire n'est requis.
wpp
8
:!mv % %:h/new_name

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

Yossarian42
la source
7

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

:exe "!mv % newfilename" | e newfilename
murftown
la source
Hmmm, je dois préciser que cela a fonctionné sur MacVim hier, mais j'ai été transféré sur un serveur et l'ai essayé aujourd'hui et la 2e commande ne semblait pas être traitée comme une commande deux-points ...
murftown
1
En fait, maintenant, cela ne fonctionne pas non plus sur MacVim. Retour à la planche à dessin! :)
murftown
2
Ça devrait être:exe "!mv % newfilename" | e newfilename
Jake
Merci Jake, c'est un peu mieux que ma solution. Mise à jour.
murftown
7

Vim a une renamefonction, 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.

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 Renamevous aidera à renommer rapidement un fichier.

Alex
la source
: call delete ('<Cr> #') est plus facile à écrire.
MaikoID
7

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 :)

sh78
la source
Et il a en effet d'autres fonctions très utiles!
Pierre-Adrien Buisson
5

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 Rcommande de type qui vous permettra de renommer le nom du fichier

Наглый Спамер
la source
3

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

DBMarcos99
la source
Cela copiera le fichier, pas le renommera.
innaM
Ah - J'ai mal lu "Je voudrais continuer à éditer person.haml_spec.rb" Mon mauvais!
DBMarcos99
Je suppose que vous pourriez:! cp foo foo.new puis: e foo.new?
DBMarcos99
3

Vous pouvez également utiliser: f suivi de: w


la source
3
Cela ne supprime pas l'ancien fichier.
Keith Pinson
1

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>
Jonas Geiregat
la source
0

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>
désemparer
la source
0

:sav newfile | !rm #

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

:sav newfile | bd# | !rm #

sitaktif
la source