Navigation dans les fichiers Vim
-
22-07-2019 - |
Question
J'essaie vraiment d'apprendre Vim après avoir utilisé TextMate ces dernières années.
J'ai commencé à mémoriser une partie de la navigation dans les fichiers, mais j'ai du mal à naviguer entre plusieurs fichiers.
Dans mon flux de travail, il est assez courant que je bascule assez régulièrement entre une poignée de fichiers (assez 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 que j'utilise constamment CTRL+W h/CTRL+W je faire des allers-retours.
Je pense que je ferais mieux avec des onglets entre lesquels je peux facilement basculer, mais je dois peut-être utiliser un flux de travail différent.
J'aimerais aussi un raccourci "Aller au fichier..." 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é.
Alors que je pourrait reconstruire la principale raison pour laquelle je souhaite passer à vim est pour pouvoir disposer d'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 !
La solution
Je ne trouve pas que l'exploration dans les sous-répertoires par l'intermédiaire d'un ancien <<> soit aussi compliquée étant donné une configuration correcte pour la complétion par des tabulations.
Examinez l'option :e
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 'wildmenu'
pour configurer davantage le type de complétion par tabulation que Vim fera.
Personnellement, j'utilise 'wildmode'
.
Mon flux de travail est comme ceci:
-
:set wildmode=full
dans le répertoire de niveau supérieur de mon projet. -
Pour ouvrir le fichier
:cd
:-
Scénario le plus simple: tapez
foo/bar/baz
. -
S'il existe plusieurs fichiers commençant par
:e f<tab>b<tab>b<tab><enter>
dans l'un de ces répertoires, vous devrez peut-être effectuer uneb
ou<left>
ou un autre<right>
sur le clavier pour passer d'un fichier à l'autre (ou tapez encore quelques lettres pour lever l’ambiguïté). -
Dans le pire des cas, il existe des fichiers et des répertoires qui portent un même 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 faire un zoom avant.
-
- Ouvrez 2 ou 3 fenêtres et ouvrez tous les fichiers nécessaires.
- 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. Il suffit de
*<tab>
créer un nouveau fichier dans la même fenêtre. - Ensuite, utilisez
:b <tab>
pour parcourir les tampons déjà ouverts en arrière-plan. Si vous tapez:b foo<tab>
, cela ne correspond qu'aux fichiers actuellement ouverts qui correspondent à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 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
Il me faut 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.
Autres conseils
Un moyen simple de parcourir le système de fichiers est la commande suivante:
:Sex
Je n'invente rien:)
:Sex
, :Vex
, :Tex
et :Ex
sont des commandes utiles pour explorer (explorer) 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 pour Split / Vertical / Tab)
Si vous ne les avez pas déjà trouvées, vous pouvez vérifier:
- l'original plug-in de recherche de flous - ce que l'IIRC n'a pas avoir les problèmes de liaison Ruby
- le plugin Project - similaire à NERDTree
- le plugin explorateur de tampons - affiche une liste des tampons ouverts
N'oubliez pas non plus 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é les solutions suivantes qui facilitent grandement leur traitement:
" 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
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, du fichier pwd
actuel 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 vous avez:
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
Je pense que je ferais mieux avec des 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 ne savez pas très bien si vous faites allusion aux onglets de Vim ou à ceux 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 récemment), et ils sont géniaux.
:tabe
en ouvre un nouveau (abréviation de " onglet édition " ;, donc par exemple :tabe path/to/file
pour vide ou gt
pour ouvrir un fichier dans un nouvel onglet), vous pouvez déplacer entre les onglets adjacents avec gT
/ :help tabs
, et il y a un tas d'autres commandes de navigation liées aux onglets, comme vous pouvez vous attendre de Vim (:vs
)
Mon flux de travail pour les grands projets implique généralement plusieurs onglets comportant chacun 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 scinder verticalement avec :sb <partial_buf_name>
. Ainsi, un seul onglet peut facilement afficher 4 fichiers à la fois avec suffisamment de place pour chacun.
Dernier conseil: j’utilise parfois le " switch buffer " commande (:set switchbuf=usetab
) 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 <=> dans mon vimrc pour que cela fonctionne avec les onglets, mais une fois que c'est défini, c'est génial.)
Découvrez le plugin ctrlp comme alternative au plugin Commande-T.C'est mieux que cela dans la mesure où il s'agit d'un script Vim « natif » et n'a pas besoin que Vim soit compilé avec Ruby (ou un autre support) alors qu'il s'exécute très rapidement et discrètement.
Si le fichier souhaité est déjà chargé dans une mémoire tampon (ce qui est probablement le cas si vous basculez régulièrement entre plusieurs fichiers), vous pouvez rapidement basculer vers la mémoire tampon avec la commande :b[uffer]
.
:b
peut prendre un numéro de tampon en tant que paramètre ou (plus utilement) une chaîne qui correspond à la partie du chemin / nom du fichier. S'il y a plusieurs correspondances, vous pouvez utiliser la 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 afficher une liste des mémoires tampons actuellement chargées.
Il est surprenant de voir que la :find
commande n'a été mentionnée dans aucune des réponses. Je travaille habituellement 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/
, il me suffit de taper :find applica
puis d'appuyer sur onglet pour la saisie semi-automatique et sur entrer pour l'ouvrir.
J'utilise cette fonction pour rechercher des fichiers dans des sous-répertoires, mais je ne l'ai pas écrite. Cela provient du wiki vim :
function! Find(name) let l:list=system("find . -name '".a:name."' | grep -v \".svn/\" | perl -ne 'print \"$.\\t$_\"'") let l:num=strlen(substitute(l:list, "[^\n]", "", "g")) if l:num 0 echo "Not a number" return endif if l:inputl:num echo "Out of range" return endif let l:line=matchstr("\n".l:list, "\n".l:input."\t[^\n]*") else let l:line=l:list endif let l:line=substitute(l:line, "^[^\t]*\t./", "", "") execute ":e ".l:line endfunction command! -nargs=1 Find :call Find("")
Une chose que j’aime est qu’il supporte les caractères génériques (*). Il se comporte également bien pour plusieurs matches.
En plus des wildmenu
réponses, j'utilise BufExplorer plug-in 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
Vous pouvez également remplacer l'explorateur de mémoire 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é le statusline
pour inclure le numéro de tampon %2n
, afin que je sache toujours quel tampon est en cours d'édition. Voir :h statusline
connaissez-vous l'application MacVim? Il est poli pour VIM pour OS X et l’une de ses fonctionnalités est la prise en charge des onglets (CMD + T pour ouvrir un nouvel onglet), il possède un tiroir, etc ... (lisez ceci: http://zerokspot.com/weblog/2008/08/03/macvim-as-textmate-replacement/ )
Essayez-le!
Cordialement Michal
NerdTree est idéal pour la navigation dans les fichiers dans vim.
Le lien ci-dessous est une bonne introduction à nerdtree.
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>)
Je peux donc simplement dire:
: Er Main.java
et il recherchera les 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 simple et rapide.
L’autre outil que j’utilise est VTreeExplorer , qui fournit une fenêtre de fichiers / répertoires basée sur une arborescence, et ne nécessite aucune option de construction particulière de VIM (c’est-à-dire qu’il s’agit d’un plugin vanilla).
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 en cours qui commencent par myf. Vous pouvez également <Tab>
les parcourir. 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 souhaitez aller à foo/baz.py
, vous ne le 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)