Quel Est votre raccourci le plus productif avec Vim?

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

les deux seules choses dont vous devez vous soucier lorsque vous parlez de vitesse (vous ne vous en souciez peut-être pas assez, mais vous devriez) sont:

  1. à l'Aide de alternativement à gauche et à droite hands est la la plus rapide façon d'utiliser le clavier.
  2. ne jamais toucher la souris est le deuxième façon d'être aussi rapide que possible. Il te faut du temps pour bouger ta main., attrape la souris, déplacer, et pour le faire de retour au clavier (et vous avez souvent à regarder le clavier pour être sûr que vous

voici deux exemples démontrant pourquoi je suis loin moins productif avec Vim.

Copier/Couper / 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 le texte. Puis Ctrl + C des 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 copier les lignes xx dans le tampon. Mais on ne sait jamais exactement si on a choisi ce qu'on voulait. J'ai souvent à faire [number xx]dd puis u pour annuler!

un Autre exemple? Rechercher & remplacer.

  • In PSPad : Ctrl + F alors tapez ce que vous voulez que vous recherchez, puis appuyez sur Enter .
  • Dans Vim: / , puis tapez ce que vous voulez rechercher, puis si il ya des caractères spéciaux mis avant chaque caractère spécial, puis appuyez sur entrer .

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

NB : j'ai déjà lu le Vim tricher feuille de :)

ma question Est:

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

1127
demandé sur Olivier Pons 2009-08-02 12:08:28

30 réponses

votre problème avec Vim est que vous ne grok vi .

vous mentionnez couper avec yy et se plaindre 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 gammes de lignes et des blocs de code. Cependant, yy n'est qu'un moyen parmi tant d'autres de faire glisser du texte dans le tampon de copie anonyme (ou "enregistrer" comme on l'appelle dans vi ).

le "Zen" de vi est que vous parlez une langue. Le premier y est un verbe. La mention yy est synonyme de y_ . Le y est doublé jusqu'à le rendre plus facile à taper, puisqu'il s'agit d'une opération commune.

cela peut aussi être exprimé comme dd P (supprimer la ligne courante et coller une copie de nouveau à la place; laisser une copie dans le registre anonyme comme effet secondaire). Les y et d "verbes" prennent n'importe quel mouvement comme leur " sujet."Ainsi yW est "tirer à partir d'ici (le curseur) à la fin de la/suivant (gros) mot" et y'a est "tirer d'ici jusqu'à la ligne contenant la marque nommée' un '."

si vous ne comprenez que les mouvements de base du curseur en haut, en bas, à gauche et à droite, alors vi va pas être plus productif qu'un exemplaire de "bloc-notes" pour vous. (OK, vous aurez toujours la mise en évidence de la syntaxe et la capacité de gérer des fichiers plus grands qu'un piddling ~45KB ou plus; mais travaillez avec moi ici).

vi possède 26 "marques" et 26 " registres."Une marque est définie à n'importe quel emplacement du curseur à l'aide de la commande m . Chaque marque est désigné par une seule lettre minuscule. Ainsi, ma place la marque a " à la marque emplacement actuel, et mz définit la marque z ". Vous pouvez passer à la ligne contenant une marque en utilisant la commande ' (simple citation). 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 en utilisant la commande ` (backquote). Ainsi, `z se déplacera directement à l'emplacement exact de la marque z ".

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

ainsi, une façon de couper une sélection arbitraire de texte serait de laisser tomber une marque (j'utilise habituellement a "comme ma" première "marque", z "comme ma marque suivante", b "comme une autre marque", et e " comme une autre (I Je ne me souviens pas avoir utilisé plus plus de quatre marques en 15 ans d'utilisation de vi ; on crée ses propres conventions concernant la façon dont les marques et les registres sont utilisés par des macros qui ne perturbent pas son contexte interactif). Puis nous allons à l'autre bout de notre texte de votre choix; nous pouvons commencer à la fin, il n'a pas d'importance. Nous pouvons alors simplement utiliser d`a pour couper ou y`a pour copier. Ainsi, l'ensemble du processus a un 5 frappes au-dessus (six si nous avons commencé en mode "insert" et nécessaire à Esc mode de commande out). Une fois que nous avons coupé ou copié, le collage dans une copie est une seule touche: p .

je dis que c'est une façon de couper ou copier du texte. Cependant, il est seulement un des nombreux. Souvent, nous pouvons décrire plus succinctement la portée du texte sans déplacer notre curseur et laisser tomber une marque. Par exemple, si je suis dans un paragraphe de texte je peux utiliser { et } mouvements au début ou à la fin du paragraphe respectivement. Ainsi, pour déplacer un paragraphe de texte je l'ai coupé en utilisant { d} (3 touches). (S'il m'arrive d'être déjà sur la première ou la dernière ligne du paragraphe, je peux alors simplement utiliser d} ou d{ respectivement.

la notion de" paragraphe " est par défaut quelque chose qui est généralement intuitivement raisonnable. Ainsi, il fonctionne souvent pour le code aussi bien que la prose.

nous connaissons souvent une certaine tendance (régulière expression) qui marque une extrémité ou l'autre du texte qui nous intéresse. La recherche vers l'avant ou vers l'arrière sont des mouvements dans vi . Ils peuvent donc aussi être utilisés comme "sujets" dans nos "déclarations."Ainsi je peux utiliser d/foo pour couper de la ligne courante à la ligne suivante contenant la chaîne" foo "et y?bar pour copier de la ligne courante à la ligne la plus récente (précédente) contenant" bar."Si Je ne veux pas de lignes entières, je peux toujours utiliser la recherche mouvements(en tant qu'énoncés de leurs propres), laisser tomber mon (s) Point (S) et utiliser les commandes `x comme décrit précédemment.

En plus de "verbes" et les "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" nommés "registres par préfixe la référence "objet" avec " (la double citation modificateur.) Ainsi, si j'utilise "add , je coupe la ligne courante dans le registre a " et si j'utilise "by/foo , alors je tire une copie du texte d'ici à la ligne suivante contenant "foo" dans le registre b ". Pour coller à partir d'un registre, Je préfixe simplement la pâte avec la même séquence de modificateur: "ap colle une copie du ' a ' contenu du Registre dans le texte après le curseur et "bP passe une copie de b " à avant la ligne courante.

cette notion de" préfixes "ajoute également les analogues grammaticaux des" adjectifs "et des "adverbes" à notre langage de manipulation de texte"."La plupart des commandes (verbes) et des mouvements (verbes ou objets, selon le Contexte) peuvent aussi prendre des préfixes numériques. Ainsi, 3J signifie "joindre les trois lignes suivantes" et d5} signifie " Supprimer de la ligne courante par la fin de la cinquième paragraphe d'ici."

C'est tout le niveau intermédiaire vi . Rien de tout cela n'est Vim spécifique et il ya beaucoup plus avancé astuces dans vi si vous êtes prêt à les apprendre. Si vous ne deviez maîtriser que ces concepts intermédiaires, vous constateriez probablement que vous avez rarement besoin d'écrire des macros parce que le langage de manipulation de texte est suffisamment concis et expressif pour faire la plupart des choses assez facilement en utilisant la langue "native" de l'éditeur.


Un échantillonnage de plus avancé des astuces:

il existe un certain nombre de commandes : , notamment la technique de substitution globale :% s/foo/bar/g . (Ce n'est pas avancé mais d'autres commandes : peuvent l'être). Tout l'ensemble des commandes : a été hérité historiquement par vi des incarnations précédentes comme le ed (éditeur de ligne) et plus tard le ex (éditeur de ligne étendu) utilitaires. En fait vi est ainsi nommé parce qu'il est l'interface visuelle de ex .

: les commandes fonctionnent normalement sur des lignes de texte. ed et ex ont été écrits à une époque où terminal écrans étaient rare et beaucoup de bornes étaient des appareils de" téléimprimeur " (ATS). Il était donc courant de travailler à partir de copies imprimées du texte, en utilisant des commandes à travers une interface extrêmement courte (les vitesses de connexion communes étaient de 110 bauds, soit environ 11 caractères par seconde -- ce qui est plus lent qu'une dactylographie rapide; les décalages étaient fréquents sur les sessions interactives multi-utilisateurs; en outre, il y avait souvent une certaine motivation pour conserver le papier).

ainsi la syntaxe de la plupart des commandes : inclut une adresse ou une plage d'adresses (numéro de ligne) suivi d'une commande. Naturellement, on pourrait utiliser des numéros de ligne littéraux: :127,215 s/foo/bar pour changer la première occurrence de "foo" en "bar" sur chaque ligne entre 127 et 215. On pourrait également utiliser des abréviations telles que . ou $ pour les lignes actuelles et les dernières lignes respectivement. On pourrait aussi utiliser les préfixes relatifs + et - pour faire référence aux offsets après ou avant la ligne courante, respectivement. Ainsi: :.,$j Signification "de la ligne courante à la dernière ligne, rejoignez-les tous en une ligne". :% est synonyme de :1,$ (toutes les lignes).

les commandes :... g et :... v portent une certaine explication car elles sont incroyablement puissantes. :... g est un préfixe pour" globalement "appliquant une commande subséquente à toutes les lignes qui correspondent à un motif (expression régulière) tandis que :... v applique une telle commande à toutes les lignes qui ne correspondent pas au motif donné ("v "de"conVerse"). Comme avec d'autres commandes ex , celles-ci peuvent être préfixées par des références d'adressage/portée. Ainsi, :.,+21g/foo/d signifie "supprimer toutes les lignes contenant la chaîne" foo" à partir de la ligne courante à travers les 21 lignes suivantes "tandis que :.,$v/bar/d signifie "d'ici à la fin du fichier, supprimer toutes les lignes qui ne contiennent pas la barre "chaîne"."

il est intéressant de noter que la commande Unix commune grep a été en fait inspirée par ceci ex "15191130920 de la commande" (et est nommé d'après la manière dont il a été documenté). Le ex commande :g/re/p (grep) était la façon dont ils ont documenté la façon" globale "" d'imprimer "des lignes contenant une" expression régulière " (re). Lorsque ed et ex ont été utilisés, la commande :p était l'un des premiers que quiconque a appris et souvent le premier utilisé lors de l'édition de tout fichier. C'était la façon dont vous avez imprimé le contenu actuel (généralement seulement une page pleine à la fois en utilisant :.,+25p ou un tel).

Note que :% g/.../d (ou l'inverse/l'inverse homologue: :% v/.../d sont les plus communs des habitudes d'utilisation. Cependant il y a quelques autres commandes ex qui valent la peine d'être rappelées:

nous pouvons utiliser m pour déplacer des lignes autour, et j pour joindre des lignes. Par exemple, si vous avez une liste et que vous souhaitez séparer toutes les choses correspondant (ou à l'inverse ne correspondant pas un modèle) sans les supprimer, alors vous pouvez utiliser quelque chose comme: :% g/foo/m$ ... et tous les "foo" lignes ont été déplacés à la fin du fichier. (Notez l'autre conseil sur l'utilisation de la fin de votre fichier comme espace de grattage). 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 (copier le fichier à son propre queue, filtrer la queue par grep , et supprimer tous les trucs de la tête).

pour joindre des lignes habituellement, je peux trouver un modèle pour toutes les lignes qui doivent être jointes à leur prédécesseur (toutes les lignes qui commencent par " ^ "plutôt que" ^ * " dans une liste de points, par exemple). Dans ce cas, j'utiliserais :% g/^ /-1j (pour chaque ligne correspondante, montez une ligne et rejoignez-la). (BTW: pour les listes à puces essayant de trouver la balle de lignes et de se joindre à la prochaine ne fonctionne pas pour un couple de raisons ... il peut joindre une ligne de balle à une autre, et il ne va pas joindre n'importe quelle ligne de balle à tous de ses continuations; il ne fonctionnera que par paire 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). Habituellement, vous n'avez pas besoin de le faire. Cependant, envisagez certains cas où vous voulez effectuer un substitution seulement sur les lignes correspondant à un autre motif. Souvent, vous pouvez utiliser un motif compliqué avec des captures et utiliser des références en arrière pour préserver les parties des lignes que vous ne voulez pas changer. 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 toute "barre" par "zzz"."(Quelque chose comme :% s/\(.*foo.*\)bar\(.*\)/zzz/g ne fonctionnerait pour les cas que les instances de "barre" qui ont été précédées par "foo" sur le même ligne; c'est déjà assez impie, et devrait être encore plus mutilé pour attraper tous les cas où " bar "précédé " foo")

le point est qu'il y a plus que juste p , s , et d lignes dans le jeu de commande ex .

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

c'est assez obscur (Je n'ai utilisé quelque chose comme ça que quelques fois au cours des 15 dernières années). Cependant, j'admets que j'ai souvent fait des choses de façon itérative et interactive qui auraient probablement pu être plus efficace si j'avais pris le temps de penser l'incantation.

une autre commande très utile vi ou ex est :r à lire dans le contenu d'un autre fichier. Ainsi: :r foo insère le contenu du fichier nommé "toto" à la ligne actuelle.

plus puissante est la commande :r! . Il lit les résultats d'une commande. C'est le même que suspension de la session vi , exécution d'une commande, redirection de sa sortie vers un fichier temporaire, reprise de votre session vi , et lecture dans le contenu de la temp. fichier.

les commandes ! (bang) et :... ! ( ex bang) sont encore plus puissantes. Ceux-ci exécutent également des commandes externes et lisent les résultats dans le texte courant. Toutefois, ils filtrent également les sélections notre texte à travers la commande! Nous pouvons trier toutes les lignes de notre fichier en utilisant 1G!Gsort ( G est la commande vi "goto"; il va par défaut à la dernière ligne du fichier, mais peut être préfixé par un numéro de ligne, comme 1, la première ligne). C'est l'équivalent de la ex variante :1,$!sort . Les écrivains utilisent souvent ! avec le Unix fmt ou fold utilitaires pour reformuler ou" word wrapping " 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 des parties de celui-ci, par le biais de indent ou d'autres outils de reformatage du code.

en utilisant les commandes :r! et ! signifie que tout utilitaire ou filtre externe peut être considéré comme une extension de notre éditeur. J'ai parfois utilisé ceux-ci avec des scripts qui a tiré des données d'une base de données, ou avec des commandes wget ou lynx qui ont tiré des données d'un site web, ou SSH commandes qui ont tiré des données de systèmes distants.

une autre commande utile ex est :so (abréviation de :source ). Ce lit le contenu d'un fichier comme une série de commandes. Quand vous commencez vi il normalement, implicitement, exécute un :source sur ~/.exinitrc fichier (et Vim habituellement fait cela sur ~/.vimrc , assez naturellement). L'utilisation de ceci est que vous pouvez changer votre profil d'éditeur à la volée en recherchant simplement dans un nouvel ensemble de macros, abréviations, et paramètres d'éditeur. Si vous êtes sournois, vous pouvez même l'utiliser comme une astuce pour stocker des séquences de commandes d'édition ex à appliquer aux fichiers sur demande.

pour 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 ce nombre de mots. Je peux appliquer ce "macro" à un fichier en utilisant une commande comme: vim +'so mymacro.ex' ./mytarget

(l'option en ligne de commande + de vi et Vim est normalement utilisée pour commencer la session d'édition à un numéro de ligne donné. Cependant c'est un fait peu connu que l'on peut suivre le + par n'importe quelle commande/expression valide ex , 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 d'hôtes connu SSH non-interactivement pendant que je ré-imaging un ensemble de serveurs).

Habituellement, il est beaucoup plus facile d'écrire de telles "macros" en utilisant Perl, AWK, sed (qui est, en fait, comme grep un utilitaire inspiré par la commande ed ).

la commande @ est probablement la plus obscure des commandes vi . En enseignant occasionnellement des cours avancés d'administration des systèmes pendant près d'une décennie, j'ai rencontré très peu de gens qui l'ont utilisé. @ exécute le contenu d'un registre, comme si il s'agissait d'un vi ou ex "15191130920 de la commande".

Exemple: j'utilise souvent: :r!locate ... pour trouver un fichier sur mon système et de lire son nom dans mon document. De là, j'efface tous les résultats externes, ne laissant que le chemin complet vers le fichier qui m'intéresse. Plutôt que de laborieusement Tab - ing à travers chaque composant du chemin (ou pire, si je me trouve être coincé sur une machine sans Tab support d'achèvement dans sa copie de vi ) je viens d'utiliser:

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

C'est seulement 10 touches (et l'expression "cdd @c est effectivement une macro de doigt pour moi, donc je peux le taper presque comme rapidement comme n'importe quel mot de six lettres commun).


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

j'ai seulement rayé à la surface de la puissance de vi et aucun de ce que j'ai décrit ici est même une partie des" améliorations "pour lequel vim est nommé! Tout ce que j'ai décrit ici devrait fonctionner sur n'importe quelle vieille copie de vi d'il y a 20 ou 30 ans.

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

2862
répondu Jim Dennis 2011-12-22 11:43:37

vous parlez de la sélection et de la copie de texte, je pense que vous devriez donner un coup d'oeil à la Vim mode visuel .

dans le mode visuel, vous pouvez sélectionner du texte en utilisant des commandes Vim, puis vous pouvez faire ce que vous voulez avec la sélection.

envisager les scénarios communs suivants:

vous devez sélectionner à la parenthèse suivante correspondant.

vous pourriez faire:

  • v% si le curseur est sur la parenthèse de début/fin
  • vib si le curseur est à l'intérieur du bloc de parenthèses

Vous voulez sélectionner le texte entre guillemets:

  • vi", par des guillemets doubles
  • vi " pour les guillemets simples

vous souhaitez sélectionner un bloc de Corset Bouclé (très commun sur les langues de style C):

  • viB
  • vi{

vous voulez sélectionnez le fichier complet:

  • ggVG

Visual block selection est une autre fonctionnalité vraiment utile, il vous permet de sélectionner une zone rectangulaire de texte, vous avez juste à appuyer sur Ctrl - V pour le Démarrer, puis sélectionnez le bloc de texte que vous voulez et effectuer tout type d'opération tels que yank, supprimer, coller, éditer, etc. Il est grand pour éditer colonne orientée texte.

505
répondu CMS 2017-02-08 14:14:05

Certains productivité conseils:

Smart mouvements

  • * et # de recherche pour le mot sous le curseur vers l'avant/vers l'arrière.
  • w au mot suivant
  • W à l'espace suivant-mot séparé
  • b / e au début/fin du mot courant. ( B / E pour espace séparé seulement)
  • gg / G sautez au début/fin du fichier.
  • % sauter à la correspondance { .. } ou ( .. ), etc..
  • { / } passez au paragraphe suivant.
  • '. retournez à la dernière ligne éditée.
  • g; revenir à la dernière position éditée.

édition Rapide des commandes

  • I Insérer Au début.
  • A annexe à la fin.
  • o / O ouvrez une nouvelle ligne après / avant le courant.
  • v / V / Ctrl+V mode visuel (pour sélectionner le texte!)
  • Shift+R remplacer le texte
  • C modifier 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 du mot
  • 3cW = changement 3 mots
  • BcW = au début du mot complet, changer le mot complet
  • ciW = changement parole intérieure.
  • ci" = changement interne entre".."
  • ci( = modifier le texte entre ( .. )
  • ci< = modifier le texte entre < .. > (besoins set matchpairs+=<:> dans vimrc)
  • 4dd = Supprimer 4 lignes
  • 3x = Supprimer 3 caractères.
  • 3s = remplacer 3 caractères.

Utile programmeur commandes

  • r remplacer un caractère (par exemple rd remplace le caractère actuel par d ).
  • ~ Change case.
  • J joint deux lignes
  • Ctrl+A/CTRL+X incréments / décréments un nombre.
  • . répétez la dernière commande (une simple macro)
  • == indent de ligne fixe
  • > bloc de tirets (en mode visuel)
  • < bloc unindent (en mode visuel)

l'enregistrement de la Macro

  • appuyez sur q[ key ] pour commencer l'enregistrement.
  • Puis appuyez sur q pour arrêter l'enregistrement.
  • la macro peut être joué 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 ajouter à la fin, b / e pour déplacer le curseur au début ou à la fin d'un mot respectivement)

Exemple de bien construit paramètres

# 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 et ensuite lire à partir du fichier /etc/vimrc en utilisant:

source /etc/vimrc.local

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

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à plus productif, sans avoir à connaître tous les trucs fantaisistes.

207
répondu vdboor 2012-10-29 18:51:23

le mécanisme Control + R est très utile :-) dans le mode insert ou command mode (i.e. sur la ligne : lors de la saisie des commandes), continuer avec un registre numéroté ou nommé:

"
  • un - z le nommé registres
  • " le registre sans nom, contenant le texte du dernier supprimer ou yank

  • % le nom de fichier actuel

  • # l'autre nom de fichier

  • * le contenu du bloc-notes (X11: sélection primaire)

  • + le contenu du bloc-notes

  • / le dernier modèle de recherche

  • : la dernière ligne de commande

  • . le dernier texte inséré

  • - le dernier de petite taille (moins d'une ligne) supprimer

  • =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 de découvrir à proximité pour plus de CTRL-R bonté.

98
répondu kev 2012-04-12 07:46:31

Vim Plugins

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 y a des scripts et des plugins pour le faire faire toutes sortes de choses folles que l'auteur original n'a jamais considérées. Voici quelques exemples de plugins vim incroyablement pratiques:

rails.vim

Rails.vim est un plugin écrit par tpope. C'est un outil incroyable pour les gens qui font du développement de rails. Il fait des choses magiques sensibles au contexte qui vous permettent de passer facilement d'une méthode dans un contrôleur à la vue associée, à un modèle, et à des tests unitaires pour ce modèle. Il a sauvé 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 commande rapide pour le poster à gist.github.com . Cela permet un accès facile à pastebin, ce qui est incroyablement pratique si vous collaborez avec quelqu'un sur IRC ou IM.

de l'espace.vim

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

surround.vim

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

superbalance.vim

ce script apporte fantaisie onglet achèvement de la fonctionnalité de vim. Le truc autocomplete est déjà présent dans le noyau de vim, mais cela l'amène à un onglet rapide plutôt qu'à plusieurs raccourcis multikey différents. Très maniable, et incroyablement fun à utiliser. Bien que ce ne soit pas intellisense de VS, c'est une grande étape et apporte une grande partie de la fonctionnalité que vous souhaitez attendre d'un outil d'achèvement d'onglet.

syntastic.vim

cet outil apporte vérification de la syntaxe des commandes dans vim. Je ne l'ai pas utilisé personnellement, mais j'ai entendu de grandes choses à ce sujet et le concept est difficile à battre. Vérifier la syntaxe sans avoir à le faire manuellement est un grand gain de temps et peut vous aider à attraper les bogues syntaxiques lorsque vous les introduisez plutôt que lorsque vous vous arrêtez finalement pour tester.

fugitif.vim

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

nerdtree.vim

un navigateur d'arbre pour vim. J'ai commencé à l'utiliser récemment, et c'est très pratique. Il vous permet de mettre un treeview dans une fente verticale et d'ouvrir des fichiers facilement. C'est génial pour un projet avec beaucoup de fichiers source entre lesquels vous sautez fréquemment.

FuzzyFinderTextmate.vim

c'est un plugin Non contenu, mais incroyablement utile. Il fournit la capacité d'ouvrir des fichiers en utilisant une syntaxe descriptive "floue". Cela signifie que dans un arbre clairsemé de fichiers, vous n'avez besoin que de taper assez de caractères pour désambiguer les fichiers qui vous intéressent à partir du reste de la casse.

Conclusion

il y a beaucoup d'outils incroyables disponibles pour vim. Je suis sûr que J'ai seulement gratté la surface ici, et ça vaut la peine de chercher des outils applicables à votre domaine. La combinaison des puissants outils vi traditionnels, des améliorations vim et des plugins qui étendent vim encore plus loin, c'est l'un des moyens les plus puissants pour éditer du texte jamais conçu. Vim est aussi puissant qu'emacs, eclipse, visual studio et textmate.

Merci

merci à duwanis pour son vim configs d'où j'ai beaucoup appris et emprunté la plupart des plugins listés ici.

91
répondu Benson 2010-04-01 03:44:29

. pour Répéter le dernier texte-modification de la commande

je gagne beaucoup de temps avec celui-ci.

mode visuel a été mentionné précédemment, mais le mode de bloc visuel m'a sauvé beaucoup de temps lors de l'édition des colonnes de taille fixe dans le fichier texte. (consulté le avec Ctrl-V).

53
répondu Cooper6581 2010-03-31 23:01:05

gi

Aller à la dernière édition de l'emplacement (très utile si vous avez effectué quelques recherches et que voulez revenir en arrière pour modifier)

^P et ^n

compléter le texte précédent (^P) ou suivant (^N).

151950920 151960920 151970920 151980920"

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

48
répondu dimba 2012-12-24 14:50:03

j'ai récemment (j'ai) découvert ce site: http://vimcasts.org/

c'est assez nouveau et vraiment très bon. Le type qui dirige le site est passé de textmate à vim et héberge de très bons et concis moulages sur des sujets vim spécifiques. Check it out!

46
répondu Ronny Brendel 2010-03-31 19:37:33

Ctrl + a incréments le nombre sur lequel vous vous tenez.

42
répondu hcs42 2010-02-27 11:20:40

tous en mode Normal:

f pour passer à l'instance suivante d'un caractère particulier sur la ligne courante, et ; pour répéter.

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

s'ils sont utilisés intelligemment, les deux ci-dessus peuvent vous tuer-déplacement rapide autour de dans un ligne.

* sur un mot pour rechercher l'instance suivante.

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

38
répondu Eric Smith 2009-08-28 15:23:22

Session

A. enregistrer la session

: mks sessionname

B.

: mks! sessionname

c. chargement d'une session

gvim or vim-S sessionname


ajouter et soustraire

A. Ajouter et soustraire

CTRL-A; ajouter [count] au nombre ou au caractère alphabétique à ou après le curseur. (non repris au point 151930920)"

CTRL-X; soustraire [count] du nombre ou de l'ordre alphabétique caractère sur ou après le curseur. {absent de Vi}

B.

dans la fenêtre, Ctrl-a déjà mappé pour la sélection de fichier entier que vous devez démonter dans le fichier rc. marque mswin.vim CTRL-une partie de mapping comme 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 faire une liste numérotée.

  1. créez la première entrée de liste, assurez-vous qu'il commence par un nombre.
  2. qa - début de l'enregistrement dans la mémoire tampon 'a'
  3. Y - yank l'entrée
  4. P-mettre une copie de l'entrée sous la première
  5. Ctrl-A-increase the number
  6. q - arrêter l'enregistrement
  7. @un - répéter le copier, de le mettre et de l'incrément de temps
34
répondu agfe2 2010-08-19 08:08:28

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

nous avions ~80 fichiers qui devaient être retravaillés pour être orientés objet - toutes les fonctions ont été déplacées dans les classes, les paramètres ont changé, les déclarations d'importation ont été ajoutées, etc. Nous avions une liste d'environ 20 types de fixer qui devait être fait pour chaque fichier. J'estime que le faire à la main une personne pourrait faire peut-être 2-4 par jour.

donc j'ai fait le premier à la main et j'ai ensuite écrit un script vim pour automatiser les changements. La plupart était 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 qui 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 un couple de transformations plus complexes telles que la génération de toutes les déclarations d'importation I intégré 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 :source fixit.vim et le fichier est transformée en un clin d'œil.

nous avons encore le travail de changer les 5% restants qui ne valaient pas la peine d'automatiser et de tester les résultats, mais en passant une journée à écrire 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 puisque regex seul ne serait pas capable de gérer les crochets imbriqués, par exemple pour convertir bar(foo(xxx)) en foo(xxx).bar() . Vim était parfait pour la tâche.

32
répondu Dave Kirby 2012-08-18 21:44:40

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

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

L'explorateur vous permet de faire des modifications de fichier. Je vais poster quelques-unes de mes clés préférées, en appuyant sur <F1> vous donnera la liste complète:

  • - : le plus utile: Passer au répertoire supérieur ( cd .. )
  • mf : marquer un fichier
  • D : supprimer les fichiers marqués ou le fichier sur lequel le curseur est placé, si rien n'est marqué.
  • R : renommer le fichier sur lequel se trouve le curseur.
  • d : créer un nouveau répertoire dans le répertoire courant
  • % : créer un nouveau fichier l'annuaire actuel
28
répondu soulmerge 2009-08-02 11:17:12

je suis membre de L'American Cryptogram Association. Le magazine bimensuel comprend plus de 100 cryptogrammes de différentes sortes. Environ 15 d'entre eux sont des "cryptarithmes" - divers types de problèmes arithmétiques avec des lettres substituées pour les chiffres. Deux ou trois d'entre eux sont sudokus, sauf avec des lettres au lieu des nombres. Lorsque la grille est terminée, les neuf lettres distinctes énonceront un mot ou des mots, sur une ligne, diagonale, spirale, etc. quelque part dans la grille.

plutôt que de travailler avec un crayon, ou de taper les problèmes à la main, je télécharge les problèmes à partir de la section Membres de leur site web.

en travaillant avec ces sudokus, j'utilise vi, simplement parce que j'utilise des installations que vi a que peu d'autres éditeurs ont. La plupart du temps en convertissant la grille lettrée dans une grille numérotée, parce que je le trouve plus facile à résoudre, et puis la grille numérotée complétée de nouveau dans la grille lettrée pour trouver la solution mot ou les mots.

le problème est formaté en neuf groupes de neuf lettres, avec - S représentant les blancs, écrits en deux lignes. La première étape consiste à mettre en forme ces neuf lignes de neuf caractères. Il n'y a rien de spécial là-dedans, juste insérer huit linebreaks dans les 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

Donc, la première étape dans la conversion en nombres est de faire une liste de les différentes lettres. Tout d'abord, je fais une copie du bloc. Je positionner le curseur en haut du bloc, puis tapez :y}}p . : me met en mode commande, y renvoie la commande suivante. Puisque } est un déplacement à la fin du paragraphe suivant, y} yanks le paragraphe. } déplace alors le curseur à la fin du paragraphe, et p colle ce que nous avions tiré juste après le curseur. Donc y}}p crée une copie de la prochaine paragraphe, et se termine avec le curseur entre les deux copies.

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

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

: me met à nouveau en mode commande. ! indique que le contenu du yank prochain doit être acheminé par une ligne de commande. } renvoie le paragraphe suivant, et la ligne de commande utilise alors la commande tr pour supprimer tout sauf les lettres majuscules, la commande sed pour imprimer chaque lettre sur une seule ligne, et la commande sort pour trier ces lignes, en supprimant les doublons, et ensuite tr efface les nouvelles lignes, laissant les neuf lettres distinctes dans une seule ligne, remplaçant les neuf lignes qui avaient constitué le paragraphe à l'origine. Dans ce cas, les lettres sont: ACELNOPST .

la Prochaine étape est de faire une autre copie de la grille. Et puis à utiliser la lettres que je viens d'identifier pour remplacer chacune de ces lettres par un chiffre allant de 1 à 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 alors être résolu de la manière habituelle, ou entré dans tout sudoku solver que vous pourriez préférer. La solution complète peut alors être reconvertie en Lettres avec :!}tr 1-9 ACELNOPST .

il y a du pouvoir en vi qui est égalé par Très peu d'autres. Le plus grand problème est que seulement quelques-uns des vi tutoriel livres, sites web, fichiers, etc. faire plus de peine en contact avec la surface de ce qui est possible.

25
répondu Jeff Dege 2011-06-15 13:39:45

manipulations de texte en vrac!

Soit par le biais de macros:

  • début de l'enregistrement: qq
  • Faire des trucs
  • arrêt de l'enregistrement: q
  • répète: @q (la première fois), @@ après cela.
  • répéter 20 fois: 20@@

ou par des expressions régulières:

  • remplacer stuff: :%s/[fo]+/bar/g

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

23
répondu jqno 2009-08-02 08:59:30

j'ai récemment découvert q: . Il ouvre la" fenêtre de commande " et affiche les commandes ex-mode (command-mode) les plus récentes. Vous pouvez vous déplacer comme d'habitude dans la fenêtre, et appuyer sur <CR> exécute la commande. Vous pouvez modifier, etc. trop. Cela n'a pas de prix quand vous jouez avec une commande complexe ou regex et que vous ne voulez pas retaper tout le truc, ou si la chose complexe que vous voulez faire était de 3 commandes de retour. C'est presque comme le set -o vi de bash , mais pour vim lui-même (heh!).

Voir :help q: pour plus intéressante bits pour aller d'avant en arrière.

23
répondu David Pope 2012-04-02 07:56:22

je viens de découvrir l'omnicompletion de Vim l'autre jour, et bien que j'admette que je suis un peu flou sur ce qui fait, j'ai eu des résultats étonnamment bons juste mashing soit Ctrl + x Ctrl + u ou Ctrl + n / Ctrl + p insérer le mode. Ce n'est pas tout à fait IntelliSense , mais je suis encore à apprendre.

essayez! :help ins-completion

22
répondu Peter Mortensen 2010-02-27 11:29:17

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

  1. faire de capslock un ESC (ou Ctrl) supplémentaire
  2. "151930920 carte" chef de file "," (virgule), avec cette commande: laissez mapleader=","

ils augmentent ma productivité.

20
répondu tfmoraes 2010-03-14 19:49:18

un autre raccourci pratique que j'utilise fréquemment Est" xp". Ce swap le caractère sous le curseur avec le caractère suivant.

19
répondu Costyn 2010-09-20 10:34:50

+ W, V pour diviser l'écran verticalement

+ W, W pour basculer entre les fenêtres

!python % [args] pour exécuter le script, je suis d'édition dans la fenêtre

ZF en mode visuel pour plier des lignes arbitraires

18
répondu Peter Ellis 2009-08-02 09:47:38

Mode Visuel

comme plusieurs personnes l'ont dit, le mode visuel est la réponse à votre problème de copie/cut & paste. Vim vous donne 'v', 'V', et C-v. en minuscule ' v ' dans vim est essentiellement la même que la touche shift dans le bloc-notes. La bonne chose est que vous n'avez pas à le maintenir. Vous pouvez utiliser n'importe quelle technique de mouvement pour naviguer efficacement pour le début (ou la fin) de votre sélection. Puis appuyez sur 'v', et utilisez des techniques de mouvement efficaces à nouveau pour naviguer à l'autre extrémité de votre sélection. Puis '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 cut/copy/paste de Jim Dennis dans vi est que vous n'avez pas à obtenir l'emplacement exact. Parfois, il est plus efficace d'utiliser un mouvement rapide pour se rendre à la proximité générale de l'endroit où vous voulez aller et puis de raffiner que d'autres mouvements que de penser à une commande de mouvement unique plus complexe qui vous obtient exactement où vous voulez aller.

l'inconvénient de l'utilisation extensive du mode visuel de cette manière est qu'il peut devenir une béquille que vous utilisez tout le temps qui vous empêche d'apprendre de nouvelles commandes vi(m) qui pourraient vous permettre de faire les choses plus efficacement. Cependant, si vous êtes très proactif dans l'apprentissage de nouveaux aspects de vi(m), alors cela ne vous affectera probablement pas beaucoup.

je vais également re-souligner que la ligne visuelle et les modes de bloc visuel vous donner des variations sur ce même thème qui peuvent être très puissantes...surtout le mode de blocage visuel.

sur L'utilisation efficace du clavier

Je ne suis pas d'accord non plus avec votre affirmation que l'alternance des mains est le moyen le plus rapide d'utiliser le clavier. Il a un élément de vérité dans cela. D'une manière très générale, l'usage répété de la même chose est lent. Cet exemple le plus significatif de ce principe est que les frappes consécutives frappées avec le même doigt sont très lent. Votre affirmation provient probablement de la tendance naturelle à utiliser le s/doigt/main/ transformation sur ce modèle. Dans une certaine mesure, c'est correct, mais à l'extrême fin de l'efficacité du spectre est incorrect.

demandez à n'importe quel pianiste. Demandez-leur s'il est plus rapide de jouer une succession de quelques notes en alternant les mains ou en utilisant les doigts consécutifs d'une seule main dans l'ordre. Le moyen le plus rapide pour taper des touches de type 4 n'est pas d'alterner les mains, mais de les taper avec 4 doigts de la même main dans l'ordre ascendant ou descendant (appelez ça un "run"). Cela devrait être évident une fois que vous aurez envisagé cette possibilité.

le problème le plus difficile est l'optimisation pour cela. C'est assez facile à optimiser pour une 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 d'être capable de le faire que n'importe quelle approche non-modale (ahem, emacs).

Emacs

de peur que les fanatiques d'emacs ne négligent complètement mon billet entier à cause de ce dernier commentaire entre parenthèses, je sens que je dois décrire la racine de la différence entre les religions emacs et vim. Je n'ai jamais parlé dans The editor wars et je ne le ferai probablement plus, 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 offre une efficacité d'édition de texte brute inégalée Emacs vous donne la capacité inégalée de personnaliser et de programmer l'éditeur

Les aveugles vim fanatiques prétendent que vim est un langage de script. Mais c'est un langage obscur et ad hoc qui a été conçu pour servir l'éditeur. Emacs a du zézaiement! J'en ai assez dit. Si vous n'appréciez pas la signification de ces deux dernières phrases ou si vous avez le désir d'en apprendre assez sur la programmation fonctionnelle et le Lisp pour développer cette appréciation, alors tu devrais utiliser vim.

les fanatiques d'emacs diront qu'emacs a le mode viper, et donc c'est un super-ensemble de vim. Mais le mode viper n'est pas standard. Je crois comprendre que le mode viper n'est pas utilisé par la majorité des utilisateurs d'emacs. Puisque ce n'est pas la valeur par défaut, la plupart des utilisateurs d'emacs ne développent probablement pas une véritable appréciation des avantages du paradigme modal.

À mon avis, ces différences sont orthogonaux. Je crois que les avantages de vim et emacs comme je l'ai dit, elles sont toutes deux valables. Cela signifie que l'ultime éditeur 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 l'état d'esprit d'emacs. La communauté emacs pourrait se déplacer de cette façon dans le futur, mais cela ne semble pas très probable.

donc si vous voulez une efficacité d'édition brute, utilisez vim. Si vous voulez l'environnement ultime pour le script et la programmation de votre éditeur utilisation d'emacs. Si vous voulez les deux avec un accent 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
répondu user307058 2010-04-01 17:00:28

passez 30 minutes à faire le tutoriel vim (exécuter vimtutor au lieu de vim en terminal). Vous apprendrez les mouvements de base, et quelques touches, ce qui vous rendra au moins aussi productif avec vim qu'avec l'éditeur de texte que vous avez utilisé auparavant. Après cela, eh bien, lire la réponse de Jim Dennis à nouveau :)

17
répondu konryd 2010-03-31 22:44:38

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

capable d'exécuter des modifications complexes et répétitives avec très peu de touches (souvent en utilisant macros ). Regardez VimGolf pour voir la puissance de Vim!

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

16
répondu Johnsyweb 2011-01-12 22:52:32

utilisez \c n'importe où dans une recherche pour ignorer le cas (en outrepassant vos paramètres ignorecase ou smartcase). Par exemple: /\cfoo ou /foo\c correspondra foo , Foo , fOO , FOO , etc.

Utiliser \C n'importe où dans une recherche de forcer cas de contrepartie. E. g. /\Cfoo ou /foo\C ne correspondent foo.

16
répondu kev 2011-06-15 13:42:51

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
répondu David Corbin 2011-06-15 13:44:13

Bizarre personne n'est mentionné dans les ctags. Téléchargez "exubérant ctags" et mettez-le en avant de la version merdique préinstallée que vous avez déjà dans votre chemin de recherche. Cd à la racine de ce que vous travaillez sur, par exemple l'Androïde du noyau de la distribution. Tapez "ctags -R ."pour construire un index de fichiers source n'importe où sous ce dir dans un fichier nommé "tags". Cela contient toutes les étiquettes, peu importe la langue ni où dans le dir, dans un fichier, donc le travail cross-langue est facile.

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

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

  • Type :ta nom pour aller à la définition de nom.

16
répondu Bradjcox 2012-05-06 20:50:49

indentation automatique:

gg (aller au début du document)

= (c'est l'heure!)

shift-g (aller à la fin du document)

vous aurez besoin de 'Filetype plugin indent on' dans votre fichier .vimrc , et probablement des paramètres appropriés 'shiftwidth' et 'expandtab'.

14
répondu David Claridge 2010-02-27 11:19:21

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

vous avez dû remarquer deux choses. Vim est puissant, et vim est difficile à apprendre. Une grande partie de son pouvoir réside dans son extensibilité et la combinaison infinie de commandes. Ne te sens pas dépassé. Allez-y doucement. Une commande, un plugin à la fois. N'en abusez pas.

Tout ce que vous avez investi dans vim pour rembourser un millier de fois. Tu vas être dans un éditeur de texte pendant des heures avant de mourir. Vim sera votre compagnon.

14
répondu autodidakto 2010-07-24 05:41:20

plusieurs tampons, et en particulier saut rapide entre eux pour comparer deux fichiers avec :bp et :bn ( correctement remappé à un seul Shift + p ou Shift + n )

vimdiff mode (se divise en deux tampons verticaux, avec des couleurs pour montrer les différences)

Zone de copie avec Ctrl + v

et enfin, tab terminer les identificateurs (rechercher"mosh_tab_or_complete"). C'est un changeur de vie.

13
répondu Stefano Borini 2010-02-27 11:23:25

est D'accord avec l'affiche du haut - le : r! commande 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 à jouer avec :set paste .

12
répondu David Wolever 2009-08-28 16:07:18