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

il y a une pléthore de questions où les gens parlent de trucs courants, notamment " Vim+ctags trucs et astuces ".

cependant, je ne fais pas référence à des raccourcis généralement utilisés que quelqu'un de nouveau à Vim trouverait cool. Je parle d'un assaisonnée d'utilisateur Unix (développeur, administrateur, à la fois, etc.), qui pensent qu'ils savent quelque chose que 99% d'entre nous n'a jamais entendu ou imaginé. Quelque chose qui non seulement rend leur travail plus facile, mais aussi est COOL et hackish . Après tout, Vim réside dans L'OS le plus sombre-coin riche dans le monde, donc il devrait avoir des complexités que seuls quelques privilégiés savent et veulent partager avec nous.

767
demandé sur 22 revs, 6 users 60%Sasha 2009-04-07 21:57:30

30 réponses

N'est peut-être pas celui que 99% des utilisateurs de Vim ne connaissent pas, mais c'est quelque chose que j'utilise quotidiennement et que tout utilisateur Linux+Vim doit savoir.

commande de Base, mais extrêmement utile.

:w !sudo tee %

j'oublie souvent de sudo avant d'éditer un fichier sur lequel je n'ai pas de permissions d'écriture. Quand je viens pour sauver ce fichier et obtenir une erreur de permission, je viens d'émettre cette commande vim afin de sauver le fichier sans la nécessité de le sauver à un fichier temporaire et puis copier de nouveau.

vous devez évidemment être sur un système avec sudo installé et avoir des droits sudo.

752
répondu skinp 2009-04-07 19:04:02

quelque chose que je viens de découvrir et que je trouve très cool:

:earlier 15m

renvoie le document à ce qu'il était il y a 15 minutes. Peut prendre divers arguments pour la quantité de temps que vous voulez revenir en arrière, et dépend de undolevels. Peut être inversé avec la commande opposée :later

585
répondu Chad Birch 2009-04-07 18:09:16

:! [command] exécute une commande externe pendant que vous êtes dans Vim.

mais ajouter un point après le deux-points, :.! [command] , et il va décharger la sortie de la commande dans votre fenêtre courante. C'est : . !

par exemple:

:.! ls

Je l'utilise souvent pour des choses comme ajouter la date actuelle dans un document que je tape:

:.! date
390
répondu Jeffrey Knight 2016-03-31 17:54:04

Pas exactement obscur, mais il y a plusieurs "supprimer" les commandes qui sont extrêmement utiles, comme..

  • diw pour supprimer le mot
  • "
  • di( supprimer dans le paren actuel
  • di" supprimer le texte entre les guillemets

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

302
répondu dbr 2009-04-08 12:17:33

de Tout supprimer jusqu'à la fin du mot en appuyant sur . à la volonté de ton cœur.

ci (xyz [Esc] -- celle-ci est étrange. Ici ,le " i " ne signifie pas insert mode. Au lieu de cela, cela signifie à l'intérieur de la parenthèse. Donc cette séquence coupe le texte entre parenthèses que vous êtes et le remplace par "xyz". Il fonctionne également à l'intérieur de crochets et de chiffres -- il suffit de faire ci[ ou ci{ en conséquence. Naturellement, vous pouvez faire di (si vous voulez juste supprimer tout le texte sans rien taper. Vous pouvez également faire a au lieu de i si vous voulez supprimer les parenthèses aussi bien et pas seulement le texte à l'intérieur d'eux.

ci " - coupe le texte dans les citations actuelles

assistant - coupe le mot en cours. Cela fonctionne exactement comme le précédent, sauf que ( est remplacé par w .

C - couper le reste de la ligne et passer en mode insertion.

ZZ -- enregistrer et fermer le fichier courant (beaucoup plus rapidement que Ctrl-F4 pour fermer l'onglet courant!)

ddp - déplacer la ligne courante une rangée plus bas

xp -- déplacer le caractère courant une position à droite

U - majuscules, donc viwU upercases le mot

~ - switches case, de sorte que viw~ inversera le boîtier du mot entier

Ctrl+u / Ctrl+d faites défiler la page demi-écran vers le haut ou vers le bas. Cela semble être plus utile que la pagination en plein écran habituelle, car cela permet de voir plus facilement le lien entre les deux écrans. Pour ceux qui veulent encore faire défiler tout l'écran à la fois il y a Ctrl+F pour L'avant et Ctrl+b pour L'arrière. Ctrl+Y et Ctrl+E font défiler vers le bas ou vers le haut une ligne à la fois.

la commande folle mais très utile est zz -- elle défile l'écran pour faire apparaître cette ligne au milieu. C'est excellent pour mettre le morceau de code que vous travaillez dans le centre de votre attention. Frère commandes -- zt et zb -- cette ligne, le haut ou le bas sur l'écran qui n'est pas très utile.

% trouve et saute à la parenthèse correspondante.

de -- supprimer du curseur à la fin du mot (vous pouvez aussi faire dE pour supprimer jusqu'à l'espace suivant)

bde -- supprimer le mot courant, de gauche à droite délimiteur

df[espace] -- delete jusqu'à et y compris l'espace suivant

dt. -- supprimer jusqu'au point suivant

dd -- supprimer toute la ligne

vous (ou vous) -- yankees le texte d'ici à la fin du mot

ce - coupe à travers la fin du mot

bye -- copie mot actuel (me fait me demander ce que " salut" le fait!)

yy -- copie la ligne courante

cc -- coupe la ligne courante, vous pouvez aussi faire S à la place. Il y a aussi le culot inférieur s qui coupe le caractère courant et passe en mode insertion.

viwy ou viwc . Tirez ou changez le mot courant. Appuyez sur w plusieurs fois pour continuer à sélectionner chaque mot suivant, utilisez b revenir en arrière

vi { - sélectionnez Tout le texte entre parenthèses. va {- sélectionnez Tout le texte y compris {}s

vi (P - mettre en surbrillance tout ce qui est à l'intérieur du ()s et remplacer par le texte collé

b et e déplacer le curseur de mot-à-mot, de la même manière que les touches Ctrl+Flèches normalement . La définition du mot est un peu différent, comme plusieurs delmiters consécutifs sont traités comme un seul mot. Si vous commencez au milieu d'un mot, en appuyant sur b sera toujours de vous rendre au début du mot courant, et chaque b consécutives saute au début du mot suivant. De la même façon, et facile à retenir, e renvoie le curseur à la fin du mot courant, et à chaque mot suivant.

semblables b / e , capitale B et E déplacer le curseur mot par mot en n'utilisant que des espaces blancs comme délimiteurs.

capital d (respire profondément) supprime le reste de la ligne à droite du curseur, comme Shift+End / Del dans les éditeurs normaux ( notez 2 touches -- Shift+D -- au lieu de 3)

229
répondu 9 revs, 9 users 84%ultraman 2017-04-21 14:06:55

un 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 le déplacement (en avant, en arrière) par le biais de la liste de modifications.

Laissez-moi vous montrer comment je l'utilise. Parfois j'ai besoin de copier et coller un morceau de code ou une chaîne, dire un code de couleur hexadécimal dans un fichier CSS, donc je cherche, je saute (ne se soucie pas de l'endroit où le match est), le copie et puis sauter en arrière (g;) à l'endroit où je éditais le code pour enfin coller. Pas besoin de créer des marques. Plus simple.

juste mes 2cents.

195
répondu Xavier Guardiola 2010-09-17 16:55:55
:%!xxd

fait de vim un éditeur hexadécimal.

:%!xxd -r

Revert.

Avertissement: Si vous ne modifiez pas les binaires (-b), vous pourriez endommager le fichier. - Josh Lee dans les commentaires.

183
répondu sharth 2014-05-05 13:06:27
gv

Resélectionne la dernière sélection visuelle.

117
répondu AaronS 2011-01-12 20:03:40

parfois un cadre dans votre .vimrc sera écrasé par un plugin ou un autocommand. Pour déboguer ceci, un truc utile est d'utiliser la commande :verbose en conjonction avec :set. Par exemple, pour savoir où cindent a été mis / désactivé:

:verbose set cindent?

cette sortie quelque chose comme:

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

cela fonctionne aussi avec des cartes et des highlights. (Merci à joeytwiddle d'avoir souligné ce point.) 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
114
répondu Laurence Gonsalves 2014-07-07 19:10:29

Je ne suis pas sûr que ça compte comme un coin sombre, mais je viens juste de l'apprendre...

:g/match/y A

fera glisser (copier) toutes les lignes contenant" match "dans le registre "a / @a . (La Capitalisation comme A fait vim ajouter yankings au lieu de remplacer le contenu de registre précédent.) Je l'ai beaucoup utilisé récemment lors de la fabrication de feuilles de style Internet Explorer.

97
répondu sjh 2015-05-31 19:30:12

:%TOhtml

crée un rendu html du fichier courant.

92
répondu N 1.1 2013-04-05 15:55:59

voulez-vous consulter votre :historique des commandes?

q:

puis parcourir, éditer et enfin exécuter la commande.

Jamais apporter des modifications similaires pour les deux fichiers et basculer entre eux? (Par exemple, les fichiers source et en-tête?)

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

puis tabulez entre ces fichiers.

88
répondu MikeyB 2011-05-11 19:30:55

Vim ouvrira une URL, par exemple

vim http://stackoverflow.com/

Nice quand vous avez besoin de tirer vers le haut la source d'une page pour référence.

77
répondu Cercerilla 2014-06-04 14:52:02
Les Macros

peuvent appeler d'autres macros, et peuvent aussi s'appeler elles-mêmes.

par exemple:

qq0dwj@qq@q

...va supprimer le premier mot de chaque ligne jusqu'à la fin du fichier.

c'est un exemple assez simple mais il démontre une caractéristique très puissante de vim

67
répondu spence91 2015-01-20 23:14:54

en supposant que vous avez le support Perl et/ou Ruby compilé dans :rubydo et :perldo exécutera un one-liner Ruby ou Perl sur chaque ligne dans une gamme (par défaut à la totalité du buffer), avec $_ lié au texte de la ligne courante (moins la nouvelle ligne). La manipulation de $_ modifiera le texte de cette ligne.

vous pouvez utiliser ceci pour faire certaines choses qui sont faciles à faire dans un langage de script mais pas si évidentes en utilisant vim builtins. Par exemple, pour inverser l'ordre des mots dans une ligne:

:perldo $_ = join ' ', reverse split

pour insérer une chaîne aléatoire de 8 caractères (A-Z) à 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 des retours à la ligne.

55
répondu Brian Carper 2009-04-08 01:15:58

et

passer à un poste plus ancien/plus récent. Lorsque vous vous déplacez à travers le fichier (en cherchant, en déplaçant des commandes, etc.) rappelez - vous 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 pour écrire du code et effectuer beaucoup de recherches.

gi

aller à la position où insérer le mode a été arrêté en dernier. Je me retrouve souvent à éditer puis à chercher quelque chose. Pour revenir à l'édition place press gi.

gf

mettre le curseur sur le nom du fichier (par exemple inclure le fichier en-tête), appuyez sur gf et le fichier est ouvert

gF

semblable à gf mais reconnaît le format "[Nom du fichier]:[numéro de ligne]". En appuyant sur gF, vous ouvrez [nom du fichier] et positionnez le curseur sur [numéro de ligne].

^P et ^n

texte complet automatique lors de l'édition (^P - correspondance précédente et ^n correspondance suivante)

X^L

pendant l'édition complète à la même ligne (utile pour la programmation). Vous écrivez du code et vous vous rappelez que vous avez le même code quelque part dans le fichier. Il suffit d'appuyer sur x^L et la ligne complète est terminée

X^F

noms de fichier complets. Vous écrivez "/ etc / pass " Hmm. Vous avez oublié le nom du fichier. Il suffit d'appuyer sur ^X^F et le nom du fichier est terminé

ou: sh

mouvement temporaire vers la coque. Si vous avez besoin d'un coup rapide:

  • appuyez sur ^Z (vi, en arrière-plan) pour revenir à l'original coque et appuyez sur fg pour revenir à vim de retour
  • de la presse :sh pour aller à la sous-shell et appuyez sur ^D/exit pour revenir à vi de retour
53
répondu dimba 2009-07-28 19:05:59

c'est une bonne astuce pour réouvrir le fichier courant avec un encodage différent:

:e ++enc=cp1250 %:p

utile lorsque vous devez travailler avec legacy encodings. Les codages supportés sont listés dans un tableau sous encoding-values (voir help encoding-values ). Une chose similaire fonctionne aussi pour ++ff , de sorte que vous pouvez rouvrir le fichier avec les fins de ligne Windows/Unix si vous vous trompez pour la première fois (voir help ff ).

47
répondu zoul 2009-04-07 18:59:22
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
47
répondu user107745 2012-11-06 08:32:44

en tapant = = corrigera l'indentation de la ligne courante basée sur 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 entretoises correspondantes. Positionnez le curseur sur le { dans le code suivant:

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

et presse = % 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 {.

44
répondu Kimball Robinson 2010-08-06 00:30:35
imap jj <esc>
40
répondu Trumpi 2009-04-19 18:33:15

voyons un petit éditeur D'IDE faire la transposition de colonne.

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

explication

\( et \) est de savoir comment souvenez-vous trucs en regex terre. Et , etc est la façon de récupérer les choses mémorisées.

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

se Souvenir de tout, suivi par ^I (onglet), suivi par tout.

>>> ^I

Remplacez le texte ci - dessus par" 2nd stuff you remembered "suivi de" 1st stuff you remembered " - essentiellement en faisant une transposition.

37
répondu Jeffrey Jose 2015-02-12 15:55:17

pas exactement un sombre secret, mais j'aime mettre la cartographie suivante dans mon .vimrc fichier, 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 cliquer sur un autre " - "pour déplacer un répertoire, en fournissant une navigation transparente d'un répertoire complexe structures (comme ceux utilisés par les MVC frameworks de nos jours):

map - :Explore<cr>

ceux-ci peuvent également être utiles pour 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>

onglet navigation - j'aime les onglets et j'ai besoin de se déplacer facilement entre eux:

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

Uniquement sur Mac OS X: Safari-comme la navigation par onglets:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
30
répondu KKovacs 2009-04-11 07:14:21

souvent, j'aime changer les répertoires courants en éditant - donc je dois spécifier moins de chemins.

cd %:h
26
répondu rampion 2009-04-07 20:11:12

j'aime utiliser 'sudo bash', et mon sysadmin déteste ça. Il a verrouillé 'sudo' pour 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#
26
répondu too much php 2009-07-21 01:12:54

j'utilise souvent beaucoup de fenêtres quand je travaille sur un projet et parfois j'ai besoin de les redimensionner. Voici ce que j'utilise:

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

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

24
répondu Taurus Olson 2009-04-07 21:11:26
: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))

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

:r! ls *.c

ne cherchez pas ce fait que vous avez lu sur wikipedia, faites-le coller directement dans le document que vous écrivez:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
21
répondu Roberto Bonvallet 2009-05-06 07:38:25

Carte F5 rapidement ROT13 votre tampon:

map <F5> ggg?G``

vous pouvez l'utiliser comme clé boss :).

21
répondu jqno 2009-07-08 19:19:08

ce n'est pas une caractéristique obscure, mais très utile et économe de temps.

si vous voulez enregistrer une session de vos tampons ouverts, onglets, marqueurs et autres paramètres, vous pouvez publier ce qui suit:

mksession session.vim

vous pouvez ouvrir votre session en utilisant:

vim -S session.vim
21
répondu mohi666 2011-03-04 02:20:57

je viens de trouver celui-ci aujourd'hui via NSFAQ :

blocs de Commentaires de code.

entrer en mode visuel dans le sens du bloc en appuyant sur CTRL-V.

marquez le bloc que vous souhaitez commenter.

Hit I (I majuscule) et saisissez votre commentaire chaîne de caractères au début de la ligne. (//pour C++)

appuyez sur ESC et toutes les lignes sélectionnées auront // préfixé à l'avant de la ligne.

19
répondu Grant Limberg 2009-05-11 21:59:04

j'utilise vim pour à peu près n'importe quelle édition de texte que je fais, donc j'utilise souvent copier et coller. Le problème est que vim par défaut va souvent fausser le texte importé via la colle. La façon d'arrêter ceci est d'utiliser

:set paste

avant de coller dans vos données. Ce sera l'empêcher de gâcher.

notez que vous devrez émettre :set nopaste pour récupérer l'auto-indentation. D'autres moyens de collage pré-formaté texte du presse-papiers registres ( * et + ), et :r!cat (vous devrez terminer le fragment collé avec ^d).

il est également parfois utile de mettre en marche un schéma de couleurs à contraste élevé. Cela peut être fait avec

:color blue

j'ai remarqué que ça ne fonctionne pas sur toutes les versions de vim-je utiliser, mais pour la plupart.

17
répondu 2 revs, 2 users 84%Ian H 2015-07-03 23:44:59