Quels sont les coins sombres de Vim dont ta maman ne t'a jamais parlé? [fermé]


799

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.


10
: Fenêtre Sex Split et explorateur de fichiers intégré ouvert (split horizontal)
user3218088

2
Cette question semble assez constructive - en regardant le nombre de votes positifs ..., a voté pour la réouverture - peut-être une réponse encore plus cool arrive - qui peut être augmentée si utile - donnant ainsi plus de valeur à SOF. Ordonner les réponses par votes J'ai appris beaucoup de trucs sympas en seulement 5 minutes ... des trucs vraiment précieux ici, pourquoi fermer quelque chose d'aussi précieux? Comment cela n'est-il pas constructif?
jhegedus

7
Ridicule que cette question soit close. Parlez de légalisme.
Lepidopterist

2
Je pense que cette question est très constructive mais, plus appropriée à Quora.
Diogo Melo

2
Pourquoi y a-t-il 2 (pour l'instant) votes pour supprimer cette question? À quoi cela pourrait-il bien servir?
Akavall

Réponses:


782

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.

:w !sudo tee %

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.


116
Sans doute, c'est encore mieux que d'exécuter vim en tant que root! A voté!
Arafangion

27
Pour un noob, que fait exactement le tee? Quelqu'un pourrait-il analyser cette commande pour moi?
AndyL

41
cmap w !! w! sudo tee%
jm666

58
Vous ne devriez jamais courir sudo vim. Au lieu de cela, vous devez exporter en EDITORtant que vim et exécuter sudoedit.
Gerardo Marset

8
@maximus: vim remplace% par le nom du tampon / fichier actuel.
migu

617

Quelque chose que je viens de découvrir récemment et que je trouvais très cool:

:earlier 15m

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


6
@skinp: Si vous annulez puis effectuez d'autres modifications à partir de l'état annulé, vous perdez cet historique de rétablissement. Cela vous permet de revenir à un état qui n'est plus dans la pile d'annulation.
ephémient

39
Aussi très utile est g + et g- pour reculer et avancer dans le temps. C'est tellement plus puissant qu'une pile d'annulation / de rétablissement puisque vous ne perdez pas l'historique lorsque vous faites quelque chose après une annulation.
Etienne PIERRE

9
Vous ne perdez pas l'historique de rétablissement si vous effectuez une modification après une annulation. Ce n'est tout simplement pas facilement accessible. Il existe des plugins pour vous aider à visualiser cela, comme Gundo.vim
Ehtesh Choudhury

559
Wow, alors maintenant je peux juste faire :later 8het j'ai fini pour aujourd'hui? : P
Igor Popov

7
Votre commande suppose que l'on passera au moins 15 minutes dans vim !
e2-e4

411

:! [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:

:.! ls

Je l'utilise beaucoup pour des choses comme l'ajout de la date actuelle dans un document que je tape:

:.! date

74
C'est assez similaire à: r! Pour autant que je sache, la seule différence est que: r! ouvre une nouvelle ligne,:.! écrase la ligne actuelle.
saffsd

6
Une alternative à :.!dateest 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.
hlovdal

43
:.!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.
Nefrubyr

2
@sundar: Pourquoi passer une ligne à sed, quand vous pouvez utiliser les commandes ed/ similaires intégrées ex? Essayez de courir :.s/old/new/g;-)
jabirali

4
Et notez également que '!' est comme 'y', 'd', 'c' etc. c'est-à-dire que vous pouvez faire: !!, nombre !!,! motion (par exemple! Gshell_command <cr> remplacer de la ligne courante à la fin du fichier ('G') par sortie de shell_command).
aqn

312

Pas exactement obscure, mais il existe plusieurs commandes "supprimer dans" qui sont extrêmement utiles, comme ..

  • diw supprimer le mot courant
  • di( supprimer dans les parens actuels
  • di" supprimer le texte entre les guillemets

D'autres peuvent être trouvés sur :help text-objects


8
dab "supprimer les crochets arounb", daB pour les accolades, t pour les balises de type xml, les combinaisons avec les commandes normales sont comme prévu cib / yaB / dit / vat etc
sjh

15
@Masi: yi (va (p supprime uniquement les crochets
Don Reba

42
C'est peut-être la principale raison pour laquelle je reste avec Vim. Cela et ses commandes de "changement" équivalentes: ciw, ci (, ci ", ainsi que dt <space> et ct <space>
thomasrutter

4
@thomasrutter: Pourquoi pas dW / cW au lieu de dt <space>?

9
@Masi: Avec le plugin surround: ds (.

237

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 aplace de isi 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é par w.

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 viwUmajuscule le mot

~ - change la casse, donc viw~inversera le casse du mot entier

Ctrl + 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 dEpour 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 Splace. Il y a aussi un plafond inférieur squi coupe le caractère actuel et passe en mode insertion.

viwy ou viwc . Tirez ou changez le mot actuel. Appuyez wplusieurs fois pour continuer à sélectionner chaque mot suivant, utilisez bpour reculer

vi { - 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 ele curseur à la fin du mot actuel et de chaque mot suivant.

similaire à b/ e, majuscule Bet Edé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)


15
zt est très utile si vous l'utilisez au début d'une définition de fonction ou de classe.
Nick Lewis

9
vityet vitcpeuvent être raccourcis à yitet citrespectivement.
Nathan Fellman

33
Tout ce que vous appelez «couper» est «changer». par exemple: C est le changement jusqu'à la fin de la ligne. L'équivalent de Vim de "couper" est "supprimer", fait avec d / D. La principale différence entre le changement et la suppression est que la suppression vous laisse en mode normal mais le changement vous met dans une sorte de mode d'insertion (bien que vous soyez toujours dans la commande de changement qui est pratique car tout le changement peut être répété avec .).
Laurence Gonsalves

11
Je pensais que c'était pour une liste de choses que peu de gens connaissent. yy est très commun, j'aurais pensé.
Almo

19
byene fonctionne pas lorsque vous êtes dans le premier caractère du mot. yiwfait toujours.
Andrea Francia

204

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.


29
de même, '.ira à la dernière ligne éditée, et `.ira à la dernière position éditée
aehlke

8
Ctrl-O et Ctrl-I (tab) fonctionneront de la même manière, mais pas de la même manière. Ils se déplacent en arrière et en avant dans la "liste des sauts", que vous pouvez voir en faisant: sauts ou: ju Pour plus d'informations, faites une: aide jumplist
Kimball Robinson

17
Vous pouvez lister la liste des changements en faisant: changements
Kimball Robinson

Hot dang qui est utile. J'utilise <C-o>/ <C-i>pour cela tout le temps - ou pour marquer ma place.
Wayne Werner

187
:%!xxd

Transformez vim en un éditeur hexadécimal.

:%!xxd -r

Revenir.

Avertissement: Si vous ne modifiez pas avec le binaire (-b), vous risquez d'endommager le fichier. - Josh Lee dans les commentaires.


9
Et comment pouvez-vous revenir en arrière?
Christian

40
:! xxd -r // Pour revenir de HEX
Naga Kiran

21
En fait, je pense que c'est :%!xxd -rpour revenir en arrière
Andreas Grech

@JoshLee: Si l'on fait attention à ne pas traverser les retours à la ligne, est-il sûr de ne pas utiliser l'option -b? Je demande parce que parfois je veux faire un changement hexadécimal, mais je ne veux pas fermer et rouvrir le fichier pour le faire.
dotancohen

4
@dotancohen: Si vous ne voulez pas fermer / rouvrir le fichier, vous pouvez le faire: set binary
Bambu


119

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é:

:verbose set cindent?

Cela produira quelque chose comme:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Cela fonctionne également avec les cartes et les hautes lumières. (Merci joeytwiddle de l'avoir signalé.) Par exemple:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim

8
Excellent conseil - exactement ce que je cherchais aujourd'hui.
Artem Russakovskii

Excellent tip man! Comment apprenez-vous ces choses geeky?
Rafid

1
:verbosepeut également être utilisé avant nmap lou highlight Normalpour savoir où le lclavier ou la Normalsurbrillance ont été définis en dernier. Très utile pour le débogage!
joeytwiddle

@joeytwiddle Merci! J'ai ajouté cette information à la réponse.
Laurence Gonsalves

Lorsque vous vous lancez dans la création de mappages personnalisés, cela vous fera économiser tant de fois, probablement l'un des plus utiles ici (IMO)!
SidOfc


98

Je ne sais pas si cela compte comme un coin sombre, mais je viens juste de l'apprendre ...

:g/match/y A

va extraire (copier) toutes les lignes contenant "match" dans le registre "a/ @a. (La mise en majuscule Apermet à 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.


compte, compte comme je n'ai pas vu celui-ci :)

Joli. Je n'en
ai

5
Vous pouvez utiliser: g! trouver des lignes qui ne correspondent pas à un modèle ex: g! / set / normal dd (supprimer toutes les lignes qui ne contiennent pas set)
tsukimi

3
Parfois, il vaut mieux faire ce que tsukimi a dit et filtrer les lignes qui ne correspondent pas à votre modèle. Une version abrégée de cette commande cependant: :v/PATTERN/dExplication: :vest une abréviation de :g!, et la :gcommande 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].
pandubear

Vous pouvez également le faire :g/match/normal "Ayy- le normalmot - clé vous permet de lui dire d'exécuter des commandes en mode normal (que vous connaissez probablement mieux).
Kimball Robinson

93

Vous voulez consulter votre: historique des commandes?

q:

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?)

:set hidden
:map <TAB> :e#<CR>

Ensuite, tabulez d'avant en arrière entre ces fichiers.


131
Je frappe q:tout le temps par accident ...
Josh Lee

11
Alternativement, depuis l'éditeur ex (:), vous pouvez faire CTRL-f pour faire apparaître la fenêtre d'historique des commandes.
Jason Down

6
@jleedev moi aussi. Je déteste presque cette commande, juste parce que je l'utilise trop accidentellement.
bradlis7

9
q / et q? peut être utilisé pour faire une chose similaire pour vos modèles de recherche.
bpw1621

5
Appuyer sur <Cf> après: ou / (ou chaque fois que vous êtes en mode commande) fera apparaître le même menu historique. Vous pouvez donc remapper q: si vous le touchez accidentellement beaucoup et accédez toujours à ce mode génial.
idbrii

82

Vim ouvrira une URL, par exemple

vim http://stackoverflow.com/

Bien quand vous avez besoin de remonter la source d'une page pour référence.


2
Pour moi, cela n'a pas ouvert la source; au lieu de cela, il a apparemment utilisé elinks pour vider la page rendue dans un tampon, puis l'a ouvert.
Ivan Vučica

il y a une erreur lors de l'exécution de cette commande
Dzung Nguyen

5
Fonctionne mieux avec une barre oblique à la fin. Astuce!
Thomas

@Vdt: Il serait utile que vous signaliez votre erreur. S'il s'agit de celui-ci: " erreur (netrw) ni la commande wget ni la commande fetch ne sont disponibles", vous devez évidemment rendre l'un de ces outils disponible à partir de votre variable d'environnement PATH.
Isaac Nequittepas

Je trouve celui-ci particulièrement utile lorsque les gens envoient des liens vers un service de collage et oublient de sélectionner une coloration syntaxique, je n'ai généralement qu'à ouvrir le lien dans vim après avoir ajouté "& raw".
Dettorer

68

Les macros peuvent appeler d'autres macros et peuvent également s'appeler elles-mêmes.

par exemple:

qq0dwj@qq@q

... 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


2
Je ne savais pas que les macros pouvaient se répéter. Cool. Remarque: qx commence l'enregistrement dans le registre x (il utilise qq pour le registre q). 0 se déplace au début de la ligne. dw supprime un mot. j descend d'une ligne. @q réexécutera la macro (définissant une boucle). Mais vous avez oublié de terminer l'enregistrement avec un "q" final, puis exécutez la macro en tapant @q.
Kimball Robinson

2
Je pense que c'est intentionnel, en tant que macro imbriquée et récursive.
Yktula

7
qqqqqifuu<Esc>h@qq@q
Gerardo Marset

6
Une autre façon de procéder consiste à enregistrer une macro dans le registre a qui effectue une transformation en une seule ligne, puis à mettre en surbrillance un groupe de lignes avec V et à taper :normal! @apour appliquer votre macro à chaque ligne de votre sélection.
Nathan Long

J'ai trouvé ce post googler les macros VIM récursives. Je ne pouvais pas trouver d'autre moyen d'arrêter la macro que de tuer le processus VIM.
dotancohen

55

En supposant que vous avez compilé le support Perl et / ou Ruby, :rubydoet :perldoque 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:

:perldo $_ = join ' ', reverse split

Pour insérer une chaîne aléatoire de 8 caractères (AZ) à la fin de chaque ligne:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Vous êtes limité à agir sur une seule ligne à la fois et vous ne pouvez pas ajouter de nouvelles lignes.


que faire si je veux seulement que perldo s'exécute sur une ligne spécifiée? ou quelques lignes sélectionnées?
Sujoy

5
Vous pouvez lui donner une plage comme toute autre commande. Par exemple: 1,5perldo ne fonctionnera que sur les lignes 1-5.
Brian Carper,

Pourriez-vous faire $ _ + = '\ nNEWLINE !!!' obtenir une nouvelle ligne après la ligne actuelle?
Greg

Malheureusement non, cela ajoute juste un caractère de contrôle funky à la fin de la ligne. Vous pouvez ensuite utiliser une recherche / remplacement Vim pour changer tous ces caractères de contrôle en de véritables nouvelles lignes.
Brian Carper

3
De même, pydoet py3dotravaillez pour python si vous avez compilé le support requis.
Derecho

54

^ 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:

  • appuyez sur ^ Z (pour mettre vi en arrière-plan) pour revenir à la coque d'origine et appuyez sur fg pour revenir à vim back
  • appuyez sur: sh pour accéder au sous-shell et appuyez sur ^ D / exit pour revenir à vi back

Avec ^X^Fmon 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' utilise se isfname-==pour mettre fin à cette nuisance
sehe

3
+1 la saisie semi-automatique intégrée est juste là, attendant d'être découverte.
joeytwiddle

48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor

2
Je ne vois pas à quoi cela sert (en plus de ressembler à une réponse de plaisanterie). Quelqu'un d'autre peut-il m'éclairer?
Ryan Edwards

2
ouvrir vim puis faire ": pour i dans la plage (1 255) | .put = '10 .0.0. '. i | endfor"
codygman

2
@RyanEdwards remplissant / etc / hosts peut
Ruslan

26
C'est une réponse formidable. Pas le bit sur la création des adresses IP, mais le bit qui implique que VIM peut utiliser pour les boucles dans les commandes .
dotancohen

4
Sans ex-mode:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap

47

C'est une bonne astuce pour rouvrir le fichier actuel avec un encodage différent:

:e ++enc=cp1250 %:p

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 (voir help ff).


Je n'ai jamais eu à utiliser ce genre de chose, mais nous ajouterons certainement à mon arsenal de trucs ...

bon conseil, merci. Pour les points bonus, ajoutez une liste d'encodages valides courants.
Adriano Varoli Piazza

2
Je l'ai utilisé aujourd'hui, mais je pense que je n'avais pas besoin de spécifier "%: p"; il suffit d'ouvrir le fichier et: e ++ enc = cp1250 était suffisant. I
Ivan Vučica

est-ce que: set encoding = cp1250 aurait le même effet?
laz

1
`: e + b% 'est également utile pour la réouverture en mode binaire (pas de saut de sauts de ligne)
intuitivé le

47

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:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Et appuyez sur =% pour obtenir instantanément ceci:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Alternativement, vous pouvez faire = a { dans le bloc de code, plutôt que de vous positionner directement sur le caractère {.


Hm, je ne savais rien de l'indentation.
Ehtesh Choudhury

Pas besoin, en général, d'être exactement sur les accolades. Je pensais souvent que je le ferais juste =}ou vaBaB=parce qu'il est moins dépendant. De plus, v}}:!astyle -bjcorrespond à mon style de code mieux, mais je peux le récupérer dans votre style avec un simple%!astyle -aj
sehe

7
gg=Gest tout à fait soigné lorsque vous collez quelque chose.
kyrias


@kyrias Oh, je l'ai fait comme ggVG=.
Braden Best

42
imap jj <esc>

7
comment allez-vous taper jj alors? : P
hasen

6
À quelle fréquence tapez-vous jj? En anglais au moins?
ojblass

50
J'ai remappé capslock pour échapper à la place, car c'est une clé autrement inutile. Ma cartographie était cependant à l'échelle de l'OS, donc elle a l'avantage supplémentaire de ne jamais avoir à se soucier de la frapper accidentellement. Le seul inconvénient est qu'il est plus difficile de crier sur les gens. :)
Alex

7
@Alex: définitivement, capslock est la mort. "Attends, wtf? oh, c'était ZZ? .... merde."
intuition

5
@ojblass: Je ne sais pas combien de personnes ont jamais eu droit au code matlab dans Vim, mais iiet jjsont couramment utilisées pour les variables de compteur, car iet jsont réservées aux nombres complexes.
brianmearns

37

Voyons un joli petit éditeur IDE faire la transposition des colonnes.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Explication

\(et \)est de savoir comment se souvenir des choses dans regex-land. Et \1, \2etc. , comment récupérer les éléments mémorisés.

>>> \(.*\)^I\(.*\)

Rappelez-vous tout suivi de ^I(tab) suivi de tout.

>>> \2^I\1

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.


4
Bascule une paire de colonnes séparées par des tabulations (séparateur arbitraire, tout est regex) entre elles.
chaos

39
Ce n'est qu'une expression régulière; de nombreux IDE ont la recherche et le remplacement regex.
rlbond

7
@rlbond - Cela se résume à la qualité du moteur d'expression régulière dans l'IDE. Les regex de Vim sont assez puissants; d'autres .. pas tellement parfois.
romandas

3
Le * sera gourmand, donc cette expression régulière suppose que vous n'avez que deux colonnes. Si vous voulez qu'il soit non gourmand, utilisez {-} au lieu de * (voir: aidez les non-gourmands pour plus d'informations sur le multiplicateur {})
Kimball Robinson

4
Il s'agit en fait d'un regex assez simple, il n'échappe qu'aux parenthèses de groupe qui le rendent compliqué.
mk12

30

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):

map - :Explore<cr>

Ceux-ci peuvent également être utiles à quelqu'un. J'aime faire défiler l'écran et avancer le curseur en même temps:

map <c-j> j<c-e>
map <c-k> k<c-y>

Navigation par onglets - J'adore les onglets et je dois me déplacer facilement entre eux:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Uniquement sous Mac OS X: navigation par onglet de type Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>

Vous pouvez également parcourir les fichiers dans Vim lui-même, en utilisant: Explorer
Roman Plášil

Salut Roman, c'est exactement ce que fait ce mappage, mais l'assigne à une "touche de raccourci". :)
KKovacs

27

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:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#

9
FWIW, sudoedit (ou sudo -e) modifie les fichiers privilégiés mais exécute votre éditeur en tant qu'utilisateur normal.
RJHunter

12
ouais ... je vous détesterais aussi;) vous ne devriez avoir besoin que d'un shell root TRÈS RAREMENT, sauf si vous avez déjà l'habitude d'exécuter trop de commandes en tant que root, ce qui signifie que vos autorisations sont toutes vissées.
Nous sommes tous Monica

5
Pourquoi votre administrateur système vous donne-t-il même racine? : D
d33tah

26

Souvent, j'aime changer les répertoires actuels lors de l'édition - je dois donc spécifier moins de chemins.

cd %:h

Qu'est-ce que cela fait? Et ça marche avec autchdir?
Leonard

2
Je suppose que cela remplacerait provisoirement autochdir (jusqu'à ce que vous changiez de tampon à nouveau). Fondamentalement, il change de répertoire pour le répertoire racine du fichier actuel. Cela me donne un peu plus de contrôle manuel que ne le fait autochdir.
rampion

1
: set autochdir // cela sert également la même fonctionnalité et il change le répertoire courant en celui du fichier dans le tampon
Naga Kiran

25

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:

map + <C-W>+
map - <C-W>-

Ces mappages permettent d'augmenter et de diminuer la taille de la fenêtre courante. C'est assez simple mais c'est rapide.


16
Il y a aussi Ctrl-W =, ce qui rend les fenêtres de largeur égale.
Bill Lynch

2
N'oubliez pas que vous pouvez ajouter des numéros pour effectuer une action plusieurs fois dans Vim. Donc, pour augmenter la hauteur de la fenêtre actuelle de 8 lignes: 8 <CW> +
joeytwiddle

23

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:

mksession session.vim

Vous pouvez ouvrir votre session en utilisant:

vim -S session.vim

5
Vous pouvez également :so session.vimutiliser vim.
TankorSmash

22
:r! <command>

colle la sortie d'une commande externe dans le tampon.

Faites quelques calculs et obtenez le résultat directement dans le texte:

:r! echo $((3 + 5 + 8))

Obtenez la liste des fichiers à compiler lors de l'écriture d'un Makefile:

:r! ls *.c

Ne cherchez pas ce fait que vous lisez sur wikipedia, faites-le directement coller dans le document que vous écrivez:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever

14
^ R = 3 + 5 + 8 en mode insertion vous permettra d'insérer la valeur de l'expression (3 + 5 + 8) dans du texte avec moins de frappes.
Sudhanshu

Comment puis-je obtenir le résultat / sortie dans un tampon différent de celui actuel?
dcn


21

Mappez F5 pour rapidement ROT13 votre tampon:

map <F5> ggg?G``

Vous pouvez l'utiliser comme clé de boss :).


14
Je ne sais pas ce que vous écrivez ... Mais sûrement, mon patron serait plus curieux quand il m'a vu écrire ROT13 pêle - mêle :)
sehe

ou pour usurper vos amis: nmap i ggg?G`` . Ou le diabolique: nmap i ggg?G``i!
romeovs

1
@romeovs 2nd one is infinite loop, use nnoremap
Amit Gold

19

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.


J'ai ajouté # pour commenter un bloc de code en rubis. Comment puis-je l'annuler.
Neeraj Singh

3
Vous pouvez simplement appuyer à nouveau sur ctrl + v, marquer les // et appuyer sur x pour "décommenter"
nos

6
J'utilise NERDCommenter pour cela.
ZyX

1
Le code mis en commentaire est probablement l'un des pires types de commentaires que vous pourriez éventuellement mettre dans votre code. Il y a de meilleures utilisations pour l'insertion de blocs impressionnante.
Braden Best

1
@Pie car le code commenté est un code mort . Le code mort ne sert à rien et crée de l'encombrement. Vous pensez que vous conservez du code que vous voudrez peut-être ramener plus tard, mais il y a toujours une meilleure façon. Vous pouvez utiliser votre historique d'annulation, dupliquer le fichier ou utiliser git, qui a cette fonctionnalité intégrée à ( 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.
Braden Best

17

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

:set paste

avant de coller vos données. Cela l'empêchera de gâcher.

Notez que vous devrez émettre :set nopastepour 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

:color blue

J'ai remarqué que cela ne fonctionne pas sur toutes les versions de vim que j'utilise mais que cela fonctionne sur la plupart.


10
La "distorsion" se produit parce que vous avez activé une certaine forme d'indentation automatique. L'utilisation set pasteou la spécification d'une clé pour l' pastetoggleoption est un moyen courant de contourner ce problème, mais le même effet peut être obtenu avec set mouse=aalors que Vim sait que le flot de texte qu'il voit est un collage déclenché par la souris.
jamessan

1
Si vous avez installé gvim, vous pouvez souvent (bien que cela dépende des options avec lesquelles votre distribution compile vim) utiliser le presse-papiers X directement depuis vim via le registre *. Par exemple "*ppour 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)
kyrias

2
@kyrias pour l'enregistrement, *est le registre PRIMARY("clic du milieu"). Le presse - papiers est+
Braden Best
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.