web-dev-qa-db-fra.com

Navigation de fichier Vim

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

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

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

J'utilise actuellement NERDTree, mais je trouve que l'exploration des répertoires est fastidieuse et l'utilisation constante CTRL+Wh/CTRL+Wl sauter en arrière.

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

Je voudrais aussi un raccourci "Go to File ..." comme CMD+T dans TextMate. J'ai trouvé fuzzy_file_Finder mais 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 raison principale pour laquelle je souhaite basculer vers vim, c’est pour pouvoir disposer d’un environnement d’éditeur qui, à mon avis, fonctionnera facilement sur n’importe quelle plate-forme.

Les options qui s'offrent à vous sont irrésistibles. Toutes les idées sont très appréciées!

77
Pete

Je ne trouve pas l'exploration dans les sous-répertoires via le vieux :e comme étant aussi fastidieuse compte tenu d'une configuration décente pour la complétion par tabulation.

Examinez l'option 'wildmenu' pour que Vim affiche une liste des complétions (noms de fichiers) dans le modèle au-dessus de la ligne de commande. Vous pouvez modifier l'option 'wildmode' pour configurer davantage le type de complétion par tabulation que Vim fera. 

Personnellement j'utilise :set wildmode=full.

Mon flux de travail est comme ça:

  1. :cd dans le répertoire toplevel 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 b dans l'un de ces répertoires, vous devrez peut-être un <left> ou <right> ou un autre <tab> sur le clavier pour sauter entre eux (ou taper quelques lettres de plus pour ne pas être ambiguë).

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

  3. Ouvrez 2 ou 3 fenêtres et ouvrez tous les fichiers selon vos besoins.
  4. Une fois qu'un fichier est ouvert dans un tampon, ne le détruisez pas. Laissez-le ouvert en arrière-plan lorsque vous ouvrez de nouveaux fichiers. Juste :e un nouveau fichier dans la même fenêtre.
  5. Utilisez ensuite :b <tab> pour parcourir les tampons déjà ouverts en arrière-plan. Si vous tapez :b foo<tab>, il ne correspond qu'aux fichiers actuellement ouverts correspondant à foo.

J'utilise également ces mappages pour faciliter l'ouverture de nouvelles fenêtres et leur permutation entre elles car c'est quelque chose que je fais 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

Il ne me faut que quelques secondes pour ouvrir Vim, configurer certaines fenêtres et y ouvrir quelques fichiers. Personnellement, je n’ai jamais trouvé l’un des scripts de navigation de fichiers tiers très utile.

79
Brian Carper

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

:Sex

Je n'invente rien :)

219
user286754

:Sex, :Vex, :Tex et :Ex sont toutes des commandes utiles pour analyser (graver) les fichiers sur votre système si vous souhaitez utiliser quelque chose de différent de :e

(où S/V/T sont des abréviations de Split/Vertical/Tab)

34
Emil Rehhnberg

Si vous ne les avez pas déjà trouvées, vous pouvez vérifier:

  • l'original Fuzzy Finder plugin - pour lequel le IIRC n'a pas les problèmes de liaison Ruby
  • le plugin Project - similaire à NERDTree
  • le plugin buffer explorer - affiche une liste des buffers ouverts

Notez également que vous pouvez remapper les raccourcis clavier dans votre fichier .vimrc pour les rendre moins encombrants. J'utilise beaucoup les fenêtres divisées; J'ai trouvé que ce qui suit facilite beaucoup les choses:

" 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
6
dlimeb

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 la pwd actuelle 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. Malheureusement, pour les deux autres modes, vous devez toujours naviguer dans l'arborescence. La bonne chose est que vous n'avez pas à partir du premier caractère. 

Si tu as:

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

et vous voulez ouvrir dir_b/file.html vous pouvez généralement le trouver en tapant b<Tab>h

5
hasen

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

Êtes-vous au courant des onglets de Vim? Vous n'êtes pas sûr de savoir si vous vous référiez aux onglets de Vim ou si vous avez envie de TextMate. La version de Vim que vous utilisez n'est pas claire, mais elle contient des onglets depuis au moins la version 7.0 (qui semble être installée partout où je regarde dernièrement), et ils sont géniaux.

:tabe en ouvre un nouveau (abréviation de "tab edit", donc :tabe pour vide ou :tabe path/to/file pour ouvrir un fichier dans un nouvel onglet), vous pouvez vous déplacer entre les onglets adjacents avec gt/gT. les commandes de navigation aussi, comme on peut s'y attendre de Vim (:help tabs)

Mon flux de travail pour les grands projets implique généralement plusieurs onglets, chacun comportant 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 puisque je peux scinder verticalement avec :vs, alors un seul onglet peut facilement me montrer 4 fichiers à la fois avec beaucoup d'espace pour chacun.

Dernier conseil: j’utilise parfois la commande "switch buffer" (:sb <partial_buf_name>), qui ressemble un peu à la recherche floue de TM, en ce sens que cela fonctionne plutôt bien, mais uniquement pour les tampons déjà ouverts. Encore parfait pour quand j'ai une douzaine de fichiers ou plus ouverts à la fois. (NB: il me fallait :set switchbuf=usetab dans mon vimrc pour que cela fonctionne sur plusieurs onglets, mais une fois que c'est défini, c'est génial.)

4
bitprophet

Découvrez le plugin ctrlp comme alternative au plugin Command-T . C'est mieux que cela car il s'agit d'un script Vim 'natif' et il n'est pas nécessaire que Vim soit compilé avec Ruby (ou tout autre support) alors qu'il s'exécute très rapidement et de manière discrète. 

3
nikola

Il est étonnant de voir que la commande :find n’a été mentionnée dans aucune des réponses. Je travaille habituellement avec des projets 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 je dois taper est :find applica, puis appuyez sur tab pour compléter automatiquement et enter pour ouvrir. 

2
Imran Ali

Si le fichier que vous souhaitez est déjà chargé dans un tampon (ce qui est probablement le cas si vous basculez régulièrement entre plusieurs fichiers), vous pouvez rapidement basculer vers le tampon avec la commande :b[uffer]

:b peut soit prendre un numéro de tampon en tant que paramètre, soit (plus utilement) une chaîne qui correspond à part du chemin/nom du fichier. S'il existe plusieurs correspondances, vous pouvez utiliser la touche de tabulation pour les parcourir. 

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

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

Vous pouvez également utiliser la commande :ls pour voir une liste des tampons actuellement chargés.

2
Dave Kirby

connaissez-vous l'application MacVim? Il est VIM poli pour OS X et l’une de ses fonctionnalités est la prise en charge des onglets (CMD + T pour ouvrir un nouvel onglet), un tiroir, etc ... (lisez ceci: http: // zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/ )

Essayez le!

Cordialement Michal 

1
msgre

NerdTree est idéal pour la navigation dans les fichiers dans vim. 

Le lien ci-dessous est une bonne introduction à nerdtree.

http://www.catonmat.net/blog/vim-plugins-nerdtree-vim/

1
xinghua

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

une fonction! Trouvez (nom) 
 let l: list = system ("find. -name '" .a: name. "' '| grep -v \". svn/\ "| Perl -ne' print \" $. \\ t $ _\"' ") 
 let l: num = strlen (substitute (l: list, "[^\n]", "", "g")) 
 si l: num 0 
 echo "Pas un chiffre" 
 revenir 
 fin si 
 si l: inputl: num 
 echo "Hors de portée" 
 revenir 
 fin si 
 let l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^\n] *") 
 autre 
 Soit l: line = l: list 
 fin si 
 let l: line = substitute (l: line, "^ [^\t] *\t. /", "", "") 
 exécutez ": e" .l: line 
 endfunction 

 command! -nargs = 1 Find: appelez Find ("") 

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

1
uniquesnowflake8

En plus des réponses wildmenu, j'utilise BufExplorer plugin et les mappages suivants pour sauter rapidement dans les mémoires 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 tampon par la commande :ls, qui affiche essentiellement la même chose.

Le dernier mappe le Alt-= pour afficher l'explorateur de tampon.

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

J'ai également modifié la variable statusline pour inclure le numéro de tampon %2n, de sorte que je sache toujours quel tampon est en cours d'édition. Voir :h statusline

1
Ayman

Voici quelque chose d'assez simple que je colle dans mon .vimrc. Il chargera un fichier depuis 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>) 

Alors je peux juste dire:

: Er Main.Java

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

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 particulière à partir de VIM (c’est-à-dire qu’il s’agit d’un plugin Vanilla).

0
Brian Agnew

Mon flux de travail pour la recherche de fichiers est le wildmenu, autocwd et :e.

Parties pertinentes dans le .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 qui commencent par myf. Vous pouvez également <Tab> à travers eux. Utilisez return to open :)

^D vous donnera toujours tous les matchs. Comme autocmd va toujours dans le dossier du fichier actuel, il est facile de travailler avec. Si vous êtes dans foo/bar.py et que vous voulez aller à foo/baz.py, vous ne faites que :e baz.py et vous y êtes. Cela fonctionne aussi avec les tampons (:b foo^D liste tous les tampons commençant par foo)

0
Armin Ronacher