Navigation dans les fichiers Vim

90

J'essaie vraiment d'apprendre le vim après avoir utilisé TextMate ces dernières années.

J'ai commencé à valider une partie de la navigation dans le fichier dans la mémoire, mais j'ai du mal à naviguer entre plusieurs fichiers.

Dans mon flux de travail, il est assez courant que je passe assez régulièrement entre une poignée de fichiers (suffisamment de fichiers pour que les fenêtres à volet divisé deviennent trop petites).

J'utilise actuellement NERDTree, mais je trouve que l'exploration des répertoires est fastidieuse et j'utilise constamment CTRL+ W h/ CTRL+ W lpour aller et venir.

Je pense que je ferais mieux avec les onglets que je peux facilement basculer entre eux, mais peut-être que j'ai besoin d'utiliser un flux de travail différent.

J'aimerais aussi un raccourci "Aller au fichier ..." comme CMD+ Tdans TextMate. J'ai trouvé fuzzy_file_findermais cela nécessite que vim soit construit avec des liaisons Ruby, ce qui n'est pas le cas des installations natives sur lesquelles j'ai travaillé.

Bien que je puisse reconstruire, la principale raison pour laquelle je veux passer à vim est que je puisse avoir un environnement d'édition qui, je le sais, fonctionnera facilement sur n'importe quelle plate-forme.

Les options disponibles sont écrasantes, toutes les idées sont très appréciées!

Pete
la source
1
Je n'ai pas trouvé de moyen vraiment satisfaisant de naviguer dans les fichiers et les tampons, qui n'utilise aucune aide externe. Le truc intégré est assez mauvais (je veux dire, passer à un tampon par son numéro? Qui se souvient des numéros de tampon temporaires ...)
Svend
1
@svend: vous pouvez faire référence aux tampons par nom et par numéro - voir ma réponse ci
Dave Kirby

Réponses:

92

Je ne trouve pas que l'exploration des sous-répertoires via plain old :esoit aussi fastidieuse étant donné une configuration décente pour l'achèvement des onglets.

Regardez dans l' 'wildmenu'option pour que Vim affiche une liste de complétions (noms de fichiers) dans la modeline au-dessus de la ligne de commande. Vous pouvez modifier l' 'wildmode'option pour configurer davantage le type de complétion d'onglet que Vim fera.

Personnellement je l'utilise :set wildmode=full.

Mon flux de travail est comme ceci:

  1. :cd dans le répertoire de premier niveau de mon projet.
  2. Pour ouvrir le fichier foo/bar/baz:

    • Scénario le plus simple: tapez :e f<tab>b<tab>b<tab><enter>.

    • S'il y a plus d'un fichier commençant par bdans l'un de ces répertoires, vous devrez peut-être faire un <left>ou un <right>autre <tab>sur le clavier pour sauter entre eux (ou taper quelques lettres de plus pour lever l'ambiguïté).

    • Dans le pire des cas, il existe des fichiers et des répertoires qui partagent un nom et vous devez explorer le répertoire. Dans ce cas, complétez le nom du répertoire par tabulation, puis tapez *<tab>pour explorer en avant.

  3. Ouvrez 2 ou 3 fenêtres et ouvrez les fichiers dans chacune d'entre elles si nécessaire.
  4. Une fois qu'un fichier est ouvert dans un tampon, ne tuez pas le tampon. Laissez-le ouvert en arrière-plan lorsque vous ouvrez de nouveaux fichiers. Juste :eun nouveau fichier dans la même fenêtre.
  5. Ensuite, utilisez :b <tab>pour parcourir les tampons déjà ouverts en arrière-plan. Si vous tapez, :b foo<tab>il ne correspondra qu'aux fichiers actuellement ouverts qui correspondent foo.

J'utilise également ces mappages pour faciliter l'ouverture de nouvelles fenêtres et passer de l'une à l'autre car c'est quelque chose que je fais si souvent.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Cela me prend quelques secondes pour ouvrir Vim, configurer certaines fenêtres et y ouvrir quelques fichiers. Personnellement, je n'ai jamais trouvé aucun des scripts de navigation de fichiers tiers très utile.

Brian Carper
la source
4
Astuce du chapeau pour l'explenation géniale. Agitation du doigt pour le skillz ++, vous devez déjà comprendre l'explication.
M. Baudin
256

Un moyen simple de parcourir le système de fichiers est la commande:

:Sex

Je n'invente pas ça :)


la source
14
et de l'aide, je vois que: Vex est également génial.
jrwren
15
Et cela a 69 votes positifs. Je ne pense pas avoir le cœur de changer cela.
AlbeyAmakiir
3
Et :Vexsi vous voulez diviser l'écran verticalement plutôt qu'horizontalement
sreenivas
1
Wow, je n'ai jamais su ni l'un ni l'autre. Je trouve :Vexplus pratique, mais :Sexje viens de rendre ma journée.
William Robertson
2
pour la petite histoire, :Seça marche aussi (idem pour les Ve, Tevariantes). Pas besoin de faire bizarre :)
Towc
46

:Sex, :Vex, :TexEt :Exsont toutes les commandes utiles pour ex (ploring) les fichiers sur votre système si vous voulez utiliser quelque chose de différent:e

(où S/V/Tsont les abréviations de Split / Vertical / Tab)

Emil Rehhnberg
la source
7

Si vous ne les avez pas déjà trouvés, vous voudrez peut-être vérifier:

  • le plugin original Fuzzy Finder - dont l'IIRC n'a pas les problèmes de liaison Ruby
  • le plugin Project - similaire à NERDTree
  • le plugin de l'explorateur de tampons - affiche une liste des tampons ouverts

Gardez également à l'esprit que vous pouvez remapper les raccourcis clavier dans votre .vimrc pour les rendre moins encombrants. J'utilise beaucoup les fenêtres séparées; J'ai trouvé que les éléments suivants facilitent grandement leur gestion:

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h
dlimeb
la source
5

Je pense que je ferais mieux avec les onglets que je peux facilement basculer entre eux, mais peut-être que j'ai besoin d'utiliser un flux de travail différent.

Connaissez-vous les onglets de Vim? Je ne sais pas si vous faites référence aux propres onglets de Vim là-bas, ou si vous êtes en manque de TextMate. On ne sait pas quelle version de Vim vous utilisez, mais il y a des onglets depuis au moins 7.0 (qui semble être installé partout où je regarde ces derniers temps), et ils sont géniaux.

:tabeouvre un nouveau (abréviation de "tab edit", donc par exemple :tabepour vide ou :tabe path/to/filepour ouvrir un fichier dans un nouvel onglet,) vous pouvez vous déplacer entre les onglets adjacents avec gt/ gT, et il y a aussi un tas d'autres commandes de navigation liées aux onglets, comme vous pourriez vous attendre de Vim ( :help tabs)

Mon flux de travail pour les grands projets a tendance à impliquer un tas d'onglets, chacun avec entre 1 et 3 fenêtres en fonction du type de contexte dont j'ai besoin. Cela fonctionne encore mieux si j'ai une fenêtre de terminal double largeur car je peux diviser verticalement avec :vs, donc un seul onglet peut facilement me montrer 4 fichiers à la fois avec beaucoup de place pour chacun.

Astuce finale: j'utilise parfois la commande "switch buffer" ( :sb <partial_buf_name>) qui ressemble un peu à la recherche floue de TM, en ce sens qu'elle fonctionne plutôt bien mais uniquement pour les tampons déjà ouverts. Toujours génial lorsque j'ai une douzaine de fichiers ou plus ouverts à la fois. (NB J'avais besoin :set switchbuf=usetabdans mon vimrc pour que cela fonctionne sur plusieurs onglets, mais une fois que c'est défini, c'est génial.)

bitprophet
la source
1
Ma compréhension des onglets est qu'il s'agit plus d'un conservateur de mise en page, pas vraiment d'une méthode pour ouvrir un tampon dans chaque onglet (consultez les vues de Bram Molenaars sur les onglets dans la vidéo "7 habitudes d'édition de texte efficace".
Svend
Ensuite, une fois que vous avez identifié des commandes comme celles-ci qui fonctionnent pour vous, vous pouvez les lier à une clé. J'ai le basculement des onglets de contrôle entre les tampons ouverts (à la firefox), mais vous pouvez changer d'onglet à la place.
Jonathan Hartley
vim-titlecasevis avec les mappages gt / gT, mais il existe une solution de contournement .
naught101
5

Je trouve LustyExplorer le meilleur à ce jour.

Vous pouvez ouvrir un fichier en ne tapant qu'une partie de son nom.

Vous pouvez ouvrir un fichier à partir du répertoire du fichier actuel, ou de l'actuel pwd, ou de la liste des tampons.

Si vous ouvrez un fichier à partir de la liste des tampons, vous n'avez pas à naviguer dans l'arborescence des répertoires, bien que malheureusement pour les deux autres modes, vous devez toujours naviguer dans l'arborescence. La bonne chose est que vous n'avez pas à commencer par le premier personnage.

Si tu as:

dir_a/
    ...
dir_b/
    file.js
    file.html

et que vous souhaitez ouvrir, dir_b/file.htmlvous pouvez généralement le trouver en tapantb<Tab>h

hasen
la source
J'ai fait quelques extensions à cet addon génial. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Basiquement me permet d'entrer simplement le nom d'un fichier récemment utilisé, qu'il soit déjà chargé ou non n'a pas d'importance. Cela signifie que vous n'avez besoin de parcourir le FS que lorsque vous ouvrez un fichier pour la première fois.
Svend
4

Il est surprenant de voir que la :findcommande n'a été mentionnée dans aucune des réponses. Je travaille généralement avec des projets de rails où je dois approfondir la hiérarchie des répertoires. Donc, pour un fichier application.css, situé dans app/assets/stylesheets/tout ce que j'ai à taper est :find applica, puis appuyez sur tab pour la saisie semi-automatique et entrez pour ouvrir.

Imran Ali
la source
3

Découvrez le plugin ctrlp comme alternative au plugin Command-T . C'est mieux que cela en ce sens qu'il s'agit d'un script Vim «natif» et qu'il n'a pas besoin que Vim soit compilé avec ruby ​​(ou autre support) alors qu'il s'exécute très rapidement et discrètement.

Nikola
la source
2

Si le fichier que vous souhaitez est déjà chargé dans un tampon (ce qui est probable si vous passez régulièrement d'un fichier à l'autre), vous pouvez rapidement basculer vers le tampon avec la :b[uffer]commande.

:bpeut soit prendre un numéro de tampon comme paramètre, soit (plus utilement) une chaîne qui correspond à une partie du chemin / nom de fichier. S'il y a plusieurs correspondances, vous pouvez utiliser tab pour les parcourir.

Si vous souhaitez diviser la fenêtre et ouvrir le tampon dans la nouvelle fenêtre, utilisez :sb name

Si vous souhaitez ouvrir le tampon dans un nouvel onglet, utilisez :tab b name

Vous pouvez également utiliser la :lscommande pour afficher une liste des tampons actuellement chargés.

Dave Kirby
la source
1

J'utilise cette fonction pour rechercher des fichiers dans des sous-répertoires, mais je ne l'ai pas écrite. C'est du wiki vim :

fonction! Trouver (nom)
    let l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    soit l: num = strlen (substitute (l: list, "[^ \ n]", "", "g")) 
    si l: num 0 
            echo "Pas un nombre" 
            revenir 
        fin si 
        si l: inputl: num 
            echo "Hors de portée" 
            revenir 
        fin si 
        let l: line = matchstr ("\ n" .l: liste, "\ n" .l: entrée. "\ t [^ \ n] *") 
    autre 
      soit l: ligne = l: liste 
    fin si 
    soit l: line = substitute (l: line, "^ [^ \ t] * \ t. /", "", "") 
    exécuter ": e" .l: ligne 
fonction finale 

commander! -nargs = 1 Rechercher: appeler Rechercher ("")

Une chose que j'aime, c'est qu'il prend en charge les caractères génériques (*). Il se comporte également bien pour plusieurs matchs.

uniquesnowflake8
la source
1

En plus des wildmenuréponses, j'utilise le plugin BufExplorer et les mappages suivants pour sauter rapidement les tampons:

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

Ou vous pouvez simplement remplacer l'explorateur de tampons par la :lscommande, qui affiche essentiellement la même chose.

Le dernier mappe le Alt-=pour montrer l'explorateur de tampons.

Je n'utilise pas beaucoup Windows, car je n'ai généralement qu'une ou deux fenêtres.

J'ai également modifié le statuslinepour inclure le numéro du tampon %2n, afin que je sache toujours quel tampon est en cours d'édition. Voir:h statusline

Ayman
la source
0

Voici quelque chose d'assez trivial que je colle dans mon .vimrc. Il chargera un fichier à partir de n'importe quel sous-répertoire.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

Donc je peux juste dire:

: Er Main.java

et il recherchera les sous-répertoires, le trouvera Main.javaet le chargera. Ce n'est pas bien fait pour plusieurs fichiers du même nom, mais c'est simple et rapide.

L'autre outil que j'utilise est VTreeExplorer , qui fournit une fenêtre arborescente de fichiers / répertoires, et ne nécessite aucune option de construction spéciale de VIM (c'est-à-dire qu'il s'agit d'un plugin vanilla).

Brian Agnew
la source
J'aimerais pouvoir charger à partir d'un sous-répertoire, mais le problème des fichiers multiples serait un facteur décisif pour moi. Je suis un développeur Django, j'ai donc généralement un tas de sous-répertoires qui ont tous un models.py, views.pyetc.
Pete
0

Mon flux de travail pour trouver des fichiers est le wildmenu, autocwd et :e.

Parties pertinentes dans .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

Et comment l'utiliser:

:e myf^D

Cela donne tous les fichiers du répertoire courant commençant par myf. Vous pouvez également à <Tab>travers eux. Utilisez retour pour ouvrir :)

^Dvous donnera toujours tous les matchs. Parce qu'autocmd va toujours dans le dossier du fichier actuel, il est facile de travailler avec. Si vous êtes foo/bar.pyet que vous voulez aller chez foo/baz.pyvous, faites-le :e baz.pyet vous y êtes. Cela fonctionne également avec les tampons ( :b foo^Drépertorie tous les tampons commençant par foo)

Armin Ronacher
la source
Que diriez-vous d'accéder à d'autres répertoires? Par exemple, je travaillerai souvent entre ma vue Python, mon modèle HTML et mes fichiers JavaScript qui vivent tous dans des sous-répertoires différents? Dans TextMate, je commence à taper le nom du fichier et toutes les correspondances dans mon "projet" (aka cwd) apparaissent.
Pete
Il ne rentre pas dans les sous-dossiers, non. Mais j'ai adapté mon flux de travail à cela. De plus, une fois le fichier ouvert, je peux simplement mentionner le nom du tampon et ça va. Vous pouvez dire à Vim de se souvenir des tampons ouverts, alors vous n'avez généralement pas du tout besoin de cette fonctionnalité.
Armin Ronacher