salir - vim, cambiando entre archivos rápidamente usando vanim Vim(sin complementos)
vim guardar (6)
Entiendo que limitarme a Vim vainilla (sin usar complementos) limita el poder del editor, pero como cambio entre diferentes máquinas con frecuencia, a menudo es demasiado problema mover mi entorno por todas partes. Quiero quedarme en vainilla Vim.
Algo que me detiene es la capacidad de cambiar rápidamente de un archivo a otro. Yo (creo al menos) tengo una buena comprensión de los búferes , ventanas , pestañas , así como netrw ( Vex
, Ex
, etc.).
Pero en un editor como Sublime Text , puedo simplemente escribir ctrl - p y al instante estoy en el archivo.
Sé que puedo pasar al shell, pero me pregunto si hay otros secretos "ocultos" para cambiar rápidamente entre los archivos en Vim basados en algo más que el nombre del archivo.
A veces también es útil ir secuencialmente a través de una lista de archivos (por ejemplo, si hiciste algo como vim *.php
para abrir 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).
El equivalente más cercano ("más cercano", no "exacto") a Ctrl + P de ST2 es un complemento llamado, prepárate ... vim.org/scripts/script.php?script_id=3736 . Hay otros complementos similares como Command-T o FuzzyFinder .
Uso CtrlP y me encanta, pero apoyo totalmente tu decisión de utilizar "sin complementos". No es la forma más fácil de ir, pero dará resultado a largo plazo.
Abrir archivos
La forma más básica de abrir un archivo es :e /path/to/filename
. Afortunadamente, obtienes complementos 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 foo
en su nombre bajo el directorio de trabajo o:
:e **/*foo/*bar<Tab>
para elegir entre todos los archivos que contienen la bar
en su nombre bajo cualquier subdirectorio que contenga foo
en su nombre, en cualquier parte bajo el directorio de trabajo.
Por supuesto, eso funciona para :tabe[dit]
:sp[lit]
y :vs[plit]
, también.
Sin embargo, esos comandos están limitados a un archivo. Uso :next
de abrir múltiples archivos:
:next **/*.js
y eche un vistazo a :help arglist
.
Saltando entre buffers
: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 conteo.
El :ls
muestra una lista de búferes cargados. Sin embargo, es un poco "especial": a los buffers se les asigna un número cuando se crean para que pueda tener una lista que se parece a 1 2 5
si elimina los búferes. 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 ciclismo :bn :bp
.
De todos modos, aquí hay un buen mapeo que enumera todos los búferes cargados y rellena el mensaje para usted, esperando que escriba el número de un búfer y presione <enter>
:
nnoremap gb :ls<CR>:b<Space>
Con este mapeo, cambiar a otro buffer 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 Vim de Bairui :
Vim también tiene <C-^>
(o <C-6>
en algunos teclados) -el modo normal equivalente de :b#
-para saltar entre el buffer actual y el anterior. Úselo si a menudo alterna entre dos buffers.
Lea todo sobre los buffers en :help buffers
.
Ir a la declaración
Dentro de un archivo, puede usar gd
o gD
.
Dentro de un proyecto, la función de "etiquetas" de Vim es su amigo, pero necesitará un indexador de código externo como ctags o cscope. Los comandos más básicos son :tag foo
y <C-]>
con el cursor sobre un nombre de método. Ambas herramientas están bien integradas en Vim: ver :help tags
:help ctags
y :help cscope
.
Por lo que vale, utilizo la navegación de etiquetas extensivamente para moverme dentro de un proyecto (usando los comandos de CtrlP :CtrlPTag
y :CtrlPBufTag
, en su mayoría, pero los que también lo hacen) y mi método de conmutación de buffer "genérico" favorito es por nombre.
Implementando su 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 máquina nueva. Piénsalo.
EDITAR
Hace unos meses, tuve que trabajar en una máquina remota con un Vim obsoleto. Pude haber instalado un Vim adecuado y clonado mi propia configuración querida, pero esta vez decidí viajar ligero para "afilar la sierra". Rápidamente construí un .vimrc
minimalista y .vimrc
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 demasiadas dependencias.
Malabares con archivos
set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *
:find
es realmente un gran comando tan pronto como set path
correctamente. Con mi configuración ,ffoo<Tab>
encontrará todos los archivos que contienen foo
bajo el directorio actual, recursivamente. Es rápido, intuitivo y liviano. Por supuesto, me beneficio de la misma finalización y comodines que con :edit
y amigos.
Para que el proceso sea aún más rápido, las siguientes asignaciones me permiten omitir partes completas del proyecto y buscar archivos recursivamente bajo 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 opción de path
es extremadamente poderosa. El valor anterior- .,**
-trabaja para mí, pero los idiomas que uso no tienen una biblioteca estándar. El valor adecuado depende completamente de sus necesidades.
Malabares con buffers
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 almacenamientos intermedios disponibles en "wildmenu" con un aviso vacío, lo que me permite navegar por el menú con <Tab>
o escribir algunas letras y <Tab>
nuevo para restringir la lista. Al igual que con las asignaciones de archivos anteriores, el proceso es rápido y casi sin fricción.
nnoremap <PageUp> :bprevious<CR>
nnoremap <PageDown> :bnext<CR>
Esas asignaciones hablan por sí mismas.
Hacer malabares con las etiquetas
nnoremap <leader>j :tjump /
Esta asignación utiliza la búsqueda de ,jba<Tab>
regulares en lugar de la búsqueda de palabras completas, así que puedo hacer ,jba<Tab>
para encontrar la etiqueta foobarbaz()
.
Sí, la combinación 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 / buffer. Su comportamiento se rige por un conjunto 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.*
wildignorecase
permite buscar foo
y 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 el ~/.vimrc
otra persona. Crea una marca de archivo en la posición exacta del cursor cada vez que deja un búfer para que, donde sea que esté, ''J
salta al último búfer de JavaScript que ha editado. Increíble.
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 utiliza una ventana grande de editor, window
:split
s convierte el problema de localizar un buffer en la ubicación de la ventana (una vez que tiene todos los buffers abiertos). Puede usar[N]<Cw><Cw>
para cambiar rápidamente a él. - Si puede memorizar (unos pocos) números del buffer, los comandos
:[N]b[uffer]
y:[N]sb[uffer]
son bastante útiles;:ls
te 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 remotamente archivos del servidor a través del plugin netrw que se envía con Vim.
Puede completar la ficha comodín en la línea de comandos 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 por:
:b foo<tab>
que recorrerá todos los buffers con ''foo'' en el camino. Es posible que deba establecer las opciones de modo salvaje y comodín para obtener el comportamiento que desea. yo tengo
wildmode=longest:full
wildmenu
en mi .vimrc.
Si desea cambiar entre los archivos en el editor vim, consulte la siguiente respuesta
Primero presione la Esc
para salir del modo de edición.
Luego escriba :e
para verificar la ruta actual del archivo.
si desea ir a otro archivo, escriba :e /path-of-file.txt/
con esto puede cambiar.
Si quiere ir al archivo anterior, simplemente escriba :e#
que cambia a la ruta del archivo anterior.