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.
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.
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
:! [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
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
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)
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.
:%!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.
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
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.
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.
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.
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
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.
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
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
).
" insert range ip's
"
" ( O O )
" =======oOO=(_)==OOo======
:for i in range(1,255) | .put='10.0.0.'.i | endfor
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 {.
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.
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>
souvent, j'aime changer les répertoires courants en éditant - donc je dois spécifier moins de chemins.
cd %:h
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#
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.
: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
Carte F5 rapidement ROT13 votre tampon:
map <F5> ggg?G``
vous pouvez l'utiliser comme clé boss :).
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
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.
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.