Oczywiście fakt, że można refaktoryzować w IDE jest dla wielu bezcenny. Rzadko kiedy to robię, kiedy koduję, ale mogę próbować to zrobić podczas edycji czyjegoś źródła. Jak wykonujesz tak trywialne zadanie na wielu plikach w Vimie?
Znalazłem tę wtyczkę do refaktoryzacji Rubiego, ale co powiesz na „dowolny” język?
vim
refactoring
Helmut Granda
źródło
źródło
Odpowiedzi:
Zgadzam się z paradygmatem „Vim nie jest IDE”. Ale są chwile, kiedy nie ma IDE. Oto, czego używam w takich sytuacjach:
: grep,: vimgrep,: Ag,: Ggrep
Refaktoryzacja, która ma więcej wspólnego z regularnymi zamianami, zwykle używam : grep w moim drzewie projektu, a następnie nagrywam makro, aby wykonać refaktor -: g i: s nie wymagają myślenia. Zwykle pozwala mi to szybko zmodyfikować dużą liczbę plików przy niewielkim wysiłku. Szczerze mówiąc, używam tej metody częściej niż innych.
W zależności od przepływu pracy wbudowane polecenia mogą być powolne / niewygodne. Jeśli używasz git, będziesz chciał użyć doskonałej wtyczki Fugitive i jej
:Ggrep
polecenia do wyszukiwania tylko plików sprawdzonych w git. Podoba mi się też Silver Searcher za jego szybkość.: argdo,: cdo oraz: bufdo
: cdo i : argdo są przydatne do wykonywania poleceń vima na zestawie plików.
wiersz poleceń
Kiedy trudniej jest określić listę plików, które wymagają zmian, korzystam
:vimgrep
z polecenia grep / find w wierszu poleceń, aby dokładniej określić listę plików, które muszę refaktoryzować. Zapisz listę w pliku tekstowym i użyj:e
oraz zestawu nagrań makr, aby wprowadzić zmiany, które muszę wprowadzić.Uważam, że im mniej zardzewiałe zachowuję moje umiejętności nagrywania makr, tym bardziej przydatne są dla mnie Vim do refaktoryzacji: czuję się komfortowo zapisując / przywracając z rejestrów, zwiększając / zmniejszając zmienne liczników rejestrów, czyszcząc / zapisując nagrania makr do pliku do późniejszego wykorzystania itp.
Aktualizacja
Od czasu napisania tego artykułu więcej wideokastów dotyczących metod, które opisuję, zostało opublikowanych na vimcasts.org (zachęcam do obejrzenia WSZYSTKICH Vimcastów! ). W przypadku refaktoryzacji obejrzyj te:
Vimgolf to także świetny sposób na ćwiczenie.
Wszechobecność serwerów Language Server Protocol, odkąd napisałem tę odpowiedź, przyniosła również Vimowi (i innym edytorom) pewne możliwości refaktoryzacji. IMO są dalekie od zrównania możliwości refaktoryzacji, które można zobaczyć w specjalnie zbudowanym IDE (używam ich, a wolę coc i ALE). Zobacz inne odpowiedzi na to pytanie, aby uzyskać więcej informacji!
źródło
Protokół serwera języka (LSP)
Protokół serwera językowego zawiera funkcję inteligentnej zmiany nazw symboli w całym projekcie:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Na przykład obsługuje to następujący serwer językowy:
Więcej serwerów językowych można znaleźć pod adresem https://langserver.org/ .
Krzepkość
Klient edytora vim jest niezbędny, aby używać ich w vimie. Istnieją następujące opcje:
LanguageClient-neovim (wymaga rdzy) sugeruje mapowanie:
coc.nvim (wymaga node.js) sugeruje mapowanie:
Ale ma
Ale nie definiuje żadnych skrótów klawiszowych. Musi to zrobić użytkownik.
vim-lsp udostępnia następujące polecenie
Podobnie jak w Ale, nie jest zalecane mapowanie. Jednak oczywiście możesz zdefiniować jeden z poniższych
(
<leader>r
do wymiany według twojego wyboru; nie wiem, na którą zgadza się większość wtyczek)vim-lsc ma domyślne mapowanie:
Zobacz także YouCompleteMe które ułatwia również LSP.
Neovim
Od tego czasu Neovim ma wbudowane wsparcie dla lsp 13.11.2019
Zobacz, aby zapoznać się z typowymi konfiguracjami dostawców LSP https://github.com/neovim/nvim-lsp
Nie mogłem jednak dowiedzieć się, jak działa inteligentna zmiana nazwy. Jeśli ktoś o tym wie, zaktualizuj tę sekcję.
Inne refaktoryzacje
Nie wiem, czy istnieją plany, aby protokół LSP obsługiwał bardziej złożone refaktoryzacje, takie jak zmiana struktury klasy, dodanie parametrów do metod / funkcji czy przeniesienie metody do innej klasy. Lista refaktoryzacji znajduje się pod adresem https://refactoring.com/catalog/ .
źródło
coc-rename
działa tylko na bieżącym buforze. Nie zaktualizował użycia wyeksportowanej nazwy globalnie w projekcie (między plikami).Pyton
Dla języka Python następujące wtyczki zapewniają `` inteligentne '' możliwości zmiany nazwy dla vim:
jedi-vim
( github )<leader>r
ropevim
( github )CTRL-c r r
python-mode
( github ):h pymode-rope-refactoring
źródło
Rodzina C.
Wypróbuj wtyczkę Clighter do zmiany nazwy-refaktoryzacji dla rodziny c. Jest oparty na clang, ale istnieją ograniczenia, a wtyczka jest oznaczona jako przestarzała.
Sugerowane mapowanie Clighter to
Uwaga, następca wtyczki clighter8 usunął funkcję zmiany nazwy w zatwierdzeniu 24927db42 .
Jeśli używasz neovim, możesz rzucić okiem na zacisk wtyczki . Sugeruje
źródło
Napisałem tę wtyczkę do generycznej refaktoryzacji. Nadal wymaga wielu ulepszeń. Kiedyś w przyszłości spróbuję porzucić ctagi na rzecz clang dla refaktoryzacji C i C ++.
źródło
Może nie jest to najbardziej eleganckie rozwiązanie, ale okazało się to bardzo przydatne: używam ECLIM do połączenia VIM i Eclipse. Oczywiście cała moja edycja kodu źródłowego odbywa się w VIM, ale kiedy nadejdzie czas na refaktoryzację, można w tej kwestii skorzystać z doskonałych możliwości Eclipse.
Spróbuj.
źródło
Plugin YouCompleteMe (YCM) (20 tys. Gwiazdek na github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Domyślnie nie ma mapowania.
źródło
Plugin Factorus
Jest jeszcze jedna wtyczka vim przeznaczona do refaktoryzacji o nazwie factorus, która jest dostępna na github .
Obecnie (2017-12) obsługuje języki
źródło
Umieść kursor na nazwie, aby refaktoryzować i pisać
gd(lub gDjeśli refaktoryzujesz zmienną globalną).
Następnie
cgn nowe imie esc
i
. jeden lub więcej razy, aby refaktoryzować następne wystąpienie (a)
lub
:%norm . aby jednocześnie refaktoryzować wszystkie wystąpienia w buforze.
źródło
Piszę dużo kodu C / C ++ w vimie. Najczęstszym refaktoryzacją, którą wykonuję, jest zmiana nazw zmiennych, nazw klas itp. Zwykle używam
:bufdo :%s/source/dest/g
do wyszukiwania / zamiany w plikach, co jest prawie takie samo jak zmiana nazwy zapewniana przez duże IDE.Jednak w moim przypadku zauważyłem, że zwykle zmieniam nazwy podobnych podmiotów, pisane w różnych przypadkach (np. CamelCase, snake_case itp.), Więc zdecydowałem się napisać małe narzędzie, które pomoże w tego rodzaju wyszukiwaniu „inteligentnych skrzynek” / wymienić, jest hostowany tutaj . Jest to narzędzie wiersza poleceń, a nie wtyczka do vima, mam nadzieję, że okaże się przydatne.
źródło
Do refaktoryzacji, jeśli używasz Unite (a powinieneś), możesz użyć vim-qfreplace i uczynić to niezwykle prostym. Obejrzyj ten film, który pokazuje, jak to działa. Po ustawieniu przepływu pracy możesz wykonać pewne mapowania, aby go zoptymalizować (zamiast wpisywać większość rzeczy, jak na wideo).
źródło
Połączenie dwóch wtyczek: vim-ripgrep , aby znaleźć między plikami i umieścić wyniki w oknie quickfix, oraz quickfix-reflector, aby zapisać zmiany bezpośrednio w oknie quickfix i automatycznie zapisywać każdą zmianę w plikach.
źródło
Rozważałbym użycie emacsa w wersji spacemacs. Używa tych samych trybów i większości naciśnięć klawiszy co Vim, ale ma o wiele więcej dodatków ze względu na swoją naturę seplenienia. Jeśli chcesz programować w C ++, po prostu dodaj warstwę c ++ i większość IDE jest już skonfigurowana dla Ciebie. W przypadku innych języków interpretowanych, takich jak python czy bash, nie musisz zostawiać plików spacemac, aby ich używać. Mają nawet sposób na uruchamianie bloków kodu bezpośrednio w tekście, który działa fantastycznie w przypadku programowania literackiego lub programowania odtwarzalnego, w którym kod i dane znajdują się w tym samym pliku. Oba wykonane jako tekst.
Spacemacs jest znacznie cięższy w początkowym ładowaniu, ale dodatkowe rzeczy, które możesz z nim zrobić, są warte kilku sekund kosztów uruchomienia. Warto to sprawdzić w trybie organizacji z jedną warstwą. Jest to najlepszy konspekt, programator, dziennik / lista rzeczy do zrobienia, z jakiego kiedykolwiek korzystałem.
źródło
Udać się
Istnieje wtyczka vim https://github.com/godoctor/godoctor.vim, która udostępnia je
vim-go
:GoRename
.Serwer językowy
gopls
źródło