2009-09-18 15 views
64

Estoy tratando de aprender vim después de usar TextMate en los últimos años.Navegador de archivos Vim

Empecé a enviar parte de la navegación en el archivo a la memoria, pero estoy luchando con la navegación entre varios archivos.

En mi flujo de trabajo, es bastante común que esté pasando entre un puñado de archivos con bastante regularidad (suficientes archivos como para que las ventanas del panel dividido se vuelvan demasiado pequeñas).

actualmente estoy usando NERDTree pero encuentra la perforación hacia abajo en directorios engorroso, así como el uso constante de CTRL +Wh/CTRL +Wl para saltar hacia atrás y adelante.

Creo que me iría mejor con las pestañas con las que puedo alternar fácilmente, pero quizás deba usar un flujo de trabajo diferente.

yo también como un "ir a Archivo ..." atajo como CMD +T en TextMate. He encontrado fuzzy_file_finder, pero requiere vim para ser construido con enlaces de Ruby, que no es el caso de las instalaciones nativas en las que he trabajado.

Mientras que podría reconstruir la razón principal por la que quiero cambiar a vim es para que pueda tener un entorno de editor que sé que funcionará fácilmente en cualquier plataforma.

¡Las opciones que hay son abrumadoras, cualquier idea es muy apreciada!

+1

No he encontrado una forma realmente satisfactoria de navegar archivos y búferes, que no utiliza ayuda externa en absoluto. Las cosas integradas son bastante malas (quiero decir, ¿cambiar a un buffer por su número? ¿Quién va por ahí recordando números temporales de buffer?) – Svend

+1

@svend: puede referirse a los buffers por nombre y número - vea mi respuesta a continuación –

Respuesta

72

No encuentro que profundizar en los subdirectorios a través de simple viejo :e para ser tan engorroso dada una configuración decente para completar la tabulación.

Mire en la opción 'wildmenu' para que Vim muestre una lista de complementos (nombres de archivos) en la línea de modo sobre la línea de comandos. Puede cambiar la opción 'wildmode' para seguir configurando el tipo de finalización de tabulación que hará Vim.

Personalmente uso :set wildmode=full.

Mi flujo de trabajo es la siguiente:

  1. :cd en el directorio principal de mi proyecto.
  2. Para abrir el archivo foo/bar/baz:

    • escenario más simple: Tipo :e f<tab>b<tab>b<tab><enter>.

    • Si hay más de un archivo a partir de b en uno de esos directorios Es posible que tenga que hacer un <left> o <right> u otra <tab> en el teclado para saltar entre ellos (o escriba unas cuantas más cartas para eliminar la ambigüedad).

    • En el peor de los casos, hay archivos y directorios que comparten un nombre y debe profundizar en el directorio. En este caso, pestaña: complete el nombre del directorio y luego escriba *<tab> para desglosar.

  3. Abra 2 o 3 ventanas y abra archivos en todas ellas según sea necesario.
  4. Una vez que se abre un archivo en un búfer, no elimine el búfer. Déjalo abierto en segundo plano cuando abras archivos nuevos. Solo :e un nuevo archivo en la misma ventana.
  5. Luego, use :b <tab> para recorrer los búferes que ya están abiertos en el fondo. Si escribe :b foo<tab>, solo coincidirá con los archivos actualmente abiertos que coincidan con foo.

También uso estas asignaciones para que sea más fácil abrir ventanas nuevas y saltar entre ellas porque es algo que hago a menudo.

" 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 

Me toma una cuestión de segundos para abrir Vim, establecer algunas ventanas y abrir algunos archivos en ellos. Personalmente, nunca he encontrado que ninguno de los scripts de exploración de archivos de terceros sea muy útil.

+2

Oh. Mi. Dios. Señor; gracias. –

+3

Punta del sombrero para la impresionante explicación. Mucho del dedo para la skillz ++ ya tienes que entender la explicación. –

0

Aquí hay algo bastante trivial que me pego en mi .vimrc. Cargará un archivo desde cualquier subdirectorio.

" 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>) 

Así que sólo puede decir:

: Er Main.java

y va a buscar subdirectorios, encontrar Main.java y cargarlo. No se comporta bien para múltiples archivos del mismo nombre, pero es rápido y simple.

La otra herramienta que uso es VTreeExplorer, que proporciona una ventana de archivos/directorios basada en un árbol, y no requiere ninguna opción de compilación especial de VIM (es decir, es un complemento de vanilla).

+0

Me gustaría poder cargar desde un subdirectorio, pero el problema de archivos múltiples sería un factor decisivo para mí. Soy un desarrollador de Django, por lo que normalmente tengo un conjunto de subdirectorios que tienen un 'models.py',' views.py', etc. – Pete

0

Mi flujo de trabajo para encontrar archivos es wildmenu, autocwd y :e.

partes relevantes en la .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\)$' 

y cómo usarlo:

:e myf^D 

que da todos los archivos en el directorio actual que comienzan con myf. También puede <Tab> a través de ellos. Use return para abrir :)

^D siempre le dará todas las coincidencias.Como autocmd siempre va a la carpeta del archivo actual, es fácil trabajar con él. Si está en foo/bar.py y quiere ir al foo/baz.py, solo hace :e baz.py y ya está. Que también trabaja con tampones (:b foo^D listas de todos los tampones que empiezan con foo)

+0

¿Qué tal si llego a otros directorios? Por ejemplo, a menudo trabajaré entre mi vista de Python, la plantilla HTML y los archivos JavaScript que todos viven en diferentes subdirectorios. En TextMate, empiezo a escribir el nombre del archivo y aparecen todas las coincidencias en mi "proyecto" (aka cwd). – Pete

+0

No se repite en subcarpetas, no. Pero adapté mi flujo de trabajo a eso. También una vez que abro el archivo, puedo mencionar el nombre del buffer y estoy bien. Puedes decirle a Vim que recuerde los búferes abiertos, entonces generalmente no necesitas esa función en absoluto. –

4

creo que haría mejor con pestañas que puede alternar fácilmente entre, pero tal vez necesidad de utilizar un flujo de trabajo diferente.

¿Conoces las pestañas de Vim? No estoy seguro de si se estaba refiriendo a las pestañas de Vim allí, o de las de TextMate. No está claro qué versión de Vim estás usando, pero tiene pestañas desde al menos 7.0 (que parece que está instalada en todos lados últimamente) y son geniales.

:tabe abre una nueva (la abreviatura de "pestaña de edición", por lo que por ejemplo :tabe de vacío o :tabe path/to/file para abrir un archivo en una nueva pestaña,) puede moverse entre pestañas adyacentes con gt/gT, y hay un montón de otros comandos de navegación relacionados con pestañas también, como cabría esperar de Vim (:help tabs)

Mi flujo de trabajo para proyectos grandes tiende a involucrar un grupo de pestañas, cada una con entre 1 y 3 ventanas dependiendo del tipo de contexto que necesito. Esto funciona incluso mejor si tengo una ventana de terminal doble porque puedo dividirme verticalmente con :vs, entonces una sola pestaña puede mostrarme fácilmente 4 archivos a la vez con suficiente espacio para cada uno.

Consejo final: a veces utilizo el comando "cambiar buffer" (:sb <partial_buf_name>) que es bastante parecido al hallazgo difuso de TM, ya que funciona bastante bien pero solo para buffers ya abiertos. Todavía es genial para cuando tengo una docena o más archivos abiertos a la vez. (N. B. necesitaba :set switchbuf=usetab en mi vimrc para que esto funcione a través de pestañas, pero una vez que se ha configurado, es genial.)

+1

Mi comprensión de las pestañas es que es más un conservador de diseño, no es realmente un método de tener un búfer abierto en cada pestaña (echa un vistazo a las propias vistas de Bram Molenaars en las pestañas del video "7 hábitos de edición efectiva de texto". – Svend

+0

has descubierto comandos como estos que funcionan para ti, puedes vincularlos a una clave. Tengo flip de pestaña de control entre búferes abiertos (a la firefox), pero puedes cambiar de pestaña en su lugar. –

5

encuentro LustyExplorer el mejor hasta ahora.

Puede abrir un archivo escribiendo solo una parte de su nombre.

Puede abrir un archivo desde el directorio del archivo actual, o el pwd actual, o desde la lista de almacenamiento intermedio.

Si abre un archivo de la lista de almacenamiento intermedio, no tiene que navegar por el árbol de directorios, aunque desafortunadamente para los otros dos modos, todavía tiene que navegar por el árbol. Lo bueno es que no tienes que empezar desde el primer personaje.

Si usted tiene:

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

y que desea abrir dir_b/file.html general, se puede encontrar tecleando

+0

Hice algunas extensiones a este complemento impresionante. http://www.svendtofte.com/wp-content/uploads/2009/08/lusty-explorer-mod.vim http://www.svendtofte.com/other/vim-stuff/ Básicamente, me permite simplemente ingresar el nombre de un archivo usado recientemente, ya sea que esté cargado o no, no importa.Esto significa que solo necesita explorar el FS cuando abre un archivo por primera vez. – Svend

6

Si usted no los ha encontrado ya, es posible que desee comprobar hacia fuera:

  • el original fuzzy finder plug-in - IIRC, que no tiene los problemas de fijación de Ruby
  • el plugin Proyecto - similar a NERDTree
  • el buffer explorador plug-in - muestra una lista de los buffers abiertos

también tener en cuenta que puede volver a asignar atajos de teclado en su .vimrc para hacerlos menos engorroso. Uso ventanas divididas mucho; He encontrado la siguiente composición tratar con ellos mucho más fácil:

" 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 
+0

http://github.com/jamis/fuzzyfinder_textmate es mejor – aehlke

1

utilizo esta función para encontrar archivos en los subdirectorios, yo no lo escribí sin embargo. Es de la vim wiki:

 
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("") 

Una cosa que me gusta es que tiene soporte para caracteres comodín (*). También se comporta bien para múltiples partidos.

1

Además de los wildmenu respuestas, yo uso BufExplorer plugin, y las siguientes asignaciones para saltar rápidamente tampones:

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 

O puede simplemente reemplazar el explorador buffer con el comando :ls, que básicamente muestran la misma cosa.

El último asigna el Alt-= para mostrar el explorador de búfer.

No uso tanto Windows, ya que generalmente solo tengo una o dos ventanas.

También modifiqué el statusline para incluir el número de memoria intermedia %2n, por lo que siempre sé qué memoria intermedia se está editando. Ver :h statusline

183

Una manera fácil de navegar por el sistema de archivos es el comando:

:Sex 

No estoy haciendo esto para arriba :)

+53

+1 ¡El sexo hizo mi día! :-) –

+11

y de la ayuda veo que: Vex también es genial. – jrwren

+1

: Sexplore ... ¡ja! – Kasapo

2

Si el archivo que desea es ya cargado en un búfer (que es probable si está intercambiando entre un puñado de archivos regularmente), entonces puede cambiar rápidamente al búfer con el comando :b[uffer].

:b puede tomar un número tampón como un parámetro, o (más útilmente) una cadena que coincide parte de la ruta/nombre de archivo. Si hay varias coincidencias, puede usar la pestaña para recorrerlas.

Si desea dividir la ventana y abrir el buffer en la nueva ventana a continuación, utilizar :sb name

Si desea abrir la memoria intermedia en una nueva pestaña y luego utilizar :tab b name

También puede utilizar el :ls comando para ver una lista de los búferes cargados actualmente.

23

:Sex, :Vex, :Tex y :Ex son todos los comandos útiles para la ex (ploring) los archivos en su sistema si desea utilizar algo diferente de :e

(donde S/V/T son la abreviatura de split/vertical/Tab)

3

Mira el plugin ctrlp como una alternativa al plugin Command-T. Es mejor que esto porque es una secuencia de comandos Vim 'nativa' y no necesita que Vim se compile con ruby ​​(u otro soporte) mientras se ejecuta muy rápido y sin molestias.

2

Es sorprendente ver que :find comando no ha sido mencionado en ninguna de las respuestas. Normalmente trabajo en proyectos de rieles donde necesito profundizar en la jerarquía de directorios. Así que para un archivo application.css, ubicado en app/assets/stylesheets/ todo lo que tengo que escribir es :find applica y luego presione pestaña para autocompletar y ingrese para abrir.

Cuestiones relacionadas