web-dev-qa-db-fra.com

Quels sont les coins sombres de Vim, ta mère ne t'a jamais parlé?

Il existe une pléthore de questions dans lesquelles les gens parlent d’astuces courantes, notamment " astuces Vim + ctags ".

Cependant, je ne fais pas référence aux raccourcis couramment utilisés que quelqu'un de nouveau chez Vim trouverait cool. Je parle d'un utilisateur Unix expérimenté (développeur, administrateur, les deux, etc.) qui pense savoir quelque chose que 99% d'entre nous n'ont jamais entendu parler ou dont il n'a jamais rêvé. Quelque chose qui facilite non seulement leur travail, mais aussi COOL et hackish . Après tout, Vim réside dans le système d’exploitation le plus sombre du monde, il devrait donc comporter des subtilités que seuls quelques privilégiés connaissent et souhaitent partager avec nous.

783
Sasha

Il se peut que 99% des utilisateurs de Vim ne le sachent pas, mais c'est quelque chose que j'utilise quotidiennement et que tout utilisateur puissant de Linux + Vim doit savoir.

Commande basique, pourtant extrêmement utile.

:w !Sudo tee %

J'oublie souvent de Sudo avant de modifier un fichier sur lequel je ne dispose pas de droits en écriture. Lorsque je viens pour enregistrer ce fichier et obtenir une erreur d'autorisation, je viens d'émettre cette commande vim afin de sauvegarder le fichier sans avoir besoin de l'enregistrer dans un fichier temporaire, puis de le copier à nouveau.

Vous devez évidemment être sur un système avec Sudo installé et avoir les droits de Sudo.

768
skinp

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

:earlier 15m

Rétablit le document comme il était il y a 15 minutes. Peut prendre différents arguments pour le temps que vous souhaitez annuler et dépend de la non-nivellement. Peut être inversé avec la commande opposée :later

604
Chad Birch

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

Mais ajoutez un point après le deux-points, :.! [command], et le résultat de la commande sera affiché dans votre fenêtre actuelle. C'est : . !

Par exemple:

:.! ls

J'utilise beaucoup cela pour des tâches telles que l'ajout de la date du jour dans un document en cours de frappe:

:.! date
402
Jeffrey Knight

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

  • diw pour supprimer le mot actuel
  • _di(_ à supprimer dans les parenthèses actuelles
  • _di"_ pour supprimer le texte entre guillemets

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

309
dbr

de Supprimez tout jusqu'à la fin du mot en appuyant sur. au désir de votre coeur.

ci (xyz [Esc] - Ceci est étrange. Ici, le 'i' ne signifie pas mode insertion, mais signifie entre parenthèses. Cette séquence coupe donc le texte entre parenthèses ' re debout et le remplace par "xyz". Il fonctionne également entre crochets et crochets - faites juste ci [ou ci {en conséquence. Naturellement, vous pouvez faire di (si vous voulez juste supprimer tout le texte sans rien taper. Vous pouvez aussi faire a au lieu de i si vous souhaitez également supprimer les parenthèses et pas uniquement le texte qu'elles contiennent.

ci " - coupe le texte entre guillemets

ciw - coupe le mot actuel. Cela fonctionne comme le précédent sauf que ( est remplacé par w.

C - coupe le reste de la ligne et passe en mode insertion.

ZZ - enregistre et ferme le fichier en cours (beaucoup plus rapidement que Ctrl-F4 pour fermer l'onglet en cours!)

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 viwU surclasse le mot

~ - change de casse, donc viw~ retournera la casse de tout le mot

Ctrl + u/Ctrl + d faire défiler la page d'un demi-écran vers le haut ou le bas. Cela semble être plus utile que la pagination habituelle en plein écran, car il est plus facile de voir le rapport entre les deux écrans. Pour ceux qui veulent toujours faire défiler tout l'écran à la fois, il y a Ctrl + f pour En avant et Ctrl + b pour En arrière. Ctrl + Y et Ctrl + E font défiler 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 jumelles - zt et zb - font de cette ligne la ligne du haut ou celle du bas de l'écran, ce qui n'est pas aussi utile.

% trouve et saute à la parenthèse correspondante.

de - efface du curseur jusqu'à la fin du mot (vous pouvez aussi faire dE pour effacer jusqu'au prochain espace)

bde - supprime le mot actuel, délimiteur de gauche à droite

df [space] - Supprime jusqu'au prochain espace inclus

dt. - efface jusqu'au point suivant

dd - efface toute la ligne

ye (ou yE) - tire le texte d'ici à la fin de la Parole

ce - coupe la fin du mot

au revoir - copie Word actuel (me fait me demander ce que "salut" fait!)

yy - copie la ligne en cours

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

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

vi { - sélectionne tout le texte entre crochets. va {- sélectionne tout le texte, y compris {} s

vi (p - met en évidence tout ce qui se trouve à l'intérieur du () et le remplace par le texte collé

b et e déplacent le curseur mot par mot, comme Ctrl + Flèches le font normalement. La définition de Word est toutefois 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, une pression sur b vous mènera toujours au début du mot actuel, et chaque b consécutif ira au début du mot suivant. De même, et facile à retenir, e place le curseur à la fin du mot courant, ainsi que de chaque mot suivant.

semblable à b/e, majuscule B et E déplace le curseur mot par mot en utilisant uniquement des espaces comme délimiteurs.

majuscule D (souffle profond) Supprime le reste de la ligne à droite du curseur, comme pour Maj + Fin/Suppr dans les éditeurs normaux (remarquez 2 pressions de touche - Maj + D - à la place de 3)

235
ultraman

Un des tutoriels que je trouve rarement dans la plupart des tutoriels de Vim, mais c’EST INCROYABLEMENT utile (du moins pour moi), c’est le

g; and g,

pour avancer (en avant, en arrière) dans la liste des 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, disons un code couleur hexagonal dans un fichier CSS, alors je cherche, saute (je ne me soucie pas de la correspondance), le copie, puis je retourne (g;) à où J'étais en train de modifier le code pour le coller enfin. Pas besoin de créer des marques. Plus simple.

Juste mes 2cents.

199
Xavier Guardiola
:%!xxd

Faites de vim un éditeur hexadécimal.

:%!xxd -r

Revenir.

Attention: si vous n'éditez pas avec binaire (-b), vous pourriez endommager le fichier. - Josh Lee dans les commentaires.

184
Bill Lynch
gv

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

125
AaronS

Parfois, un paramètre de votre fichier .vimrc sera remplacé par un plugin ou une autocommande. Pour résoudre ce problème, une astuce utile consiste à utiliser la commande: verbose en conjonction avec: set. Par exemple, pour savoir où 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 des cartes et des faits saillants. (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
118

:%TOhtml

Crée un rendu HTML du fichier actuel.

98
N 1.1

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

:g/match/y A

jettera (copiera) toutes les lignes contenant "match" dans le registre "a/@a. (La capitalisation sous la forme A rend vim append yankings au lieu de remplacer le contenu du registre précédent.) Je l'ai beaucoup utilisée récemment lors de la création de feuilles de style Internet Explorer.

98
sjh

Voulez-vous regarder votre: historique des commandes?

q:

Puis parcourez, éditez et enfin exécutez la commande.

Avez-vous déjà apporté des modifications similaires à deux fichiers et basculé entre eux? (Dites, fichiers source et en-tête?)

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

Ensuite, faites la navette entre ces fichiers.

90
MikeyB

Vim ouvrira une URL, par exemple

vim http://stackoverflow.com/

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

79
Cercerilla

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 montre une fonctionnalité très puissante de vim

68
spence91

En supposant que Perl et/ou Ruby soient compilés, :rubydo et :perldo exécutent un Ruby ou Perl one-liner sur chaque ligne d'une plage. (par défaut, tout le tampon), avec $_ lié au texte de la ligne en cours (moins la nouvelle ligne). Manipuler $_ changera le texte de cette ligne.

Vous pouvez l'utiliser pour faire certaines choses faciles à faire dans un langage de script, mais pas si évidentes à l'aide des fonctions intégrées 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 (A à Z) à la fin de chaque ligne:

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

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

55
Brian Carper

^ O et ^ I

Aller à la position plus ancienne/plus récente. Lorsque vous vous déplacez dans le fichier (en cherchant, en déplaçant des commandes, etc.), mémorisez ces "sauts" afin que vous puissiez répéter ces sauts en arrière (^ O - O pour ancien) et en avant (^ I - juste à côté de I sur le clavier). ) Je trouve cela très utile pour écrire du code et effectuer beaucoup de recherches.

gi

Aller à la position où le mode Insertion a été arrêté en dernier. Je me trouve souvent en train d’éditer puis de chercher quelque chose. Pour revenir au lieu d'édition, appuyez sur gi.

gf

placez le curseur sur le nom du fichier (par exemple, inclure le fichier d'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]". Appuyez sur gF pour ouvrir [nom du fichier] et régler le curseur sur [numéro de ligne].

^ P et ^ N

Terminer automatiquement le texte 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 et ensuite vous vous rappelez 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 du fichier est terminé

^ Z ou: sh

Déplacement temporaire vers le shell. Si vous avez besoin d'un coup bas rapide:

  • appuyez sur ^ Z (pour mettre vi en arrière-plan) pour revenir au shell d'origine et appuyez sur fg pour revenir à vim
  • appuyez sur: sh pour aller au sous-shell et appuyez sur ^ D/exit pour revenir à vi
54
dimba

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 codages pris en charge sont répertoriés dans un tableau sous encoding-values (voir helpencoding-values). Le même principe fonctionne également pour ++ff, afin que vous puissiez rouvrir le fichier avec la fin de ligne Windows/Unix si vous vous trompez pour la première fois (voir helpff).

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

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

Taper == corrigera l'indentation de la ligne en cours 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 pourriez faire = a { dans le bloc de code, plutôt que de vous positionner directement sur le caractère {.

46
Kimball Robinson
imap jj <esc>
41
Trumpi

Voyons une jolie petite IDE éditeur faire la transposition de colonnes.

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

Explication

\( et \) est comment rappelez-vous tout ce qui se trouve dans regex-land. Et \1, \2 etc est comment récupérer le contenu mémorisé.

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

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

>>> \2^I\1

Remplacez les éléments ci-dessus par "2e élément dont vous vous êtes souvenu" suivi de "1er élément dont vous vous souveniez" - essentiellement une transposition.

37
chaos

Ce n'est pas vraiment un secret obscur, mais j'aime bien mettre le mappage suivant dans mon fichier .vimrc afin de pouvoir appuyer sur "-" (moins) à tout moment pour ouvrir l'explorateur de fichiers afin d'afficher les fichiers adjacent à celui que je viens d'éditer. Dans l'explorateur de fichiers, je peux utiliser un autre "-" pour accéder à un répertoire, ce qui permet de naviguer de manière transparente dans une structure de répertoires complexe (comme celle utilisée par les frameworks MVC):

map - :Explore<cr>

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

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

Navigation dans les onglets: j'adore les onglets et je dois facilement me déplacer entre eux:

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

Uniquement sous Mac OS X: navigation par onglet à la Safari:

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

J'aime utiliser 'Sudo bash', et mon administrateur système déteste ça. 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 néanmoins pu utiliser vim pour obtenir un shell racine:

bash$ Sudo vi +'silent !bash' +q
Password: ******
root#
27
too much php

Souvent, j'aime changer de répertoire en cours d’édition. Je dois donc spécifier moins de chemins.

cd %:h
26
rampion

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 en cours. C'est assez simple mais c'est rapide.

24
Taurus Olson
:r! <command>

colle la sortie d'une commande externe dans la mémoire tampon.

Faites des 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 Makefile:

:r! ls *.c

Ne cherchez pas ce 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
22

Ce n'est pas une fonctionnalité obscure, mais très utile et qui fait gagner du temps.

Si vous souhaitez enregistrer une session de vos tampons ouverts, onglets, marqueurs et autres paramètres, vous pouvez générer les éléments suivants:

mksession session.vim

Vous pouvez ouvrir votre session en utilisant:

vim -S session.vim
22
mohi666

Carte F5 pour rapidement ROT13 votre tampon:

map <F5> ggg?G``

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

21
jqno

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

Blocs de code de commentaire.

Passez en mode visuel bloc en appuyant sur CTRL-V.

Marquez le bloc que vous souhaitez commenter.

Hit I (majuscule I) et entrez votre chaîne de commentaires au début de la ligne. (// pour C++)

Appuyez sur ECHAP et toutes les lignes sélectionnées auront // préchargées au début de la ligne.

19
Grant Limberg

J'utilise vim pour pratiquement toutes les modifications de texte que je fais, aussi je me sers souvent de copier/coller. Le problème est que vim par défaut déformera souvent le texte importé via coller. La façon d'arrêter cela est d'utiliser

:set paste

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

Notez que vous devrez émettre :set nopaste pour récupérer l'indentation automatique. Les registres du presse-papiers (* et +) et :r!cat (vous devez terminer le fragment collé avec ^ D) sont des méthodes alternatives de collage de texte préformaté.

Il est également parfois utile d'activer un jeu 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 la plupart du temps.

17
Ian H

Voici quelque chose de pas évident. Si vous avez beaucoup de plugins/extensions personnalisés dans votre $ HOME et que vous devez parfois utiliser su/Sudo/..., cela peut être utile.

Dans votre ~/.bashrc:

export VIMINIT=":so $HOME/.vimrc"

Dans votre ~/.vimrc:

if $HOME=='/root'
        if $USER=='root'
                if isdirectory('/home/your_typical_username')
                        let rtuser = 'your_typical_username'
                elseif isdirectory('/home/your_other_username')
                        let rtuser = 'your_other_username'
                endif
        else
                let rtuser = $USER
        endif
        let &runtimepath = substitute(&runtimepath, $HOME, '/home/'.rtuser, 'g')
endif

Cela permettra à vos plugins locaux de se charger - quelle que soit la méthode utilisée pour changer d'utilisateur.

Vous voudrez peut-être aussi extraire les fichiers * .swp de votre chemin actuel et les placer dans ~/vimtmp (cela se trouve dans .vimrc):

if ! isdirectory(expand('~/vimtmp'))
   call mkdir(expand('~/vimtmp'))
endif
if isdirectory(expand('~/vimtmp'))
   set directory=~/vimtmp
else
   set directory=.,/var/tmp,/tmp
endif

En outre, certains mappages que j'utilise pour faciliter l'édition - permettent à ctrl + s de fonctionner comme un échappement et ctrl + h/l modifient les onglets:

inoremap <C-s> <ESC>
vnoremap <C-s> <ESC>
noremap <C-l> gt
noremap <C-h> gT
11
viraptor

Ctrl-n en mode insertion complétera automatiquement le mot que vous tapez en fonction de tous les mots qui se trouvent dans les tampons ouverts. S'il y a plus d'une correspondance, cela vous donnera une liste de mots possibles que vous pouvez parcourir en utilisant ctrl-n et ctrl-p.

11
Niki Yoshiuchi
gg=G

Corrige l'indentation pour tout le fichier. Il me manquait mon fidèle <C-a><C-i> dans Eclipse, mais je viens de découvrir que vim le gère bien.

10
daltonb

Possibilité d'exécuter Vim sur un mode basé sur le client/serveur.

Par exemple, supposons que vous travailliez sur un projet comportant de nombreux tampons, onglets et autres informations enregistrés dans un fichier de session appelé session.vim.

Vous pouvez ouvrir votre session et créer un serveur en lançant la commande suivante:

vim --servername SAMPLESERVER -S session.vim

Notez que vous pouvez ouvrir des fichiers texte normaux si vous voulez créer un serveur et que cela ne doit pas nécessairement être une session.

Supposons maintenant que vous êtes dans un autre terminal et que vous devez ouvrir un autre fichier. Si vous l'ouvrez régulièrement en émettant:

vim new_file.txt

Votre fichier serait ouvert dans un tampon Vim séparé, ce qui rend difficile les interactions avec les fichiers de votre session. Afin d'ouvrir new_file.txt dans un nouvel onglet de votre serveur, utilisez cette commande:

vim --servername SAMPLESERVER --remote-tab-silent new_file.txt

Si aucun serveur n'est en cours d'exécution, ce fichier sera ouvert comme un fichier normal.

Comme il est très fastidieux de fournir ces indicateurs à chaque fois que vous souhaitez les exécuter, vous pouvez créer un alias distinct pour la création du client et du serveur.

J'ai placé les éléments suivants sur mon fichier bashrc:

alias vims='vim --servername SAMPLESERVER'
alias vimc='vim --servername SAMPLESERVER --remote-tab-silent'

Vous pouvez trouver plus d'informations à ce sujet sur: http://vimdoc.sourceforge.net/htmldoc/remote.html

9
mohi666

Vous voulez un IDE?

:make exécutera le fichier Make dans le répertoire en cours, analysera la sortie du compilateur. Vous pourrez ensuite utiliser :cn et :cp pour parcourir les erreurs du compilateur en ouvrant chaque fichier et en cherchant le numéro de ligne dans question.

:syntax on active la coloration syntaxique de vim.

9
caskey

Je souhaite souvent mettre en évidence un nom de mot/fonction particulier, mais je ne souhaite pas encore rechercher l'instance suivante:

map m* *#
9
Scotty Allen

Variation de Sudo écrire:

en .vimrc

cmap w!! w !Sudo tee % >/dev/null

Après avoir rechargé vim, vous pouvez faire "Sudo save" en tant que

:w!!
9
jm666

HOWTO: Ctags à complétion automatique lors de l'utilisation de Vim dans Bash. Pour ceux qui utilisent Vim et Ctags, j'ai écrit une petite fonction de compléteur automatique pour Bash. Ajoutez ce qui suit dans votre fichier ~/.bash_completion (créez-le s'il n'existe pas):

Merci à styliste pour ses nombreuses corrections et améliorations.

_vim_ctags() {
    local cur prev

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    case "${prev}" in
        -t)
            # Avoid the complaint message when no tags file exists
            if [ ! -r ./tags ]
            then
                return
            fi

            # Escape slashes to avoid confusing awk
            cur=${cur////\\/}

            COMPREPLY=( $(compgen -W "`awk -vORS=" "  "/^${cur}/ { print \\$1 }" tags`" ) )
            ;;
        *)
            _filedir_xspec
            ;;
    esac
}

# Files matching this pattern are excluded
excludelist='*.@(o|O|so|SO|so.!(conf)|SO.!(CONF)|a|A|rpm|RPM|deb|DEB|gif|GIF|jp?(e)g|JP?(E)G|mp3|MP3|mp?(e)g|MP?(E)G|avi|AVI|asf|ASF|ogg|OGG|class|CLASS)'

complete -F _vim_ctags -f -X "${excludelist}" vi vim gvim rvim view rview rgvim rgview gview

Une fois que vous redémarrez votre session Bash (ou en créez une nouvelle), vous pouvez taper:

Code:

~$ vim -t MyC<tab key>

et il complétera automatiquement la balise de la même manière que pour les fichiers et les répertoires:

Code:

MyClass MyClassFactory
~$ vim -t MyC

Je trouve cela très utile lorsque je saute dans une correction de bogue rapide.

8
michael

% est également utile lorsque vous souhaitez différencier des fichiers sur deux copies différentes d'un projet sans user les pinkies (à partir de la racine du projet1):

:vert diffs /project2/root/%
7
Ben

: autoread setlocal

Recharge automatique du tampon en cours .. particulièrement utile lors de la visualisation des fichiers journaux et sert presque à la fonctionnalité du programme "tail" sous unix depuis vim.

Vérifier les erreurs de compilation à partir de vim. définir la variable makeprg en fonction de la langue, disons pour Perl

: setlocal makeprg = Perl\-c \%

Pour PHP

définir makeprg = php\-l \%
set errorformat =% m\in \% f\on\line \% l

La publication de ": make" exécute le makeprg associé et affiche les erreurs/avertissements de compilation dans la fenêtre de correction rapide et permet de naviguer facilement vers les numéros de ligne correspondants.

7
Naga Kiran

J'utilise Vim pour tout. Lorsque je modifie un message électronique, j'utilise:

gqap (ou gwap)

largement pour reformater facilement et correctement paragraphe par paragraphe, même avec des caractères de tête de citation. Afin de réaliser cette fonctionnalité, j'ajoute également:

-c 'set fo=tcrq' -c 'set tw=76'

à la commande pour appeler l'éditeur en externe. Un ajout remarquable serait d'ajouter "a" au paramètre fo (formatoptions). Cela reformatera automatiquement le paragraphe au fur et à mesure que vous tapez et naviguez dans le contenu, mais peut gênera ou causera des problèmes de formatage errant ou impair contenu dans le message.

7
Gary Chambers

J'étais sûr que quelqu'un l'aurait déjà posté, mais voilà.

Prenez n'importe quel système de construction qui vous convient; faire, mvn, ant, peu importe. À la racine du répertoire du projet, créez un fichier contenant les commandes que vous utilisez tout le temps, comme suit:

mVN installer
mvn clean install
... et ainsi de suite

Pour faire un build, placez le curseur sur la ligne et tapez !! sh. C'est à dire. filtrer cette ligne; écrivez-le dans un shell et remplacez-le par les résultats.

Le journal de construction remplace la ligne, prêt au défilement, à la recherche, peu importe.

Lorsque vous avez terminé de consulter le journal, tapez u pour annuler et vous revenez à votre fichier de commandes.

6
Brad Cox

En raison de la latence et du manque de couleurs (j'adore les jeux de couleurs :), je n'aime pas programmer sur des machines distantes dans PuTTY . J'ai donc développé cette astuce pour contourner ce problème. Je l'utilise sous Windows.

Vous aurez besoin de

  • 1x gVim
  • 1x rsync sur les machines distantes et locales
  • 1x authentification de clé privée SSH sur la machine distante pour que vous n'ayez pas besoin de taper le mot de passe
  • 1x Pageant
  • 1x mastic

Configuration de la machine distante

Configurez rsync pour rendre votre répertoire de travail accessible. J'utilise un tunnel SSH et n'autorise que les connexions à partir du tunnel:

address = 127.0.0.1
hosts allow = 127.0.0.1
port = 40000
use chroot = false
[bledge_ce]
    path = /home/xplasil/divine/bledge_ce
    read only = false

Puis lancez rsyncd: rsync --daemon --config = rsyncd.conf

Configuration de la machine locale

Installez rsync à partir de Cygwin. Lancez Pageant et chargez votre clé privée pour la machine distante. Si vous utilisez le tuning SSH, démarrez PuTTY pour créer le tunnel. Créez un fichier de commandes Push.bat dans votre répertoire de travail qui téléchargera les fichiers modifiés sur la machine distante à l'aide de rsync:

rsync --blocking-io *.cc *.h SConstruct rsync://localhost:40001/bledge_ce

SConstruct est un fichier de construction pour scons. Modifiez la liste des fichiers en fonction de vos besoins. Remplacez localhost par le nom de la machine distante si vous n'utilisez pas le tunelling SSH.

Configurer Vim C'est maintenant facile. Nous allons utiliser la fonctionnalité de correction rapide (: make et error list), mais la compilation sera exécutée sur la machine distante. Nous devons donc définir makeprg:

set makeprg=Push\ &&\ plink\ -batch\ [email protected]\ \"cd\ /home/xplasil/divine/bledge_ce\ &&\ scons\ -j\ 2\"

Cela démarrera d'abord la tâche Push.bat pour télécharger les fichiers, puis exécutera les commandes sur une machine distante à l'aide de SSH ( Plink à partir de la suite PuTTY). La commande change d'abord le répertoire dans le répertoire de travail, puis lance la construction (j'utilise scons).

Les résultats de la construction apparaîtront dans votre liste d’erreurs gVim locale.

6
Roman Plášil

Entrez un caractère à partir de sa valeur hexadécimale (mode insertion):

<C-Q>x[type the hexadecimal byte]
6
Luper Rouch

Mettez ceci dans votre fichier .vimrc pour avoir une commande permettant d’imprimer joliment xml:

function FormatXml()
    %s:\(\S\)\(<[^/]\)\|\(>\)\(</\):\1\3\r\2\4:g
    set filetype=xml
    normal gg=G
endfunction

command FormatXml :call FormatXml()
6
Trumpi
 =========================================== ============= 
 En mode normal 
 ======================== ================================= 
 gf .......... ...... ouvrir le fichier sous le curseur dans la même fenêtre -> voir: h chemin 
 Ctrl-w f .......... ouvrir le fichier sous le curseur dans une nouvelle fenêtre 
 Ctrl-w q .......... fermer la fenêtre en cours 
 Ctrl-w 6 .......... ouvrir un fichier alternatif -> voir: h # 
 gi ................ mode d'insertion init dans la dernière position d'insertion 
 '0 ................ place le curseur où il se trouvait lors de la dernière édition du fichier 
6
SergioAraujo

set colorcolumn=+1 ou set cc=+1 pour vim 7.3

5
quabug

Lorsque vous travaillez sur un projet où le processus de construction est lent, je construis toujours en arrière-plan et dirige la sortie vers un fichier appelé errors.err (quelque chose comme make debug 2>&1 | tee errors.err). Cela me permet de continuer à éditer ou à revoir le code source pendant le processus de construction. Quand il est prêt (en utilisant pynotify sur GTK pour m'informer qu'il est complet), je peux regarder le résultat dans vim en utilisant correction rapide . Commencez par émettre: cf [ile] qui lit le fichier d’erreur et saute à la première erreur. Personnellement, j'aime bien utiliser cwindow pour obtenir le résultat de la construction dans une fenêtre séparée.

4
Anders Holmberg

:sp %:h - liste de répertoire/sélecteur de fichier utilisant le répertoire du fichier actuel

(appartient en tant que commentaire sous le conseil de rampion cd, mais je n'ai pas encore de droits de commentaire)

4
searlea

Juste avant de copier et coller dans stackoverflow:

:retab 1
:% s/^I/ /g
:% s/^/    /

Maintenant, copiez et collez le code.

Comme demandé dans les commentaires:

retab 1. Ceci définit la taille de l'onglet à un. Mais il parcourt également le code et ajoute des tabulations et des espaces supplémentaires, de sorte que la mise en forme ne déplace aucun élément du texte (le texte a exactement la même apparence après ratab).

% s/^ I// g: Notez que ^ I est le résultat de la frappe sur l'onglet. Ceci recherche tous les onglets et les remplace par un seul espace. Comme nous venons de procéder à une retabulation, cela ne devrait pas entraîner de modification de la mise en forme, mais comme il est inutile de placer des onglets sur un site Web, il est bon de les supprimer.

% s/^//: remplace le début de la ligne par quatre espaces. Étant donné que vous ne pouvez pas remplacer le début de la ligne par quoi que ce soit, il insère quatre espaces au début de la ligne (ceci est nécessaire pour la mise en forme SO afin de faire ressortir le code).

4
Martin York

Quelques utiles:

:set nu # displays lines
:44     # go to line 44
'.      # go to last modification line

Mon favori: Ctrl + n Mot achèvement!

4
dfens
In Insert mode 
<C-A>   - Increments the number under cursor 
<C-X>   - Decrements the number under cursor

Cela sera très utile si nous voulons générer des nombres séquentiels dans vim
Disons si nous voulons insérer les lignes 1 à 10 avec des nombres de 1 à 10 [comme "1" à la première ligne, "2" à la deuxième ligne ...]
insérez "0" sur la première ligne et copiez la ligne et les 9 dernières fois afin que toutes les lignes affichent "0".

Exécutez la commande Ex suivante

:g/^/exe "norm " . line(".") . "\<C-A>"
3
Naga Kiran

Pour que vim ressemble un peu plus à un éditeur IDE:

  • set nu - pour les numéros de ligne dans la marge de gauche.
  • set cul - met en surbrillance la ligne contenant le curseur.
3
mpe

J'aime: la commande.

3
PuzzleCracker

macros de carte

Je trouve assez souvent utile de définir à la volée un mappage de clé comme on définirait une macro. La torsion ici est que le mappage est récursif et est exécuté jusqu'à ce qu'il échoue.

Exemple:

enum ProcStats
{
        ps_pid,
        ps_comm,
        ps_state,
        ps_ppid,
        ps_pgrp,
:map X /ps_<CR>3xixy<Esc>X

Donne:

enum ProcStats
{
        xypid,
        xycomm,
        xystate,
        xyppid,
        xypgrp,

Juste un exemple idiot :).

Je suis tout à fait au courant de tous les inconvénients - il se trouve que je l’ai trouvé plutôt utile à certaines occasions. En outre, il peut être intéressant de le regarder au travail;).

3
Marcus Borkenhagen

En mode insertion, ctrl+xctrl+p complétera (avec le menu des complétions possibles si c'est ce que vous aimez) l'identifiant long actuel que vous tapez.

if (SomeCall(LONG_ID_ <-- type c-x c-p here
            [LONG_ID_I_CANT_POSSIBLY_REMEMBER]
             LONG_ID_BUT_I_NEW_IT_WASNT_THIS_ONE
             LONG_ID_GOSH_FORGOT_THIS
             LONG_ID_ETC
             ∶
3
bobbogo

Réutilisation

Motions à mélanger avec d'autres commandes, plus ici .

tx
fx
Fx

Utilisez vos outils préférés dans Vim.

:r !python anything you want or awk or Y something

Répétez en mode visuel, puissant lorsqu'il est combiné avec les conseils ci-dessus.

;
3
hhh

Remplace tout

  :%s/oldtext/newtext/igc

Donnez à remplacer tout :)

2
AIB

Afin de copier un texte de Vim dans votre presse-papiers pour pouvoir être utilisé par une autre application, sélectionnez le texte que vous souhaitez copier en mode visuel, puis appuyez sur "+ y. Ainsi, vous pourrez facilement coller votre texte dans d'autres applications.

Ceci est particulièrement utile si vous avez scindé la fenêtre verticalement et que vous souhaitez copier quelque chose de la fenêtre de droite. Utiliser set mouse = r ne vous aidera pas dans cette situation car il sélectionnera également tout dans la fenêtre de gauche.

Notez que votre vim doit être compilé avec le support xterm.

2
mohi666

J'ai recueilli ces au fil des ans.

" Pasting in normal mode should append to the right of cursor
nmap <C-V>      a<C-V><ESC>
" Saving
imap <C-S>      <C-o>:up<CR>
nmap <C-S>      :up<CR>
" Insert mode control delete
imap <C-Backspace> <C-W>
imap <C-Delete> <C-O>dw
nmap    <Leader>o       o<ESC>k
nmap    <Leader>O       O<ESC>j
" tired of my typo
nmap :W     :w
2
Yada

Utilisez le bouton droit de la souris pour activer le mode d’insertion dans gVim avec les paramètres suivants dans ~/.gvimrc:

"
"------------------------------------------------------------------
" toggle insert mode <--> 'normal mode with the <RightMouse>-key
"------------------------------------------------------------------
nnoremap  <RightMouse> <Insert>
inoremap  <RightMouse> <ESC>
"
2
Fritz G. Mehner

Créez une fonction pour exécuter le tampon actuel en utilisant Shebang (en supposant que celui-ci soit défini) et appelez-le avec crtl-x.

map <C-X> :call CallInterpreter()<CR>

au BufEnter *
\ if match (getline(1) , '^\#!') == 0 |
\   execute("let b:interpreter = getline(1)[2:]") |
\ endif

fun! CallInterpreter()
    if exists("b:interpreter")
        exec("! ".b:interpreter." %")
    endif
endfun
2
jonyamo

Essayez d’utiliser perltidy pour formater avec = commande en mode normal

:set equalprg=perltidy
2
c9s

Aucun des éléments suivants n'est vraiment inflexible, mais je le trouve extrêmement utile.

Liaisons triviales, mais je ne peux tout simplement pas vivre sans. Il active le mouvement de style hjkl en mode insertion (à l'aide de la touche ctrl). En mode normal: ctrl-k/j fait défiler la moitié d'un écran vers le haut et vers le bas et ctrl-l/h permet d'accéder au tampon suivant/précédent. Les mappages µ et ù sont spécialement conçus pour un clavier AZERTY et permettent de passer à l'erreur suivante/précédente.

imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>

nmap ù :cp<RETURN>
nmap µ :cn<RETURN>

Une petite fonction que j'ai écrite pour mettre en évidence des fonctions, des globales, des macros, des structs et des typedefs. (Peut être lent sur les très gros fichiers). Chaque type est mis en surbrillance (voir ": help group-name" pour avoir une idée des paramètres actuels de votre couleur) Utilisation: enregistrez le fichier avec ww (valeur par défaut "\ ww"). Vous avez besoin de balises pour cela.

nmap <Leader>ww :call SaveCtagsHighlight()<CR>

"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
    write

    let extension = expand("%:e")
    if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
        return
    endif

    silent !ctags --fields=+KS *
    redraw!

    let list = taglist('.*')
    for item in list
        let kind = item.kind

        if     kind == 'member'
            let kw = 'Identifier'
        elseif kind == 'function'
            let kw = 'Function'
        elseif kind == 'macro'
            let kw = 'Macro'
        elseif kind == 'struct'
            let kw = 'Structure'
        elseif kind == 'typedef'
            let kw = 'Typedef'
        else
            continue
        endif

        let name = item.name
        if name != 'operator=' && name != 'operator ='
            exec 'syntax keyword '.kw.' '.name
        endif
    endfor
    echo expand("%")." written, tags updated"
endfunction

J'ai l'habitude d'écrire beaucoup de code et de fonctions et je n'aime pas écrire de prototypes pour eux. J'ai donc créé une fonction pour générer une liste de prototypes dans un fichier source de style C. Il existe deux variantes: l'une qui supprime le nom du paramètre formel et l'autre le conservant. Je viens d'actualiser la liste complète chaque fois que je dois mettre à jour les prototypes. Cela évite d'avoir des prototypes désynchronisés et des définitions de fonctions. A également besoin de balises.

"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
    execute "silent !ctags --fields=+KS ".expand("%")
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
                let sig = substitute( sig, '\s*\w\+\s*,',        ',',   'g')
                let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
            else
                let sig = '()'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction


function GeneratePrototypesFullSignature()
    "execute "silent !ctags --fields=+KS ".expand("%")
    let dir = expand("%:p:h");
    execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
            else
                let sig = '(void)'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction
2
RoaldFre

Ma recette préférée pour passer d'une fenêtre à l'autre:

function! SwitchPrevWin()
    let l:winnr_index = winnr()
    if l:winnr_index > 1
       let l:winnr_index -= 1
    else
       "set winnr_index to max window open
        let l:winnr_index = winnr('$')
    endif
    exe l:winnr_index . "wincmd w" 
endfunction

nmap <M-z> :call SwitchPrevWin()
imap <M-z> <ESC>:call SwitchPrevWin()

nmap <C-z> :wincmd w
imap <C-z> <ESC>:wincmd w
1
ken

Je voudrais organiser certains de mes propres fichiers de configuration dans after-directory . C'est particulièrement utile pour ftplugin .

Vous pouvez éviter d'écrire une longue liste de augroup dans votre fichier .vimrc au lieu de fichiers distincts pour chaque type.

Mais, évidemment, le répertoire .vim/ftplugin fait la même chose que .vim/after/ftplugin, mais je préférerais laisser le répertoire .vim aux plugins vim.

1
quabug

par ceci fil

Pour préfixer un ensemble de lignes, j'utilise l'une des deux approches suivantes:

Une approche est la sélection de bloc (mentionnée par qch). En général, vous pouvez sélectionner une région rectangulaire avec ctrl-V suivi du mouvement du curseur. Une fois que vous avez mis un rectangle en surbrillance, appuyez sur Maj-Je vais insérer des caractères sur le côté gauche du rectangle, ou sur Maj-A pour les ajouter sur le côté droit du rectangle. Vous pouvez donc utiliser cette technique pour créer un rectangle contenant la colonne la plus à gauche des lignes que vous souhaitez préfixer, appuyez sur shift-I, tapez le préfixe, puis appuyez sur échap.

L'autre approche consiste à utiliser une substitution (comme mentionné par Brian Agnew). La substitution de Brian affectera le fichier entier (le% dans la commande signifie "toutes les lignes"). Pour ne toucher que quelques lignes, l’approche la plus simple consiste à appuyer sur shift-V (ce qui active le mode ligne visuelle) sur la première/dernière ligne, puis à passer à la dernière/première ligne. Puis tapez:

: s/^/VOTRE PRÉFIXE /

Le ^ est une regex (dans ce cas, le début de la ligne). En tapant ceci en mode ligne visuelle, vous verrez que '<,'> est inséré avant le s automatiquement. Cela signifie que la plage de substitution sera la sélection visuelle.

Conseil supplémentaire: si votre préfixe contient des barres obliques, vous pouvez les échapper avec une barre oblique inverse ou vous pouvez utiliser un caractère de ponctuation différent comme séparateur dans la commande. Par exemple, pour ajouter des commentaires de ligne C++, j'écris habituellement:

: s: ^: //:

Pour ajouter un suffixe, l’approche de substitution est généralement plus facile à moins que toutes vos lignes aient exactement la même longueur. Utilisez simplement $ pour le motif à la place de ^ et votre chaîne sera ajoutée à la place de pré-suspendue.

Si vous voulez ajouter un préfixe et un suffixe simultanément, vous pouvez faire quelque chose comme ceci:

: s /.*/ PREFIX & SUFFIX /

Le. * Correspond à toute la ligne. Le & dans le remplacement renvoie le texte correspondant (la ligne entière), mais votre préfixe et suffixe seront désormais ajoutés.

BTW: lorsque vous commentez du code, vous voudrez probablement le supprimer plus tard. Vous pouvez utiliser visual-block (ctrl-V) pour sélectionner les barres obliques, puis appuyer sur d pour les supprimer, ou vous pouvez utiliser une substitution (probablement avec une sélection de ligne visuelle, faite avec shift-V) pour supprimer les barres obliques majeures comme celle-ci. :

: s: // ::

1
vehomzzz

Des mappages pour faire en sorte que les mouvements fonctionnent sur la ligne d'écran actuelle en mode Habillage. J'ai découvert cela dans un commentaire sur un conseil de Vim il y a quelque temps, et il s'est révélé très pratique.

function! ScreenMovement(movement)
  if &wrap
    return "g" . a:movement
  else
    return a:movement
  endif
endfunction
onoremap <silent> <expr> j ScreenMovement("j")
onoremap <silent> <expr> k ScreenMovement("k")
onoremap <silent> <expr> 0 ScreenMovement("0")
onoremap <silent> <expr> ^ ScreenMovement("^")
onoremap <silent> <expr> $ ScreenMovement("$")
nnoremap <silent> <expr> j ScreenMovement("j")
nnoremap <silent> <expr> k ScreenMovement("k")
nnoremap <silent> <expr> 0 ScreenMovement("0")
nnoremap <silent> <expr> ^ ScreenMovement("^")
nnoremap <silent> <expr> $ ScreenMovement("$")
1
Mark42

Certains de mes must-have sont:

cscope + ctags + vim, disponibles sur le Web.

Quelques abréviations pour démarrer rapidement de nouveaux fichiers de code tels que:

ab cpph #include <iostream><CR>#include <string><CR>#include <cstdlib><CR>#include <cassert><CR>#include <vector><CR>#include <
stdexcept><CR>using namespace std;<CR>int main(int argc, char *argv[]) {
ab perlh #!/usr/bin/Perl<CR>use strict;<CR>use warnings;<CR>
ab chdr #include <stdio.h><CR>#include <sys/types.h><CR>#include <unistd.h><CR>#include <stdlib.h><CR>#include <sys/stat.h><CR>
#include <sys/wait.h><CR>#include <string.h><CR>int main(int argc, char *argv[]) {
ab xhtmlhdr <?xml version="1.0" encoding="UTF-8"?><CR><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.o
rg/TR/xhtml1/DTD/xhtml1-strict.dtd"><CR><html xmlns="http://www.w3.org/1999/xhtml"><CR>  <head><CR>  <title></title><CR><link h
ref="style.css" rel="STYLESHEET" type="text/css"><CR></head>

Par exemple, cpph insérera un squelette de base d’un fichier main.cc

Il y a aussi ma cartographie des touches de fonction:

map <F1> <Esc>:w<CR>:Perl $e = `./error.pl`; my ($f,$l,@w) = split(":",$e); my $w=join(":",@w); $curwin->Cursor($l,0); VIM::Msg($w);<CR>
map <F2> :wincmd w<CR>
map <F3> :wincmd s<CR>
map <F4> :wincmd v<CR>
map <F5> :wincmd o<CR>
map <F6> :sball<CR>
map <F7> :wq<CR>
map <F8> :wincmd q<CR>
map <F9> :wincmd -<CR>
map <F10> :wincmd +<CR>
map <F11> :wincmd <<CR>
map <F12> :wincmd ><CR>

Dans ce cas, ma F1 est mappée pour placer le curseur sur la prochaine erreur à corriger pour une migration de code source.

map _ ebi"^[ea"^[

Cette carte ferait _ citer une chaîne

1
piotr

Mine utilise des macros au lieu de recherches - la combinaison d'une macro avec le mode visuel est parfois plus efficace.

1
lukaszkorecki