J'ai récemment réalisé à quel point vim fonctionne très bien pour le golf, en particulier pour la complexité kolmogorov . De plus, selon meta vim est un «langage de programmation» parfaitement acceptable au moins, pour la portée de ce site, c'est-à-dire.
Quels conseils généraux avez-vous pour jouer au golf à Vim? Je recherche des idées qui peuvent être appliquées aux problèmes de code-golf et qui sont également au moins quelque peu spécifiques à Vim (par exemple, "supprimer les commentaires" n'est pas une réponse).
Veuillez poster un pourboire par réponse.
Réponses:
Soyez conscient des variantes majuscules des commandes courantes. Cela peut enregistrer de manière triviale une frappe dans de nombreux contextes. Par exemple:
Un autre est d'utiliser à la
G
place degg
, mais seulement si vous utilisez un compte! Par exemple, sans décompte,gg
passe au début etG
se termine à la fin. Cependant, avec un comptage, ils se déplacent tous les deux vers la ligne que vous spécifiez, c'est donc5G
plus court que mais équivalent à5gg
.Un autre est à utiliser
H
à la place degg
, mais il est important de noter que cela ne fonctionne que si vous pouvez garantir qu'aucune entrée ne prendra plus que le nombre de lignes par défaut (je pense que c'est 24, mais cela peut varier).la source
$
même, donc au moinsC
etD
sauverait quelque chose).G
etgg
ne sont pas équivalents. Le premier va à la fin du tampon et le second va au début.5G
est équivalent à5gg
. J'ajouterai plus de détails sur ce point.Chaque fois qu'une commande échoue, elle fait du bruit, ce qui annule la macro actuelle. Vous pouvez (ab) l'utiliser pour créer une forme de boucle brute. Par exemple, si vous souhaitez répéter les frappes
<foobar>
jusqu'à ce que votre mémoire tampon comporte moins de 3 lignes. Tu peux fairece qui signifie:
Il est important de noter que si vous testez cela dans une session vim, cela
@q
peut avoir des effets secondaires imprévus, car les macros sont chargées à partir de.vim_profile
. Vous pouvez contourner cela de différentes manières. La meilleure solution consiste probablement à lancer vim avecVous pouvez également supprimer votre
.viminfo
.Si vous avez déjà lancé vim, vous pouvez taper
au début pour remettre à zéro la macro.
Les autres conditions avec lesquelles vous pouvez remplacer la 3G sont
ou
la source
Vous pensez qu'il existe des versions plus raccourcies des commandes ex. Par exemple, vous saviez probablement déjà que cela
:global
peut être raccourci:g
, mais saviez-vous que cela:nnoremap
équivaut à:nn
?C'est une bonne idée d'exécuter
:h :foo
toutes les commandes ex que vous utilisez dans votre réponse pour voir s'il existe une version plus courte.la source
est toujours équivalent à
qui se trouve être également équivalent à
assez étonnamment. (En général, sans indicateur, la dernière barre oblique d'une
:s
expression n'est jamais nécessaire.)la source
:%s/x
ne supprime pas chaque occurrence de x, juste la première sur chaque ligne.:&&
pour répéter une commande de substitution et ses indicateurs.Supposons que vous soyez en mode insertion et que vous souhaitiez effectuer une seule commande en mode normal. Vous pourriez écrire cela comme ceci:
Ne le faites pas comme ça. Au lieu de cela, utilisez
<C-o>
, qui exécute une seule commande normale, puis revient immédiatement en mode insertion.la source
<CR>
après<foobar>
pour envoyer la commande?:
,/
ou?
)Il existe trois opérateurs de «changement de cas»,
Puisque ce sont des opérateurs, ils prennent un mouvement, donc pour convertir le caractère actuel en minuscules, vous utiliseriez
Voici où l'astuce amusante entre en jeu. :) Si vous voulez changer la casse d'un seul caractère ou la ligne actuelle, c'est un octet plus court en mode visuel. Par exemple,
gul
équivaut àEt
gu_
(_ est la ligne actuelle) est équivalent àCette astuce ne fonctionne pas pour le basculement, car elle
v?
déclenche une recherche en arrière en mode visuel (tout comme en sev/
déplaçant dans la direction opposée), vous en avez donc besoin à lavg?
place. Cependant, voici où vous pouvez utiliser l'~
opérateur, pour économiser encore plus d'octets! (Merci @Doorknob de l'avoir signalé)Vous pouvez voir cette astuce en action sur ma réponse vim ici , et sur la réponse V équivalente sur le et le post.
la source
~
, ce qui fait basculer la casse du caractère sous le curseur et en déplace un vers la droite!L'alphabet en 10 touches
Tout le mérite de cette technique revient à Lynn, qui l'a d'abord utilisée dans cette réponse . Je l'écris ici pour la postérité.
Utilisez les dix touches suivantes pour extraire l'alphabet minuscule:
(Où
␍
est un retour chariot, c'est-à-dire la touche Entrée.)Explication
:h<_␍
ouvre la section d'aidev_b_<_example
(un exemple de sélection visuelle par blocs), qui contient le texteabcdefghijklmnopqrstuvwyxz
.jjY
descend vers cette ligne et la tire, puisZZ
ferme la fenêtre d'aide.la source
Connaissez vos registres
Tirer ou supprimer du texte dans un registre spécifique (par exemple
"aY
) pour l'utiliser plus tard n'est pas toujours nécessaire. Vim possède plusieurs registres qui sont automatiquement remplis avec les sujets de diverses commandes. Tapez:help registers
pour les voir tous, mais voici quelques remarques particulières:Registre sans nom:
""
- Le dernier texte qui a été retiré ou supprimé.Registre numéroté
"0
- Le dernier texte qui a été tiré.Registres numérotés
"1
-"9
- Le dernier texte qui a été supprimé sauf s'il était inférieur à une ligne. Chaque fois qu'il"1
est rempli, son contenu précédent est déplacé vers"2
et ainsi de suite.Petit registre de suppression:
"-
- Le dernier texte de moins d'une ligne qui a été supprimé.Dernier texte inséré:
".
En particulier, les registres
"-
et"1
peuvent être utiles ensemble, vous permettant de supprimer du texte avec par exempledd
dans le"1
registre et de supprimer un autre texte avecD
dans le"-
(bien sûr, la sémantique n'est pas identique, mais souvent ils n'ont pas besoin d'être ).Tous les registres peuvent être un peu difficiles à suivre, mais vous pouvez voir le contenu de tous vos registres à tout moment en tapant
:registers
.la source
Cela est apparu dans le chat plus tôt, j'ai donc pensé que je pourrais aussi bien le poster comme un conseil complet.
<C-a>
et<C-x>
incrémenter et décrémenter le nombre suivant sur la ligne. C'est une fonctionnalité extrêmement utile pour certains calculs simples, mais elle permet également un petit hack soigné.Disons que vous devez passer au numéro suivant. Par exemple, nous devons changer
à
La façon la plus évidente est de passer au 2, puis de faire:
Puisque c'est plus court que
Il existe de nombreuses façons de passer au 2. Par exemple,
Ainsi que de nombreuses autres façons.
Ce sont tous 2 (ou plus) frappes. Cependant, étant donné
<C-a>
que<C-x>
non seulement les nombres incrémentent / décrémentent, mais sautent également au nombre suivant, nous pouvons prendre un octet avecla source
Mouvements de golfeur
Souvent, si vous travaillez avec un bloc de texte (en particulier dans les défis ascii-art ), vous devrez vous déplacer vers le premier ou le dernier caractère du tampon.
G
etgg
sont assez bons, mais il y a des choses ennuyeuses. Par exemple, pour obtenir le dernier caractère, vous avez besoinG$
etgg
ne vous placerez pas nécessairement dans la première colonne s'il y a un espace de tête. Voici quelques mouvements plus agréables, mais notez qu'ils ne fonctionnent que si votre texte n'a pas de lignes vides au milieu:Premier caractère du tampon:
{
est meilleur quegg0
. S'il y a des lignes vides au milieu du texte, vous pouvez également utilisergo
ce qui vous amène au premier caractère du tampon, quoi qu'il arrive .Dernier caractère du tampon:
}
est meilleur queG$
Ceux-ci fonctionnent également comme un argument pour un opérateur, mais notez que ce sont des mouvements de caractère, pas des mouvements de ligne!
la source
H
est plus golfeur quegg
H
n'est pas fiable. Son comportement dépend de la taille de la fenêtre visible et de l'endroit où vous vous trouvez dans le tampon. (Il est remappé en V pour éviter cette confusion)Faire des calculs avec le registre d'expression
Vous pouvez effectuer des calculs en mode normal et en mode insertion.
Mode normal
En mode normal, si vous tapez,
@=
votre curseur se déplacera vers la ligne de commande, où vous pourrez saisir n'importe quelle expression. Lorsque vous appuyez sur Entrée, le résultat de l'expression sera exécuté en tant que commandes en mode normal.Par exemple, supposons que vous souhaitiez accéder à la colonne du milieu de la ligne actuelle. L'appel de fonction
col('$')
renvoie le nombre de colonnes de la ligne, afin que nous puissions accomplir quoi en tapant ce qui suit:Lorsque vous appuyez sur entrée, le curseur revient dans le tampon et vim attend un opérateur (comme
|
) comme si vous veniez de saisir un nombre. Alternativement, vous auriez pu saisir ceci:... mais bien sûr, c'est plus d'octets.
Mode d'insertion
Vous pouvez également utiliser le registre d'expression en mode insertion en appuyant sur
<Ctrl-r>=
au lieu de@=
. Cela fonctionne de la même manière en mode normal, sauf que le résultat de l'expression que vous entrez sera exécuté en mode insertion. Par exemple, si vous avez tapé<Ctrl-r>=col('$')<CR>
, le nombre de colonnes de la ligne actuelle serait inséré au niveau du curseur comme si vous l'aviez tapé.Pour plus d'informations sur le registre d'expression, tapez
:help "=
.Réutiliser des expressions
La dernière expression utilisée est stockée dans le registre d'expression,
"=
. Taper@=<CR>
en mode normal ou<Ctrl-r>=<CR>
en mode insertion évaluera à nouveau l'expression, vous permettant de les utiliser un peu comme des macros.Faire des calculs par substitution
Vous pouvez également évaluer des expressions lorsque vous effectuez des substitutions d'expressions régulières. Tout ce que vous avez à faire est de commencer votre substitution par
\=
. Par exemple, supposons que vous vouliez numéroter les lignes de ce fichier:L'appel de fonction
line('.')
renvoie le numéro de ligne actuel, donc le travail est facile. Entrer ceci:... donne le résultat souhaité:
Pour utiliser des groupes capturés dans une telle expression, vous pouvez utiliser la
submatch()
fonction, où par exemplesubmatch(0)
est équivalent à\0
dans une substitution ordinaire,submatch(1)
est équivalent à\1
, etc. Cela mange beaucoup de frappes, malheureusement.Pour plus d'informations sur la substitution d'expression, tapez
:help sub-replace-expression
.la source
i1 <esc>bqqywjPb<C-a>@qq@q
c'est une solution en mode normal pur qui est plus courte de 5 octets. Et si vous êtes sous Unix, vous pourriez même le faire:%!nl
. Encore de bons conseils!Vous pouvez modifier directement le texte d'une macro, qui peut être considérablement plus court qu'un conditionnel alambiqué. Par exemple, supposons que vous souhaitiez coller quelque chose n fois, où n est l'entrée utilisateur. J'ai d'abord essayé de faire ceci:
Explication:
C'est 18 frappes, et une façon vraiment laide de le faire. Au lieu de cela, accédez à l'emplacement de ce numéro et procédez comme suit:
Explication:
Il s'agit de 9 touches, une énorme amélioration.
Modifier:
Encore plus court consiste à exécuter la macro de votre numéro, puis à taper votre commande. Par exemple:
Explication:
7 touches.
la source
D
pasdd
. 2. Si la commande n'implique pas de registres, vous pouvez la raccourcir encore plus. Par exemple, si vous souhaitez répéter le caractèrex
autant de fois que le nombre sous le curseur, au lieu de"qD@qix<esc>
, utilisezD@"ix<esc>
.