Zmiana nazwy bieżącego pliku w Vimie

392

Jak zmienić nazwę mojego bieżącego pliku w Vimie?

Na przykład:

  • Redaguję person.html_erb_spec.rb
  • Chciałbym zmienić jego nazwę na person.haml_spec.rb
  • Chciałbym kontynuować edycję person.haml_spec.rb

Jak miałbym to robić elegancko?

Sam Saffron
źródło

Odpowiedzi:

87

Jest mała wtyczka, która pozwala ci to zrobić.

innaM
źródło
9
Ta zaktualizowana wersja Rename.vim poprawnie obsługuje CWD - zawsze zapisuje plik w katalogu oryginalnym.
sickill
48
P: „Jakiego rodzaju socjopatyczny dziwak umieszcza spacje w nazwie reż?” - Odp .: facet, który już dawno rozpoczął projekt, który jest teraz twoim szefem ... awansował z kodowania do swojego prawdziwego obszaru specjalizacji: podążania za modami rozwoju i zmuszania ich do pracy w zespole.
Stabledog
3
@AaronMahan Naprawiłem Rename2.vim (pomijając mądrzejszą, ale bardziej złożoną wersję DelvarWorld), aby umożliwić spacje na ścieżkach i rozwidliłem go tutaj: github.com/aehlke/vim-rename3 Zapraszam do wysyłania próśb o jeszcze inteligentniejszą funkcjonalność!
aehlke
4
@Stabledog Microsoft, najwyraźniej. Program Files (x86). Za każdym razem, gdy ten katalog wymaga pracy, musi być zawinięty w cudzysłów. Co jest dużo.
JackHasaKeyboard
5
@JackHasaKeyboard: +10. „Program Files (x86)” zwycięża przez cały czas „Najgorsza jak dotąd nazwa katalogu w systemie operacyjnym pozbawionym dowiązań symbolicznych”. :)
Stabledog
451

Komenda jest wywoływana :saveas, ale niestety nie usunie twojego starego pliku, musisz to zrobić ręcznie. zobacz :help saveaswięcej informacji.

EDYTOWAĆ:

Większość instalacji vima ma zintegrowany eksplorator plików, którego można używać do takich operacji. Spróbuj :Explorew trybie poleceń (właściwie zamapowałbym to na klawisz funkcyjny, jest to bardzo przydatne). Możesz na przykład zmieniać nazwy plików za pomocą Rlub je usuwać D. Ale naciśnięcie <F1>Eksploratora da ci lepszy przegląd.

soulmerge
źródło
6
Nie sądzę, że jest to niewygodne w porównaniu do innych edytorów, w których zwykle nie można przenieść pliku. Zamiast tego musisz przejść do wybranego menedżera plików, zmienić nazwę pliku i wrócić do edytora. Jeśli masz szczęście, musisz zamknąć i ponownie uruchomić edytor, jeśli nie otrzymał powiadomienia o zmianie nazwy pliku.
Rafael Bugajewski,
130
Może Ci się również spodobać: Seks (stenografia dla podzielonego odkrywania :-))
Peter Jankuliak
6
Ponadto: e otworzy eksplorację w bieżącym okienku. Mniej ekscytujące niż: seks, ale bardziej wydajne;).
Josh
56
Dla nieustraszonych, pionowych: Sex is: Vex.
hobbes3
5
@Josh: E działa dla mnie, e nie działa dla mnie. Używam: e do edycji innego pliku w tym samym oknie.
omar
159

Jeśli używasz git i już wtyczki tpope za fugitive.vim po prostu:

:Gmove newname

Spowoduje to:

  1. Zmień nazwę pliku na dysku.
  2. Zmień nazwę pliku w git repo.
  3. Załaduj ponownie plik do bieżącego bufora.
  4. Zachowaj historię cofania.

Jeśli plik nie został jeszcze dodany do repozytorium git, najpierw dodaj go:

:Gwrite
ISQ
źródło
4
Łzy płyną mi z oczu. Idealna odpowiedź!
Farid Nouri Neshat
3
Poświęciłem dwie kozy na cześć tej odpowiedzi! Ale mam z tym mały problem, ponieważ musisz wpisać ścieżkę z katalogu głównego działającego drzewa; i to często staje się dość długie w każdym projekcie. Czy istnieje rozwiązanie tego?
xor
1
To wspaniale! Ciągle znajduję nowe rzeczy, które może zrobić zbieg.
Rich Churcher
8
@xxor: jak wspomniano w odpowiedzi Mesco, możesz użyć Ctrl + R%, aby wstawić bieżącą nazwę pliku, którą można następnie edytować.
deltab
4
Aby połączyć kilka komentarzy tutaj: :Gmovewymaga ścieżki względnej dla nowej nazwy pliku. Dobrym sposobem na to jest wpisanie, :Gmove <ctrl-r>%która dołącza bieżącą ścieżkę / nazwę pliku.
shmup
80

Robię to za pomocą wtyczki NERDTree:

:NERDTreeFind

następnie naciśnij m

Aby zmienić nazwę, możesz wybrać (m)ove the current nodei zmienić nazwę pliku. Dostępne są również opcje takie jak usuwanie, kopiowanie, przenoszenie itp.

woto
źródło
1
wiesz co, to jest główny sposób, w jaki zmieniam teraz nazwy rzeczy
Sam Saffron,
2
Ten działa naprawdę dobrze. Zdecydowanie polecam.
Matt Setter
Podoba mi się ten pomysł. To będzie teraz moja główna metoda zmiany nazwy pliku.
SLN
72
  • Napisz plik podczas edycji - :w newname-, aby utworzyć kopię.
  • Rozpocznij edycję nowej kopii - :e#.
  • (Opcjonalnie) usuń starą kopię - :!rm oldname.

W systemie Windows opcjonalny trzeci krok nieco się zmienia:

  • (Opcjonalnie) usuń starą kopię Windows - :!del oldname.
gimel
źródło
3
Stosuję to podejście przez cały czas, jednak wadą jest to, że tracisz swoje drzewo cofania - więc nie możesz cofnąć niczego przed: e
rampion
7
Miły. Najwyraźniej Ctrl-6 robi to samo co: e #
glenn jackman
możesz także otworzyć katalog, przesunąć kursor do pliku i nacisnąć „D”, aby usunąć plik.
Peder
38
Imho jest prostszy: 1) zmień nazwę bieżącego bufora :f newname2) zapisz go :w3) (opcjonalnie) !rm oldname. Zaletą jest to, że historia cofania została zachowana.
kynan
3
:saveasjest lepszy pod tym względem, @rampion - i robi to, co napisał @kynan.
lericson
36

Jeśli plik jest już zapisany:

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

Przykład:

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

Wymagania dotyczące zezwolenia:

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

Zapisz jako:

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


Dla Windows niezweryfikowany

:!move {file location} {new file location}
:e {new file location}
Benzoes
źródło
5
Możesz przynajmniej wyjaśnić, dlaczego głosowałeś na tę odpowiedź.
Benjamin
31

Polecam :Renamez tpope za eunucha do tego.

Zawiera także kilka innych przydatnych poleceń.

Polecenie Zmień nazwę jest obecnie zdefiniowane w następujący sposób (sprawdź, czy w repozytorium nie ma aktualizacji!):

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
źródło
31

Możesz to również zrobić za pomocą netrw

Polecenie explorer otwiera netrw w katalogu otwartego pliku

:E

Przesuń kursor nad plikiem, którego nazwę chcesz zmienić:

R

Wpisz nową nazwę, naciśnij enter, naciśnij y.

Ben
źródło
świetny! nawet nie wiedziałem o sieci.
javadba
31

Krótko, bezpiecznie, bez wtyczki:

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

control+ R, #natychmiast zostanie rozwinięty do alternatywnego pliku (poprzednio edytowanej ścieżki w bieżącym oknie) przed naciśnięciem Enter. To pozwala nam sprawdzić, co dokładnie zamierzamy usunąć. Używanie potoku |w takim przypadku nie jest bezpieczne, ponieważ jeśli savz jakiegoś powodu zawiedzie, #nadal będzie wskazywać inne miejsce (lub nic). To znaczy !rm #lubdelete(expand(#)) może usunąć zupełnie inny plik! Zrób to ostrożnie ręcznie lub użyj dobrego skryptu (są one wymienione w wielu odpowiedziach tutaj).

Edukacyjny

... lub spróbuj samodzielnie zbudować funkcję / polecenie / skrypt. Zacznij od czegoś prostego:

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

po przeładowaniu vimrc, po prostu wpisz :Rename new_filename. Jaki jest problem z tym poleceniem?

Test bezpieczeństwa 1: Co robi :Renamebez argumentów?

Tak, usuwa plik ukryty w '#'!

Rozwiązanie: możesz użyć np. warunki lub trytakie oświadczenie:

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

Test bezpieczeństwa 1: :Rename (bez argumentów) zgłosi błąd:

E471: Wymagany argument

Test bezpieczeństwa 2: Co jeśli nazwa będzie taka sama jak poprzednia?

Test bezpieczeństwa 3: Co się stanie, jeśli plik będzie w innej lokalizacji niż Twoja rzeczywista?

Napraw to sam. Aby zwiększyć czytelność, możesz napisać to w następujący sposób:

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

notatki

  • !rm #jest lepsze niż !rm old_name-> nie musisz pamiętać starej nazwy

  • !rm <C-R>#jest lepszy niż !rm #kiedy robisz to ręcznie -> zobaczysz, co faktycznie usuwasz (względy bezpieczeństwa)

  • !rmjest ogólnie niezbyt bezpieczny ... mvlepsza jest lokalizacja śmieci

  • call delete(expand('#'))jest lepszy niż polecenie powłoki (niezależny od systemu operacyjnego), ale dłuższy do pisania i niemożliwy do użycia control+R

  • try | code1 | code2 | tryend -> gdy wystąpi błąd podczas kodu 1, nie uruchamiaj kodu 2

  • :sav(lub :saveas) jest równoważne z :f new_name | w- patrz plik_f - i zachowuje historię cofania

  • expand('%:p')podaje całą ścieżkę twojej lokalizacji ( %) lub lokalizacji alternatywnego pliku ( #)

Mesco
źródło
17
sav person.haml_spec.rb | call delete(expand('#'))
Maxim Kim
źródło
miły! nie wiedziałem ocall delete(expand('#'))
Kyle Wild
10

W .vimrc Gary Bernhardta jest funkcja , która to obsługuje.

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
źródło
5
Głosuj za mną tak, jak lubisz. Przynajmniej mogę zmienić nazwę plików.
Jezen Thomas
To świetna odpowiedź, nie wymaga dodatkowej wtyczki.
wpp
8
:!mv % %:h/new_name

Rejestr %zawiera nazwę bieżącego pliku. '%:h'pokazuje katalog „head” zawierający bieżący plik, np .: %:hzwraca, /abc/defgdy pełna ścieżka pliku jestabc/dev/my.txt

Yossarian42
źródło
7

Co powiesz na to (poprawione sugestią Jake'a):

:exe "!mv % newfilename" | e newfilename
Murftown
źródło
Hmmm, powinienem wyjaśnić, że działało wczoraj na MacVimie, ale zostałem wpuszczony do serwera i wypróbowałem go dzisiaj, a drugie polecenie nie wydawało się traktowane jako polecenie dwukropka ...
murftown
1
Właściwie teraz też nie działa na MacVimie. Wróć do deski kreślarskiej! :)
murftown,
2
Powinno być:exe "!mv % newfilename" | e newfilename
Jake,
Dzięki Jake, to trochę lepsze niż moje rozwiązanie. Zaktualizowano
murftown
7

Vim ma renamefunkcję, ale niestety nie zachowuje historii.

Najłatwiejszym agnostycznym sposobem zmiany nazwy pliku bez utraty historii jest:

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

expand('#:p') zwraca pełną ścieżkę starszego pliku.

Użyj, :bd #jeśli chcesz również usunąć starszy plik z listy buforów.

Lub utwórz wtyczkę

Jeśli chcesz użyć szybkiego polecenia do zmiany nazwy pliku, dodaj nowy plik w ~ / .vim / plugin z następującą zawartością:

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

Polecenie Renamepomoże ci szybko zmienić nazwę pliku.

Alex
źródło
: usuwanie połączeń („<Cr> #”) jest łatwiejsze do napisania.
MaikoID
7

Istnieje znacznie większa wtyczka o nazwie vim-eunuch autorstwa Tima Pope'a, która zawiera funkcję zmiany nazwy, a także kilka innych dodatków (usuwanie, znajdowanie, zapisywanie wszystkich, chmod, edycja sudo, ...).

Aby zmienić nazwę pliku w vim-eunuch:

:Move filename.ext

W porównaniu do rename.vim:

:rename[!] filename.ext

Zapisuje kilka naciśnięć klawiszy :)

sh78
źródło
I rzeczywiście ma kilka innych bardzo przydatnych funkcji!
Pierre-Adrien Buisson
5

Aby zmienić nazwę istniejącego pliku bez użycia wtyczek, należy użyć polecenia

:Explore

To polecenie pozwala przeglądać pliki w. Katalogu, usuwać je lub zmieniać ich nazwy. niż powinieneś przejść do niezbędnego pliku w eksploratorze niż Rpolecenie type, które pozwoli ci zmienić nazwę pliku

Наглый Спамер
źródło
3

Nie wiem, czy jest to „najłatwiejsza” metoda, ale zakładając, że już zapisałeś swój plik (: w), wywołałbym powłokę (: sh) i wykonałem prosty procesor cp foo foo.bak Aby wrócić do edytora użyj Ctrl-D / Exit. Przydatna lista komend edytora vi w tym linku

DBMarcos99
źródło
Spowoduje to skopiowanie pliku, a nie zmianę jego nazwy.
innaM
Ach - źle odczytałem „Chciałbym kontynuować edytowanie person.haml_spec.rb” Mój zły!
DBMarcos99
Przypuszczam, że możesz:! cp foo foo.new, a następnie: e foo.new?
DBMarcos99
3

Możesz także użyć: f, a następnie: w


źródło
3
To nie usuwa starego pliku.
Keith Pinson,
1

Ten mały skrypt nie jest idealny (dodatkowy zwrot karetki, który musisz nacisnąć), ale wykonuje zadanie.

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
źródło
0

Innym sposobem jest użycie netrw, który jest natywną częścią vima.

:e path/to/whatever/folder/

Następnie są opcje usuwania, zmiany nazwy itp.

Oto mapa klawiszy, aby otworzyć netrw w folderze edytowanego pliku:

map <leader>e :e <C-R>=expand("%:p:h") . '/'<CR><CR>
dechimp
źródło
0

:sav newfile | !rm #

Pamiętaj, że nie usuwa starego pliku z listy buforów. Jeśli jest to dla Ciebie ważne, możesz zamiast tego użyć następujących opcji:

:sav newfile | bd# | !rm #

sitaktif
źródło