web-dev-qa-db-fra.com

Quel est votre raccourci le plus productif avec Vim?

J'ai beaucoup entendu parler de Vim , le pour et le contre. Il semble vraiment que vous devriez être (en tant que développeur) plus rapidement avec Vim qu'avec n'importe quel autre éditeur. J'utilise Vim pour faire des choses de base et je suis au mieux 10 fois moins productif avec Vim.

Les deux seules choses qui doivent vous intéresser lorsque vous parlez de vitesse (vous ne l'êtes peut-être pas assez, mais vous devriez) sont les suivantes:

  1. Utiliser alternativement les mains gauche et droite est le moyen le plus rapide d'utiliser le clavier.
  2. Ne jamais toucher la souris est le deuxième moyen d’être aussi rapide que possible. Il vous faut beaucoup de temps pour déplacer votre main, saisir la souris, la déplacer et la ramener sur le clavier (et vous devez souvent regarder le clavier pour vous assurer que vous avez bien remis votre main au bon endroit).

Voici deux exemples démontrant pourquoi je suis beaucoup moins productif avec Vim.

Copier/Couper et coller. Je le fais tout le temps. Avec tous les éditeurs contemporains, vous appuyez sur Shift avec la main gauche, et vous déplacez le curseur avec votre main droite pour sélectionner du texte. ensuite Ctrl+C copies, vous déplacez le curseur et Ctrl+V pâtes.

Avec Vim c'est horrible:

  • yy pour copier une ligne (vous ne voulez presque jamais la ligne entière!)
  • [number xx]yy pour copier les lignes xx dans la mémoire tampon. Mais vous ne savez jamais exactement si vous avez sélectionné ce que vous vouliez. Je dois souvent faire [number xx]dd puis u pour annuler !

Un autre exemple? Rechercher et remplacer.

  • Dans PSPadCtrl+f puis tapez ce que vous voulez chercher, puis appuyez sur Enter.
  • Dans Vim: /, tapez ce que vous voulez rechercher, puis s'il y a des caractères spéciaux mis \ avant chaque caractère spécial, puis appuyez sur Enter.

Et tout avec Vim est comme ça: il semble que je ne sais pas comment gérer ça correctement.

NB: J'ai déjà lu le Vim trichefeuille :)

Ma question est:

Quelle est la façon dont vous utilisez Vim qui vous rend plus productif qu'avec un éditeur contemporain?

1127
Olivier Pons

Votre problème avec Vim, c'est que vous ne prenez pas la parole vi.

Vous mentionnez couper avec yy et vous vous plaignez du fait que vous ne voulez presque jamais couper des lignes entières. En fait, les programmeurs, éditant le code source, veulent très souvent travailler sur des lignes entières, des plages de lignes et des blocs de code. Cependant, yy n'est qu'une des nombreuses façons d'insérer du texte dans le tampon de copie anonyme (ou "register" comme il est appelé dans vi).

Le "Zen" de vi est que vous parlez une langue. L'initiale y est un verbe. L'instruction yy est un synonyme de y_. La y est doublée pour faciliter la frappe car il s'agit d'une opération courante.

Cela peut aussi être exprimé sous la forme ddP (effacez la ligne actuelle et collez une copie à la place; laissez une copie dans le registre anonyme comme effet secondaire). Les y et d "verbes" prennent n'importe quel mouvement comme "sujet". Ainsi, yW est "yank à partir d'ici (le curseur) jusqu'à la fin du mot actuel/suivant (grand) mot" et y'a est "yank à partir de la ligne contenant la marque nommée ' a '. "

Si vous ne comprenez que les mouvements de base du curseur vers le haut, le bas, la gauche et la droite, alors vi ne sera pas plus productif qu'une copie du "bloc-notes" pour vous. (D'accord, vous aurez toujours la coloration syntaxique et la possibilité de gérer des fichiers plus volumineux qu'un petit nombre approximatif de ~ 45 Ko; mais travaillez avec moi ici).

vi a 26 "marques" et 26 "registres". Un repère est défini sur n'importe quel emplacement du curseur à l'aide de la commande m. Chaque marque est désignée par une seule lettre minuscule. Ainsi, ma définit le repère ' a ' sur l'emplacement actuel et mz définit le repère ' z 'marque. Vous pouvez accéder à la ligne contenant une marque à l’aide de la commande ' (guillemet simple). Ainsi, 'a se déplace au début de la ligne contenant la marque ' a '. Vous pouvez vous déplacer à l'emplacement précis de n'importe quelle marque à l'aide de la commande ` (citation arrière). Ainsi, `z se déplacera directement à l'emplacement exact de la marque ' z '.

Parce que ce sont des "mouvements", ils peuvent également être utilisés comme sujets pour d'autres "déclarations".

Ainsi, une façon de couper une sélection de texte arbitraire serait de supprimer une marque (j’utilise habituellement ' un ' comme "première" marque, " z 'comme prochaine marque,' b 'comme autre, et ' e ' en tant qu'autre (je ne me souviens pas d'avoir utilisé interactivement plus de quatre marques en 15 ans d'utilisation de vi =; on crée ses propres conventions concernant la manière dont les marques et les registres sont utilisés par des macros qui ne perturbent pas son contexte interactif). Nous passons ensuite à l’autre bout du texte souhaité; nous pouvons commencer à l’une ou l’autre extrémité, peu importe Ensuite, nous pouvons simplement utiliser d`a pour couper ou y`a pour copier. Ainsi, le processus entier est surchargé de 5 frappes (six si nous avons démarré en mode "insertion" et avons besoin de Esc en mode de commande). Une fois que nous avons coupé ou copié puis collé dans une copie, il n’ya qu’une seule frappe: p.

Je dis que c'est une façon de couper ou de copier du texte. Cependant, ce n'est qu'un parmi beaucoup d'autres. Souvent, nous pouvons décrire de manière plus succincte la plage de texte sans déplacer notre curseur et laisser tomber une marque. Par exemple, si je suis dans un paragraphe de texte, je peux utiliser les mouvements { et } au début ou à la fin du paragraphe, respectivement. Donc, pour déplacer un paragraphe de texte, je l'ai coupé en utilisant {d} (3 frappes de touche). (Si je me trouve déjà sur la première ou la dernière ligne du paragraphe, je peux alors simplement utiliser respectivement d} ou d{.

La notion de "paragraphe" renvoie par défaut à quelque chose qui est habituellement intuitivement raisonnable. Ainsi, cela fonctionne souvent pour le code ainsi que pour la prose.

Nous connaissons souvent un motif (expression régulière) qui marque une extrémité ou l'autre du texte qui nous intéresse. Une recherche en avant ou en arrière est un mouvement dans vi. Ainsi, ils peuvent également être utilisés comme "sujets" dans nos "déclarations". Je peux donc utiliser d/foo pour couper de la ligne en cours à la ligne suivante contenant la chaîne "foo" et y?bar pour copier de la ligne en cours à la dernière ligne ("précédente") contenant "bar". Si je ne veux pas de lignes entières, je peux quand même utiliser les mouvements de recherche (en tant que déclarations propres), lâcher mes marques et utiliser les commandes `x comme décrit précédemment.

En plus des "verbes" et des "sujets" vi a aussi des "objets" (au sens grammatical du terme). Jusqu'à présent, je n'ai décrit que l'utilisation du registre anonyme. Cependant, je peux utiliser n'importe lequel des 26 registres "nommés" en en préfixant la référence "objet" avec " (le modificateur de guillemet double) . Ainsi, si j’utilise "add je coupe la ligne actuelle dans le registre ' a ' et si j’utilise "by/foo, alors Je suis en train de transférer une copie du texte d'ici à la ligne suivante contenant "foo" dans le registre ' b '. Pour coller depuis un registre, je préfixe simplement coller avec la même séquence de modificateur: "ap colle une copie du contenu du registre ' a ' dans le texte après le curseur et "bP colle une copie de ' b ' avant la ligne en cours.

Cette notion de "préfixes" ajoute également les analogues "d'adjectifs" et "adverbes" à notre "langage de manipulation de texte". La plupart des commandes (verbes) et des mouvements (verbes ou objets, en fonction du contexte) peuvent également prendre des préfixes numériques. 3J signifie "joindre les trois lignes suivantes" et d5} signifie "supprimer de la ligne en cours jusqu'à la fin du cinquième paragraphe".

Ceci est tout niveau intermédiaire vi. Rien de tout cela n'est spécifique à Vim et il existe des astuces beaucoup plus avancées dans vi si vous êtes prêt à les apprendre. Si vous maîtrisiez seulement ces concepts intermédiaires, vous constaterez probablement que vous avez rarement besoin d'écrire des macros car le langage de manipulation de texte est suffisamment concis et expressif pour faire la plupart des choses assez facilement en utilisant le langage "natif" de l'éditeur.


Un échantillon d'astuces plus avancées:

Il existe un certain nombre de commandes :, notamment la technique de substitution :% s/foo/bar/g globale. (Ce n'est pas avancé mais d'autres commandes : peuvent être). L'ensemble complet de : commandes a été hérité par les précédentes incarnations de vi comme ed (éditeur de ligne) et plus tard par ex = Utilitaires (éditeur de lignes étendues). En fait, vi est nommé ainsi car c'est l'interface visuelle vers ex.

Les commandes : fonctionnent normalement sur des lignes de texte. ed et ex ont été écrits à une époque où les écrans de terminaux étaient rares et où de nombreux terminaux étaient des dispositifs de type "télétype" (ATS). Il était donc courant de travailler à partir de copies imprimées du texte, en utilisant des commandes via une interface extrêmement concise (les vitesses de connexion habituelles étaient de 110 bauds ou environ 11 caractères par seconde, ce qui est plus lent que celui d'une dactylographe rapide; les retards étaient courants. sessions interactives multi-utilisateurs; de plus, il y avait souvent une certaine motivation à économiser du papier).

Ainsi, la syntaxe de la plupart des commandes : comprend une adresse ou une plage d'adresses (numéro de ligne) suivie d'une commande. Naturellement, vous pouvez utiliser des numéros de ligne littéraux: :127,215 s/foo/bar pour remplacer la première occurrence de "foo" par "bar" sur chaque ligne entre 127 et 215. Vous pouvez également utiliser des abréviations telles que . ou $ pour les lignes en cours et les dernières. Vous pouvez également utiliser les préfixes relatifs + et - pour faire référence aux décalages après ou avant la ligne actuelle, respectivement. Ainsi: :.,$j signifie "de la ligne courante à la dernière ligne, joignez-les tous en une seule ligne". :% est synonyme de :1,$ (toutes les lignes).

Les commandes :... g et :... v portent une explication car elles sont incroyablement puissantes. :... g est un préfixe pour "globalement" l'application d'une commande ultérieure à toutes les lignes correspondant à un modèle (expression régulière), tandis que :... v applique cette commande à toutes les lignes ne correspondant PAS au modèle donné ("v "de" converger "). Comme avec les autres commandes ex, celles-ci peuvent être préfixées par l'adressage/les références de plage. Ainsi, :.,+21g/foo/d signifie "supprime toutes les lignes contenant la chaîne" foo "de la ligne courante aux 21 lignes suivantes", tandis que :.,$v/bar/d signifie "d'ici la fin du fichier, supprimez toutes les lignes qui font DON '. T contiennent la chaîne "bar".

Il est intéressant de noter que la commande Unix commune grep a été réellement inspirée par cette commande ex (et porte le nom de la manière dont elle a été documentée). La commande ex:g/re/p (grep) expliquait comment "globalement" "imprimer" les lignes contenant une "expression régulière" (re). Lorsque ed et ex ont été utilisés, la commande :p est l'une des premières que tout le monde a apprise et souvent la première utilisée lors de l'édition d'un fichier. C’est ainsi que vous avez imprimé le contenu actuel (en général, une page à la fois en utilisant :.,+25p ou quelque chose du genre).

Notez que :% g/.../d ou (son homologue reVerse/conVerse: :% v/.../d sont les modèles d'utilisation les plus courants. Cependant, il existe quelques autres commandes ex qu'il convient de retenir:

Nous pouvons utiliser m pour déplacer des lignes et j pour joindre des lignes. Par exemple, si vous avez une liste et que vous souhaitez séparer tous les éléments correspondants (ou inversement ne correspondant à aucun motif) sans les supprimer, vous pouvez utiliser quelque chose comme: :% g/foo/m$ ... et toutes les lignes "foo" aura été déplacé à la fin du fichier. (Notez l'autre astuce sur l'utilisation de la fin de votre fichier comme espace de travail). Cela aura préservé l'ordre relatif de toutes les lignes "foo" tout en les ayant extraites du reste de la liste. (Cela équivaudrait à faire quelque chose comme: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d (copiez le fichier dans sa propre queue, filtrez la queue à travers grep et supprimez tous les éléments de la tête).

Pour joindre des lignes, je peux généralement trouver un motif pour toutes les lignes devant être jointes à leur prédécesseur (toutes les lignes commençant par "^" plutôt que "^ *" dans une liste à puces, par exemple). Pour ce cas, j'utiliserais: :% g/^ /-1j (pour chaque ligne correspondante, montez d'une ligne et joignez-les). (BTW: pour les listes à puces qui essaient de rechercher les lignes de balle et de se joindre à la suivante ne fonctionnent pas pour deux raisons ... il peut joindre une ligne de balle à une autre et ne joindre aucune ligne de balle à tout de ses suites; il ne fonctionnera que par paires sur les matches).

Presque inutile de mentionner que vous pouvez utiliser notre vieil ami s (substitut) avec les commandes g et v (global/converse-global). Généralement, vous n'avez pas besoin de le faire. Cependant, considérons le cas où vous souhaitez effectuer une substitution uniquement sur des lignes correspondant à un autre modèle. Vous pouvez souvent utiliser un motif complexe avec des captures et utiliser des références en arrière pour conserver les portions de lignes que vous ne voulez PAS modifier. Cependant, il sera souvent plus facile de séparer la correspondance de la substitution: :% g/foo/s/bar/zzz/g - pour chaque ligne contenant "foo", remplacez tous "bar" par "zzz". (Quelque chose comme :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g ne fonctionnerait que pour les cas où "bar" avait été PRÉCÉDÉ par "foo" sur la même ligne; c'est déjà assez maladroit et devrait être mutilé davantage pour intercepter tous les cas où "bar" précédé "foo")

Le fait est qu’il n’ya pas que p, s et d lignes dans le jeu de commandes ex.

Les adresses : peuvent également faire référence à des marques. Ainsi, vous pouvez utiliser: :'a,'bg/foo/j pour joindre une ligne contenant la chaîne foo à la ligne suivante, si elle se trouve entre les lignes situées entre ' a 'et' b 'marques. (Oui, tous les exemples de commandes ex précédents peuvent être limités à des sous-ensembles de lignes du fichier en préfixant ces types d'expressions d'adressage).

C'est assez obscur (j'ai utilisé quelque chose comme ça à quelques reprises au cours des 15 dernières années). Cependant, je reconnais volontiers que j'ai souvent fait des choses de manière itérative et interactive qui auraient probablement pu être faites plus efficacement si j'avais pris le temps de réfléchir à la bonne incantation.

Une autre commande très utile vi ou ex est :r pour lire le contenu d'un autre fichier. Ainsi: :r foo insère le contenu du fichier nommé "foo" à la ligne en cours.

La commande :r! est plus puissante. Ceci lit les résultats d'une commande. Cela revient à suspendre la session vi, à exécuter une commande, à rediriger sa sortie vers un fichier temporaire, à reprendre votre session vi et à lire le contenu du fichier temp. fichier.

Les commandes ! (bang) et :... ! (ex bang) sont encore plus puissantes. Celles-ci exécutent également des commandes externes et lisent les résultats dans le texte actuel. Cependant, ils filtrent également les sélections de notre texte via la commande! Ceci nous permet de trier toutes les lignes de notre fichier en utilisant 1G!Gsort (G est la commande vi "goto"; sa valeur par défaut est d'aller à la dernière ligne du fichier, mais peut être préfixé par un numéro de ligne, tel que 1, la première ligne). Ceci est équivalent à la variante ex:1,$!sort. Les rédacteurs utilisent souvent ! avec les utilitaires Unix fmt ou fold pour reformater ou sélectionner des sélections de texte. Une macro très courante est {!}fmt (reformatez le paragraphe actuel). Les programmeurs l'utilisent parfois pour exécuter leur code, ou seulement une partie de celui-ci, via indent ou d'autres outils de reformatage de code.

L'utilisation des commandes :r! et ! signifie que tout filtre ou utilitaire externe peut être traité comme une extension de notre éditeur. Je les ai parfois utilisés avec des scripts qui extrayaient des données d'une base de données ou avec des commandes wget ou lynx qui extrayaient des données d'un site Web, ou ssh commandes qui ont extrait des données de systèmes distants.

Une autre commande ex utile est :so (abréviation de :source). Ceci lit le contenu d'un fichier sous la forme d'une série de commandes. Lorsque vous démarrez vi, il effectue normalement, implicitement, un fichier :source sur ~/.exinitrc (et Vim le fait généralement sur ~/.vimrc, assez naturellement). L’utilisation de ceci est que vous pouvez changer votre profil d’éditeur à la volée en faisant simplement une recherche dans un nouvel ensemble de macros, d’abréviations et de paramètres d’éditeur. Si vous êtes sournois, vous pouvez même utiliser cette astuce pour stocker des séquences de commandes d'édition ex à appliquer aux fichiers à la demande.

Par exemple, j'ai un fichier de sept lignes (36 caractères) qui exécute un fichier à travers wc et insère un commentaire de style C en haut du fichier contenant ces données de nombre de mots. Je peux appliquer cette "macro" à un fichier en utilisant une commande telle que: vim +'so mymacro.ex' ./mytarget

(L'option de ligne de commande + de vi et Vim est normalement utilisée pour démarrer la session d'édition à un numéro de ligne donné. Toutefois, il est peu connu qu'un peut suivre le + par n'importe quelle commande/expression ex valide, telle qu'une commande "source" comme je l'ai fait ici; pour un exemple simple, j'ai des scripts qui invoquent: vi +'/foo/d|wq!' ~/.ssh/known_hosts pour supprimer une entrée de mon fichier hôtes connus SSH de manière non interactive pendant que je ré-imite un ensemble de serveurs).

En général, il est beaucoup plus facile d'écrire de telles "macros" en utilisant Perl, AWK, sed (ce qui, en fait, ressemble à grep, un utilitaire inspiré par le ed commande).

La commande @ est probablement la commande la plus obscure vi. En enseignant occasionnellement des cours avancés d’administration des systèmes pendant près de 10 ans, j’ai rencontré très peu de personnes qui l’avaient déjà utilisée. @ exécute le contenu d'un registre comme s'il s'agissait d'une commande vi ou ex.
Exemple: J'utilise souvent: :r!locate ... pour rechercher un fichier sur mon système et lire son nom dans mon document. À partir de là, je supprime tous les hits superflus, ne laissant que le chemin d'accès complet au fichier qui m'intéresse. Plutôt que péniblement Tab-ing à travers chaque composant du chemin (ou pire, si je suis coincé sur une machine sans support d'achèvement de tabulation dans sa copie de vi) je viens d'utiliser:

  1. 0i:r (pour transformer la ligne actuelle en une commande : r valide),
  2. "cdd (pour effacer la ligne dans le registre "c") et
  3. @c exécute cette commande.

Cela ne représente que 10 frappes de touche (et l'expression "cdd@c est en fait une macro de doigt, ce qui me permet de la saisir presque aussi rapidement que n'importe quel mot commun de six lettres).


Une pensée qui donne à réfléchir

Je n'ai fait qu'effleurer le pouvoir de vi et rien de ce que j'ai décrit ici ne fait même partie des "améliorations" pour lesquelles vim est nommé! Tout ce que j'ai décrit ici devrait fonctionner sur n'importe quelle ancienne copie de vi d'il y a 20 ou 30 ans.

Il y a des gens qui ont utilisé considérablement plus de pouvoir de vi que je ne le ferai jamais.

2862
Jim Dennis

Vous parlez de la sélection et de la copie de texte, je pense que vous devriez jeter un coup d'œil au Mode visuel Vim .

En mode visuel, vous pouvez sélectionner du texte à l'aide des commandes Vim, puis faire ce que vous voulez avec la sélection.

Considérez les scénarios courants suivants:

Vous devez sélectionner la prochaine parenthèse correspondante.

Vous pourriez faire:

  • v% si le curseur se trouve sur la parenthèse initiale/finale
  • vib si le curseur est à l'intérieur du bloc de parenthèse

Vous voulez sélectionner du texte entre guillemets:

  • vi " pour les guillemets doubles
  • vi ' pour les guillemets simples

Vous souhaitez sélectionner un bloc d'accolade (très courant dans les langages de style C):

  • viB
  • vi{

Vous voulez sélectionner le fichier entier:

  • ggVG

Sélection de bloc visuel est une autre fonctionnalité très utile, elle vous permet de sélectionner une zone rectangulaire de texte. Il vous suffit d'appuyer sur Ctrl-V pour le démarrer, puis sélectionnez le bloc de texte souhaité et effectuez n’importe quel type d’opération, tel que supprimer, coller, éditer, etc. Il est bon de modifier orienté colonne texte.

505
CMS

Quelques conseils de productivité:

mouvements intelligents

  • * et # recherchent le mot sous le curseur en avant/en arrière.
  • w au prochain mot
  • W au prochain mot séparé par des espaces
  • b/e au début/à la fin du mot actuel. (B/E pour les espaces séparés uniquement)
  • gg/G passe au début/à la fin du fichier.
  • % saute à la correspondance {..} ou (..), etc.
  • {/} passe au paragraphe suivant.
  • '. retourne à la dernière ligne modifiée.
  • g; retourne à la dernière position modifiée.

Commandes d'édition rapide

  • I insère au début.
  • A ajouter à la fin.
  • o/O ouvre une nouvelle ligne après/avant le courant.
  • v/V/Ctrl+V mode visuel (pour sélectionner du texte!)
  • Shift+R remplace le texte
  • C change la partie restante de la ligne.

Combinaison de commandes

La plupart des commandes acceptent un montant et une direction, par exemple:

  • cW = changer jusqu'à la fin de Word
  • 3cW = changer 3 mots
  • BcW = commencer par Word complet, changer le Word entier
  • ciW = changer le mot intérieur.
  • ci" = changement interne entre ".."
  • ci( = changer le texte entre (..)
  • ci< = changer le texte entre <..> (nécessite set matchpairs+=<:> dans vimrc)
  • 4dd = supprimer 4 lignes
  • 3x = supprimer 3 caractères.
  • 3s = remplacez 3 caractères.

Commandes utiles du programmeur

  • r remplace un caractère (par exemple, rd remplace le caractère actuel par d).
  • ~ change la casse.
  • J joint deux lignes
  • Ctrl + A/Ctrl + X incrémente/décrémente un nombre.
  • . répéter la dernière commande (une simple macro)
  • == retrait de ligne
  • > bloc d'indentation (en mode visuel)
  • < bloc unindent (en mode visuel)

enregistrement de macro

  • Appuyez sur q[ key ] pour lancer l'enregistrement.
  • Appuyez ensuite sur q pour arrêter l'enregistrement.
  • La macro peut être lue avec @[ key ].

En utilisant des commandes et des mouvements très spécifiques, VIM peut rejouer ces actions exactes pour les lignes suivantes. (par exemple, A pour append-to-end, b/e pour déplacer le curseur au début ou à la fin d'un mot, respectivement)

Exemple de paramètres bien construits

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,Elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup Perl
    # reset (disable previous 'augroup Perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

Les paramètres peuvent être stockés dans ~/.vimrc ou à l'échelle du système dans /etc/vimrc.local, puis lus à partir du fichier /etc/vimrc à l'aide de:

source /etc/vimrc.local

(vous devrez remplacer le caractère de commentaire # par " pour le faire fonctionner dans VIM, je souhaitais ici mettre en évidence la syntaxe appropriée).

Les commandes que j'ai énumérées ici sont assez basiques, et les principales que j'utilise jusqu'à présent. Ils me rendent déjà beaucoup plus productif, sans avoir à connaître toutes les choses fantaisistes.

207
vdboor

Le Control+R mécanisme est très utile :-) Dans mode insertion ou mode commande (c'est-à-dire sur la ligne : lorsque vous tapez des commandes), continuez avec un registre numéroté ou nommé :

  • a - z les registres nommés
  • " le registre sans nom, contenant le texte de la dernière suppression ou suppression
  • % le nom du fichier actuel
  • # le nom du fichier alternatif
  • * le contenu du presse-papier (X11: sélection primaire)
  • + le contenu du presse-papier
  • / le dernier motif de recherche
  • : la dernière ligne de commande
  • . le dernier texte inséré
  • - le dernier petit (moins d'une ligne) delete
  • =5*5 insérer 25 dans le texte (mini-calculatrice)

Voir :help i_CTRL-R et :help c_CTRL-R pour plus de détails, et fouiner à proximité pour plus de qualité CTRL-R.

98
kev

Plugins Vim

Il y a beaucoup de bonnes réponses ici, et une étonnante sur le zen de vi. Une chose que je ne vois pas mentionnée est que vim est extrêmement extensible via des plugins. Il existe des scripts et des plugins pour lui permettre de faire toutes sortes de choses folles que l'auteur original n'a jamais envisagées. Voici quelques exemples de plugins extrêmement utiles:

Rails.vim

Rails.vim est un plugin écrit par tpope. C'est un outil incroyable pour les personnes qui développent Rails. Il fait des choses magiques contextuelles qui vous permettent de passer facilement d'une méthode d'un contrôleur à la vue associée, à un modèle, puis à des tests unitaires pour ce modèle. Il a économisé des dizaines, voire des centaines d’heures en tant que développeur Rails.

Gist.vim

Ce plugin vous permet de sélectionner une région de texte en mode visuel et de taper une commande rapide pour l'envoyer à Gist.github.com . Cela permet un accès facile à Pastebin, ce qui est incroyablement pratique si vous collaborez avec quelqu'un sur IRC ou sur la messagerie instantanée.

space.vim

Ce plugin fournit des fonctionnalités spéciales à la barre d'espace. Il transforme la barre d'espace en quelque chose d'analogue à la période, mais au lieu de répéter les actions, il répète les mouvements. Cela peut être très pratique pour parcourir rapidement un fichier de la manière que vous définissez à la volée.

surround.vim

Ce plugin vous donne la possibilité de travailler avec du texte délimité d’une manière ou d’une autre. Il vous donne des objets qui dénotent des choses à l'intérieur des parenthèses, des choses à l'intérieur des guillemets, etc. Il peut être utile pour manipuler du texte délimité.

supertab.vim

Ce script apporte à vim une fonctionnalité sophistiquée de complétion par tabulation Le contenu de la saisie semi-automatique est déjà présent dans le noyau de vim, mais cela le place dans un onglet rapide plutôt que dans plusieurs raccourcis multijoueurs différents. Très pratique et incroyablement amusant à utiliser. Bien qu’il ne s’agisse pas de l’intellisense de VS, c’est un pas en avant qui apporte une grande partie des fonctionnalités que vous aimeriez attendre d’un outil de complétion par onglets.

syntastic.vim

Cet outil introduit des commandes de vérification de syntaxe externes dans vim. Je ne l'ai pas utilisé personnellement, mais j'ai entendu de très bonnes choses à ce sujet et le concept est difficile à battre. Vérifier la syntaxe sans avoir à le faire manuellement vous fait gagner beaucoup de temps et peut vous aider à attraper les erreurs syntaxiques lors de leur introduction, plutôt que lorsque vous vous arrêtez finalement pour tester.

fugitive.vim

Accès direct à git depuis l’intérieur de vim. Encore une fois, je n'ai pas utilisé ce plugin, mais je peux voir l'utilitaire. Malheureusement, je suis dans une culture où svn est considéré comme "nouveau", je ne verrai donc probablement pas git au travail avant un certain temps.

nerdtree.vim

Un navigateur d'arbre pour vim. J'ai commencé à l'utiliser récemment, et c'est vraiment pratique. Il vous permet de placer un arbre dans une division verticale et d’ouvrir facilement des fichiers. Ceci est idéal pour un projet comportant de nombreux fichiers source avec lesquels vous passez fréquemment.

FuzzyFinderTextmate.vim

Ceci est un plugin non maintenu, mais toujours incroyablement utile. Il offre la possibilité d'ouvrir des fichiers en utilisant une syntaxe descriptive "floue". Cela signifie que dans une arborescence de fichiers fragmentée, il vous suffit de taper suffisamment de caractères pour distinguer les fichiers qui vous intéressent du reste de la procédure.

Conclusion

Il existe de nombreux outils incroyables disponibles pour vim. Je suis sûr que je n’ai fait que gratter la surface ici, et cela vaut la peine de chercher des outils applicables à votre domaine. La combinaison du puissant ensemble d'outils traditionnel vi, des améliorations apportées par vim et des plugins qui étendent encore plus vim, constitue l'un des moyens les plus puissants d'éditer du texte jamais conçu. Vim est facilement aussi puissant que emacs, Eclipse, Visual Studio et Textmate.

Merci

Merci à duwanis pour ses vim configs desquels j'ai beaucoup appris et emprunté la plupart des plugins listés ici.

91
Benson

. Répéter la dernière commande de changement de texte

Je gagne beaucoup de temps avec celui-ci.

Le mode visuel a été mentionné précédemment, mais le mode visuel bloc m'a permis de gagner beaucoup de temps lors de la modification de colonnes de taille fixe dans un fichier texte. (accessible avec Ctrl-V).

53
Cooper6581

gi

Aller au dernier emplacement modifié (très utile si vous effectuez une recherche et que vous voulez revenir à l'édition)

^ P et ^ N

Complétez le texte précédent (^ P) ou suivant (^ N).

^ O et ^ I

Aller à l'emplacement précédent (^O - "O" pour l'ancien) ou au prochain (^I - "I" juste à côté de "O"). Lorsque vous effectuez des recherches, modifiez des fichiers, etc., vous pouvez naviguer dans ces "sauts" en avant et en arrière.

48
dimba

J'ai récemment découvert ce site: http://vimcasts.org/

C'est assez nouveau et vraiment très bon. Le type qui gère le site est passé de textmate à vim et héberge des diffusions très bonnes et concises sur des sujets spécifiques à vim. Vérifiez-le!

46
Ronny Brendel

CTRL + A incrémente le nombre sur lequel vous vous tenez.

42
hcs42

Tout en mode normal:

f <char> pour passer à la prochaine instance d'un caractère particulier sur la ligne en cours, et ; pour le répéter.

F <char> pour passer à l'instance précédente d'un caractère particulier sur la ligne en cours et ; à répéter.

Si utilisé intelligemment, les deux ci-dessus peuvent vous faire bouger rapidement en ligne.

* sur un mot pour rechercher l'instance suivante.

# sur un mot pour rechercher l'instance précédente.

38
Eric Smith

Session

une. sauver la session

: mks sessionname

b. forcer la session de sauvegarde

: mks! sessionname

c. session de chargement

gvim ou vim -S sessionname


Ajout et soustraction

une. Ajout et soustraction

CTRL-A; Ajoutez [nombre] au chiffre ou au caractère alphabétique situé à ou après le curseur. {pas dans Vi

CTRL-X; Soustrayez [nombre] du nombre ou du caractère alphabétique situé après le curseur. {pas dans Vi}

b. Démappage de la clé de fenêtre

Dans la fenêtre, Ctrl-A déjà mappé pour la sélection de fichier entier, vous devez annuler le mappage dans un fichier rc. marquer mswin.vim CTRL-Une partie de mappage en commentaire ou ajouter votre fichier rc avec unmap

c. Avec macro

La commande CTRL-A est très utile dans une macro. Exemple: Utilisez les étapes suivantes pour créer une liste numérotée.

  1. Créez la première entrée de liste, assurez-vous qu'elle commence par un nombre.
  2. qa - commence à enregistrer dans le tampon 'a'
  3. Y - tirer l'entrée
  4. p - mettre une copie de l'entrée en dessous de la première
  5. CTRL-A - incrémente le nombre
  6. q - arrêter l'enregistrement
  7. @a - répète les temps de tir, de mise et d'incrément
34
agfe2

La semaine dernière au travail, notre projet a hérité de beaucoup de code Python d'un autre projet. Malheureusement, le code ne correspondait pas à notre architecture existante - tout a été fait avec des variables et des fonctions globales, ce qui ne fonctionnerait pas dans un environnement multithread.

Nous avions ~ 80 fichiers à retravailler pour être orientés objet - toutes les fonctions déplacées dans des classes, les paramètres modifiés, les instructions d'importation ajoutées, etc. Nous avions une liste d'environ 20 types de correctifs devant être apportés à chaque fichier. Je pense que le faire à la main, une personne pourrait en faire 2 à 4 par jour.

J'ai donc fait le premier à la main, puis écrit un script vim pour automatiser les modifications. Il s’agissait essentiellement d’une liste de commandes vim, par exemple.

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

Le dernier mérite un peu d'explication:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

Pour quelques transformations plus complexes, telles que la génération de toutes les instructions d'importation, j'ai incorporé du python dans le script vim.

Après quelques heures de travail, j'ai eu un script qui fera au moins 95% de la conversion. Je viens d'ouvrir un fichier dans vim puis d'exécuter :source fixit.vim et le fichier est transformé en un clin d'œil.

Nous avons encore du travail pour changer les 5% restants qui ne méritaient pas d'être automatisés et pour tester les résultats, mais en consacrant une journée à l'écriture de ce script, j'estime que nous avons économisé des semaines de travail.

Bien sûr, il aurait été possible d'automatiser cela avec un langage de script comme Python ou Ruby, mais cela aurait pris beaucoup plus de temps à écrire et aurait été moins flexible - le dernier exemple aurait été difficile, vu que regex seul ne serait pas capable de gérer les crochets imbriqués, par exemple convertir bar(foo(xxx)) en foo(xxx).bar(). Vim était parfait pour la tâche.

32
Dave Kirby

Utilisez l'explorateur de fichiers intégré! La commande est :Explore et vous permet de naviguer très rapidement dans votre code source. J'ai ces correspondances dans mon .vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

L’explorateur vous permet également d’apporter des modifications aux fichiers. Je posterai certaines de mes touches préférées en appuyant sur <F1> pour obtenir la liste complète:

  • -: Le plus utile: Passer au répertoire supérieur (cd ..)
  • mf: Marquer un fichier
  • D: Efface les fichiers marqués ou le fichier sur lequel se trouve le curseur, si rien n’est marqué.
  • R: Renommez le fichier sur lequel se trouve le curseur.
  • d: Créer un nouveau répertoire dans le répertoire actuel
  • %: Créer un nouveau fichier dans le répertoire actuel
28
soulmerge

Je suis membre de l'American Cryptogram Association. Le magazine bimestriel comprend plus de 100 cryptogrammes de différentes sortes. Environ 15 d'entre eux sont des "cryptarithmes" - divers types de problèmes d'arithmétique avec des lettres remplacées par des chiffres. Deux ou trois d'entre eux sont des sudokus, sauf des lettres au lieu de chiffres. Lorsque la grille est complétée, les neuf lettres distinctes épeleront un mot ou des mots, sur une ligne, une diagonale, une spirale, etc., quelque part dans la grille.

Plutôt que de travailler avec un crayon ou de taper les problèmes à la main, je les télécharge depuis la zone membres de leur site Web.

Lorsque je travaille avec ces sudokus, j’utilise vi, tout simplement parce que j’utilise des installations que vi n’a que peu d’éditeurs. Généralement, je convertis la grille alphabétique en une grille numérotée, parce que je trouve cela plus facile à résoudre, puis la grille numérotée complétée dans la grille alphabétique pour trouver le mot ou les mots solution.

Le problème est présenté sous forme de neuf groupes de neuf lettres, avec -s représentant les blancs, écrits sur deux lignes. La première étape consiste à les formater en neuf lignes de neuf caractères chacune. Cela n'a rien de spécial, il suffit d'insérer huit sauts de ligne aux endroits appropriés.

Le résultat ressemblera à ceci:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

La première étape de la conversion en chiffres consiste donc à dresser une liste des lettres distinctes. Tout d'abord, je fais une copie du bloc. Je positionne le curseur en haut du bloc, puis tapez :y}}p. : me met en mode commande, y jette la commande de mouvement suivante. Puisque } est un déplacement vers la fin du paragraphe suivant, y} jette le paragraphe. } place ensuite le curseur à la fin du paragraphe et p colle ce que nous avions précédemment placé juste après le curseur. Donc, y}}p crée une copie du paragraphe suivant et termine avec le curseur entre les deux copies.

Ensuite, je transformer une de ces copies en une liste de lettres distinctes. Cette commande est un peu plus complexe:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

: me met à nouveau en mode commande. ! indique que le contenu du prochain virement doit être acheminé via une ligne de commande. } lance le paragraphe suivant et la ligne de commande utilise ensuite la commande tr pour tout effacer, à l'exception des majuscules, la commande sed pour imprimer chaque lettre sur une seule ligne. et la commande sort pour trier ces lignes, en supprimant les doublons, puis tr supprime les nouvelles lignes, laissant les neuf lettres distinctes sur une seule ligne, remplaçant les neuf lignes qui constituaient le paragraphe à l'origine. Dans ce cas, les lettres sont: ACELNOPST.

La prochaine étape consiste à créer une autre copie de la grille. Ensuite, utilisez les lettres que je viens d’identifier pour remplacer chacune de ces lettres par un chiffre compris entre 1 et 9. C’est simple: :!}tr ACELNOPST 0-9. Le résultat est:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Cela peut ensuite être résolu de la manière habituelle, ou entré dans n'importe quel résolveur de sudoku que vous préférez. La solution complétée peut ensuite être reconvertie en lettres avec :!}tr 1-9 ACELNOPST.

Il existe un pouvoir dans vi qui n’est égalé que par très peu d’autres. Le plus gros problème est que très peu de tutoriels, de sites Web, de fichiers d’aide, etc., ne font que toucher à la surface de ce qui est possible.

25
Jeff Dege

Manipulations de texte en bloc!

Soit par macros:

  • Commencez par enregistrer: qq
  • Faire des trucs
  • Arrêter l'enregistrement: q
  • Répétez: @q (la première fois), @@ après cela.
  • Répétez 20 fois: 20@@

Ou à travers des expressions régulières:

  • Remplacer le matériel: :%s/[fo]+/bar/g

(Attention, si vous faites ce dernier, vous aurez 2 problèmes :).)

23
jqno

J'ai récemment découvert q:. Il ouvre la "fenêtre de commande" et affiche vos dernières commandes en mode ex (mode commande). Vous pouvez vous déplacer comme d'habitude dans la fenêtre et appuyer sur <CR> exécute la commande. Vous pouvez éditer, etc. aussi. Inestimable lorsque vous vous amusez avec une commande complexe ou une regex et que vous ne voulez pas ressaisir tout le texte, ou si la chose complexe que vous voulez faire était de 3 commandes en arrière. C'est presque comme set -o vi de bash, mais pour vim lui-même (heh!).

Voir :help q: pour plus d'informations intéressantes sur les allers-retours.

23
David Pope

Je viens tout juste de découvrir l'omnification de Vim l'autre jour, et même si je dois avouer que je suis un peu confus sur ce qui fait quoi, j'ai eu des résultats étonnamment bons, en écrasant soit Ctrl + xCtrl + u ou Ctrl + n/Ctrl +p en mode insertion. Ce n'est pas tout à fait IntelliSense , mais je l'apprends toujours.

Essaye le! :help ins-completion

22
Svend

Ce ne sont pas des raccourcis, mais ils sont liés:

  1. Faire de Capslock un ESC supplémentaire (ou Ctrl)
  2. mappeur en "," (virgule), avec cette commande: let mapleader = ","

Ils augmentent ma productivité.

20
tfmoraes

Un autre "raccourci" utile que j’utilise fréquemment est "xp". Cela va échanger le caractère sous le curseur avec le caractère suivant.

19
Costyn

Mode visuel

Comme plusieurs personnes l'ont déjà dit, le mode visuel est la solution à votre problème de copier/coller/coller. Vim vous donne 'v', 'V' et C-v. La minuscule 'v' dans vim est essentiellement la même chose que la touche Maj du bloc-notes. La bonne chose est que vous n'avez pas à le maintenir. Vous pouvez utiliser n’importe quelle technique de déplacement pour naviguer efficacement jusqu'au point de départ (ou de fin) de votre sélection. Appuyez ensuite sur 'v' et utilisez à nouveau des techniques de mouvement efficaces pour naviguer vers l’autre extrémité de votre sélection. Ensuite, "d" ou "y" vous permet de couper ou de copier cette sélection.

L'avantage du mode visuel de vim par rapport à la description de couper/copier/coller dans vi par Jim Dennis est qu'il n'est pas nécessaire d'obtenir l'emplacement exact. Parfois, il est plus efficace d'utiliser un mouvement rapide pour se rendre au voisinage général de l'endroit où vous voulez aller et d'affiner cela avec d'autres mouvements plutôt que de concevoir une commande de mouvement unique plus complexe qui vous mènera exactement où vous voulez aller.

L’inconvénient d’utiliser de manière intensive le mode visuel de cette manière est qu’il peut devenir une béquille que vous utilisez tout le temps, ce qui vous empêche d’apprendre de nouvelles commandes vi (m) pouvant vous permettre d’agir plus efficacement. Cependant, si vous êtes très proactif quant à l'apprentissage de nouveaux aspects de vi (m), cela ne vous affectera probablement pas beaucoup.

Je tiens également à souligner de nouveau que les modes ligne linéaire et bloc visuel vous offrent des variations sur ce même thème qui peuvent être très puissantes ... en particulier le mode bloc visuel.

Utilisation efficace du clavier

Je ne suis pas non plus d'accord avec votre affirmation selon laquelle l'alternance des mains est le moyen le plus rapide d'utiliser le clavier. Il contient un élément de vérité. De manière très générale, l’utilisation répétée de la même chose est lente. Cet exemple le plus significatif de ce principe est que les frappes de touche consécutives tapées avec le même doigt sont très lentes. Votre affirmation découle probablement de la tendance naturelle à utiliser le s/doigt/main/transformation sur ce motif. Dans une certaine mesure, c'est correct, mais à l'extrême extrême du spectre d'efficacité, c'est incorrect.

Demandez à n'importe quel pianiste. Demandez-leur s'il est plus rapide de jouer successivement quelques notes en alternant les mains ou en utilisant successivement les doigts d'une seule main. Le moyen le plus rapide de taper 4 touches est de ne pas alterner les mains, mais de les taper avec 4 doigts de la même main, dans l'ordre croissant ou décroissant (appelez cela une "course"). Cela devrait aller de soi une fois que vous avez envisagé cette possibilité.

Le problème le plus difficile est l'optimisation pour cela. Il est assez facile d'optimiser la distance absolue sur le clavier. Vim fait ça. Il est beaucoup plus difficile d'optimiser au niveau "run", mais vi (m) avec son édition modale vous donne une meilleure chance de le faire que n'importe quelle approche non modale (ahem, emacs).

Sur Emacs

De peur que les zélateurs d’emacs n’ignorent complètement mon article en raison de ce dernier commentaire entre parenthèses, j’ai le sentiment que je dois décrire la racine de la différence entre les religions emacs et vim. Je n'ai jamais parlé pendant la guerre des éditeurs et je ne le referai probablement pas, mais je n'ai jamais entendu personne décrire les différences de cette façon, alors voilà. La différence est le compromis suivant:

Vim vous donne une efficacité inégalée pour l'édition de texte brut. Emacs vous donne une capacité sans égal pour personnaliser et programmer l'éditeur.

Les zélotes aveugles de vim prétendent que vim a un langage de script. Mais c'est un obscur langage ad-hoc qui a été conçu pour servir l'éditeur. Emacs a LISP! Assez dit. Si vous n'appréciez pas la signification de ces deux dernières phrases ou si vous souhaitez en savoir suffisamment sur la programmation fonctionnelle et le LISP pour développer cette appréciation, vous devez utiliser vim.

Les zélateurs d’Emacs vont prétendre qu’Emacs a le mode Viper, c’est donc un sur-ensemble de Vim. Mais le mode Viper n'est pas standard. Je crois comprendre que le mode vipère n’est pas utilisé par la majorité des utilisateurs d’emacs. Comme ce n'est pas le cas par défaut, la plupart des utilisateurs d’emacs ne développent probablement pas une véritable appréciation des avantages du paradigme modal.

A mon avis, ces différences sont orthogonales. Je crois que les avantages de vim et d’emacs, comme je l’ai dit, sont valables. Cela signifie que l'éditeur ultime n'existe pas encore. Il est probablement vrai qu'emacs serait la plate-forme la plus facile sur laquelle baser l'éditeur ultime. Mais l'édition modale n'est pas ancrée dans la mentalité emacs. La communauté emacs pourrait évoluer de la sorte à l'avenir, mais cela ne semble pas très probable.

Donc, si vous voulez une efficacité d’édition brute, utilisez vim. Si vous voulez un environnement ultime pour la création de scripts et la programmation, votre éditeur utilise emacs. Si vous voulez un peu des deux avec une emphase sur la programmabilité, utilisez emacs avec le mode Viper (ou programmez votre propre mode). Si vous voulez le meilleur des deux mondes, vous n'avez pas de chance pour le moment.

18
user307058

<Ctrl> + W, V pour diviser l'écran verticalement
<Ctrl> + W, W pour passer d’une fenêtre à l’autre

! python% [args] pour exécuter le script que je suis en train de modifier dans cette fenêtre

ZF en mode visuel pour plier des lignes arbitraires

18
Peter Ellis

Passez 30 minutes à suivre le didacticiel vim (exécutez vimtutor au lieu de vim dans le terminal). Vous apprendrez les mouvements de base et quelques frappes au clavier. Cela vous rendra au moins aussi productif avec vim qu'avec l'éditeur de texte que vous utilisiez auparavant. Après cela, lisez bien la réponse de Jim Dennis :)

17
konryd

J'ai été surpris de ne trouver aucune mention du mouvement t. Je l'utilise fréquemment avec des listes de paramètres sous la forme de dt, ou yt,

16
David Corbin

Bizarre personne n'a mentionné les balises. Téléchargez "ctags exubérants" et mettez-le devant la version préinstallée de merde que vous avez déjà dans votre chemin de recherche. Cd à la racine de tout ce sur quoi vous travaillez; Par exemple, la distribution du noyau Android. Tapez "ctags -R." pour construire un index de fichiers source n'importe où sous ce répertoire dans un fichier nommé "tags". Celui-ci contient toutes les balises, indique la langue ou l’emplacement du répertoire dans un seul fichier, ce qui facilite le travail multilingue.

Ensuite, ouvrez vim dans ce dossier et lisez: help ctags pour certaines commandes. Quelques-uns que j'utilise souvent:

  • Placez le curseur sur un appel de méthode et tapez CTRL-] pour accéder à la définition de la méthode.

  • Tapez: ta nom pour aller à la définition du nom.

16
Bradjcox

Utilisez \c n'importe où dans une recherche pour ignorer la casse (en remplaçant vos paramètres d'ignorecase ou de smartcase). Par exemple. /\cfoo ou /foo\c correspondra à foo, Foo, fOO, FOO, etc.

Utilisez \C n'importe où dans une recherche pour forcer la mise en correspondance des observations. Par exemple. /\Cfoo ou /foo\C ne fera correspondre que foo.

16
kev

Quelle est la façon dont vous utilisez Vim qui vous rend plus productif qu'avec un éditeur contemporain?

Être capable d'exécuter des éditions complexes et répétitives avec très peu de frappes au clavier (souvent en utilisant macros ). Jetez un coup d'œil à VimGolf pour constater le pouvoir de Vim!

Après plus de dix ans d'utilisation quasi quotidienne, il est difficile d'imaginer utiliser un autre éditeur.

16
Johnsyweb

Vous avez posé des questions sur les raccourcis productifs, mais je pense que votre vraie question est la suivante: vim en vaut-il la peine? La réponse à cette question est -> "Oui"

Vous devez avoir remarqué deux choses. Vim est puissant et difficile à apprendre. Une grande partie de sa puissance réside dans son extensibilité et sa combinaison infinie de commandes. Ne vous sentez pas dépassé. Va lentement. Une commande, un plugin à la fois. N'en faites pas trop.

Tout cet investissement que vous investissez dans vim vous rapportera mille fois. Avant de mourir, vous passerez de nombreuses heures dans un éditeur de texte. Vim sera votre compagnon.

14
autodidakto

Indentation automatique:

gg (aller au début du document)
= (heure du retrait!)
shift-g (aller à la fin du document)

Vous aurez besoin de 'filetype plugin indent on' dans votre fichier .vimrc, ainsi que des paramètres 'shiftwidth' et 'expandtab' appropriés.

14
David Claridge

Tampons multiples, et en particulier sauts rapides entre eux pour comparer deux fichiers avec :bp et :bn (correctement remappé à un seul fichier). Shift + p ou Shift + n)

Mode vimdiff (divise en deux mémoires tampons verticales, avec des couleurs pour montrer les différences)

Zone-copie avec Ctrl + v

Et enfin, complétez l'onglet des identifiants (recherchez "mosh_tab_or_complete"). C'est un changeur de vie.

13
Stefano Borini

D'accord avec l'affiche du haut - la commande : r! est très utile .

Le plus souvent, je l'utilise pour "coller" des choses:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

De cette façon, je n'ai pas besoin de tripoter :set paste.

12
David Wolever

cit - vide le contenu de la balise avec la transition en mode insertion

yit - copie le contenu de la balise

10
Sanek

Un troisième critère pour rendre l'édition plus rapide est le nombre de frappes requis. Je dirais que cela est plus important que vos autres 2. Dans Vim, presque toutes les opérations nécessitent moins de frappes au clavier que tout autre éditeur que je connais bien.

Vous dites que vous rencontrez des problèmes de copier-coller, mais il semble que vous ayez besoin d'une plus grande expérience des commandes de mouvement générales dans vim. Tirez 3 mots: y3w Tirez du curseur au point-virgule suivant: yf; Passez à la prochaine occurrence de votre recherche la plus récente: yn Tout cela est beaucoup plus rapide que d'essayer de naviguer avec une souris tout en maintenant une touche de modification. De plus, comme le montrent certains exemples de la réponse de CMS, les commandes de mouvement de vim sont hautement optimisées pour une navigation efficace dans le code source C et C++.

En ce qui concerne la question "comment utiliser vim qui me rend plus productif?", J'espère que la réponse est: "efficacement".

10
William Pursell

Mon astuce vi/Vim la plus productive est:

:%s

J'aime pouvoir utiliser des expressions régulières à la volée pour remplacer ce que je veux dans le fichier. Chaque éditeur de texte doit prendre en charge les expressions régulières IMHO.

10
Eric Ryan Harrison

Vous pouvez utiliser\= dans une chaîne de substitution et c’est quelque chose que je fais de temps en temps.

Si vim contient essentiellement une liste non ordonnée, en utilisant # comme marqueur, vous pouvez la convertir en une liste ordonnée.

# CSSLINT
# PHPCS
# Charlie
# Delta

Si cela commence par la première ligne, vous pouvez faire

:1,6s/#/\=line(".")/g

Pour le convertir en

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

Si cela ne commence pas par la première ligne, faites juste le calcul:

:16,20s/#/\=line(".") - 15/g

Plus d'infos sur: help sub-replace-expression

10
kguest

Voici un autre site que j'ai trouvé utile pour apprendre Vim. C'est amusant aussi! :)

VIM Adventures est un jeu en ligne basé sur les raccourcis clavier de VIM (commandes, mouvements et opérateurs). C'est le jeu "Zelda rencontre l'édition de texte". C'est un jeu de puzzle pour s'exercer et mémoriser les commandes VIM (le bon vieux VI est également couvert, bien sûr). C'est un moyen facile d'apprendre VIM sans courbe d'apprentissage abrupte.

9
Alex Lockwood

Après avoir associé le texte ci-dessous à un simple combo de touches, les éléments suivants me sont très utiles:

Sauter dans un fichier en passant par son chemin

gf

obtenir le chemin complet du fichier existant

:r!echo %:p

récupère le répertoire du fichier existant

:r!echo %:p:h

code d'exécution:

:!Ruby %:p

Ruby abréviations:

ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/

lancer le programme en cours:

   map ,rby :w!<cr>:!Ruby %:p<cr>

vérifier la syntaxe du programme en cours:

   map ,c :w!<cr>:!Ruby -c %:p<cr>

exécuter toutes les spécifications pour le programme actuel:

   map ,s :w!<cr>:!rspec %:p<cr>

craquer ouvert irb:

   map ,i :w!<cr>:!irb<cr>

abréviations rspec:

   ab shared_examples shared_examples_for "behavior here" do<cr>end
   ab shared_behavior describe "description here" do<cr>  before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
   ab describe_do describe "description here" do<cr>end
   ab context_do describe "description here" do<cr>end
   ab it_do it "description here" do<cr>end
   ab before_each before :each do<cr>end<cr>

Abréviations de Rails:

authentification d'utilisateur:

     ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
     ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
     ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>

ouvrir l'URL sélectionnée visuellement dans firefox:

"function
   function open_url_in_firefox:(copy_text)
     let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
     exe g:open_url_in_firefox
   endfunction

"abbreviations
   map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
   map go y:call open_url_in_firefox:(@0)<cr> 

rspec: spécification d'exécution contenant la ligne actuelle:

"function
   function run_single_rspec_test:(the_test)
     let g:rake_spec="!rspec ".a:the_test.":".line(".")
     exe g:rake_spec
   endfunction

"abbreviations
   map ,s :call run_single_rspec_test:(expand("%:p"))<cr>

rspec-Rails: spécification d'exécution contenant la ligne actuelle:

"function
   function run_single_Rails_rspec_test:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,r :call run_single_Rails_rspec_test:(expand("%:p"))<cr>

rspec-Rails: spécification d'exécution contenant la ligne en cours avec le débogage:

"function
   function run_spec_containing_current_line_with_debugging:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>

html

"abbreviations

  "ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
   ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
   ab script_i <script src=''></script>
   ab script_m <script><cr></script>
   ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
   ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>

"function to render common html template

   function html:() 
     call feedkeys( "i", 't' )
     call feedkeys("<html>\<cr>  <head>\<cr></head>\<cr><body>\<cr> ", 't')
     call feedkeys( "\<esc>", 't' )
     call feedkeys( "i", 't' )
     call include_js:()
     call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
   endfunction

javascript

"jasmine.js
  "abbreviations
   ab describe_js describe('description here', function(){<cr>});
   ab context_js context('context here', function(){<cr>});
   ab it_js it('expectation here', function(){<cr>});
   ab expect_js expect().toEqual();
   ab before_js beforeEach(function(){<cr>});
   ab after_js afterEach(function(){<cr>});

"function abbreviations

   ab fun1 function(){}<esc>i<cr><esc>ko
   ab fun2 x=function(){};<esc>hi<cr>
   ab fun3 var x=function(){<cr>};

"method for rendering inclusion of common js files

   function include_js:()
     let includes_0  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
     let includes_1  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
     let includes_2  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
     let includes_3  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
     let includes_4  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
     let includes_5  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
     let includes_6  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
     let includes_7  = "<script>"
     let includes_8  = "  describe('default page', function(){ "
     let includes_9  = "it('should have an html tag', function(){ "
     let includes_10 = "  expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
     let includes_11  = "});"
     let includes_12 = "});"
     let includes_13 = "$(function(){"
     let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
     let includes_15 = "jasmine.getEnv().execute();"
     let includes_16 = "});"
     let includes_17 = "\<bs>\<bs><\/script>"

     let j = 0

     while j < 18
       let entry = 'includes_' . j
       call feedkeys( {entry}, 't' )
       call feedkeys( "\<cr>", 't' )
       let j = j + 1
     endwhile

   endfunction

"jquery

  "abbreviations

     ab docr $(document).ready(function(){});
     ab jqfun $(<cr>function(){<cr>}<cr>);
9
kikuchiyo
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
7
SergioAraujo

Insérer du texte dans un bit de code:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

Enregistrer une macro pour éditer du texte et l'exécuter N fois:

q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
7
Vesa Nieminen

Ignorant la question un instant (ma réponse est ci-dessous), quelques éléments qui pourraient vous aider à résoudre vos problèmes avec vim:

:map <C-F> /\V

Cela fera que Ctrl-F commence une recherche avec les premiers caractères de la recherche étant \V, ce qui désactive tout le "magique", de sorte que vous ne devez échapper à rien (comme PsPad).

" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(extrait directement de mswin.vim de la distribution Vim). Cela vous donnera Ctrl-C, Ctrl-V, etc. pour copier et coller.

Personnellement, je trouve le copier-coller beaucoup mieux avec le Vim standard. Dans Vim, je peux avoir le curseur sur une ligne, tapez yy pour le copier, 10p pour en coller 10 copies. Avec le plugin Align , je peux ensuite utiliser Ctrl-V (en supposant que les mappages de fenêtres ci-dessus ne sont pas utilisés) pour sélectionner visuellement une colonne de nombres qui a été créée; :II puis incrémente automatiquement cette colonne de nombres. De même, avec YankRing , je peux copier 10 lignes (ou plus) l’une après l’autre, puis les coller à nouveau l’une après l’autre.

En ce qui concerne la façon dont Vim me rend plus productif, je dirais que le fichier de balises est la seule chose dont je ne pourrais plus me passer. Lorsque le curseur est sur une balise, je peux appuyer sur Ctrl-] pour accéder à la fonction (et sur Ctrl-T pour revenir, autant de niveaux que je le souhaite) ou sur ,p pour ouvrir la définition de fonction ou de macro ( ou quoi que ce soit) dans la fenêtre d'aperçu (qui peut ensuite être rapidement fermée avec: pcl) ou [i pour afficher simplement une définition de macro dans la barre d'état. Pour naviguer dans le code source complexe, ces outils sont inestimables.

La fenêtre d’aperçu repose sur un mappage dans .vimrc, cependant:

:map ,p :ptag <C-R><C-W><CR>

Le fichier de balises permet également l’utilisation de quelques (my) plugins qui donnent une coloration syntaxique qui montre les erreurs beaucoup plus clairement (en soulignant les balises reconnues et non en soulignant les non reconnues) et signatures de balises lorsque vous déplacez le passez la souris sur un mot clé.

7
DrAl

http://www.viemu.com/a-why-vi-vim.html est un bon article de plaidoyer. Il explique le pouvoir d'utiliser le . commande pour répéter la dernière édition.

Copier/couper et coller. Je le fais tout le temps. Avec tous les éditeurs classiques, vous appuyez sur Maj avec la main gauche et vous déplacez le curseur avec votre main droite pour sélectionner du texte. Puis Ctrl + C copie, vous déplacez le curseur et Ctrl + V colle.

Avec Vim c'est horrible:

* yy to copy one line (you almost never want the whole line!)
* [number xx]yy to copy xx lines into the buffer. But you never know

exactement si vous avez sélectionné ce que vous vouliez. Je dois souvent faire [numéro xx] jj puis u pour annuler!

Je suis sûr que les autres réponses ont été mieux expliquées, mais vous vous trompez. J'utilise souvent le mode visuel pour sélectionner du texte à supprimer ou à supprimer, ce qui est similaire à votre exemple shift + select, mais Vim a un avantage évident ici, car vos mains ne quittent jamais le rang pour le faire. yy est une excellente commande mais je fais souvent Vy à la place si je veux tirer une ligne entière.

6
Dan Olson

Pour copier/couper et coller spécifiquement, l’utilisation du mode visuel facilite beaucoup l’adaptation à partir d’autres éditeurs. Donc, la façon dont je coupe et colle normalement est la suivante:

  • Esc - quitter le mode insertion (à sauter si vous êtes déjà en mode normal)
  • v - activer le mode visuel
  • déplacez-vous dans le fichier pour sélectionner le texte souhaité - le mode visuel vous indiquera quels caractères sont sélectionnés. Pour quelques mots, w, e et b sont utiles (déplacer au début du mot suivant, à la fin du mot suivant et au début de ce mot/mot précédent, respectivement).
  • d - coupe le texte (utilisez y si vous voulez copier le texte)
  • déplacez-vous là où vous voulez que le texte aille
  • p - paste (ceci colle après le caractère actuel, P colle avant le caractère actuel.

Il est également utile d’utiliser V pour passer en mode Visual (ligne) qui sélectionne automatiquement les lignes entières, quel que soit le lieu où se trouve le curseur.

6
Hamish Downer

Que diriez-vous de raccourcis supplémentaires?


Mettez dans votre .vimrc:
nnoremap;:

De cette façon, entrer commmandmode est plus facile: ;q ou ;w fonctionne, au lieu de :q ou :w.

Deux frappes au lieu de trois, et vous en aurez besoin très souvent.


Mauvais pour les administrateurs système , car ils ont besoin des mêmes fonctionnalités prêtes à l'emploi, pour être identiques sur toutes les boîtes partout.

Mais une ÉNORME amélioration pour les programmeurs en utilisant vi.

5
sjas

En fait, je perdais toujours mes tampons, donc je copie généralement une plage de lignes simplement en l'écrivant dans un fichier temporaire, puis en le lisant à l'emplacement approprié.

par exemple.

ka (marque la marque)

'une,. w! t (tout copier de la marque dans le fichier t)

.. déplacez votre curseur ..

: .r t (lu en t dans le spot actuel).

Cela implique probablement moins de frappes de touches que l'utilisation de la mémoire tampon, il est plus facile de garder trace de ceux-ci et vous pouvez avoir des fichiers collés de longue durée. J'utilise habituellement des noms de 1 lettre pour les fichiers, pour la vitesse.

La raison principale pour laquelle cela est rapide est que, pour déplacer votre curseur, utilisez simplement les fonctions de recherche "/" et "n" si vous rencontrez une autre occurrence du motif avant d'arriver à l'endroit où vous souhaitez aller.

5
Larry Watanabe

Vous pouvez rechercher le contenu d'un registre.

Supposons que votre registre x contienne

chaîne à rechercher

Pour rechercher cette chaîne, vous devez taper en mode normal
/CTRL-rxENTER

Il va coller le contenu de x register.

4
Luc M

En plus de l'excellente réponse à propos de grokking vi, il convient de noter que vim ne ajoute quelques fonctionnalités très similaires à vi qui rendent l'utilisation des commandes vi plus agréable. Ceux qui viennent à l’esprit en premier sont les objets texte: au lieu de {!}fmt pour reformater le paragraphe actuel, !apfmt fait de même. Cela fonctionne en spécifiant d’abord que nous voulons sélectionner l’objet texte a, qui est le courant paragraphe. Similaire, pour changer le littéral de chaîne actuel (foo en bar pour un exemple), au lieu de T"ct"bar (déplace vers juste après le précédent ", changement jusque juste avant le prochain ", insérez barre), vous pouvez dire ci"bar: changez les guillemets (insérés le plus à l'intérieur), en insérant bar .

Penser en termes d'objets texte au lieu de commandes de mouvement est très agréable.

4
wolverian

Il y a beaucoup de trucs vim mais à partir de maintenant, celui que j’apprécie vraiment est Ctrl+A comme il m’arrive d’avoir affaire à un code st ** d qui est un index de tableau codé en dur.

3
lang2

La série de commandes vim ggVGg? applique un chiffrement Rot13 au texte de votre document actuel.

Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13.

3
cytinus

Coupure rapide et écrasement d'une ligne:

Une tâche très courante lorsque vous modifiez une ligne consiste à couper de l'emplacement actuel du curseur jusqu'à un certain endroit et à écraser le nouveau contenu.

Vous pouvez utiliser les commandes suivantes:

ct<identifier> pour la coupe en avant.

cT<identifier> pour la coupe en arrière.

Où est le personnage dans la ligne jusqu'à laquelle vous voulez couper.

Exemple: Disons à ceci la ligne que vous voulez éditer et votre curseur est à I.

Hi There. I am a Coder and I code in : Python and R.

Vous voulez couper jusqu'à : et écraser avec I am a programmer, vous tapez: ct: puis tapez I am a programmer. Cela se traduira par: Hi There. I am a programmer: Python and R.

partie de suppression d'une ligne:

Comme ci-dessus, les commandes suivantes suppriment le contenu de l'emplacement actuel du curseur jusqu'à l'identifiant

dt<identifier> pour suppression en avant

dT<identifier> pour la suppression arrière

J'espère que cela vous sera utile aussi.

2
dabsingh

finalisation intelligente des onglets ^^

http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion

1
David Lam

nnoremap q; q: dans mon fichier .vimrc, conserve le flux lors de la création d’une recherche et d’un remplacement compliqués.

0
sjas