Il y a une pléthore de questions où les gens parlent de trucs communs, notamment " Trucs et astuces Vim + ctags ".
Cependant, je ne fais pas référence aux raccourcis couramment utilisés que les nouveaux utilisateurs de Vim trouveraient cool. Je parle d'un utilisateur expérimenté d'Unix (qu'il soit développeur, administrateur, les deux, etc.), qui pense savoir que 99% d'entre nous n'ont jamais entendu ou rêvé. Quelque chose qui non seulement facilite leur travail, mais aussi COOL et hackish . Après tout, Vim réside dans le système d'exploitation le plus riche au monde, il devrait donc avoir des subtilités que seuls quelques privilégiés connaissent et veulent partager avec nous.
Réponses:
Peut-être que 99% des utilisateurs de Vim ne le savent pas, mais c'est quelque chose que j'utilise quotidiennement et que tout utilisateur expérimenté de Linux + Vim doit savoir.
Commande de base, mais extrêmement utile.
J'oublie souvent sudo avant d'éditer un fichier sur lequel je n'ai pas de droits d'écriture. Lorsque je viens d'enregistrer ce fichier et d'obtenir une erreur d'autorisation, je lance simplement cette commande vim afin d'enregistrer le fichier sans avoir besoin de l'enregistrer dans un fichier temporaire, puis de le recopier.
Vous devez évidemment être sur un système avec sudo installé et avoir des droits sudo.
la source
sudo vim
. Au lieu de cela, vous devez exporter enEDITOR
tant que vim et exécutersudoedit
.Quelque chose que je viens de découvrir récemment et que je trouvais très cool:
Restaure le document tel qu'il était il y a 15 minutes. Peut prendre divers arguments pour la durée que vous souhaitez annuler et dépend des niveaux non définis. Peut être inversé avec la commande opposée
:later
la source
:later 8h
et j'ai fini pour aujourd'hui? : P:! [command]
exécute une commande externe pendant que vous êtes dans Vim.Mais ajoutez un point après le signe deux-points,
:.! [command]
et cela exportera la sortie de la commande dans votre fenêtre actuelle. C'est: . !
Par exemple:
Je l'utilise beaucoup pour des choses comme l'ajout de la date actuelle dans un document que je tape:
la source
:.!date
est d'écrire "date" sur une ligne puis de l'exécuter!$sh
(en alternance, la commande est suivie d'une ligne vierge et s'exécute!jsh
). Cela dirigera la ligne vers le shell "sh" et la remplacera par la sortie de la commande.:.!
est en fait un cas particulier de:{range}!
, qui filtre une plage de lignes (la ligne actuelle lorsque la plage est.
) via une commande et remplace ces lignes par la sortie. Je trouve:%!
utile pour filtrer des tampons entiers.sed
, quand vous pouvez utiliser les commandesed
/ similaires intégréesex
? Essayez de courir:.s/old/new/g
;-)Pas exactement obscure, mais il existe plusieurs commandes "supprimer dans" qui sont extrêmement utiles, comme ..
diw
supprimer le mot courantdi(
supprimer dans les parens actuelsdi"
supprimer le texte entre les guillemetsD'autres peuvent être trouvés sur
:help text-objects
la source
de Supprimez tout jusqu'à la fin du mot en appuyant sur. au désir de votre cœur.
ci (xyz [Esc] - Ceci est étrange. Ici, le «i» ne signifie pas le mode d'insertion. Au lieu de cela, il signifie à l'intérieur de la parenthèse. Cette séquence coupe donc le texte entre parenthèses dans lequel vous vous trouvez et le remplace par "xyz". Il fonctionne également à l'intérieur des crochets et des crochets - faites simplement ci [ou ci {en conséquence. Naturellement, vous pouvez faire di (si vous voulez simplement supprimer tout le texte sans taper quoi que ce soit. Vous pouvez également le faire à la
a
place dei
si vous souhaitez également supprimer les parenthèses et pas seulement le texte à l'intérieur.ci " - coupe le texte entre guillemets courants
ciw - coupe le mot actuel. Cela fonctionne comme le précédent, sauf qu'il
(
est remplacé parw
.C - couper le reste de la ligne et passer en mode insertion.
ZZ - enregistrer et fermer le fichier actuel (bien plus rapide que Ctrl-F4 pour fermer l'onglet actuel!)
ddp - déplace la ligne actuelle d'une ligne vers le bas
xp - déplace le caractère actuel d'une position vers la droite
U - majuscule, donc en
viwU
majuscule le mot~ - change la casse, donc
viw~
inversera le casse du mot entierCtrl + u / Ctrl + d faire défiler la page d'un demi-écran vers le haut ou vers le bas. Cela semble plus utile que la pagination plein écran habituelle, car elle permet de voir plus facilement comment les deux écrans sont liés. Pour ceux qui veulent toujours faire défiler tout l'écran à la fois, il y a Ctrl + f pour Forward et Ctrl + b pour Backward. Ctrl + Y et Ctrl + E défilent vers le bas ou le haut d'une ligne à la fois.
La commande folle mais très utile est zz - elle fait défiler l'écran pour faire apparaître cette ligne au milieu. C'est excellent pour placer le morceau de code sur lequel vous travaillez au centre de votre attention. Les commandes frères - zt et zb - font de cette ligne la ligne supérieure ou inférieure de l'écran, ce qui n'est pas aussi utile.
% trouve et passe à la parenthèse correspondante.
de - supprimer du curseur à la fin du mot (vous pouvez également faire
dE
pour supprimer jusqu'à l'espace suivant)bde - supprime le mot courant, de gauche à droite délimiteur
df [espace] - supprime jusqu'à et y compris l'espace suivant
dt. - supprimer jusqu'au prochain point
dd - supprimer toute cette ligne
ye (ou yE) - tire le texte d'ici à la fin du mot
ce - coupe la fin du mot
bye - copie le mot courant (me fait me demander ce que fait "salut"!)
yy - copie la ligne actuelle
cc - coupe la ligne actuelle, vous pouvez également le faire à la
S
place. Il y a aussi un plafond inférieurs
qui coupe le caractère actuel et passe en mode insertion.viwy ou viwc . Tirez ou changez le mot actuel. Appuyez
w
plusieurs fois pour continuer à sélectionner chaque mot suivant, utilisezb
pour reculervi { - sélectionnez tout le texte entre crochets. va {- sélectionner tout le texte, y compris les {} s
vi (p - surlignez tout à l'intérieur des () s et remplacez par le texte collé
b et e déplacent le curseur mot à mot, de la même manière que le font normalement Ctrl + Flèches . La définition du mot est cependant un peu différente, car plusieurs délimiteurs consécutifs sont traités comme un seul mot. Si vous commencez au milieu d'un mot, appuyer sur b vous amènera toujours au début du mot actuel, et chaque b consécutif sautera au début du mot suivant. De même, et facile à retenir, place
e
le curseur à la fin du mot actuel et de chaque mot suivant.similaire à
b
/e
, majusculeB
etE
déplacez le curseur mot à mot en utilisant uniquement des espaces blancs comme délimiteurs.majuscule D (inspirez profondément) Supprime le reste de la ligne à droite du curseur, comme Shift + End / Del dans les éditeurs normaux (remarquez 2 touches - Shift + D - au lieu de 3)
la source
vity
etvitc
peuvent être raccourcis àyit
etcit
respectivement..
).bye
ne fonctionne pas lorsque vous êtes dans le premier caractère du mot.yiw
fait toujours.Celui que je trouve rarement dans la plupart des tutoriels Vim, mais il est INCROYABLEMENT utile (au moins pour moi), est le
g; and g,
pour se déplacer (en avant, en arrière) dans la liste des modifications.
Permettez-moi de vous montrer comment je l'utilise. Parfois, je dois copier et coller un morceau de code ou une chaîne, par exemple un code de couleur hexadécimal dans un fichier CSS, alors je recherche, saute (sans me soucier de l'endroit où se trouve la correspondance), copiez-le puis sautez en arrière (g;) à l'endroit où J'étais en train de modifier le code pour enfin le coller. Pas besoin de créer de marques. Plus simple.
Juste mes 2 cents.
la source
'.
ira à la dernière ligne éditée, et`.
ira à la dernière position éditée<C-o>
/<C-i>
pour cela tout le temps - ou pour marquer ma place.Transformez vim en un éditeur hexadécimal.
Revenir.
Avertissement: Si vous ne modifiez pas avec le binaire (-b), vous risquez d'endommager le fichier. - Josh Lee dans les commentaires.
la source
:%!xxd -r
pour revenir en arrièreResélectionne la dernière sélection visuelle.
la source
Parfois, un paramètre de votre .vimrc sera remplacé par un plugin ou une autocommande. Pour déboguer cela, une astuce utile consiste à utiliser la commande: verbose en conjonction avec: set. Par exemple, pour savoir où le cindent a été activé / désactivé:
Cela produira quelque chose comme:
Cela fonctionne également avec les cartes et les hautes lumières. (Merci joeytwiddle de l'avoir signalé.) Par exemple:
la source
:verbose
peut également être utilisé avantnmap l
ouhighlight Normal
pour savoir où lel
clavier ou laNormal
surbrillance ont été définis en dernier. Très utile pour le débogage!:%TOhtml
Crée un rendu html du fichier actuel.
la source
Je ne sais pas si cela compte comme un coin sombre, mais je viens juste de l'apprendre ...
va extraire (copier) toutes les lignes contenant "match" dans le registre
"a
/@a
. (La mise en majusculeA
permet à vim d' ajouter des extraits au lieu de remplacer le contenu du registre précédent.) Je l'ai beaucoup utilisé récemment lors de la création de feuilles de style Internet Explorer.la source
:v/PATTERN/d
Explication::v
est une abréviation de:g!
, et la:g
commande applique n'importe quelle commande ex aux lignes.:y[ank]
fonctionne et fait ainsi:normal
, mais ici la chose la plus naturelle à faire est juste:d[elete]
.:g/match/normal "Ayy
- lenormal
mot - clé vous permet de lui dire d'exécuter des commandes en mode normal (que vous connaissez probablement mieux).Vous voulez consulter votre: historique des commandes?
Ensuite, parcourez, modifiez et enfin exécutez la commande.
Avez-vous déjà apporté des modifications similaires à deux fichiers et basculé entre eux? (Par exemple, fichiers source et en-tête?)
Ensuite, tabulez d'avant en arrière entre ces fichiers.
la source
q:
tout le temps par accident ...Vim ouvrira une URL, par exemple
Bien quand vous avez besoin de remonter la source d'une page pour référence.
la source
Les macros peuvent appeler d'autres macros et peuvent également s'appeler elles-mêmes.
par exemple:
... supprimera le premier mot de chaque ligne jusqu'à la fin du fichier.
Ceci est un exemple assez simple mais il démontre une fonctionnalité très puissante de vim
la source
qqqqqifuu<Esc>h@qq@q
:normal! @a
pour appliquer votre macro à chaque ligne de votre sélection.En supposant que vous avez compilé le support Perl et / ou Ruby,
:rubydo
et:perldo
que vous exécuterez une ligne unique Ruby ou Perl sur chaque ligne d'une plage (par défaut à tout le tampon), avec$_
lié au texte de la ligne actuelle (moins la nouvelle ligne). La manipulation$_
changera le texte de cette ligne.Vous pouvez l'utiliser pour faire certaines choses qui sont faciles à faire dans un langage de script, mais pas si évidentes en utilisant les commandes internes de Vim. Par exemple, pour inverser l'ordre des mots d'une ligne:
Pour insérer une chaîne aléatoire de 8 caractères (AZ) à la fin de chaque ligne:
Vous êtes limité à agir sur une seule ligne à la fois et vous ne pouvez pas ajouter de nouvelles lignes.
la source
pydo
etpy3do
travaillez pour python si vous avez compilé le support requis.^ O et ^ I
Accédez à une position plus ancienne / plus récente. Lorsque vous vous déplacez dans le fichier (en recherchant, en déplaçant des commandes, etc.), rappelez ces "sauts", de sorte que vous pouvez répéter ces sauts en arrière (^ O - O pour les anciens) et en avant (^ I - juste à côté de I sur le clavier ). Je le trouve très utile lors de l'écriture de code et lors de nombreuses recherches.
gi
Allez à la position où le mode Insertion a été arrêté en dernier. Je me retrouve souvent à éditer puis à chercher quelque chose. Pour revenir au lieu d'édition, appuyez sur gi.
gf
placez le curseur sur le nom du fichier (par exemple, incluez le fichier d'en-tête), appuyez sur gf et le fichier est ouvert
gF
similaire à gf mais reconnaît le format "[nom de fichier]: [numéro de ligne]". Appuyez sur gF pour ouvrir [nom de fichier] et positionner le curseur sur [numéro de ligne].
^ P et ^ N
Texte de saisie automatique lors de l'édition (^ P - correspondance précédente et ^ N correspondance suivante)
^ X ^ L
Pendant que l'édition se termine sur la même ligne (utile pour la programmation). Vous écrivez du code puis vous vous souvenez que vous avez le même code quelque part dans le fichier. Appuyez simplement sur ^ X ^ L et la ligne complète est terminée
^ X ^ F
Noms de fichiers complets. Vous écrivez "/ etc / pass" Hmm. Vous avez oublié le nom du fichier. Appuyez simplement sur ^ X ^ F et le nom de fichier est terminé
^ Z ou: sh
Déplacer temporairement vers le shell. Si vous avez besoin d'un dénigrement rapide:
la source
^X^F
mon animal de compagnie, les noms de fichiers incluent des=
signes, ce qui permet de faire des choses pourries à de nombreuses reprises (fichiers ini, makefiles, etc.). Je l' utilisese isfname-==
pour mettre fin à cette nuisancela source
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
C'est une bonne astuce pour rouvrir le fichier actuel avec un encodage différent:
Utile lorsque vous devez travailler avec des encodages hérités. Les encodages pris en charge sont répertoriés dans un tableau sous
encoding-values
(voirhelp
encoding-values
). Une chose similaire fonctionne également pour++ff
, afin que vous puissiez rouvrir le fichier avec la fin de la ligne Windows / Unix si vous vous trompez pour la première fois (voirhelp
ff
).la source
Taper == corrigera l'indentation de la ligne actuelle en fonction de la ligne ci-dessus.
En fait, vous pouvez faire un signe = suivi de n'importe quelle commande de mouvement. = {mouvement}
Par exemple, vous pouvez utiliser le mouvement% qui se déplace entre les accolades correspondantes. Positionnez le curseur sur le {dans le code suivant:
Et appuyez sur =% pour obtenir instantanément ceci:
Alternativement, vous pouvez faire = a { dans le bloc de code, plutôt que de vous positionner directement sur le caractère {.
source
=}
ouvaBaB=
parce qu'il est moins dépendant. De plus,v}}:!astyle -bj
correspond à mon style de code mieux, mais je peux le récupérer dans votre style avec un simple%!astyle -aj
gg=G
est tout à fait soigné lorsque vous collez quelque chose.ggVG=
.source
ii
etjj
sont couramment utilisées pour les variables de compteur, cari
etj
sont réservées aux nombres complexes.Voyons un joli petit éditeur IDE faire la transposition des colonnes.
Explication
\(
et\)
est de savoir comment se souvenir des choses dans regex-land. Et\1
,\2
etc. , comment récupérer les éléments mémorisés.Rappelez-vous tout suivi de
^I
(tab) suivi de tout.Remplacez le truc ci-dessus par "2ème truc dont vous vous souvenez" suivi de "1er truc dont vous vous souvenez" - essentiellement pour faire une transposition.
source
la source
Ce n'est pas vraiment un secret obscur, mais j'aime mettre le mappage suivant dans mon fichier .vimrc, donc je peux appuyer sur "-" (moins) à tout moment pour ouvrir l'explorateur de fichiers pour afficher les fichiers adjacents à celui que je viens d'éditer . Dans l'explorateur de fichiers, je peux appuyer sur un autre "-" pour remonter d'un répertoire, offrant une navigation transparente dans des structures de répertoires complexes (comme celles utilisées par les frameworks MVC de nos jours):
Ceux-ci peuvent également être utiles à quelqu'un. J'aime faire défiler l'écran et avancer le curseur en même temps:
Navigation par onglets - J'adore les onglets et je dois me déplacer facilement entre eux:
Uniquement sous Mac OS X: navigation par onglet de type Safari:
la source
J'aime utiliser 'sudo bash', et mon administrateur système déteste cela. Il a verrouillé 'sudo' afin qu'il ne puisse être utilisé qu'avec une poignée de commandes (ls, chmod, chown, vi, etc.), mais j'ai quand même pu utiliser vim pour obtenir un shell root:
la source
Souvent, j'aime changer les répertoires actuels lors de l'édition - je dois donc spécifier moins de chemins.
la source
J'utilise souvent de nombreuses fenêtres lorsque je travaille sur un projet et j'ai parfois besoin de les redimensionner. Voici ce que j'utilise:
Ces mappages permettent d'augmenter et de diminuer la taille de la fenêtre courante. C'est assez simple mais c'est rapide.
la source
Pas une fonction obscure, mais très utile et un gain de temps.
Si vous souhaitez enregistrer une session de vos tampons ouverts, onglets, marqueurs et autres paramètres, vous pouvez émettre les éléments suivants:
Vous pouvez ouvrir votre session en utilisant:
la source
:so session.vim
utiliser vim.colle la sortie d'une commande externe dans le tampon.
Faites quelques calculs et obtenez le résultat directement dans le texte:
Obtenez la liste des fichiers à compiler lors de l'écriture d'un Makefile:
Ne cherchez pas ce fait que vous lisez sur wikipedia, faites-le directement coller dans le document que vous écrivez:
la source
Mappez F5 pour rapidement ROT13 votre tampon:
Vous pouvez l'utiliser comme clé de boss :).
la source
nmap i ggg?G``
. Ou le diabolique:nmap i ggg?G``i
!Je viens de trouver celui-ci aujourd'hui via NSFAQ :
Blocs de commentaire de code.
Entrez en mode visuel par blocs en appuyant sur CTRL-V.
Marquez le bloc que vous souhaitez commenter.
Appuyez sur I (I majuscule) et entrez votre chaîne de commentaires au début de la ligne. (// pour C ++)
Appuyez sur ESC et toutes les lignes sélectionnées auront // été ajoutées au début de la ligne.
la source
git checkout
). Quant à de meilleures utilisations pour l'insertion de blocs, il n'y a pas de pierre incrustée. Vous l'utilisez simplement lorsque vous avez plusieurs lignes où vous souhaitez insérer la même séquence de caractères au même endroit.J'utilise vim pour à peu près n'importe quelle édition de texte que je fais, donc j'utilise souvent le copier-coller. Le problème est que vim par défaut déformera souvent le texte importé via coller. La façon de l'arrêter est d'utiliser
avant de coller vos données. Cela l'empêchera de gâcher.
Notez que vous devrez émettre
:set nopaste
pour récupérer l'indentation automatique. Les autres moyens de coller du texte pré-formaté sont les registres du presse-papiers (*
et+
), et:r!cat
(vous devrez terminer le fragment collé avec ^ D).Il est également parfois utile d'activer une palette de couleurs à contraste élevé. Cela peut être fait avec
J'ai remarqué que cela ne fonctionne pas sur toutes les versions de vim que j'utilise mais que cela fonctionne sur la plupart.
la source
set paste
ou la spécification d'une clé pour l'pastetoggle
option est un moyen courant de contourner ce problème, mais le même effet peut être obtenu avecset mouse=a
alors que Vim sait que le flot de texte qu'il voit est un collage déclenché par la souris."*p
pour coller à partir du X xlipboard. (Cela fonctionne aussi depuis le terminal vim, c'est juste que vous pourriez avoir besoin du paquet gvim s'ils sont séparés)*
est le registrePRIMARY
("clic du milieu"). Le presse - papiers est+