vim, basculer rapidement entre les fichiers en utilisant vanilla Vim (pas de plugins)

103

Je comprends que 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, il est souvent trop difficile de déplacer mon environnement partout. Je veux juste rester dans la vanille Vim.

Ce qui me retient, c'est la possibilité de basculer rapidement entre les fichiers. I (croire au moins) ont une bonne compréhension des tampons , des fenêtres , onglets , ainsi que netrw ( Vex, Ex, etc.).

Mais dans un éditeur tel que Sublime Text , je peux simplement taper ctrl- pet instantanément je suis au fichier.

Je sais que je peux passer au shell, mais je me demande s'il existe d'autres secrets "cachés" pour passer rapidement d'un fichier à l'autre dans Vim en fonction de plus que le nom de fichier.

Jonathan.Brink
la source
2
Cela ne répond pas à votre question, mais cela pourrait vous persuader d'envisager d'utiliser des plugins: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood
Je synchronise personnellement mes paramètres avec Dropbox. C'est maladroit mais ça marche plus ou moins sans y penser. Le seul plugin que j'utilise et que je connais fonctionne bien pour ce que vous voulez est Command-T ( github.com/wincent/Command-T ). Ctrl-P pourrait être une alternative ( vim.org/scripts/script.php?script_id=3736 ).
FX
1
Avez-vous vu danielmiessler.com/study/vim ? Il a la pratique très intelligente de mettre son vimrc + tous les plugins dont il a besoin dans Github ... partout où il va, il peut le cloner et voilà, Vim est exactement comme il le souhaite. Brilliant
bobox
6
@bobox, des dizaines de milliers de personnes font cela; il n'y a rien d'extraordinaire à cela.
romainl

Réponses:

236

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

J'utilise CtrlP et j'adore ça mais je soutiens sans réserve votre décision de devenir "sans plugin". Ce n'est pas la façon la plus simple de procéder, mais elle sera payante à long terme.


Ouverture de fichiers

Le moyen le plus simple d'ouvrir un fichier est :e /path/to/filename. Heureusement, vous obtenez des tabulations et des jokers: le classique *et un spécial **, qui signifie "tout sous-répertoire".

En combinant tout cela, vous pouvez faire:

:e **/*foo<Tab>

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

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

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

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

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

:next **/*.js

et jetez un oeil à :help arglist.


Sauter entre les tampons

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

: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 beaucoup de ces commandes et leurs proches acceptent un décompte.

La :lscommande vous montre une liste des tampons chargés. C'est un peu "spécial", cependant: les tampons reçoivent un numéro lors de leur création afin que vous puissiez avoir une liste qui ressemble à 1 2 5si vous supprimez des tampons. C'est un peu gênant, oui, et cela rend le passage à un tampon par son numéro un peu trop gênant. Je préfère passer par une partie du nom, :b foo<Tab>ou du vélo, :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 appuyez sur <enter>:

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

Avec ce mappage, passer à un autre tampon est aussi simple que:

gb
(quickly scanning the list)
3<CR>

ou:

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

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

Voler vs vélo

Vim a aussi <C-^>(ou <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 gdou gD.

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

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


Déployer votre configuration

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


ÉDITER

Il y a quelques mois, j'ai dû travailler sur une machine distante avec un Vim obsolète. J'aurais pu installer un Vim approprié et cloner ma propre config bien-aimée mais j'ai décidé de voyager léger, cette fois, pour «affûter la scie». J'ai rapidement construit un minimaliste .vimrcet 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 mappages personnalisés ne sont pas aussi sexy, mais ils font le travail sans trop de dépendances.


Jongler avec des fichiers

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

:findest une commande vraiment géniale dès que vous avez set pathcorrectement. Avec mes paramètres, ,ffoo<Tab>retrouvera tous les fichiers contenant foosous le répertoire courant, de manière récursive. C'est rapide, intuitif et léger. Bien sûr, je profite de la même finition et des mêmes wildcards qu'avec :editet amis.

Pour rendre le processus encore plus rapide, les mappages suivants me permettent de sauter des parties entières du projet et de trouver des fichiers de manière récursive dans 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! L' pathoption est extrêmement puissante. La valeur ci-dessus - .,**fonctionne pour moi, mais les langues que j'utilise n'ont pas de bibliothèque standard. La valeur appropriée dépend entièrement de vos besoins.


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 mappages ci-dessus répertorient les tampons disponibles dans le "wildmenu" avec une invite vide, me permettant de naviguer dans le menu avec <Tab>ou de taper quelques lettres et <Tab>encore de réduire la liste. Comme avec les mappages de fichiers ci-dessus, le processus est rapide et presque sans friction.

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

Ces mappages parlent d'eux-mêmes.


Jongler avec les tags

nnoremap <leader>j :tjump /

Ce mappage utilise la recherche regex au lieu de la recherche par mot entier afin que je puisse le faire ,jba<Tab>pour trouver une balise foobarbaz().

Oui, la correspondance floue crée une dépendance, mais vous pouvez être tout aussi productif sans elle. Et pour une fraction du coût.


PLUS EDIT

Quelques trucs / astuces supplémentaires…


Options du Wildmenu

Le "wildmenu", activé avec set wildmenu, facilite la navigation dans les fichiers / tampons. Son comportement est régi par un tas 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 toute la cruauté:

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.*

wildignorecasevous permet de rechercher fooet de trouver Foo:

set wildignorecase

Marques de fichier

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é ce bijou chez quelqu'un d'autre ~/.vimrc. Il crée une marque de fichier à la position exacte du curseur chaque fois que vous quittez une mémoire tampon afin que, où que vous soyez, 'Jsaute au dernier tampon JavaScript que vous avez modifié. Impressionnant.

romainl
la source
2
+1. Je n'avais aucune idée du "any subdirectory" en combinaison avec :emais je vais l'utiliser beaucoup à partir de maintenant. Je suis émerveillé par le travail qui est entré dans Ctrl-P et je peux en apprendre beaucoup, mais cela n'a pas fonctionné pour moi. Je l'ai trouvé un peu lent et en tant que tel interrompant mon train de pensées tout en travaillant (cela pourrait être mon système, mes paramètres, moi-même mais je n'ai pas enquêté)
Lieven Keersmaekers
2
**c'est génial, en effet.
romainl
1
J'aimerais à nouveau voter pour la gbcarte. Un autre que j'utiliserai beaucoup. Tous les plugins de tampon que j'ai essayés (CtrlP, bufExplorer, ...) ne sont pas aussi rapides que cela (d'accord, ils offrent plus de fonctionnalités mais pas assez pour que je continue à les utiliser) .
Lieven Keersmaekers
2
@LievenKeersmaekers, c'est là que je l'ai eu et c'est là l'image stupide vient. Merci Bairui!
romainl
4
C'est peut-être la meilleure réponse qui soit.
craigp
5

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

  • S'il s'agit principalement de deux fichiers (par exemple un en-tête C et un fichier d'implémentation), <C-^>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, window :splits détourne le problème de la localisation d'un tampon de la localisation de la fenêtre (une fois que vous avez ouvert tous les tampons). Vous pouvez l'utiliser [N]<C-w><C-w>pour y accéder rapidement.
  • Si vous pouvez mémoriser (quelques) numéros de tampon, les commandes :[N]b[uffer]et :[N]sb[uffer]sont très pratiques; :lsvous indique les chiffres.

Les plugins (ou du moins les mappages personnalisés) peuvent beaucoup améliorer les choses, et il y a toute une variété sur ce sujet sur vim.org . Il existe différents mécanismes pour distribuer votre configuration (Pathogen + GitHub, Dropbox, ...), ou vous pouvez éditer à distance les fichiers du serveur via le plugin netrw fourni avec Vim.

Ingo Karkat
la source
4
Cela vaut probablement la peine de mentionner ctags, cscope, gtags, id et amis. Je trouve que l'utilisation de majuscules est très utile. Utilisez mApour stocker la marque Aet `` `` A '' pour revenir. Je trouve netrw beaucoup plus utile après avoir appris :Rexquels retours dans l'explorateur. :b, :eet bien d'autres peuvent prendre des caractères génériques comme *et **. La :bcommande peut prendre un nom de fichier partiel. Combinez cela avec <c-d>ou le menu sauvage, vous pouvez aller assez loin. En ce qui concerne les plugins, vous pouvez utiliser quelque chose de spécifique au domaine comme rail.vim qui fournit des commandes de navigation spécifiques aux rails ou quelque chose de plus général comme CtrlP.
Peter Rincker
@PeterRincker: +1 pour avoir mentionné les marques. Je suggère de construire une réponse avec des points.
Helbreder
Que signifient <C - ^> et [N] <Cw> <Cw>?
Josh Desmond
5

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

Chris
la source
4

Vous pouvez effectuer la complétion des onglets génériques sur la ligne de commande sans aucun plug-in. 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 souhaitez éditer.

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 parcourra tous les tampons avec «foo» dans le chemin. Vous devrez peut-être définir les options wildmode et wildmenu pour obtenir le comportement souhaité. j'ai

wildmode=longest:full
wildmenu

dans mon .vimrc.

Dave Kirby
la source
2

Si vous êtes sur un nom de fichier et que vous souhaitez accéder à ce fichier, le gffera pour vous. J'aime aussi utiliser ctags , qui n'est pas un plugin; vous construisez simplement les balises et pouvez facilement parcourir votre base de code.

gpojd
la source
1

Si vous voulez basculer entre les fichiers dans l'éditeur vim, veuillez voir la réponse ci-dessous

Appuyez d'abord sur la Esctouche pour quitter le mode d'édition.

Tapez ensuite :epour vérifier le chemin du fichier actuel.

si vous voulez aller dans un autre fichier, tapez en :e /path-of-file.txt/utilisant ceci, vous pouvez changer.

Si vous souhaitez accéder au fichier précédent, tapez simplement :e#le chemin du fichier précédent.

Amol Udage
la source
0

J'ai eu le même problème avec Vim.

La dernière chose que je souhaite est de dépendre des plugins pour une tâche aussi banale que le changement de fichier.

J'ai ajouté les lignes suivantes à .vimrc

set path+=**
set wildmenu

Et BAM! Je peux maintenant :find any/filename/in/any/folder/tant que vim est dans le répertoire racine du projet. L'achèvement des onglets fonctionne. Les jokers fonctionnent!

Une fois que les fichiers sont déjà ouverts et qu'il y a une tonne de tampons en arrière-plan (vous pouvez les utiliser :lspour voir tous les tampons), l'exécution d' :b any/file <TAB>une recherche floue pour tous les tampons et saute vers le fichier requis. Dans le cas où il n'est pas unique, il y aura un wildmenu d'onglets (d'où la 2ème ligne dans .vimrc) qui peuvent être sélectionnés en utilisant tab.

Ma réponse vient de cette superbe vidéo
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Il y a plus d'astuces et je recommande de la regarder.

Oui
la source