O Vim pode escrever linhas incrementais? isto é, em cada linha A se torna B e 1 se torna 2

8

Eu queria escrever isso:

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]

Acabei usando o LibreCalc, colocando as diferentes partes em diferentes células, adicionando letras e números, concatenando os resultados e colando o lote de volta no Vim.

Aprecio que o que eu queria escrever é um código terrível. Estou estudando Python no momento e tenho tentado evitar encontrar informações que eu sei que serão abordadas mais tarde no curso que estou seguindo ( http://interactivepython.org/ ).

A maneira mais rápida que eu sabia de fazer isso no vim era digitar algo como

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

Eu sei que o vim é muito poderoso (eu o uso há algumas semanas, estou gostando muito).

Teria sido possível escrever o que eu queria com algum comando vim?

Duncan Betts
fonte

Respostas:

11

Embora isso possa ser feito com scripts, se você possui uma versão muito recente do Vim (por exemplo, a do Arch Linux), pode usar g Ctrl-apara incrementar um bloco visual. No seu caso:

  1. Escreva a linha original: A = mapping[0] Esc
  2. Arranque a linha e coloque 25 cópias abaixo: yy25p
  3. Selecione visualmente a coluna que contém o 0caractere (seleção de bloco, usando Ctrl-v), excluindo a 0partir da 1ª linha (para terminar com uma coluna contendo os últimos 25 zeros) e, em seguida, incremente-os com g Ctrl-a.
  4. Aplique o mesmo método para a coluna que contém A.

( Nota : Como os comentários mostram, é necessário adicionar alphaàs nrformatsopções, para poder aumentar as letras, por exemplo: set nrformats+=alpha.My vimrc has :,set nrformats=hex,alpha desativando o incremento octal e binário, que eu não uso).

VanLaser
fonte
yy não está funcionando para mim. Eu posso ver no cheatsheet que imprimi em www.vimcheatsheet.com que este é um comando muito padrão. vim --version retorna isso: pastebin.com/DcFxZh1S . Vou ter que investigar por que não está funcionando para mim ... (tentei nos modos de comando e inserção visual). Além disso, quando colo, tudo aparece na mesma linha. No entanto, eu tentei sair g Ctrl-a e ele faz exatamente o que eu queria, obrigado :)
Duncan Betts
11
:verbose map ydeve mostrar quais mapeamentos começam com yvocê e onde eles foram definidos. Mas você tem que usar yyno modo normal.
VanLaser 12/02
11
Corrigido: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Duncan Betts
11
Qual versão do vimincrementará Aa Bcom a Ctrl-aação? O meu definitivamente não, e eu estou 7.4 1-1202.
Cory Klein
4
@CoryKlein Tente digitar :set nrformats+=alpha. Ele adicionará o valor alphaà opção 'nrformats'e deve permitir Ctrl-a"incrementar" caracteres alfabéticos. Se você gosta desse comportamento, pode adicioná-lo ao seu vimrc. Caso contrário, você poderá adicioná-lo à opção com o operador +=e removê-lo posteriormente com o operador -=( :set nrformats-=alpha).
Saginaw
6

Prefiro a solução de incremento visual usada pelo @VanLaser (consulte :h v_CTRL-A). No entanto, mostrarei que isso também pode ser feito via macro.

Começar com:

A = mapping[0]

Registre as seguintes teclas pressionadas em uma macro de sua escolha (por exemplo q):

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

Isso duplicará a linha e aumentará o primeiro caractere (por exemplo A) e aumentará a parte numérica. Execute essa macro 24 vezes e pronto, por exemplo 24@q.

  • qq - comece a gravar no registro q
  • yyp - duplicar a linha
  • :set nrformats+=alpha<cr>- 'nrformatsnão possui alphapor padrão
  • <c-a>- Com alphaagora podemos incrementar letras
  • :set nrformats-=alpha<cr>- remover alphade'nrformats'
  • <c-a> - incrementar o próximo número
  • q - pare de gravar
  • 24@q- repete a macro no registro q24 vezes

Para obter mais ajuda, consulte:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
fonte
Nice one :) 25?
VanLaser
11
@VanLaser: 1 (linha de partida) + 1 (registrando a macro) + 24 = 26. #
315 Peter Rincker
4

Boas respostas já fornecidas, eu não teria pensado em fazê-lo tão bem. Eu teria digitado todas as letras em uma única linha e introduzido o texto e a quebra de linha com uma substituição de expressão (usando o número da linha como número incremental), algo como

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
fonte
muito legal ! (+1)
JJoao
2

Quase sempre, ao fazer algo assim, eu escolho usar :substitutesobre macros. Especialmente a capacidade de avaliar a expressão em substituição ao iniciar \=torna frequentemente possível (consulte :h sub-replace-special).

Depois de ter linhas vazias no lugar ( 25i<Enter><Esc>), você pode usar o comando

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

as seqüências necessárias são geradas usando o número da linha atual ( '.'argumento) retornado pela função line()e usando nr2char () para converter números decimais em equivalentes ASCII (65 = A). As seqüências necessárias são concatenadas usando.

Sakari Cajanus
fonte
1

Você sempre pode tentar usar o sistema operacional ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
fonte
11
Perl não está no sistema operacional.
traço-tom-bang