117 votes

vim, pour passer rapidement d'un fichier à l'autre en utilisant Vim (sans plugins)

Je comprends que le fait de me limiter à vanilla Vim (sans utiliser de plugins) limite la puissance de l'éditeur, mais comme je passe fréquemment d'une machine à l'autre, c'est souvent trop compliqué de déplacer mon environnement partout. Je veux simplement rester dans vanilla Vim.

Ce qui me retient, c'est la possibilité de passer rapidement d'un fichier à l'autre. J'ai (du moins je le crois) une bonne compréhension de ce qui suit tampons , Windows , onglets ainsi que netrw ( Vex , Ex etc).

Mais dans un éditeur tel que Texte sublime je peux juste taper ctrl - p et je suis instantanément dans le dossier.

Je sais que je peux accéder à l'interpréteur de commandes, mais je me demande s'il existe d'autres secrets "cachés" permettant de passer rapidement d'un fichier à l'autre dans Vim en ne se basant pas uniquement sur le nom du fichier.

267voto

romainl Points 55506

L'équivalent le plus proche (" le plus proche ", pas " exact ") de la ST2 Ctrl + P est un plugin appelé, préparez-vous CtrlP . Il existe d'autres plugins similaires comme Command-T o FuzzyFinder .

J'utilise CtrlP et je l'adore, mais je soutiens de tout cœur votre décision de vous passer de plugins. Ce n'est pas la voie la plus facile à suivre, mais elle sera payante à long terme.


Ouverture de fichiers

La façon la plus simple d'ouvrir un fichier est :e /path/to/filename . Heureusement, vous disposez de la complétion par tabulation et des caractères génériques : les classiques * et une spéciale, ** qui signifie "tout sous-répertoire".

En combinant tout cela, vous pouvez faire :

:e **/*foo<Tab>

pour choisir parmi tous les fichiers contenant foo dans leur nom sous le répertoire de travail ou :

:e **/*foo/*bar<Tab>

pour choisir parmi tous les fichiers contenant bar dans leur nom sous n'importe quel sous-répertoire contenant foo dans son nom, n'importe où sous le répertoire de travail.

Bien sûr, cela fonctionne pour :tabe[dit] , :sp[lit] y :vs[plit] aussi.

Ces commandes sont cependant limitées à un seul fichier. Utilisez :next pour ouvrir plusieurs fichiers :

:next **/*.js

et jetez un coup d'œil à :help arglist .


Sauter entre les tampons

:b[uffer] est la commande de commutation de tampon de base :

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Notez que plusieurs de ces commandes et de leurs proches acceptent un compte.

El :ls vous montre une liste des tampons chargés. C'est un peu "spécial", cependant : un numéro est attribué aux tampons lorsqu'ils sont créés, de sorte que vous pouvez avoir une liste qui ressemble à ceci 1 2 5 si vous supprimez des tampons. C'est un peu maladroit, oui, et cela rend le passage à un tampon par son numéro un peu trop gênant. Préférez la commutation par nom partiel, :b foo<Tab> ou le cyclisme, :bn :bp .

Quoi qu'il en soit, voici un mappage sympa qui répertorie tous les tampons chargés et remplit l'invite pour vous, en attendant que vous tapiez le numéro d'un tampon et que vous appuyiez sur la touche <enter> :

nnoremap gb :ls<CR>:b<Space>

Avec ce mappage, le passage à un autre tampon est aussi simple que cela :

gb
(quickly scanning the list)
3<CR>

ou :

gb
(quickly scanning the list)
foo<tab><CR>

L'idée vient de cette image extrait de la collection d'infographies sur Vim de Bairui :

Flying vs cycling

Vim dispose également de <C-^> (o <C-6> sur certains claviers)-l'équivalent en mode normal de :b# -pour sauter entre le tampon actuel et le précédent. Utilisez-le si vous alternez souvent entre deux tampons.

Lisez tout sur les tampons dans :help buffers .


Aller à la déclaration

Dans un fichier, vous pouvez utiliser gd o gD .

Au sein d'un projet, la fonction "tags" de Vim est votre amie mais vous aurez besoin d'un indexeur de code externe comme ctags ou cscope. Les commandes les plus basiques sont :tag foo y <C-]> avec le curseur sur un nom de méthode. Les deux outils sont bien intégrés dans Vim : voir :help tags , :help ctags y :help cscope .

Pour ce que ça vaut, j'utilise beaucoup la navigation par balises pour me déplacer dans un projet (en utilisant la fonction de CtrlP :CtrlPTag y :CtrlPBufTag mais aussi les commandes intégrées) et ma méthode "générique" préférée de changement de tampon est le nom.


Déploiement de votre configuration

Beaucoup d'utilisateurs de Vim placent leur configuration sous contrôle de version, ce qui rend très rapide et facile d'installer votre propre config sur une nouvelle machine. Pensez-y.


EDIT

Il y a quelques mois, j'ai dû travailler sur une machine distante avec un Vim obsolète. J'aurais pu installer un Vim correct et cloner ma propre configuration bien-aimée, mais j'ai décidé de voyager léger, cette fois, afin d'"affûter la scie". J'ai rapidement construit une configuration minimaliste .vimrc et revisité quelques fonctionnalités natives à moitié oubliées. Après ce concert, j'ai décidé que CtrlP n'était pas si nécessaire et je m'en suis débarrassé : les fonctionnalités natives et les mappings personnalisés ne sont pas aussi sexy mais ils font le travail sans trop de dépendances.


Jongler avec les dossiers

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:find est une commande vraiment importante dès lors que vous set path correctement. Avec mes paramètres, ,ffoo<Tab> trouvera tous les fichiers contenant foo sous le répertoire courant, de manière récursive. C'est rapide, intuitif et léger. Bien sûr, je bénéficie de la même complétion et des mêmes caractères génériques qu'avec :edit et des amis.

Pour rendre le processus encore plus rapide, les mappings suivants me permettent de sauter des parties entières du projet et de trouver des fichiers de manière récursive sous le répertoire du fichier actuel :

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

AVERTISSEMENT ! Le site path L'option est extrêmement puissant. La valeur ci-dessus- `.,` -travaux pour moi , comme valeur de repli par défaut . Dans le monde réel, la valeur exacte de l'option sera différente d'un projet/langue/framework/workflow à l'autre, donc l'option approprié dépend entièrement de votre besoins. Ne copiez pas aveuglément cette ligne et ne vous attendez pas à ce qu'elle résolve tous vos problèmes.**


Jongler avec les tampons

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Les mappings ci-dessus listent les tampons disponibles dans le "wildmenu" avec une invite vide, me permettant de naviguer dans le menu avec <Tab> ou tapez quelques lettres et <Tab> à nouveau pour réduire la liste. Comme pour les mappages de fichiers ci-dessus, le processus est rapide et presque sans friction.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Ces correspondances parlent d'elles-mêmes.


Jongler avec les étiquettes

nnoremap <leader>j :tjump /

Ce mappage utilise la recherche par regex au lieu de la recherche par mot entier, ce qui me permet de faire ,jba<Tab> pour trouver le tag foobarbaz() .

Oui, le fuzzy matching crée une dépendance, mais vous pouvez être tout aussi productif sans lui. Et pour une fraction du coût.


PLUS D'INFORMATIONS

Quelques conseils et astuces supplémentaires


Options du menu sauvage

Le "wildmenu", activé avec set wildmenu permet de faciliter la navigation dans les fichiers et les tampons. Son comportement est régi par une série d'options qui méritent d'être étudiées :

wildmode indique à Vim comment vous voulez que le "wildmenu" se comporte :

set wildmode=list:full

wildignore filtre tout ce qui est superflu :

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecase vous permet de rechercher foo et trouver Foo :

set wildignorecase

Marquage des dossiers

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

J'ai récemment trouvé cette perle dans le livre de quelqu'un d'autre. ~/.vimrc . Il crée une marque de fichier à la position exacte du curseur chaque fois que vous quittez un tampon, de sorte que, où que vous soyez, 'J saute vers le dernier tampon JavaScript que vous avez édité. Génial.

5voto

Ingo Karkat Points 61399

La réponse dépend beaucoup de vos préférences et des circonstances. Quelques exemples :

  • S'il s'agit principalement de deux fichiers (par exemple, un en-tête C et un fichier d'implémentation), <C-^> est très pratique. En général, le fichier alternatif est un concept important.
  • Si vous utilisez une grande fenêtre d'éditeur, la fenêtre :split s transforment le problème de la localisation d'un tampon en celui de la localisation de la fenêtre (une fois que tous les tampons sont ouverts). Vous pouvez utiliser [N]<C-w><C-w> pour y passer rapidement.
  • Si vous pouvez mémoriser (quelques) numéros de tampon, la :[N]b[uffer] y :[N]sb[uffer] sont très pratiques ; :ls vous indique les chiffres.

Les plugins (ou au moins les mappings personnalisés) peuvent améliorer considérablement les choses, et il y a toute une variété sur ce sujet sur vim.org . Il existe plusieurs mécanismes pour distribuer votre configuration (Pathogen + GitHub, Dropbox, ...), ou vous pouvez modifier à distance les fichiers du serveur grâce à l'outil de gestion de la configuration. netrw qui est fourni avec Vim.

5voto

chris Points 3140

Parfois, il est également pratique de parcourir séquentiellement une liste de fichiers (par exemple, si vous avez fait quelque chose comme vim *.php pour ouvrir plusieurs fichiers à la fois). Vous pouvez ensuite utiliser :n[ext] (ainsi que :prev[ious] , :fir[st] y :la[st] ) pour la navigation (en plus de ce qui a été suggéré dans les autres réponses).

4voto

Dave Kirby Points 12310

Vous pouvez utiliser la complétion de tabulation par caractères génériques sur la ligne de commande sans aucun plugin, par exemple

:e src/**/foo*<tab>

vous permettra de parcourir tous les fichiers commençant par 'foo' dans l'arborescence des répertoires sous ./src et de sélectionner celui que vous voulez modifier.

Si vous avez déjà édité le fichier et qu'il est toujours dans une mémoire tampon, vous pouvez y accéder avec :

:b foo<tab>

qui va parcourir tous les tampons avec 'foo' dans le chemin. Vous devrez peut-être définir les options wildmode et wildmenu pour obtenir le comportement que vous souhaitez. J'ai

wildmode=longest:full
wildmenu

dans mon .vimrc.

2voto

gpojd Points 12043

Si vous êtes sur un nom de fichier et que vous voulez sauter à ce fichier, gf le fera pour vous. J'aime aussi utiliser ctags qui n'est pas un plugin ; vous construisez simplement les balises et vous pouvez facilement sauter dans votre base de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X