Vim può scrivere linee incrementali? cioè su ogni riga A diventa B e 1 diventa 2


8

Volevo scrivere questo:

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]

Ho finito con LibreCalc, inserendo le diverse parti in celle diverse, aggiungendo lettere e numeri, concatenando i risultati e incollando il lotto in Vim.

Apprezzo che quello che volevo scrivere sia un codice terribile. Al momento sto studiando Python e ho cercato di evitare di cercare da solo informazioni che so che verranno trattate più avanti nel corso che sto seguendo ( http://interactivepython.org/ ).

Il modo più veloce che sapevo di fare questo in vim era digitare qualcosa del genere

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

So che Vim è molto potente (lo uso da un paio di settimane, mi sto davvero divertendo).

Sarebbe stato possibile scrivere quello che volevo con qualche comando vim?

Risposte:


11

Mentre può essere fatto con gli script, se hai una versione molto recente di Vim (ad esempio quella in Arch Linux), puoi usare g Ctrl-aper incrementare un blocco visivo. Nel tuo caso:

  1. Scrivi la riga originale: A = mapping[0] Esc
  2. Yank line e ne metto 25 copie di seguito: yy25p
  3. Seleziona visivamente la colonna contenente il 0carattere (selezione del blocco, usando Ctrl-v), escluso 0dalla prima riga (quindi finisci con una colonna contenente gli ultimi 25 zero), quindi incrementali con g Ctrl-a.
  4. Applicare lo stesso metodo per la colonna contenente A.

( Nota : come mostrano i commenti, è necessario aggiungere alphaalle nrformatsopzioni, al fine di poter incrementare le lettere, ad esempio: set nrformats+=alpha.Il mio vimrc ha :, set nrformats=hex,alphadisabilitando così l'incremento ottale e binario, che non uso)


yy non funziona per me. Vedo sul cheatsheet che ho stampato da www.vimcheatsheet.com che questo è un comando molto standard. vim --version restituisce questo: pastebin.com/DcFxZh1S . Dovrò indagare sul motivo per cui non funziona per me ... (Ho provato con il comando visivo e le modalità di inserimento). Anche quando incollo, appare tutto sulla stessa riga. Comunque ho provato g Ctrl-a e fa esattamente quello che volevo, grazie :)
Duncan Betts,

1
:verbose map ydovrebbe mostrarti quali mappature iniziano con yte e dove sono state impostate. Ma devi usare yyin modalità normale.
VanLaser,


1
Quale versione di vimincrementerà Aa Bcon l' Ctrl-aazione? Il mio sicuramente no, e io ci sto 7.4 1-1202.
Cory Klein,

4
@CoryKlein Prova a digitare :set nrformats+=alpha. Aggiungerà il valore alphaall'opzione 'nrformats'e dovrebbe consentire Ctrl-adi "incrementare" i caratteri alfabetici. Se ti piace questo comportamento, puoi aggiungerlo al tuo vimrc. Altrimenti, è possibile aggiungerlo all'opzione con l'operatore +=e rimuoverlo successivamente con l'operatore -=( :set nrformats-=alpha).
saginaw,

6

Preferisco la soluzione di incremento visivo utilizzata da @VanLaser (Vedi :h v_CTRL-A). Tuttavia mostrerò che questo può essere fatto anche tramite macro.

Iniziare con:

A = mapping[0]

Registra i seguenti tasti premuti in una macro di tua scelta (es. q):

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

Ciò duplicherà la riga e quindi incrementerà il primo carattere (ad es. A) E quindi incrementerà la porzione numerica. Esegui questa macro 24 volte e il gioco è fatto, ad es 24@q.

  • qq - avvia la registrazione nel registro q
  • yyp - duplicare la riga
  • :set nrformats+=alpha<cr>- 'nrformatsnon ha alphaper impostazione predefinita
  • <c-a>- Con alphaora possiamo incrementare le lettere
  • :set nrformats-=alpha<cr>- rimuovere alphada'nrformats'
  • <c-a> - incrementa il numero successivo
  • q - interrompere la registrazione
  • 24@q- riprodurre la macro nel registro q24 volte

Per ulteriori informazioni, consultare:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A

Bello :) 25?
VanLaser,

1
@VanLaser: 1 (linea di partenza) + 1 (registrazione della macro) + 24 = 26.
Peter Rincker,

4

Belle risposte già fornite, non avrei pensato di farlo altrettanto bene. Avrei digitato tutte le lettere su una sola riga e poi introdotto il testo e l'interruzione di riga con una sostituzione di espressione (usando il numero di riga per il numero incrementale), qualcosa di simile

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g

molto bello! (+1)
JJoao,

2

Quasi sempre quando faccio una cosa del genere, scelgo di utilizzare le :substitutemacro. Soprattutto la capacità di valutare l'espressione in sostituzione quando si inizia con lo \=rende spesso possibile (vedi :h sub-replace-special).

Una volta che hai posto le righe vuote ( 25i<Enter><Esc>), puoi usare il comando

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

le sequenze necessarie vengono generate utilizzando il numero di riga ( '.'argomento) corrente restituito dalla funzione line()e utilizzando nr2char () per convertire i numeri decimali in equivalenti ASCII (65 = A). Le stringhe necessarie vengono concatenate utilizzando.


1

Puoi sempre provare a utilizzare il sistema operativo ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'

1
Perl non è nel sistema operativo.
dash-tom-bang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.