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?
Jak zmienić nazwę mojego bieżącego pliku w Vimie?
Na przykład:
person.html_erb_spec.rb
person.haml_spec.rb
person.haml_spec.rb
Jak miałbym to robić elegancko?
Odpowiedzi:
Jest mała wtyczka, która pozwala ci to zrobić.
Program Files (x86)
. Za każdym razem, gdy ten katalog wymaga pracy, musi być zawinięty w cudzysłów. Co jest dużo.
Komenda jest wywoływana :saveas
, ale niestety nie usunie twojego starego pliku, musisz to zrobić ręcznie. zobacz :help saveas
więcej informacji.
EDYTOWAĆ:
Większość instalacji vima ma zintegrowany eksplorator plików, którego można używać do takich operacji. Spróbuj :Explore
w 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ą R
lub je usuwać D
. Ale naciśnięcie <F1>
Eksploratora da ci lepszy przegląd.
Jeśli używasz git i już wtyczki tpope za fugitive.vim po prostu:
:Gmove newname
Spowoduje to:
Jeśli plik nie został jeszcze dodany do repozytorium git, najpierw dodaj go:
:Gwrite
:Gmove
wymaga ś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.
Robię to za pomocą wtyczki NERDTree:
:NERDTreeFind
następnie naciśnij m
Aby zmienić nazwę, możesz wybrać (m)ove the current node
i zmienić nazwę pliku. Dostępne są również opcje takie jak usuwanie, kopiowanie, przenoszenie itp.
:w newname
-, aby utworzyć kopię.:e#
.:!rm oldname
.W systemie Windows opcjonalny trzeci krok nieco się zmienia:
:!del oldname
.:f newname
2) zapisz go :w
3) (opcjonalnie) !rm oldname
. Zaletą jest to, że historia cofania została zachowana.
:saveas
jest lepszy pod tym względem, @rampion - i robi to, co napisał @kynan.
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}
Polecam :Rename
z 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
: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 sav
z 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).
... 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 :Rename
bez argumentów?
Tak, usuwa plik ukryty w '#'!
Rozwiązanie: możesz użyć np. warunki lub try
takie 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)
!rm
jest ogólnie niezbyt bezpieczny ... mv
lepsza 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 ( #
)
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>
:!mv % %:h/new_name
Rejestr %
zawiera nazwę bieżącego pliku. '%:h'
pokazuje katalog „head” zawierający bieżący plik, np .: %:h
zwraca, /abc/def
gdy pełna ścieżka pliku jestabc/dev/my.txt
Co powiesz na to (poprawione sugestią Jake'a):
:exe "!mv % newfilename" | e newfilename
:exe "!mv % newfilename" | e newfilename
Vim ma rename
funkcję, 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.
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 Rename
pomoże ci szybko zmienić nazwę pliku.
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 :)
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ż R
polecenie type, które pozwoli ci zmienić nazwę pliku
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
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>