Wstawić pojedynczy znak w Vimie?

25

W Vimie (7.2) istnieje polecenie trybu normalnego, rktóre zastępuje jeden znak innym. Na przykład wpisanie rXzastąpi jeden znak pod kursorem, Xa następnie powróci do normalnego trybu.

Czy istnieje polecenie trybu normalnego, aby wstawić pojedynczy znak, a następnie powrócić do trybu normalnego?

John Dibling
źródło
1
Możliwy duplikat w
innej
Zobacz vim.wikia.com/wiki/Insert_a_single_character dla kompleksowego rozwiązania.
Maxim Suslov,

Odpowiedzi:

6

MelBurslan ma rację, że ta funkcja nie istnieje natywnie, ale utworzenie polecenia zdefiniowanego przez użytkownika nie jest tak naprawdę sposobem na jego utworzenie. Majstrowałem przez kilka minut i wymyśliłem:

:nmap <silent> ,s "=nr2char(getchar())<cr>P

Który wykorzystuje pewne sztuczki Vima polegające na „wstawianiu” tekstu z rejestru, w tym przypadku rejestrze „wyrażenia”. Wyrażenie podłączane do rejestru to „ nr2char(getchar())”, które zwróci ciąg jednego znaku.

Powodem, dla którego zbudowałem mapowanie w ten sposób, jest to, że uzyskanie wkładu użytkownika „w połowie” mapowania jest trudne i może zachowywać się nieprzewidywalnie; nawet to mapowanie spowoduje upuszczenie kursora do obszaru stanu podczas oczekiwania na wpisanie znaku przez użytkownika.

Heptyt
źródło
8

Dzięki Johnny za udzielenie nam tej wspaniałej odpowiedzi w komentarzach poniżej:

":nmap <C-i> i_<Esc>r"

To mapuje Control + i, aby wstawić pojedynczy znak, i robi to bardzo zwięźle.

W twoim pliku vimrc będzie to wyglądać następująco:

nnoremap <C-i> i_<Esc>r

Zmieniłem moje mapowanie, aby użyć miejsca, a ty możesz zmienić swój na preferowane klucze:

nnoremap <Space> i_<Esc>r
Matt C.
źródło
1
To najbardziej zwięzła i prosta odpowiedź.
Dylanthepiguy
4

O ile mi wiadomo, nie ma takiej funkcji w żadnym szeroko rozpowszechnionym wcieleniu edytora vi, ale vim ma możliwość tworzenia własnych poleceń. Zostało to wcześniej omówione tutaj: w tym wątku

Możesz być w stanie utworzyć niestandardowe polecenie, robiąc to, co chcesz.

MelBurslan
źródło
3
Oto polecenie mapowania Ctrl-I w celu wstawienia pojedynczego znaku: „: nmap <Ci> i_ <esc> r”
Johnny
2

Prostym sposobem na to jest użycie poleceń Wytnij xi Umieść p. Powiedz, że *to znak, który chcesz wstawić. Włóż za pomocą i * Esc. Następnie uderz x. To spowoduje odcięcie postaci. Teraz możesz uderzyć, paby umieścić pojedynczą postać. Jeśli chcesz wstawić ten znak 300 razy, można wpisać: 300p.

Steve Bragg
źródło