Jak mogę uzyskać wizualny wybór vimscript?

12

Jeśli mam kilka wierszy vimscript, które chcę przetestować przed włożeniem mojego vimrc, czy można wizualnie wybrać, a następnie je pobrać?

próbowałem

  • dokonaj selekcji wizualnej v, a następnie ruchów, aby dokonać selekcji itp., a następnie
  • :'<,'>so

Ale vim podaje błąd

niedozwolony zasięg

również

:'<,'>w | so

daje

Posługiwać się ! napisać częściowy bufor

Jak mogę zdobyć wizualnie wybrany vimscript?

the_velour_fog
źródło

Odpowiedzi:

11

W wierszu polecenia naciśnij, <C-u>a następnie wpisz @*i wprowadź.

<C-u>usunie zakres wizualny '<,'>, który został wstawiony automatycznie, jeśli jakiś tekst zostanie wizualnie zaznaczony.

:@*wykona zawartość *rejestru, która zawiera wszystko, co jest aktualnie wybrane wizualnie.

Nawet jeśli zaznaczony / podświetlony tekst znajduje się w przeglądarce (Firefox, Chrome, ...), będzie działał, *rejestr pozwoli ci na bezpośredni dostęp do niego w vimie.


Jeśli tekst jest zaznaczony w buforze vim, innym rozwiązaniem jest skopiowanie go w nazwie rejestru, na przykład do rejestru poprzez wpisywanie "ay.

Następnie w wierszu polecenia wpisz: <C-r>ai wpisz.
Ctrl+ rda ci rodzaj podpowiedzi reprezentowanej przez znak "(więcej informacji można przeczytać :h c_Ctrl-r).
W tym nowym monicie, jeśli podasz nazwę rejestru, jego zawartość zostanie wstawiona w linii poleceń, gdzie będziesz mógł go edytować przed wykonaniem.


Poza tym, jeśli skopiujesz jakiś tekst bez podawania rejestru, będzie on dostępny z rejestru bez nazwy .

Załóżmy, że masz plik vimscript w pliku i chcesz go szybko pobrać, możesz skopiować za pomocą Y, a następnie za pomocą: :<C-r>"i wpisać w wierszu poleceń .

Wreszcie, jeśli użyjesz tego ostatniego rozwiązania, jest tylko problem, o którym musisz wiedzieć.
Jeśli pojawi się dziwny znak w linii poleceń jak ten ^M, to jest notacja daszek powrotu karetki. Powinieneś go usunąć, w przeciwnym razie prawdopodobnie wystąpi błąd.

Podsumowując:

  1. skopiuj swoją linię vimscript za pomocą Y
  2. przejść do trybu poleceń za pomocą :
  3. naciśnij, <C-r>aby przejść do monitu rejestrów
  4. wpisz, "aby wywołać rejestr bez nazwy
  5. naciśnij klawisz Backspace, aby usunąć ^Mznak
  6. i naciśnij Enter.
saginaw
źródło
1
Słodkie! : D działa ładnie - nigdy wcześniej nie spotkałem @*, dzięki!
the_velour_fog
Cieszę się, że ci pomogło. Zredagowałem odpowiedź, aby zaproponować inne rozwiązanie.
saginaw
1
fajny, próbowałem twojej sugestii, żeby : <C-r>a go użyć, tak naprawdę działał dobrze :) Myślę, że vim czyta te ^Mznaki jako linię powrotną - i wykonuje każdą z nich jako osobną linię / polecenie?
the_velour_fog
To dobre pytanie, szczerze mówiąc nie wiem. Zwykle jeśli nie usunę tej postaci, mam błędy. Cieszę się, że zadziałało to bezbłędnie. Może ktoś z większą wiedzą na ten temat wyjaśni nam, jak vim traktuje tego rodzaju znaki specjalne.
saginaw
2

Właściwie robię to trochę inaczej, po prostu dokonuję edycji w moim vimrc i ponownie go za każdym razem piszę. (Mam kaskadowy zestaw plików vimrc, więc pozwala mi to na zmianę dowolnego z nich).

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif
dash-tom-bang
źródło
2

Bardziej bezpośrednio do pytania niż do mojej innej odpowiedzi, możesz zdefiniować odwzorowanie w ten sposób (w nnoremapprzypadku braku wyboru, po prostu wykonaj bieżącą linię; vnoremapdla gdy tryb wizualny jest aktywny):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

W obu przypadkach „bieżącą linią” jest :executed, więc w wersji wizualnej :executeprzechodzisz jedną linię po drugiej poprzez selekcję wizualną.

Jak stwierdzono w innej odpowiedzi, <C-u>usuwa specyfikację zakresu, która pojawia się w wierszu poleceń podczas :wpisywania. Te |znaki muszą być uciekł, bo w przeciwnym razie są one interpretowane jako koniec vnoremappolecenia.

Można to również przekształcić w funkcję pozwalającą na pozbycie się części gimnastyki ucieczkowej, ale w tej chwili nie wydaje mi się to wielką wygraną. Zasadniczo byłby to vnoremap rozwinięty do wielu linii i edytowany callz zakresem lub nie zależnym od trybu mapowania [nv].

dash-tom-bang
źródło
Och, mapowanie w trybie wizualnym wykonuje całe linie, więc jeśli masz blok lub znak, zignoruje punkty początkowe i końcowe w liniach.
dash-tom-bang