Je travaille chez Vim depuis huit ans et je découvre constamment quelque chose de nouveau. Il est considéré comme une vertu de Vim. Pour moi, c'est un manque d'ouverture: un tas de fonctions cachées sont cachées trop profondément.
Ils parlent de la beauté de l'édition modale et des objets texte, mais il me semble que l'essence de Vim n'est pas cela. Vim est un patchwork de sous-systèmes obstrués par des outils supplémentaires. Seulement en mode d'édition normal plus d'une centaine de raccourcis clavier! Cette densité de boîtes à outils explique en grande partie pourquoi Vim est si utile. Si «afficher toutes les balises d'un mot clé» est juste
g]
, cette commande sera utilisée beaucoup plus souvent.
Dans les systèmes avec un manque d'ouverture, il faut compter sur le leadership. Mais pour Vim, il n'y en a pas tellement. Il existe des articles pour les débutants, tels que
ciw
(à ne pas confondre avec la CIA,
le manuel de la CIA pour Vim ) et similaires. Et il y a des articles d'experts qui sont plongés dans des sous-systèmes. Mais personne ne parle vraiment de ces trucs spéciaux qui vous font vous exclamer: bon sang, comme j'en avais besoin depuis six ans!
Cet article concerne certaines des petites astuces que j'utilise dans Vim. Aucun d'entre eux n'est démonté dans tous les détails, donc si quelque chose vous intéresse, je vous recommande de creuser des informations supplémentaires. Ils ne sont pas non plus liés les uns aux autres. Mais c'est normal. En général, il y en a plus qu'assez pour vraiment aider presque tout le monde.
Structure de l'article
Très grossier, les utilisateurs de Vim se répartissent en deux catégories.
Les puristes apprécient la petite taille et l'omniprésence. En règle générale, ils minimisent la configuration au cas où vous devriez travailler sur un ordinateur inconnu (par exemple, via ssh). Les extenseurs, d'autre part, remplissent Vim de plugins, de fonctions et de mappages locaux dans une tentative futile de prétendre utiliser Emacs. Si vous leur prenez du vimrc, les gars resteront complètement impuissants.
Comme vous le devinez probablement, je suis beaucoup plus proche des expanseurs que des puristes. J'ai divisé les astuces en deux sections selon que des modifications sont nécessaires dans le Vim de base.
Puristes
Pour les commandes modales, des vues d'aide standard sont utilisées, c'est-à-dire que
<cr>
signifie que vous appuyez sur la touche Entrée. Lorsque vous avez besoin d'aide
:h
pour une ligne spécifique, par exemple
:h E676
, la ligne sera entre parenthèses.
Diverses commandes en mode normal
": et @:
":
est un registre contenant la dernière commande exécutée. Vous pouvez taper
":p
pour l'imprimer dans le tampon.
@:
répète la dernière commande.
"=
Inscrivez-vous aux «expressions». Ici, vous pouvez entrer n'importe quelle expression vimL et l'insérer, l'utiliser avec ctrl-R, etc. Ainsi, par exemple, l'horodatage local est inséré en tapant
"=strftime("%c")<cr>p
.
mA, 'A
m{letter}
place la marque à la position du curseur. Ensuite,
'{letter}
ira à cette ligne. Pour les lettres minuscules, il agit sur le tampon, il convient donc à la navigation. Cela fonctionne globalement pour les lettres majuscules: même si vous êtes dans un autre fichier,
'A
ira dans le fichier étiqueté
Vous pouvez voir toutes vos balises avec la commande
:marks:
ctrl-A et ctrl-X
Augmente et diminue le nombre suivant de la ligne à l'emplacement du curseur ou à sa droite. Puisqu'il va immédiatement au nombre, la combinaison peut être utilisée de n'importe où.
10c-A
beaucoup plus simple que
wwwwwciw20
.
q:
Ouvre l'historique des équipes précédentes. Vous pouvez l'utiliser avec n'importe quel texte Vim, mais les modifications ne sont pas enregistrées. Cependant, vous pouvez exécuter la commande modifiée à l'aide de
<CR>
. Cela vous permet de modifier et de redémarrer très rapidement les commandes ou de rechercher les anciennes pour les réutiliser.
q /, q?
Identique à
q:
sauf recherche.
ctrl-I, ctrl-O
Passe à l'emplacement suivant ou précédent dans la liste des sauts. Utile pour une vérification rapide puis un retour en arrière. C'est très agréable de lire les fichiers d'aide.
Macros
Consultez
cet article pour un aperçu plus approfondi de l'utilisation des macros.
Mode visuel
gv
Sélectionne l'élément visuel précédent.
v_o
Va de l'autre côté du bloc visuel. Utile si vous avez commencé une ligne trop bas ou quelque chose comme ça. En mode bloc, il passe à l'angle diagonal opposé et utilise
v_O
pour passer à l'
v_O
horizontal opposé.
g ctrl-A / ctrl-X
En mode visuel, ctrl-A incrémente simplement le premier nombre de chaque ligne. D'un autre côté,
g ctrl-A
incrémentera d'une ligne à chaque ligne. Ceci est beaucoup plus facile à expliquer dans le tableau:
Opérateurs: v, V, cv (: h o_v)
Vous savez probablement qu'en mode visuel, vous pouvez sélectionner des caractères (v), des lignes (V) et des blocs (ctrl-V). Mais ces trois combinaisons peuvent être utilisées comme opérateurs de mouvement pour le fragment correspondant. Par exemple, vous avez le texte suivant:
abc
abc
abc
Si vous placez le curseur sur le haut
b
et appuyez sur
d2j
, il supprimera les trois lignes, car
j
déplace ligne par ligne. Si
d<cV>2j
enfoncé à la place, le mouvement devient bloc par bloc et seule la colonne du milieu avec trois lettres
b
est supprimée.
Un cas d'utilisation est la suppression dans la recherche. Normal
d/
déplace caractère par caractère. Par conséquent, j'utilise
dV/
pour le mouvement ligne par ligne avec suppression. Il existe une autre façon de procéder:
/ regex / {n}
Déplacer n lignes en dessous de la correspondance, ou autant de lignes vers le haut si la valeur est négative. Comme effet secondaire, le mouvement se produit ligne par ligne. Ainsi, si vous souhaitez supprimer la première ligne correspondant à
regex
, vous pouvez saisir
d/regex//0
.
Ex-équipes
Vous entrez des ex-commandes en mode commande, par exemple, la commande
:s
. En plus du remplacement, il existe de nombreuses autres commandes utiles. Tous ces exemples nécessitent une plage, telle que
%
.
: g / regex / ex
Exécute la commande uniquement sur les lignes correspondant à l'expression régulière. Par exemple, vous pouvez saisir
g/regex/d
pour supprimer toutes les lignes correspondant à regex. La commande
v
est similaire à
g
, mais fonctionne sur toutes les lignes qui
ne correspondent
pas à l'expression régulière.
Les astuces deviennent plus puissantes avec la norme et quelques autres.
: norme {Vim}
Agit comme si vous exécutiez {Vim} sur chaque ligne de la plage. Par exemple,
g/regex/norm f dw
supprimera le premier mot après le premier espace de chaque ligne correspondant à l'expression régulière regex. C'est souvent beaucoup plus simple qu'une macro.
norm
obéit à toutes vos comparaisons. Par exemple, si vous avez attribué
jk
à
<esc>
en mode insertion, la
norm I jk$diw
ajoutera un espace au début de la ligne,
quittera le mode insertion , puis supprimera le dernier mot de la ligne. J'aime vraiment cette fonctionnalité, mais si vous préférez ne pas utiliser vos mappages, vous pouvez appliquer la
norm!
.
: co.
Copie une plage dans la ligne actuelle. Vous pouvez également spécifier des valeurs arbitraires au lieu d'un point, par exemple,
+3
ou
'a. mv
'a. mv
pour se déplacer.
: y {reg}
Copie la plage dans le registre
{reg}
. Si
{reg}
majuscule, il est ajouté au cas existant. c'est à dire une telle équipe
let @a = '' | %g/regex/y A
copiera toutes les lignes correspondant à l'
regex
dans tout le fichier. Cela permet d'extraire le texte cassé du fichier et de le copier dans le presse-papiers du système (en utilisant
let @+ = @a
).
: windo {ex}
Exécute une commande dans toutes les fenêtres. Par exemple
:windo $
toutes les fenêtres vers le bas. Il y a
bufdo
,
cdo
,
tabdo
et autres.
Fonctionne très bien avec
g
et
s
. Pour remplacer toutes les combinaisons
AA
par
BB
avec un aperçu des remplacements, vous pouvez entrer
vimgrep AA
en chargeant toutes les correspondances dans quickfix puis
cdo s/AA/BB/cge
pour rechercher / remplacer toutes les correspondances.
Vim for Extender
Voici des astuces qui nécessitent d'enregistrer les paramètres ou de modifier une session Vim. Hypothétiquement, ils peuvent être utilisés dans le mode "puritain", simplement en entrant des commandes, mais certains impliquent des changements assez sérieux qui contredisent l'esprit du purisme.
Voici seulement le plus insolite. Beaucoup de gens attribuent
H
à la casquette
^
, donc ces choses ne valent pas la peine d'être mentionnées. En outre, cela n'a aucun sens de parler de
vim-sensible
ou de
vim-surround
, mais uniquement de plugins plus exotiques.
Si vous configurez constamment votre vimrc, faites-vous plaisir et ajoutez une commande distincte pour cela:
command! Vimrc :vs $MYVIMRC
Paramètres
J'ai tous les paramètres, les raccourcis clavier et les fonctions stockés dans un seul fichier vimrc. La division en plusieurs fichiers rend la recherche difficile.
La plupart des paramètres ne sont pas vraiment des «trucs». Il vaut mieux regarder
vim-sensible : presque tous les paramètres à partir de là conviendront à votre vimrc.
définir lazyredraw
Ne redessinez pas l'écran au milieu d'une macro (pour améliorer les performances).
définir smartcase / ignorecase
Avec ces deux paramètres, une recherche sans majuscules ne respecte pas la casse et une recherche avec des majuscules est sensible à la casse.
définir un fichier
Sauvegarde des actions, même si vous fermez et ouvrez Vim, afin que les actions d'annulation soient toujours disponibles. Très pratique en combinaison avec le plugin undotree.
set foldcolumn = {n}
Colonne latérale avec blocs effondrés. Plus
n
grand, plus les blocs sont réduits dans la colonne et pour le reste, le nombre est indiqué.
set suffixesadd = {str}
gf
signifie généralement "aller au fichier sous le curseur", mais nécessite une extension de fichier dans la ligne.
suffixesadd
ajoute l'extension spécifiée. Si
suffixesadd=.md
, la commande
gf
sur la ligne 'foo' recherchera les fichiers
foo
et
foo.md
set inccommand = nosplit
Uniquement pour Neovim. La
incommand
montre en temps réel les changements que l'équipe apportera. Seul
s
est actuellement pris en charge, mais même cela est incroyablement utile. Si vous entrez
:s/regex
, toutes les correspondances sont mises en surbrillance. Si vous ajoutez
/change
, il affichera tous les remplacements. Fonctionne avec toutes les propriétés d'expression régulière, y compris les backlinks et les groupes.
définir la ligne d'état (: h état ligne)
Détermine les éléments à afficher dans le panneau en bas de chaque fenêtre. Ici, le formatage est beaucoup plus compliqué et capricieux que dans d'autres paramètres, vous devez donc passer du temps à l'expliquer. Il existe quelques astuces simples. Tout d'abord, regardez la barre d'état Vim par défaut:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
Ici, il est plus facile de remplacer
%P
(pourcentage du fichier sur le curseur). Le format de la barre d'état est la valeur après le signe de pourcentage entre accolades. Par conséquent, pour les fichiers Markdown, vous pouvez écrire ceci:
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %{wordcount()[\"words\"]}
Et remplacez le pourcentage du fichier par le nombre de mots dans le document.
Ou installez une
tabline
. Si vous n'utilisez pas d'onglets, cette ligne peut devenir une «ligne d'état globale». Par exemple
set tabline=%{strftime('%c')}
affichera toujours la date en haut.
Liaisons de touches
J'ai
beaucoup de fixations.
De nombreuses touches pratiques dans Vim sont stupidement attribuées par défaut. Par exemple, enregistrer la séquence de touches
s
est synonyme de
cl
(enregistrer une séquence de touches), et
U
est identique à
u
, sauf pour écrire annuler comme une nouvelle modification, qui est fonctionnellement inutile.
Q
identique à
gQ
et est en tout cas un formidable piège.
Z
utilisé uniquement pour
ZZ
et
ZQ
. Mon Dieu, même le manuel de Vim recommande de réaffecter les touches
_
et à certaines fonctions, car "vous ne les utiliserez probablement jamais". Je préférerais ne pas enregistrer un clic, mais ajouter des fonctions complètement nouvelles au clavier. Voici quelques unes de mes fixations:
nnoremap Q @@
Sans ralentir le passage en ex-mode, répète la dernière macro.
nnoremap s "_d
Il fait fonctionner la clé
s
(avec les paramètres appropriés pour
ss
et
S
) comme d, uniquement sans enregistrer le texte supprimé dans le registre. Utile pour ne pas obstruer le registre.
nnoremap <cj> <cw> j
Accédez à la fenêtre ci-dessous. Affectations appropriées pour
h
,
k
,
l
. Travailler avec des fenêtres est beaucoup plus facile.
nnoremap <leader> e: exe getline (ligne ('.')) <cr>
Exécutez la ligne actuelle comme s'il s'agissait d'une commande. Dans les expériences, c'est souvent plus pratique que
q:
Arguments spéciaux (: h map-arguments)
La commande
map <buffer> lhs rhs
active le mappage de clé pour ce tampon uniquement. Il fonctionne vraiment de manière pratique avec les commandes automatiques comme combinaison de touches temporaire ou lors de la définition d'affectations via une fonction. Les affectations de tampons ont priorité sur les affectations globales, c'est-à-dire que vous pouvez remplacer la commande générale plus utile dans une situation spécifique.
La commande
map <expr> {lhs} {expr}
vérifie
{expr}
et utilise la valeur de retour comme remappage final des clés. Un cas d'utilisation simple est contraignant en fonction des conditions. Je les ai:
nnoremap <expr> k (v:count == 0 ? 'gk' : 'k')
nnoremap <expr> j (v:count == 0 ? 'gj' : 'j')
Ce qui fait que
j
et
k
déplacent le long de la ligne
jusqu'à ce qu'un nombre soit trouvé, et ensuite la clé est annulée. Par conséquent, je peux parcourir de longs paragraphes de prose sans casser des combinaisons telles que
10j
.
L'argument
<silent>
utile si des liaisons exécutent des commandes ex.
inoremaps
Grâce à
inoremap
liaisons fonctionnent en mode insertion. Là, ils commencent à travailler, donc
inoremap ;a aaaa
introduira «aaaa» au lieu de «; a». Si vous voulez faire quelque chose en mode normal, utilisez
<cO>
. Par exemple, si nous avons
inoremap ;1 <co>ma
puis
;1
définira
'a
.
J'aime spécifier d'utiliser des points-virgules comme clé pour les réaffectations, car dans les textes normaux, il y a presque toujours un espace ou une nouvelle ligne après le point-virgule.
autocmd
Les commandes automatiques sont idéales pour la configuration. Habituellement, vous les configurez comme ceci:
augroup {name} autocmd! " Prevents duplicate autocommands au {events} {file regex} {command} augroup END
Ensuite, si l'un des événements {events} se produit dans le fichier {file regex}, la commande {command} se déclenchera. Les événements sont répertoriés
:h event
. Par exemple, si vous écrivez
augroup every autocmd! au InsertEnter * set norelativenumber au InsertLeave * set relativenumber augroup END
alors vim désactivera le numéro relatif pour le mode d'insertion uniquement.
La commande
au {event} <buffer> {ex}
applique la commande auto uniquement au tampon actuel. Parfois, j'utilise ceci pour ajouter des gestionnaires d'événements à court terme à un fichier spécifique.
BufNewFile, BufRead
BufnewFile
démarre lorsqu'un nouveau fichier est créé,
BufRead
- lorsque le tampon est ouvert pour la première fois. Ils sont généralement utilisés pour ajouter des paramètres et des remappages à des types de fichiers spécifiques. J'en ai un:
augroup md autocmd! au BufNewFile,BufRead *.md syntax keyword todo TODO au BufNewFile,BufRead *.md inoremap <buffer> ;` ```<cr><cr>```<Up><Up> augroup END
Ce n'est que dans les fichiers Markdown que la ligne TODO est mise en évidence et les caractères
;`
en mode insertion ajoute une notation de code.
Les équipes automatiques vous permettent de faire des choses beaucoup plus complexes. Par exemple,
au
pour
BufWriteCmd
remplace l'enregistrement standard, vous permettant d'implémenter une logique personnalisée. Cela va au-delà des «astuces» et va dans le domaine de la «magie noire».
Plugins
La plupart des gens connaissent les plugins populaires tels que
vim-surround
et
NERDtree
. Voici une liste de quelques-uns peu connus que je trouve très utiles.
Dans la plupart des éditeurs de texte, les actions d'annulation se produisent de façon linéaire. Si vous apportez une modification à A, l'annulez, puis apportez une modification à B, alors A est perdu pour toujours. Cependant, Vim stocke l'arborescence entière des actions annulées. La commande
u
annule l'action dans la branche d'arbre actuelle et
g
passe à la version
chronologique précédente. Vous pouvez afficher la liste des actions annulées avec la commande
:undolist
.
Mais ce format n'est pas très clair. Il est préférable de voir l'arbre réel. C'est exactement ce
Undotree
fait
Undotree
: il présente une bonne représentation ASCII de l'arbre des actions annulées avec une navigation pratique.
Le plugin fournit des commandes pour échanger des arguments, vous pouvez donc remplacer
(a, f(b, c))
par
(f(b, c), a)
en quelques frappes. Je dois régulièrement faire de telles modifications, c'est donc une amélioration majeure de la qualité de vie.
Connecte une API de niveau supérieur au terminal intégré neo / vim. Par exemple
:T {text}
envoie {text} à la console. Bon pour créer un environnement interactif.
"TODO {{{
De nombreux sujets ne sont pas traités dans cet article car ils sont trop techniques ou doivent être expliqués en détail, comme l'écriture de fonction ou le système de syntaxe. Et je ne sais pas grand-chose. Je voudrais étudier plus en détail les sujets suivants:
Fenêtres Aperçu, Quickfix et Liste
J'utilise parfois des outils avec ces fenêtres, mais je ne sais pas comment les manipuler. Je voudrais ajouter des erreurs de correction rapide à mon
plugin TLA + . J'aime aussi l'idée de mettre les informations de support et les commandes de rappel dans la fenêtre d'aperçu. Cela ouvre des possibilités difficiles à reproduire dans l'IDE.
API Neovim
Neovim propose une API avancée pour intégrer Vim à des programmes externes. Votre script Python peut envoyer des commandes à l'instance Neovim et vous pouvez contrôler l'éditeur via le serveur, par exemple. J'ai vu des démos conceptuelles sympas où la saisie semi-automatique se produit en fonction des informations d'un navigateur. Ça a l'air très cool!
Objets texte
Jamais créé un tel.
Il s'agissait donc d'un bref aperçu de certaines des fonctions implicites de Vim. J'espère que vous avez découvert quelque chose d'utile!