Używam Vima do czytania wielu kodów C i Perl zawierających wiele jednoliterowych nazw zmiennych.
Byłoby miło mieć jakieś polecenie zmiany nazwy zmiennej na coś bardziej znaczącego, gdy jestem w trakcie czytania kodu, aby móc szybciej przeczytać resztę.
Czy w Vimie jest jakieś polecenie, które pozwoliłoby mi to szybko zrobić?
Myślę, że wyrażenia regularne nie zadziałałyby, ponieważ:
ta sama jednoliterowa nazwa może mieć różne cele w różnych blokach zakresu; i
ta sama kombinacja liter może być częścią innej dłuższej nazwy zmiennej, literału ciągu lub komentarza.
Czy są jakieś znane rozwiązania?
źródło
:
dwukrotnie nacisnąć dwukropek ( ). Za pierwszym razem zobaczyłem:'<,'>
. Gdybym po prostus/
stamtąd pisał , nie działało; Musiałem wpisać inny dwukropek przeds/
.<C-R>
w poleceniu substitute, po prostu pominięcie wyszukiwania spowoduje, że vim użyje ostatnio szukanego wzorca, który w tym przypadku został utworzony zgd
polecenia. Tak więc po prostu:s//<newname>/gc
wystarczy.Wiem, że to stare pytanie, a droga @ mykola-golubyev JEST oczywiście najlepszą odpowiedzią dla konkretnego przypadku w pytaniu OP (które, jak zakładam, przechodzi przez zaciemniony kod, w którym prawdopodobnie będziesz mieć wiele bloków o tych samych nazwach var) ; ale przy takiej nazwie pytania wiele osób przychodzących tutaj z wyszukiwań w Google prawdopodobnie szuka mniej specyficznych dla sytuacji sposobów zmiany nazw zmiennych w VIM - a te mogą być bardziej zwięzłe
Jestem zaskoczony, że nikt nie zasugerował w ten sposób:
To
*
jest to samo cogn
- wyszukuje następne wystąpienie słowa pod kursorem ORAZ staje się ostatnim szukanym wzorcem, więc kiedy pominiesz wzorzec wyszukiwania w poleceniu substytucji, VIM zakłada, że jest to wzorzec do wyszukania.W przypadku małych ilości kopii var, jeszcze szybsza:
Szukaj wystąpienia,
cw
to polecenie zmiany słowa ,n
przechodzi do następnego wystąpienia ostatnio wyszukiwanego terminu i.
powtarza ostatnie polecenie (czyli zmień słowo na NOWA NAZWA )(Podziękowania dla mnie, wiedząc o tym wszystkim, trafiają do @doomedbunnies na Reddit )
Kolejna fajna sztuczka to: ( Podziękowania dla @ nobe4 )
cgn
to „zmień wszystko, co jest wynikiem (znajdź następne wystąpienie)”. Teraz, gdy jest to ostatnie polecenie , nie potrzebujesz,n
aby przejść do następnego wystąpienia, więc ponownie mniej pociągnięć i, co ważniejsze, nie ma potrzeby zmianyn
i.
. Ale oczywiście ma tę wadę, że nie ma sposobu, aby pominąć wystąpienie.Oto kilka korzyści:
*
lubgn
do zaznaczania słów jest bardzo szybkie - wystarczy jedno naciśnięcie klawisza (cóż, powiedzmy 1,5)*
lubgn
upewnia się, że nie dostaniesz żadnych dopasowań w innych słowach, tak samo jak:%s/<C-R>//gc
. Pokonuje:%s/\<OLDNAME\>/NEWNAME/gc
ręczne wpisywanie : osobiście często zapominam\<
o ograniczaniu dopasowań tylko do całych słów.n
aby pominąć niechciane dopasowania - prawdopodobnie nawet mniej niż dodatkowe pociągnięcia potrzebne do ograniczenia zakresu. W normalnych okolicznościach Twoje zmienne są najprawdopodobniej nieco zlokalizowane w określonym bloku kodu.źródło
AFAIK, w VIM nie ma rzeczywistej obsługi refaktoryzacji. Podczas zmiany nazwy z zamiarem refaktora zwykle podejmuję następujące środki ostrożności:
Moja końcowa zmiana wygląda mniej więcej tak
Chciałbym się mylić co do tego, że nie ma narzędzia do refaktoryzacji dla VIM, ale go nie widziałem.
źródło
Umieść to w swoim .vimrc
Zadzwoń za pomocą
:call Rnvar()
expand("<cword>")
pobiera słowo pod kursorem. Zastosowania ciąg wyszukiwania%
dla file-zakresu i\(\W\)
wzory szukać znaków spoza tekstu na granicy słowa do zastąpienia, i zapisać je w zmiennych\1
i\2
tak być ponownie umieszczona w strukturze zastępczej.źródło
Możesz użyć modyfikatora 'c' w wyszukiwaniu globalnym i zastąpić, który poprosiłby Cię o potwierdzenie każdej zamiany. Zajmie to więcej czasu, ale może zadziałać w przypadku niehumongicznego pliku kodu:
C oznacza potwierdzenie.
źródło
W c możesz poczynić postępy przy użyciu cscope. Podejmuje próbę zrozumienia składni, więc miałby szansę dowiedzieć się, kiedy litera jest zmienną.
źródło
Jeśli dotyczy to wielu plików, możesz rozważyć przyjrzenie się sedowi. Użyj find, aby pobrać pliki i xargs plus sed do wymiany. Powiedzmy, że chcesz zastąpić a_better_name we wszystkich plikach pasujących do * .c, możesz to zrobić
odnaleźć . -name "* .c" | xargs sed -i -e 's / a / a_ lepsza_nazwa / g'
Pamiętaj, że spowoduje to zastąpienie WSZYSTKICH wystąpień a, więc możesz potrzebować bardziej niezawodnego wyrażenia regularnego.
źródło