Может ли Vim писать дополнительные строки? т.е. в каждой строке A становится B, а 1 становится 2

8

Я хотел написать это:

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]

В итоге я использовал LibreCalc, поместил разные части в разные ячейки, добавил буквы и цифры, объединил результаты и вставил их обратно в Vim.

Я ценю то, что я хотел написать, это ужасный код. Сейчас я изучаю Python и пытаюсь избежать поиска информации, которая, как я знаю, будет рассмотрена позже в курсе, за которым я следую ( http://interactivepython.org/ ).

Самый быстрый способ, которым я знал, сделать это в vim, это напечатать что-то вроде

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

Я знаю, что Vim очень мощный (я использовал его в течение нескольких недель, я действительно наслаждаюсь этим).

Было бы возможно написать то, что я хотел, с какой-нибудь командой vim?

Дункан Беттс
источник

Ответы:

11

Хотя это можно сделать с помощью сценариев, если у вас есть очень свежая версия Vim (например, та, что в Arch Linux), вы можете использовать g Ctrl-aдля увеличения визуального блока. В твоем случае:

  1. Напишите оригинальную строку: A = mapping[0] Esc
  2. Вставьте строку и поместите 25 копий ниже: yy25p
  3. Визуально выберите столбец, содержащий 0символ (выбор блока, используя Ctrl-v), исключая 0из 1-й строки (таким образом, вы получите столбец, содержащий последние 25 нулей), затем увеличьте их с помощью g Ctrl-a.
  4. Примените тот же метод для столбца, содержащего A.

( Примечание : как показывают комментарии, нужно добавить alphaк nrformatsопциям, чтобы иметь возможность увеличивать буквы, например: set nrformats+=alpha.My vimrc имеет:, set nrformats=hex,alphaтаким образом отключая восьмеричное и двоичное приращение, которое я не использую)

VanLaser
источник
уу не работает на меня. На распечатке, которую я распечатал с www.vimcheatsheet.com, я вижу, что это очень стандартная команда. vim --version возвращает это: pastebin.com/DcFxZh1S . Мне придется выяснить, почему это не работает для меня ... (я пробовал в визуальном режиме команд и вставки). Также, когда я вставляю, все это появляется в одной строке. Однако я попробовал g Ctrl-a, и он делает именно то, что хотел, спасибо :)
Дункан Беттс
1
:verbose map yдолжен показать вам, какие сопоставления начинаются у yвас, и где они были установлены. Но вы должны использовать yyв обычном режиме.
VanLaser
1
Исправлено: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Дункан Беттс
1
Какая версия vimбудет увеличиваться , Aчтобы Bс Ctrl-aдействием? Моего точно нет, а я на 7.4 1-1202.
Кори Кляйн
4
@CoryKlein Попробуйте набрать :set nrformats+=alpha. Это добавит значение alphaк опции 'nrformats'и должно позволить Ctrl-a«увеличивать» алфавитные символы. Если вам нравится это поведение, вы можете добавить его в свой vimrc. В противном случае вы можете добавить его в опцию с оператором +=и впоследствии удалить его с помощью оператора -=( :set nrformats-=alpha).
сагино
6

Я предпочитаю решение визуального увеличения, которое использовал @VanLaser (см. :h v_CTRL-A). Однако я покажу, что это можно сделать и с помощью макроса.

Начните с:

A = mapping[0]

Запишите следующие нажатия клавиш в макрос по вашему выбору (например q):

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

Это дублирует строку, а затем увеличивает первый символ (например A), а затем увеличивает числовую часть. Запустите этот макрос 24 раза, и все готово, например 24@q.

  • qq - начать запись в регистр q
  • yyp - продублируйте строку
  • :set nrformats+=alpha<cr>- 'nrformatsне имеет alphaпо умолчанию
  • <c-a>- Теперь alphaмы можем увеличивать буквы
  • :set nrformats-=alpha<cr>- удалить alphaиз'nrformats'
  • <c-a> - увеличить следующий номер
  • q - остановить запись
  • 24@q- повторить макрос в реестре q24 раза

Для получения дополнительной помощи см .:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Питер Ринкер
источник
Хороший :) 25?
VanLaser
1
@VanLaser: 1 (начальная строка) + 1 (запись макроса) + 24 = 26.
Питер Ринкер,
4

Прекрасные ответы уже предоставлены, я бы не подумал пойти так же хорошо. Я бы набрал все буквы в одной строке, а затем ввел текст и разрыв строки с подстановкой выражения (используя номер строки для добавочного номера), что-то вроде

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
источник
очень круто ! (+1)
Жоао
2

Почти всегда, когда я делаю что-то подобное, я предпочитаю использовать :substituteмакросы. Особенно возможность оценки выражения в замене, когда начинается с, \=часто делает это возможным (см. :h sub-replace-special).

Когда у вас есть пустые строки на месте ( 25i<Enter><Esc>), вы можете использовать команду

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

необходимые последовательности генерируются с использованием текущего номера строки ( '.'аргумента), возвращаемого функцией line(), и использования nr2char () для преобразования десятичных чисел в эквиваленты ASCII (65 = A). Необходимые строки объединяются с использованием.

Сакари Каянус
источник
1

Вы всегда можете попробовать использовать операционную систему ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
источник
1
Perl отсутствует в операционной системе.
Даш-Том-Бэнг