Чи може Vim писати додаткові рядки? тобто на кожному рядку А стає В, а 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/ ).

Найшвидший спосіб, який я знав, щоб зробити це in 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знак char (вибір блоку, використовуючи Ctrl-v), виключаючи 0з 1-го рядка (таким чином ви закінчите стовпець, що містить останні 25 нулів), а потім збільшуйте їх g Ctrl-a.
  4. Застосовуйте той самий метод для стовпця, що містить A.

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


yy не працює для мене. Я можу побачити на шпаргалці, яку я роздрукував з www.vimcheatsheet.com, що це дуже стандартна команда. vim --version повертає це: pastebin.com/DcFxZh1S . Мені доведеться дослідити, чому це не працює для мене ... (я спробував у режимах візуального управління та вставки). Також коли я вставляю, це все відображається в одному рядку. Однак я спробував g Ctrl-a, і він робить саме те, що я хотів, дякую :)
Duncan Betts

1
:verbose map yмає показати вам, які відображення, які починаються у yвас, і де вони були встановлені. Але вам доведеться користуватися yyв звичайному режимі.
VanLaser


1
Яка версія vimбуде збільшуватися , Aщоб Bз Ctrl-aдією? Моїх точно немає, і я на 7.4 1-1202.
Cory Klein

4
@CoryKlein Спробуйте ввести :set nrformats+=alpha. Це додасть значення alphaпараметру 'nrformats'і повинно дозволяти Ctrl-a«збільшувати» алфавітні символи. Якщо вам подобається така поведінка, ви можете додати її до свого vimrc. В іншому випадку ви можете додати його до опції разом з оператором +=і видалити його згодом за допомогою оператора -=( :set nrformats-=alpha).
saginaw

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

дуже круто ! (+1)
Jooao

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 ,"]"}'

1
Perl немає в операційній системі.
dash-tom-bang
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.