Vim peut-il écrire des lignes incrémentielles? c'est-à-dire que sur chaque ligne, A devient B et 1 devient 2

8

Je voulais écrire ceci:

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]

J'ai fini par utiliser LibreCalc, en mettant les différentes parties dans différentes cellules, en ajoutant les lettres et les chiffres, en concaténant les résultats et en recollant le lot dans Vim.

J'apprécie que ce que je voulais écrire soit un code affreux. J'étudie actuellement Python et j'ai essayé d'éviter d'aller chercher moi-même des informations dont je sais qu'elles seront traitées plus tard dans le cours que je suis en train de suivre ( http://interactivepython.org/ ).

Le moyen le plus rapide que je connaissais pour le faire dans vim était de taper quelque chose comme

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

Je sais que vim est très puissant (je l'utilise depuis quelques semaines, je l'apprécie vraiment).

Aurait-il été possible d'écrire ce que je voulais avec une commande vim?

Duncan Betts
la source

Réponses:

11

Bien que cela puisse être fait avec des scripts, si vous avez une version très récente de Vim (par exemple celle d'Arch Linux), vous pouvez utiliser g Ctrl-apour incrémenter un bloc visuel. Dans ton cas:

  1. Écrivez la ligne originale: A = mapping[0] Esc
  2. Yank line et en mettre 25 exemplaires ci-dessous: yy25p
  3. Sélectionnez visuellement la colonne contenant le caractère 0(sélection de bloc, en utilisant Ctrl-v), en excluant la 0de la 1ère ligne (vous vous retrouvez donc avec une colonne contenant les 25 derniers zéros), puis incrémentez-les avec g Ctrl-a.
  4. Appliquez la même méthode pour la colonne contenant A.

( Remarque : Comme commentaires montrent, il faut ajouter alphaaux nrformatsoptions, afin d'être en mesure de lettres incrément, par exemple: set nrformats+=alpha.Mon vimrc a: set nrformats=hex,alpha, ce qui désactive octal et l' incrément binaire, que je ne l' utilise pas)

VanLaser
la source
yy ne fonctionne pas pour moi. Je peux voir sur la feuille de triche que j'ai imprimée sur www.vimcheatsheet.com qu'il s'agit d'une commande très standard. vim --version renvoie ceci: pastebin.com/DcFxZh1S . Je vais devoir chercher pourquoi ça ne marche pas pour moi ... (J'ai essayé en mode commande visuelle et en mode insertion). Aussi quand je colle, tout apparaît sur la même ligne. Cependant, j'ai essayé g Ctrl-a et il fait exactement ce que je voulais, merci :)
Duncan Betts
1
:verbose map ydevrait vous montrer les mappages qui commencent par yvous, et où ils ont été définis. Mais vous devez utiliser yyen mode normal.
VanLaser
1
Corrigé: D asciinema.org/a/2zqavz00sbzvumxwg742h3ozi
Duncan Betts
1
Quelle version de vimincrémente Aà Bla Ctrl-amesure? Le mien ne l'est certainement pas, et je suis en marche 7.4 1-1202.
Cory Klein du
4
@CoryKlein Essayez de taper :set nrformats+=alpha. Il ajoutera la valeur alphaà l'option 'nrformats'et devrait permettre Ctrl-ad'incrémenter les caractères alphabétiques. Si vous aimez ce comportement, vous pouvez l'ajouter à votre vimrc. Sinon, vous pouvez l'ajouter à l'option avec l'opérateur +=et la supprimer ensuite avec l'opérateur -=( :set nrformats-=alpha).
saginaw
6

Je préfère la solution d'incrément visuel utilisée par @VanLaser (voir :h v_CTRL-A). Cependant, je montrerai que cela peut également être fait via une macro.

Commencer avec:

A = mapping[0]

Enregistrez les touches suivantes dans une macro de votre choix (par exemple q):

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

Cela dupliquera la ligne, puis incrémentera le premier caractère (par exemple A), puis incrémentera la partie numérique. Exécutez cette macro 24 fois et vous avez terminé, par exemple 24@q.

  • qq - commencer l'enregistrement dans le registre q
  • yyp - dupliquer la ligne
  • :set nrformats+=alpha<cr>- 'nrformatsn'a pas alphapar défaut
  • <c-a>- Avec alphanous pouvons maintenant incrémenter les lettres
  • :set nrformats-=alpha<cr>- retirer alphade'nrformats'
  • <c-a> - incrémenter le nombre suivant
  • q - arrête d'enregistrer
  • 24@q- rejouer la macro dans le registre q24 fois

Pour plus d'aide, voir:

:h q
:h @
:h yy
:h p
:h 'nrformats'
:h :set
:h CTRL-A
:h v_CTRL-A
Peter Rincker
la source
Sympa :) 25?
VanLaser
1
@VanLaser: 1 (ligne de départ) + 1 (enregistrement de la macro) + 24 = 26.
Peter Rincker
4

Bonnes réponses déjà fournies, je n'aurais pas pensé y aller aussi bien. J'aurais tapé toutes les lettres sur une seule ligne, puis introduit le texte et le saut de ligne avec une substitution d'expression (en utilisant le numéro de ligne pour le numéro incrémentiel), quelque chose comme

iABCDEFGHIJKLMNOPQRSTUVXYZ<Esc>:s/./\=submatch(0)." = mapping[".line('.')."]\n"/g
jjaderberg
la source
très cool ! (+1)
JJoao
2

Presque toujours lorsque je fais quelque chose comme ça, je choisis d'utiliser des :substitutemacros. En particulier, la capacité d'évaluer l'expression en remplacement au début le \=permet souvent (voir :h sub-replace-special).

Une fois que vous avez des lignes vides en place ( 25i<Enter><Esc>), vous pouvez utiliser la commande

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

les séquences nécessaires sont générées en utilisant le '.'numéro de ligne ( argument) actuel retourné par la fonction line()et en utilisant nr2char () pour convertir les nombres décimaux en équivalents ASCII (65 = A). Les chaînes nécessaires sont concaténées en utilisant.

Sakari Cajanus
la source
1

Vous pouvez toujours essayer d'utiliser le système d'exploitation ...

:r ! perl -E 'for(A..Z){say "$_ = mapping[", ord($_)-64 ,"]"}'
JJoao
la source
1
Perl n'est pas dans le système d'exploitation.
dash-tom-bang