Umbenennen der aktuellen Datei in Vim

392

Wie soll ich meine aktuelle Datei in Vim umbenennen?

Zum Beispiel:

  • Ich bearbeite person.html_erb_spec.rb
  • Ich möchte es umbenannt in person.haml_spec.rb
  • Ich möchte weiter bearbeiten person.haml_spec.rb

Wie würde ich das elegant machen?

Sam Safran
quelle

Antworten:

87

Es gibt ein kleines Plugin , mit dem Sie dies tun können.

innaM
quelle
9
Diese aktualisierte Version von Rename.vim behandelt CWD korrekt - speichert die Datei immer im ursprünglichen Verzeichnis.
sickill
48
F: "Was für ein soziopathischer Verrückter setzt Leerzeichen in den Verzeichnisnamen?" - A: Der Typ, der das Projekt vor langer Zeit gestartet hat und jetzt Ihr Chef ist ... wurde aus der Codierung in sein wahres Fachgebiet befördert: Befolgen Sie die Moden der Entwicklungsmethodik und zwingen Sie sie dem Team auf.
Stabledog
3
@AaronMahan Ich habe Rename2.vim (ohne Berücksichtigung der intelligenteren, aber komplexeren DelvarWorld-Version) behoben, um Leerzeichen in Pfaden zuzulassen, und es hier gegabelt: github.com/aehlke/vim-rename3 Sie können gerne Pull-Anfragen für noch intelligentere Funktionen einreichen!
Aehlke
4
@Stabledog Microsoft anscheinend. Program Files (x86). Jedes Mal, wenn mit diesem Verzeichnis gearbeitet werden muss, muss es in Anführungszeichen gesetzt werden. Welches ist ähm, viel.
JackHasaKeyboard
5
@ JackHasaKeyboard: +10. "Programme (x86)" gewinnt den "schlechtesten Verzeichnisnamen aller Zeiten in einem Betriebssystem, dem Symlinks fehlen". :)
Stabledog
451

Der Befehl wird aufgerufen :saveas, aber leider wird Ihre alte Datei nicht gelöscht. Sie müssen dies manuell tun. siehe :help saveasfür weitere Informationen.

BEARBEITEN:

Die meisten vim-Installationen verfügen über einen integrierten Datei-Explorer, den Sie für solche Vorgänge verwenden können. Versuchen Sie es :Exploreim Befehlsmodus (ich würde das tatsächlich einer Funktionstaste zuordnen, es ist sehr praktisch). Sie können beispielsweise Dateien mit umbenennen Roder mit löschen D. Durch Drücken <F1>des Explorers erhalten Sie jedoch einen besseren Überblick.

Soulmerge
quelle
6
Ich denke nicht, dass es im Vergleich zu anderen Editoren, bei denen Sie normalerweise keine Datei verschieben können, umständlich ist. Stattdessen müssen Sie den Dateimanager Ihrer Wahl aufrufen, die Datei umbenennen und zu Ihrem Editor zurückkehren. Wenn Sie Glück haben, müssen Sie Ihren Editor beenden und neu starten, wenn er keine Benachrichtigung über die Änderung des Dateinamens erhalten hat.
Rafael Bugajewski
130
Das könnte dir auch gefallen: Sex (Abkürzung für Split
Explore
6
Außerdem: e öffnet die Erkundung im aktuellen Bereich. Weniger aufregend als: Sex aber effizienter;).
Josh
56
Für die Unerschrockenen, Vertikalen: Sex ist: Vex.
hobbes3
5
@ Josh: E funktioniert für mich ,: e es funktioniert nicht für mich. Ich benutze: e, um andere Dateien im selben Fenster zu bearbeiten.
Omar
159

Wenn Sie git verwenden und bereits das Plugin fugitive.vim des tpope haben, dann einfach:

:Gmove newname

Dieser Wille:

  1. Benennen Sie Ihre Datei auf der Festplatte um.
  2. Benennen Sie die Datei in Git Repo um.
  3. Laden Sie die Datei erneut in den aktuellen Puffer.
  4. Geschichte rückgängig machen.

Wenn Ihre Datei noch nicht zu einem Git-Repo hinzugefügt wurde, fügen Sie sie zuerst hinzu:

:Gwrite
ISQ
quelle
4
Tränen kommen aus meinen Augen. Die perfekte Antwort!
Farid Nouri Neshat
3
Ich habe zwei Ziegen zu Ehren dieser Antwort geopfert! Aber ich habe ein kleines Problem damit, weil Sie den Pfad von der Wurzel des Arbeitsbaums eingeben müssen; und das wird in jedem Projekt oft ziemlich langwierig. Gibt es eine Lösung dafür?
xor
1
Das ist großartig! Ich finde immer wieder neue Dinge, die Flüchtlinge tun können.
Rich Churcher
8
@xxor: Wie in Mescos Antwort erwähnt, können Sie mit Strg + R% den aktuellen Dateinamen einfügen, der dann bearbeitet werden kann.
Deltab
4
Um hier einige Kommentare zu kombinieren: :GmoveErfordert den relativen Pfad für den neuen Dateinamen. Eine :Gmove <ctrl-r>%gute Möglichkeit, dies zu tun, besteht darin, den aktuellen Pfad / Dateinamen anzugeben.
Shmup
80

Ich mache es mit dem NERDTree Plugin:

:NERDTreeFind

dann drücken m

Zum Umbenennen können Sie den (m)ove the current nodeDateinamen auswählen und ändern. Es gibt auch Optionen wie Löschen, Kopieren, Verschieben usw.

woto
quelle
1
Weißt du was? Das ist die Hauptmethode, mit der ich heutzutage Sachen umbenenne
Sam Saffron,
2
Dieser funktioniert wirklich gut. Auf jeden Fall empfehlen.
Matt Setter
Ich liebe die Idee. Dies wird jetzt meine Hauptmethode zum Ändern des Dateinamens sein.
SLN
72
  • Schreiben Sie die Datei während der Bearbeitung - :w newname-, um eine Kopie zu erstellen.
  • Starten Sie die Bearbeitung der neuen Kopie - :e#.
  • (Optional) entfernen Sie die alte Kopie - :!rm oldname.

Unter Windows ändert sich der optionale dritte Schritt ein wenig:

  • (Optional) alte Windows-Kopie entfernen - :!del oldname.
gimel
quelle
3
Ich benutze diesen Ansatz die ganze Zeit, aber der Nachteil ist, dass Sie Ihren Rückgängig Baum verlieren - so kann man nicht rückgängig machen etwas vor dem: e
rampion
7
Nett. Anscheinend macht Strg-6 dasselbe wie: e #
Glenn Jackman
Sie können das Verzeichnis auch öffnen, den Cursor auf die Datei bewegen und "D" drücken, um eine Datei zu löschen.
Peder
38
Der einfachere Weg imho ist 1) den aktuellen Puffer umzubenennen :f newname2) ihn zu speichern :w3) (optional) !rm oldname. Der Vorteil ist, dass Ihr Rückgängig-Verlauf erhalten bleibt.
Kynan
3
:saveasist in dieser Hinsicht besser, @rampion - und macht das, was @kynan geschrieben hat.
Lericson
36

Wenn die Datei bereits gespeichert ist:

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

Beispiel:

:!mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala
:e src/test/scala/myNewFile.scala

Berechtigungsanforderungen:

:!sudo mv src/test/scala/myFile.scala src/test/scala/myNewFile.scala

Speichern als:

:!mv {file location} {save_as file location}
:w
:e {save_as file location} 


Für Windows Unverified

:!move {file location} {new file location}
:e {new file location}
Benjamin
quelle
5
Sie könnten zumindest erklären, warum Sie diese Antwort abgelehnt haben.
Benjamin
31

Ich würde es :Renamevon tpopes Eunuchen empfehlen .

Es enthält auch eine Reihe anderer praktischer Befehle.

Der Befehl Umbenennen ist derzeit wie folgt definiert (überprüfen Sie das Repo auf Aktualisierungen!):

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
quelle
31

Sie können dies auch mit netrw tun

Der Explore-Befehl öffnet netrw im Verzeichnis der geöffneten Datei

:E

Bewegen Sie den Mauszeiger über die Datei, die Sie umbenennen möchten:

R

Geben Sie den neuen Namen ein, drücken Sie die Eingabetaste und dann y.

Ben
quelle
groß! Ich wusste nicht einmal über das Netrw.
Javadba
31

Kurz, sicher, ohne Plugin:

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

control+ R, #Wird sofort zu einer erweitern alternative-Datei (zuvor bearbeiteten Pfad im aktuellen Fenster) vor dem Pressen Enter. Auf diese Weise können wir überprüfen, was genau gelöscht werden soll. Die Verwendung von Pipe |in einem solchen Fall ist nicht sicher, da bei einem savAusfall aus irgendeinem Grund #immer noch auf einen anderen Ort (oder auf nichts) verwiesen wird. Das bedeutet!rm # oder delete(expand(#))kann eine völlig andere Datei löschen! Machen Sie es also sorgfältig von Hand oder verwenden Sie ein gutes Skript (sie werden hier in vielen Antworten erwähnt).

Lehrreich

... oder versuchen Sie selbst eine Funktion / einen Befehl / ein Skript zu erstellen. Beginnen Sie mit etw einfach wie:

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

Nach dem erneuten Laden von vimrc geben Sie einfach ein :Rename new_filename . Was ist das Problem mit diesem Befehl?

Sicherheitstest 1: Was macht:Rename ohne Argument?

Ja, es löscht die in '#' versteckte Datei!

Lösung: Sie können zB verwenden. Bedingungen oder tryAussage wie diese:

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

Sicherheitstest 1: :Rename (ohne Argument) gibt einen Fehler aus:

E471: Argument erforderlich

Sicherheitstest 2: Was ist, wenn der Name mit dem vorherigen identisch ist?

Sicherheitstest 3: Was ist, wenn sich die Datei an einem anderen Speicherort als Ihrem tatsächlichen befindet?

Repariere es selbst. Zur besseren Lesbarkeit können Sie es folgendermaßen schreiben:

function! s:localscript_name(name):
  try
    execute 'saveas ' . a:name
    ...
  endtry
endfunction
command! -nargs=1 Rename call s:localscript_name(<f-args>)

Anmerkungen

  • !rm #ist besser als !rm old_name-> Sie müssen sich nicht an den alten Namen erinnern

  • !rm <C-R>#ist besser als !rm #wenn man es von Hand macht -> Sie werden sehen, was Sie tatsächlich entfernen (Sicherheitsgrund)

  • !rmist in der Regel nicht sehr sicher ... mvzu einem Müllplatz ist besser

  • call delete(expand('#'))ist besser als der Shell-Befehl (OS-unabhängig), aber länger zu tippen und control+ nicht verwendbarR

  • try | code1 | code2 | tryend -> Wenn während Code1 ein Fehler auftritt, führen Sie Code2 nicht aus

  • :sav(oder :saveas) entspricht :f new_name | w- siehe file_f - und behält den Rückgängig-Verlauf bei

  • expand('%:p')gibt den gesamten Pfad Ihres Speicherorts ( %) oder den Speicherort der alternativen Datei ( #) an

Mesco
quelle
17
sav person.haml_spec.rb | call delete(expand('#'))
Maxim Kim
quelle
nett! wusste nicht übercall delete(expand('#'))
Kyle Wild
10

In Gary Bernhardts .vimrc gibt es eine Funktion , die dies erledigt.

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
quelle
5
Stimmen Sie mich ab, was Sie wollen. Zumindest kann ich Dateien umbenennen.
Jezen Thomas
Dies ist eine großartige Antwort, es ist kein zusätzliches Plugin erforderlich.
wpp
8
:!mv % %:h/new_name

Register %enthält den Namen der aktuellen Datei. '%:h'Zeigt das Verzeichnis 'head' an, das die aktuelle Datei enthält, z. B.: %:hGibt zurück, /abc/defwenn der vollständige Pfad Ihrer Datei lautetabc/dev/my.txt

Yossarian42
quelle
7

Wie wäre es damit (verbessert durch Jakes Vorschlag):

:exe "!mv % newfilename" | e newfilename
Murftown
quelle
Hmmm, ich sollte klarstellen, dass es gestern auf MacVim funktioniert hat, aber ich wurde in einen Server eingebunden und habe es heute versucht und der 2. Befehl schien nicht als Doppelpunktbefehl behandelt zu werden ...
Murftown
1
Eigentlich funktioniert es jetzt auch nicht auf MacVim. Zurück zum Zeichenbrett! :)
Murftown
2
Es sollte sein:exe "!mv % newfilename" | e newfilename
Jake
Danke Jake, das ist ein bisschen besser als meine Lösung. Aktualisiert.
Murftown
7

Vim hat zwar eine renameFunktion, behält aber leider nicht die Geschichte bei.

Der einfachste betriebssystemunabhängige Weg, eine Datei umzubenennen, ohne den Verlauf zu verlieren, ist:

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

expand('#:p') Gibt den vollständigen Pfad der älteren Datei zurück.

Verwenden :bd #Sie diese Option, wenn Sie auch die ältere Datei aus der Pufferliste löschen möchten.

Oder erstellen Sie ein Plugin

Wenn Sie die Datei mit einem Schnellbefehl umbenennen möchten, fügen Sie unter ~ / .vim / plugin eine neue Datei mit folgendem Inhalt hinzu:

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

Mit dem Befehl Renamekönnen Sie eine Datei schnell umbenennen.

Alex
quelle
: call delete ('<Cr> #') ist einfacher zu schreiben.
MaikoID
7

Es gibt ein deutlich größeres Plugin namens vim- eunuch von Tim Pope, das eine Umbenennungsfunktion sowie einige andere Extras enthält (Löschen, Suchen, Speichern aller, chmod, sudo edit, ...).

So benennen Sie eine Datei in vim-eunuch um:

:Move filename.ext

Im Vergleich zu rename.vim:

:rename[!] filename.ext

Spart ein paar Tastenanschläge :)

sh78
quelle
Und es hat tatsächlich einige andere sehr nützliche Funktionen!
Pierre-Adrien Buisson
5

Um vorhandene Dateien ohne Verwendung von Plugins umzubenennen, sollten Sie den Befehl verwenden

:Explore

Mit diesem Befehl können Sie Dateien im Verzeichnis durchsuchen, löschen oder umbenennen. Dann sollten Sie im Explorer zu der erforderlichen Datei navigieren und dann den RBefehl type eingeben , mit dem Sie den Dateinamen umbenennen können

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

Ich weiß nicht, ob dies die "einfachste" Methode ist, aber vorausgesetzt, Sie haben Ihre Datei bereits gespeichert (: w), würde ich die Shell (: sh) aufrufen und ein einfaches cp foo foo.bak ausführen, um zum Editor zurückzukehren Verwenden Sie Strg-D / Beenden. Nützliche Liste der vi-Editor-Befehle unter diesem Link

DBMarcos99
quelle
Dadurch wird die Datei kopiert und nicht umbenannt.
InnaM
Ah - ich habe falsch verstanden "Ich möchte person.haml_spec.rb weiter bearbeiten" Mein schlechtes!
DBMarcos99
Ich nehme an, Sie könnten :! cp foo foo.new und dann: e foo.new?
DBMarcos99
3

Sie können auch Folgendes verwenden: f gefolgt von: w


quelle
3
Dadurch wird die alte Datei nicht entfernt.
Keith Pinson
1

Dieses kleine Skript ist nicht perfekt (der zusätzliche Wagenrücklauf, den Sie drücken müssen), aber es erledigt den Job.

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
quelle
0

Eine andere Möglichkeit besteht darin, nur netrw zu verwenden, das ein nativer Bestandteil von vim ist.

:e path/to/whatever/folder/

Dann gibt es Optionen zum Löschen, Umbenennen usw.

Hier ist eine Keymap zum Öffnen von netrw für den Ordner der Datei, die Sie bearbeiten:

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

:sav newfile | !rm #

Beachten Sie, dass die alte Datei nicht aus der Pufferliste entfernt wird. Wenn Ihnen das wichtig ist, können Sie stattdessen Folgendes verwenden:

:sav newfile | bd# | !rm #

Sitaktif
quelle