vim, cambiando entre archivos rápidamente usando vanilla Vim (sin complementos)

103

Entiendo que limitarme a Vanilla Vim (no usar complementos) limita el poder del editor, pero como cambio entre diferentes máquinas con frecuencia, a menudo es demasiado problema mover mi entorno a todas partes. Solo quiero quedarme en Vanilla Vim.

Algo que me frena es la capacidad de cambiar rápidamente entre archivos. I (creer al menos) tienen una buena comprensión de los tampones , ventanas , pestañas , así como netrw ( Vex, Ex, etc.).

Pero en un editor como Sublime Text , puedo simplemente escribir ctrl, py al instante estoy en el archivo.

Sé que puedo bajar al shell, pero me pregunto si hay otros secretos "ocultos" para cambiar rápidamente entre archivos en Vim basados ​​en algo más que el nombre del archivo.

Jonathan.Brink
fuente
2
Esto no responde a su pregunta, pero podría persuadirlo de considerar el uso de complementos: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood
Yo personalmente sincronizo mi configuración con Dropbox. Es torpe pero funciona más o menos sin tener que pensar en ello. El único complemento que uso y sé que funciona bien para lo que quieres es Command-T ( github.com/wincent/Command-T ). Ctrl-P podría ser una alternativa ( vim.org/scripts/script.php?script_id=3736 ).
FX
1
¿Has visto danielmiessler.com/study/vim ? Tiene la práctica muy inteligente de poner su vimrc + todos los plugns que necesita en Github ... y donde quiera que vaya, puede clonarlo y listo, Vim es exactamente como le gusta. Brilliant
bobox
6
@bobox, decenas de miles de personas hacen eso; no hay nada extraordinario en eso.
Romel

Respuestas:

236

El equivalente más cercano ("más cercano", no "exacto") a ST2's Ctrl+ Pes un complemento llamado, prepárate ... CtrlP . Hay otros complementos similares como Command-T o FuzzyFinder .

Utilizo CtrlP y me encanta, pero apoyo incondicionalmente su decisión de ir "sin complementos". No es la forma más fácil de hacerlo, pero a la larga dará sus frutos.


Abrir archivos

La forma más básica de abrir un archivo es :e /path/to/filename. Afortunadamente, obtienes finalización de tabulación y comodines: el clásico *y uno especial **, que significa "cualquier subdirectorio".

Combinando todo eso, puedes hacer:

:e **/*foo<Tab>

para elegir entre todos los archivos que contienen foosu nombre en el directorio de trabajo o:

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

para elegir entre todos los archivos que contienen barsu nombre en cualquier subdirectorio que contenga foosu nombre, en cualquier lugar del directorio de trabajo.

Por supuesto, que trabaja para :tabe[dit], :sp[lit]y :vs[plit], también.

Sin embargo, esos comandos están limitados a un archivo. Úselo :nextpara abrir varios archivos:

:next **/*.js

y échale un vistazo :help arglist.


Saltando entre búferes

:b[uffer] es el comando básico de conmutación de búfer:

: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

Tenga en cuenta que muchos de estos comandos y sus familiares aceptan un recuento.

El :lscomando le muestra una lista de búferes cargados. Sin embargo, es un poco "especial": a los búferes se les asigna un número cuando se crean para que pueda tener una lista que se parece a 1 2 5si los borra. Esto es un poco incómodo, sí, y eso hace que cambiar a un búfer por su número sea demasiado problemático. Prefiere cambiar por nombre parcial :b foo<Tab>o en bicicleta :bn :bp.

De todos modos, aquí hay un mapeo genial que enumera todos los búferes cargados y llena el mensaje por usted, esperando que ingrese el número de un búfer y presione <enter>:

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

Con este mapeo, cambiar a otro búfer es tan simple como:

gb
(quickly scanning the list)
3<CR>

o:

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

La idea proviene de esta imagen tomada de la colección de infografías de Vim de Bairui :

Volar vs andar en bicicleta

Vim también tiene <C-^>(o <C-6>en algunos teclados) —el equivalente en modo normal :b#de— para saltar entre el búfer actual y el anterior. Úselo si a menudo alterna entre dos búferes.

Lea todo sobre búferes en :help buffers.


Ir a declaración

Dentro de un archivo, puede usar gdo gD.

Dentro de un proyecto, la función de "etiquetas" de Vim es su amiga, pero necesitará un indexador de código externo como ctags o cscope. Los comandos más básicos son :tag fooy <C-]>con el cursor sobre el nombre de un método. Ambas herramientas están bien integrados en Vim: ver :help tags, :help ctagsy :help cscope.

Por lo que vale, utilizo la navegación de etiquetas ampliamente para moverme dentro de un proyecto (usando CtrlP :CtrlPTagy :CtrlPBufTagcomandos, principalmente, pero también los integrados) y mi método de cambio de búfer "genérico" favorito es el nombre.


Implementando tu configuración

Muchos usuarios de Vim ponen su configuración bajo control de versiones, lo que hace que sea muy rápido y fácil instalar su propia configuración en una nueva máquina. Piénsalo.


EDITAR

Hace unos meses, tuve que trabajar en una máquina remota con un Vim desactualizado. Podría haber instalado un Vim adecuado y clonar mi propia configuración querida, pero decidí viajar ligero, esta vez, para "afilar la sierra". Rápidamente construí un minimalista .vimrcy revisé un par de características nativas medio olvidadas. Después de ese concierto, decidí que CtrlP no era tan necesario y me deshice de él: las funciones nativas y las asignaciones personalizadas no son tan atractivas, pero hacen el trabajo sin muchas dependencias.


Haciendo malabares con archivos

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

:findes un gran comando tan pronto como lo hagas set pathcorrectamente. Con mi configuración, ,ffoo<Tab>encontrará todos los archivos que contienenfoo en el directorio actual, de forma recursiva. Es rápido, intuitivo y ligero. Por supuesto, me beneficio de la misma finalización y comodines que con :edity amigos.

Para que el proceso sea aún más rápido, las siguientes asignaciones me permiten omitir partes enteras del proyecto y buscar archivos de forma recursiva en el directorio del archivo actual:

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>

¡ADVERTENCIA! La pathopción es extremadamente poderosa. El valor anteriormente .,**-Funciona para mí , pero los idiomas que utilizo no tienen una biblioteca estándar. El valor adecuado depende completamente de sus necesidades.


Haciendo malabares con los amortiguadores

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Las asignaciones anteriores enumeran los búferes disponibles en el "menú comodín" con un mensaje vacío, lo que me permite navegar por el menú <Tab>o escribir algunas letras y, <Tab>nuevamente, reducir la lista. Al igual que con las asignaciones de archivos anteriores, el proceso es rápido y casi sin fricciones.

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

Esas asignaciones hablan por sí solas.


Haciendo malabares con etiquetas

nnoremap <leader>j :tjump /

Este mapeo utiliza la búsqueda de expresiones regulares en lugar de la búsqueda de palabras completas, por lo que puedo hacer ,jba<Tab>para encontrar la etiqueta foobarbaz().

Sí, la coincidencia difusa es adictiva, pero puede ser igual de productivo sin ella. Y por una fracción del costo.


MÁS EDITAR

Un par de consejos / trucos adicionales ...


Opciones de Wildmenu

El "wildmenu", habilitado con set wildmenu, facilita la navegación de archivos / búfer. Su comportamiento se rige por un montón de opciones que vale la pena investigar:

wildmode le dice a Vim cómo quieres que se comporte el "wildmenu":

set wildmode=list:full

wildignore filtra todo el cruft:

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

wildignorecasele permite buscar fooy encontrar Foo:

set wildignorecase

Marcas de archivo

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

Recientemente encontré esta joya en la de otra persona ~/.vimrc. Crea una marca de archivo en la posición exacta del cursor cada vez que deja un búfer para que, dondequiera que esté, 'Jsalte al último búfer de JavaScript que editó. Increíble.

romainl
fuente
2
+1. No tenía idea acerca del "cualquier subdirectorio" en combinación con, :epero lo usaré mucho a partir de ahora. Me maravilla el trabajo que llegó a Ctrl-P y puedo aprender mucho de él, pero no funcionó para mí. Descubrí que era un poco lento y, como tal, interrumpía mi línea de pensamiento mientras trabajaba (podría ser mi sistema, mi configuración, yo mismo, pero no investigué)
Lieven Keersmaekers
2
**es genial, de hecho.
romainl
1
Me encantaría volver a votar a favor del gbmapa. Otro que usaré mucho. Todos los complementos de búfer que he probado (CtrlP, bufExplorer, ...) no son tan rápidos como este (concedido, ofrecen más funcionalidad pero no lo suficiente como para seguir usándolos) .
Lieven Keersmaekers
2
@LievenKeersmaekers, de aquí es de donde lo saqué y de aquí de donde viene la imagen tonta. ¡Gracias Bairui!
romainl
4
Esta podría ser la mejor respuesta de todos los tiempos.
craigp
5

La respuesta depende mucho de tus preferencias y circunstancias. Algunos ejemplos:

  • Si se trata principalmente de dos archivos (por ejemplo, un encabezado C y un archivo de implementación), <C-^>es muy útil. En general, el archivo alternativo es un concepto importante.
  • Si usa una ventana de editor grande, las ventanas :splitevitan que el problema de localizar un búfer no ubique la ventana (una vez que haya abierto todos los búferes). Puedes usar[N]<C-w><C-w> para cambiar rápidamente a él.
  • Si puede memorizar (algunos) números de búfer, los comandos :[N]b[uffer]y :[N]sb[uffer]son bastante útiles; :lste dice los números.

Los complementos (o al menos las asignaciones personalizadas) pueden mejorar mucho las cosas, y hay una gran variedad sobre este tema en vim.org . Existen varios mecanismos para distribuir su configuración (Pathogen + GitHub, Dropbox, ...), o puede editar de forma remota los archivos del servidor a través del complemento netrw que viene con Vim.

Ingo Karkat
fuente
4
Probablemente valdría la pena mencionar ctags, cscope, gtags, id y friends. Encuentro que usar marcas en mayúsculas es muy útil. Use mApara almacenar la marca Ay `` `` A``` para regresar. Encuentro a netrw mucho más útil después de enterarme de :Rexcuál regresa al explorador. :b, :ey muchos otros pueden utilizar comodines como *y **. El :bcomando puede tomar un nombre de archivo parcial. Combine eso con <c-d>o el menú salvaje y puede llegar bastante lejos. En cuanto a los complementos, puede usar algo específico de dominio como rail.vim que proporciona comandos de navegación específicos de rieles o algo más general como CtrlP.
Peter Rincker
@PeterRincker: +1 por mencionar las marcas. Sugiero construir una respuesta con marcas.
Helbreder
¿Qué significan <C - ^> y [N] <Cw> <Cw>?
Josh Desmond
5

A veces también es útil recorrer secuencialmente una lista de archivos (por ejemplo, si hizo algo como vim *.phpabrir varios archivos a la vez). Luego, puede usar :n[ext](así como :prev[ious], :fir[st]y :la[st]) para la navegación (además de lo que se sugirió en las otras respuestas).

chris
fuente
4

Puede completar la pestaña comodín en la línea de comando sin ningún complemento. p.ej

:e src/**/foo*<tab>

le permitirá recorrer todos los archivos que comienzan con 'foo' en el árbol de directorios bajo ./src y seleccionar el que desea editar.

Si ya ha editado el archivo y todavía está en un búfer, puede cambiarlo con:

:b foo<tab>

que recorrerá todos los búferes con 'foo' en la ruta. Es posible que deba configurar las opciones wildmode y wildmenu para obtener el comportamiento que desea. yo tengo

wildmode=longest:full
wildmenu

en mi .vimrc.

Dave Kirby
fuente
2

Si está en un nombre de archivo y desea saltar a ese archivo, gflo hará por usted. También me gusta usar ctags , que no es un complemento; simplemente crea las etiquetas y puede saltar fácilmente por su código base.

gpojd
fuente
1

Si desea cambiar entre archivos en el editor vim, consulte la respuesta a continuación

Primero presione la Esctecla para salir del modo de edición.

Luego escriba :epara verificar la ruta del archivo actual.

si desea ir a otro archivo, escriba :e /path-of-file.txt/usando este, puede cambiar.

Si desea ir al archivo anterior, simplemente escriba :e#el cambio a la ruta del archivo anterior.

Amol Udage
fuente
0

Tuve el mismo problema con Vim.

Lo último que quiero es depender de complementos para una tarea tan mundana como el cambio de archivos.

Agregué las siguientes líneas a .vimrc

set path+=**
set wildmenu

¡Y BAM! Ahora puedo :find any/filename/in/any/folder/siempre que vim esté en el directorio raíz del proyecto. La finalización de pestañas funciona. ¡Los comodines funcionan!

Una vez que los archivos ya están abiertos, y hay un montón de búferes en segundo plano (puede usarlos :lspara ver todos los búferes), la ejecución realizará :b any/file <TAB>una búsqueda aproximada de todos los búferes y saltará al archivo requerido. En caso de que no sea único, habrá un menú comodín de pestañas (de ahí la segunda línea en .vimrc) que se puede seleccionar usando la pestaña.

Mi respuesta proviene de este increíble video
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Hay más trucos y recomiendo verlo.


fuente