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?
Wie soll ich meine aktuelle Datei in Vim umbenennen?
Zum Beispiel:
person.html_erb_spec.rb
person.haml_spec.rb
person.haml_spec.rb
Wie würde ich das elegant machen?
Antworten:
Es gibt ein kleines Plugin , mit dem Sie dies tun können.
Program Files (x86)
. Jedes Mal, wenn mit diesem Verzeichnis gearbeitet werden muss, muss es in Anführungszeichen gesetzt werden. Welches ist ähm, viel.
Der Befehl wird aufgerufen :saveas
, aber leider wird Ihre alte Datei nicht gelöscht. Sie müssen dies manuell tun. siehe :help saveas
fü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 :Explore
im Befehlsmodus (ich würde das tatsächlich einer Funktionstaste zuordnen, es ist sehr praktisch). Sie können beispielsweise Dateien mit umbenennen R
oder mit löschen D
. Durch Drücken <F1>
des Explorers erhalten Sie jedoch einen besseren Überblick.
Wenn Sie git verwenden und bereits das Plugin fugitive.vim des tpope haben, dann einfach:
:Gmove newname
Dieser Wille:
Wenn Ihre Datei noch nicht zu einem Git-Repo hinzugefügt wurde, fügen Sie sie zuerst hinzu:
:Gwrite
:Gmove
Erfordert 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.
Ich mache es mit dem NERDTree Plugin:
:NERDTreeFind
dann drücken m
Zum Umbenennen können Sie den (m)ove the current node
Dateinamen auswählen und ändern. Es gibt auch Optionen wie Löschen, Kopieren, Verschieben usw.
:w newname
-, um eine Kopie zu erstellen.:e#
.:!rm oldname
.Unter Windows ändert sich der optionale dritte Schritt ein wenig:
:!del oldname
.:f newname
2) ihn zu speichern :w
3) (optional) !rm oldname
. Der Vorteil ist, dass Ihr Rückgängig-Verlauf erhalten bleibt.
:saveas
ist in dieser Hinsicht besser, @rampion - und macht das, was @kynan geschrieben hat.
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}
Ich würde es :Rename
von 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
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.
: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 sav
Ausfall 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).
... 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 try
Aussage 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)
!rm
ist in der Regel nicht sehr sicher ... mv
zu 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
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>
:!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.: %:h
Gibt zurück, /abc/def
wenn der vollständige Pfad Ihrer Datei lautetabc/dev/my.txt
Wie wäre es damit (verbessert durch Jakes Vorschlag):
:exe "!mv % newfilename" | e newfilename
:exe "!mv % newfilename" | e newfilename
Vim hat zwar eine rename
Funktion, 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.
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 Rename
können Sie eine Datei schnell umbenennen.
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 :)
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 R
Befehl type eingeben , mit dem Sie den Dateinamen umbenennen können
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
Sie können auch Folgendes verwenden: f gefolgt von: w
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>
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>