Czy Vim może pisać linie przyrostowe? tzn. na każdej linii A staje się B, a 1 staje się 2

8

Chciałem to napisać:

A = mapping[0]
B = mapping[1]
C = mapping[2]
D = mapping[3]
E = mapping[4]
F = mapping[5]
G = mapping[6]
H = mapping[7]
I = mapping[8]
J = mapping[9]
K = mapping[10]
L = mapping[11]
M = mapping[12]
N = mapping[13]
O = mapping[14]
P = mapping[15]
Q = mapping[16]
R = mapping[17]
S = mapping[18]
T = mapping[19]
U = mapping[20]
V = mapping[21]
W = mapping[22]
X = mapping[23]
Y = mapping[24]
Z = mapping[25]

Skończyło się na użyciu LibreCalc, umieszczając różne części w różnych komórkach, dodając litery i cyfry, łącząc wyniki i wklejając całą partię z powrotem do Vima.

Rozumiem, że to, co chciałem napisać, to okropny kod. Obecnie studiuję Python i staram się unikać szukania informacji, które, jak wiem, zostaną omówione w dalszej części kursu ( http://interactivepython.org/ ).

Najszybszym sposobem, jaki o tym wiedziałem, było napisanie czegoś takiego

A = mapping[0] <ESC> hh <CTRL>+<V> BBh y $ o B <ESC> y 1] <CR>

Wiem, że vim jest bardzo potężny (używam go od kilku tygodni, naprawdę mi się podoba).

Czy byłoby możliwe napisanie tego, co chciałem za pomocą komendy vim?

Duncan Betts
źródło

Odpowiedzi:

11

Chociaż można to zrobić za pomocą skryptów, jeśli masz najnowszą wersję Vima (np. W Arch Linux), możesz użyć g Ctrl-ado zwiększenia bloku wizualnego. W Twoim przypadku:

  1. Napisz oryginalną linię: A = mapping[0] Esc
  2. Yank line i umieść poniżej 25 jego kopii: yy25p
  3. Wizualnie wybierz kolumnę zawierającą 0znak ( zaznaczanie bloku, używając Ctrl-v), wyłączając 0z pierwszego wiersza (więc skończysz na kolumnie zawierającej ostatnie 25 zer), a następnie zwiększ je za pomocą g Ctrl-a.
  4. Zastosuj tę samą metodę dla kolumny zawierającej A.

( Uwaga : Ponieważ komentarze pokazują, trzeba dodać alphado nrformatsopcji, aby móc przyrostu liter, np set nrformats+=alpha.My vimrc posiada: set nrformats=hex,alphaw ten sposób przyrost wyłączenie ósemkowy i binarne, które nie używam)

VanLaser
źródło
yy nie działa dla mnie. Widzę w ściągach, które wydrukowałem ze strony www.vimcheatsheet.com, że jest to bardzo standardowe polecenie. vim --version zwraca to: pastebin.com/DcFxZh1S . Będę musiał zbadać, dlaczego to nie działa dla mnie ... (Próbowałem w trybie poleceń wizualnych i trybów wstawiania). Również po wklejeniu wszystko pojawia się w tym samym wierszu. Jednak wypróbowałem g Ctrl-a i robi dokładnie to, co chciałem, dziękuję :)
Duncan Betts
1
:verbose map ypowinien pokazać, jakie mapowania zaczynają się od yCiebie i gdzie zostały ustawione. Ale musisz używać yyw trybie normalnym.
VanLaser,
1
Naprawiono: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Duncan Betts
1
Jaka wersja vimbędzie zwiększać Asię Bz Ctrl-aakcji? Mój zdecydowanie nie, i jestem włączony 7.4 1-1202.
Cory Klein
4
@CoryKlein Spróbuj pisać :set nrformats+=alpha. Doda wartość alphado opcji 'nrformats'i pozwoli Ctrl-a„zwiększać” znaki alfabetyczne. Jeśli podoba ci się to zachowanie, możesz dodać je do swojego vimrc. W przeciwnym razie możesz dodać go do opcji za pomocą operatora, +=a następnie usunąć za pomocą operatora -=( :set nrformats-=alpha).
saginaw
6

Wolę rozwiązanie przyrostu wizualnego, którego używał @VanLaser (patrz :h v_CTRL-A). Jednak pokażę, że można to zrobić również za pomocą makra.

Zacząć od:

A = mapping[0]

Zapisz następujące naciśnięcia klawiszy w wybranym makrze (np. q):

yyp:set nrformats+=alpha<cr><c-a>:set nrformats-=alpha<c-a>

Spowoduje to zduplikowanie linii, a następnie zwiększenie pierwszego znaku (np. A), A następnie zwiększenie części liczbowej. Uruchom to makro 24 razy i gotowe, np 24@q.

  • qq - rozpocząć nagrywanie do rejestru q
  • yyp - zduplikuj linię
  • :set nrformats+=alpha<cr>- 'nrformatsnie ma alphadomyślnie
  • <c-a>- Za pomocą alphamożemy teraz zwiększać litery
  • :set nrformats-=alpha<cr>- usuń alphaz'nrformats'
  • <c-a> - zwiększ następny numer
  • q - Zatrzymaj nagrywanie
  • 24@q- powtórz makro w rejestrze q24 razy

Aby uzyskać więcej pomocy, zobacz:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
źródło
Fajny :) 25?
VanLaser,
1
@ VanLaser: 1 (linia początkowa) + 1 (rejestrowanie makra) + 24 = 26.
Peter Rincker
4

Odpowiedzi już udzielone, nie pomyślałabym, że zajmę się tym tak ładnie. Napisałbym wszystkie litery w jednym wierszu, a następnie wprowadziłem tekst i podział wiersza z podstawieniem wyrażenia (używając numeru linii jako liczby przyrostowej), coś w rodzaju

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
źródło
bardzo fajny ! (+1)
JJoao
2

Niemal zawsze, gdy robię coś takiego, wybieram użycie :substitutemakr. Zwłaszcza zdolność do oceny ekspresji zastępującej na początku \=sprawia, że ​​często jest to możliwe (patrz :h sub-replace-special).

Gdy masz już puste linie ( 25i<Enter><Esc>), możesz użyć polecenia

:1,26s/^/\=nr2char(line('.')+64) . ' = mapping[' . (line('.')-1) . ']'

niezbędne sekwencje są generowane przy użyciu bieżącej '.'liczby wiersza ( argumentu) zwróconej przez funkcję line()i przy użyciu nr2char () do konwersji liczb dziesiętnych na odpowiedniki ASCII (65 = A). Niezbędne łańcuchy są łączone za pomocą.

Sakari Cajanus
źródło
1

Zawsze możesz spróbować użyć systemu operacyjnego ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
źródło
1
Perla nie ma w systemie operacyjnym.
dash-tom-bang