Hay una gran cantidad de preguntas en las que la gente habla sobre trucos comunes, en particular " Consejos y trucos de Vim + ctags ".
Sin embargo, no me refiero a los atajos de uso común que alguien nuevo en Vim encontraría genial. Estoy hablando de un usuario experimentado de Unix (ya sea un desarrollador, administrador, ambos, etc.), que cree saber algo que el 99% de nosotros nunca escuchó ni soñó. Algo que no solo facilita su trabajo, sino que también es FRESCO y hackeo . Después de todo, Vim reside en el sistema operativo más rico en rincones oscuros del mundo, por lo que debería tener complejidades que solo unos pocos privilegiados conocen y quieren compartir con nosotros.
Respuestas:
Puede que no sea algo que el 99% de los usuarios de Vim desconocen, pero es algo que uso a diario y que cualquier usuario de Linux + Vim debe saber.
Comando básico, pero extremadamente útil.
A menudo olvido sudo antes de editar un archivo en el que no tengo permisos de escritura. Cuando vengo a guardar ese archivo y obtengo un error de permiso, simplemente ejecuto ese comando vim para guardar el archivo sin la necesidad de guardarlo en un archivo temporal y luego copiarlo nuevamente.
Obviamente, debe estar en un sistema con sudo instalado y tener derechos de sudo.
fuente
sudo vim
. En su lugar, debe exportarEDITOR
como vim y ejecutarsudoedit
.Algo que acabo de descubrir recientemente que me pareció genial:
Revierte el documento a como estaba hace 15 minutos. Puede tomar varios argumentos por la cantidad de tiempo que desea revertir y depende de los niveles de deshacer. Se puede revertir con el comando opuesto
:later
fuente
:later 8h
y he terminado por hoy? : P:! [command]
ejecuta un comando externo mientras estás en Vim.Pero agregue un punto después de los dos puntos,
:.! [command]
y volcará la salida del comando en su ventana actual. Eso es: . !
Por ejemplo:
Lo uso mucho para cosas como agregar la fecha actual en un documento que estoy escribiendo:
fuente
:.!date
es escribir "fecha" en una línea y luego ejecutar!$sh
(alternativamente, tener el comando seguido de una línea en blanco y ejecutar!jsh
). Esto canalizará la línea al shell "sh" y lo sustituirá con la salida del comando.:.!
es en realidad un caso especial de:{range}!
, que filtra un rango de líneas (la línea actual cuando el rango es.
) a través de un comando y reemplaza esas líneas con la salida. Me resulta:%!
útil para filtrar buffers completos.sed
, cuando puedes usar los comandosed
/ incorporados similaresex
? Intenta correr:.s/old/new/g
;-)No es exactamente oscuro, pero hay varios comandos "eliminar en" que son extremadamente útiles, como ...
diw
para eliminar la palabra actualdi(
para eliminar dentro de los padres actualesdi"
para eliminar el texto entre comillasOtros se pueden encontrar en
:help text-objects
fuente
de Elimine todo hasta el final de la palabra presionando. en el deseo de tu corazón.
ci (xyz [Esc] - Esto es extraño. Aquí, la 'i' no significa modo de inserción. En cambio, significa dentro del paréntesis. Entonces esta secuencia corta el texto dentro del paréntesis en el que estás parado y lo reemplaza con "xyz". También funciona dentro de corchetes cuadrados y de figura: simplemente haga ci [o ci {correspondientemente. Naturalmente, puede hacer di (si solo desea eliminar todo el texto sin escribir nada. También puede hacerlo en
a
lugar dei
si desea eliminar también los paréntesis y no solo el texto dentro de ellos.ci " - corta el texto entre comillas actuales
ciw : corta la palabra actual. Esto funciona igual que el anterior, excepto que
(
se reemplaza conw
.C : corte el resto de la línea y cambie al modo de inserción.
ZZ : guarda y cierra el archivo actual (¡MUCHO más rápido que Ctrl-F4 para cerrar la pestaña actual!)
ddp : mueve la línea actual una fila hacia abajo
xp : mueve el personaje actual una posición hacia la derecha
U - mayúscula, por lo que
viwU
aumenta la palabra~ - cambia de mayúsculas y minúsculas, por
viw~
lo que invertirá el uso de mayúsculas y minúsculasCtrl + u / Ctrl + d desplaza la página media pantalla hacia arriba o hacia abajo. Esto parece ser más útil que la paginación habitual de pantalla completa, ya que facilita ver cómo se relacionan las dos pantallas. Para aquellos que todavía quieren desplazarse por la pantalla completa a la vez, hay Ctrl + f para Adelante y Ctrl + b para Atrás. Ctrl + Y y Ctrl + E se desplazan hacia abajo o hacia arriba una línea a la vez.
El comando loco pero muy útil es zz : desplaza la pantalla para que esta línea aparezca en el medio. Esto es excelente para poner el código en el que está trabajando en el centro de su atención. Los comandos entre hermanos, zt y zb, hacen que esta línea sea la superior o la inferior del sreen, lo que no es tan útil.
% encuentra y salta al paréntesis coincidente.
de - eliminar del cursor hasta el final de la palabra (también puede hacerlo
dE
para eliminar hasta el siguiente espacio)bde : elimina la palabra actual, delimitador de izquierda a derecha
df [espacio] : eliminar hasta e incluir el siguiente espacio
dt. - eliminar hasta el próximo punto
dd : elimina esta línea completa
ye (o yE) : tira del texto desde aquí hasta el final de la palabra
ce - corta hasta el final de la palabra
adiós - copia la palabra actual (me hace preguntarme qué hace "hola")
yy : copia la línea actual
cc : corta la línea actual, también puede hacerlo en su
S
lugar. También hay una tapa inferiors
que corta el carácter actual y cambia al modo de inserción.viwy o viwc . Yank o cambiar la palabra actual. Golpee
w
varias veces para seguir seleccionando cada palabra subsiguiente, useb
para moverse hacia atrásvi { - selecciona todo el texto entre paréntesis. va {- selecciona todo el texto, incluidos {} s
vi (p - resalta todo dentro de () sy reemplaza con el texto pegado
bye mueven el cursor palabra por palabra, de manera similar a como lo hacen normalmente las teclas Ctrl + Flechas . Sin embargo, la definición de palabra es un poco diferente, ya que varios delmitadores consecutivos se tratan como una sola palabra. Si comienzas a la mitad de una palabra, presionar b siempre te llevará al comienzo de la palabra actual, y cada b consecutiva saltará al comienzo de la siguiente palabra. Del mismo modo, y es fácil de recordar,
e
coloca el cursor al final de la palabra actual y de cada palabra subsiguiente.similar a
b
/e
, capitalB
yE
mueva el cursor palabra por palabra utilizando solo espacios en blanco como delimitadores.D mayúscula (respire profundo) Elimina el resto de la línea a la derecha del cursor, igual que Shift + End / Del en editores normales (observe 2 pulsaciones de teclas - Shift + D - en lugar de 3)
fuente
vity
yvitc
se puede acortar ayit
ycit
respectivamente..
).bye
no funciona cuando estás en el primer carácter de la palabra.yiw
siempre lo haceUno que rara vez encuentro en la mayoría de los tutoriales de Vim, pero es INCREÍBLEMENTE útil (al menos para mí), es el
g; and g,
para moverse (hacia adelante, hacia atrás) a través de la lista de cambios.
Déjame mostrarte cómo lo uso. A veces necesito copiar y pegar un código o cadena, digamos un código de color hexadecimal en un archivo CSS, así que busco, salto (sin importar dónde está la coincidencia), lo copio y luego salto hacia atrás (g;) a donde Estaba editando el código para finalmente pegarlo. No es necesario crear marcas. Más simple
Solo mis 2 centavos.
fuente
'.
irá a la última línea editada, e`.
irá a la última posición editada<C-o>
/<C-i>
para esto todo el tiempo - o marcando mi lugar.Convierta vim en un editor hexadecimal.
Revertir.
Advertencia: si no edita con binario (-b), puede dañar el archivo. - Josh Lee en los comentarios.
fuente
:%!xxd -r
para revertirloVuelve a seleccionar la última selección visual.
fuente
A veces, una configuración en su .vimrc será anulada por un complemento o autocomando. Para depurar esto, un truco útil es usar el comando: verbose junto con: set. Por ejemplo, para descubrir dónde se configuró / desarmó Cindent:
Esto generará algo como:
Esto también funciona con mapas y resaltados. (Gracias joeytwiddle por señalar esto). Por ejemplo:
fuente
:verbose
también se puede usar antesnmap l
ohighlight Normal
para averiguar dónde se definió por última vez ell
mapa de teclas o elNormal
resaltado. Muy útil para la depuración!:%TOhtml
Crea una representación html del archivo actual.
fuente
No estoy seguro si esto cuenta como dark-corner-ish, pero acabo de enterarme ...
tirará (copiará) todas las líneas que contengan "coincidencia" en el registro
"a
/@a
. (El uso de mayúsculasA
hace que vim agregue yankings en lugar de reemplazar el contenido del registro anterior). Lo usé mucho recientemente cuando hice las hojas de estilo de Internet Explorer.fuente
:v/PATTERN/d
Explicación::v
es una abreviatura de:g!
, y el:g
comando aplica cualquier comando ex a las líneas.:y[ank]
funciona y también lo hace:normal
, pero aquí lo más natural es simplemente:d[elete]
.:g/match/normal "Ayy
: lanormal
palabra clave le permite indicarle que ejecute comandos en modo normal (con los que probablemente esté más familiarizado).¿Quieres ver tu: historial de comandos?
Luego navegue, edite y finalmente ejecute el comando.
¿Alguna vez realizó cambios similares en dos archivos y cambió de uno a otro? (Digamos, ¿fuente y archivos de encabezado?)
Luego tabula hacia adelante y hacia atrás entre esos archivos.
fuente
q:
por accidente todo el tiempo ...Vim abrirá una URL, por ejemplo
Agradable cuando necesitas abrir la fuente de una página para referencia.
fuente
Las macros pueden llamar a otras macros, y también pueden llamarse a sí mismas.
p.ej:
... eliminará la primera palabra de cada línea hasta el final del archivo.
Este es un ejemplo bastante simple, pero demuestra una característica muy poderosa de vim
fuente
qqqqqifuu<Esc>h@qq@q
:normal! @a
para aplicar su macro a cada línea en su selección.Suponiendo que tiene compilado el soporte de Perl y / o Ruby,
:rubydo
y:perldo
ejecutará una línea de línea de Ruby o Perl en cada línea en un rango (por defecto a todo el búfer), con un$_
enlace al texto de la línea actual (menos la nueva línea). Manipulando$_
cambiará el texto de esa línea.Puede usar esto para hacer ciertas cosas que son fáciles de hacer en un lenguaje de secuencias de comandos, pero no tan obvio usando Vim builtins. Por ejemplo, para invertir el orden de las palabras en una línea:
Para insertar una cadena aleatoria de 8 caracteres (AZ) al final de cada línea:
Está limitado a actuar en una línea a la vez y no puede agregar nuevas líneas.
fuente
pydo
ypy3do
trabaje para Python si tiene el soporte requerido compilado.^ O y ^ I
Ir a la posición anterior / anterior. Cuando se está moviendo a través del archivo (buscando, moviendo comandos, etc.) vim vuelva a recordar estos "saltos", para que pueda repetir estos saltos hacia atrás (^ O - O para los anteriores) y hacia adelante (^ I - justo al lado de I en el teclado ) Me resulta muy útil al escribir código y realizar muchas búsquedas.
soldado americano
Vaya a la posición donde el modo Insertar se detuvo por última vez. A menudo me encuentro editando y luego buscando algo. Para volver al lugar de edición, presione gi.
gf
coloque el cursor sobre el nombre del archivo (por ejemplo, incluya el archivo de encabezado), presione gf y el archivo se abrirá
gF
similar a gf pero reconoce el formato "[nombre de archivo]: [número de línea]". Al presionar gF se abrirá [nombre del archivo] y se establecerá el cursor en [número de línea].
^ P y ^ N
Autocompletar texto durante la edición (^ P - coincidencia anterior y ^ N siguiente coincidencia)
^ X ^ L
Mientras que la edición se completa en la misma línea (útil para la programación). Escribe código y luego recuerda que tiene el mismo código en algún lugar del archivo. Simplemente presione ^ X ^ L y la línea completa completa
^ X ^ F
Nombres completos de archivos. Escribes "/ etc / pass" Hmm. Olvidaste el nombre del archivo. Simplemente presione ^ X ^ F y se completará el nombre de archivo
^ Z o: sh
Mover temporalmente a la cáscara. Si necesitas un golpe rápido:
fuente
^X^F
mi motivo favorito es que los nombres de archivo incluyen=
signos, lo que hace que haga cosas podridas en muchas ocasiones (archivos ini, makefiles, etc.). Yo usose isfname-==
de acabar con esa molestiafuente
i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
Este es un buen truco para volver a abrir el archivo actual con una codificación diferente:
Útil cuando tiene que trabajar con codificaciones heredadas. Las codificaciones compatibles se enumeran en una tabla debajo de
encoding-values
(verhelp
encoding-values
). Algo similar también funciona++ff
, por lo que puede volver a abrir el archivo con Windows / Unix si la línea se equivoca por primera vez (consultehelp
ff
).fuente
Escribir == corregirá la sangría de la línea actual basada en la línea de arriba.
En realidad, puedes hacer un signo = seguido de cualquier comando de movimiento. = {movimiento}
Por ejemplo, puede usar el% de movimiento que se mueve entre llaves coincidentes. Coloque el cursor en {en el siguiente código:
Y presione =% para obtener esto al instante:
Alternativamente, podría hacer = a { dentro del bloque de código, en lugar de posicionarse directamente en el {carácter.
fuente
=}
ovaBaB=
es menos dependiente. Además,v}}:!astyle -bj
coincide con mi estilo de código mejor, pero puedo conseguir de nuevo en su estilo con un simple%!astyle -aj
gg=G
es bastante ordenado al pegar algo.ggVG=
.fuente
ii
yjj
se utilizan comúnmente para variables de control, porquei
, yj
están reservados para los números complejos.Veamos a un editor IDE bastante pequeño haciendo transposición de columnas.
Explicación
\(
y\)
es cómo recordar cosas en regex-land. Y\1
,\2
etc. es cómo recuperar las cosas recordadas.Recuerda todo seguido de
^I
(tabulación) seguido de todo.Reemplace las cosas anteriores con "2da cosa que recordaba" seguido de "1ra cosa que recordaba" - esencialmente haciendo una transposición.
fuente
fuente
No es exactamente un secreto oscuro, pero me gusta poner el siguiente mapeo en mi archivo .vimrc, así puedo presionar "-" (menos) en cualquier momento para abrir el explorador de archivos para mostrar los archivos adyacentes al que acabo de editar . En el explorador de archivos, puedo presionar otro "-" para subir un directorio, proporcionando una exploración perfecta de estructuras de directorios complejas (como las que usan los marcos MVC en la actualidad):
Estos también pueden ser útiles para alguien. Me gusta desplazar la pantalla y avanzar el cursor al mismo tiempo:
Navegación con pestañas: me encantan las pestañas y necesito moverme fácilmente entre ellas:
Solo en Mac OS X: navegación de pestañas tipo Safari:
fuente
Me gusta usar 'sudo bash', y mi administrador de sistemas odia esto. Bloqueó 'sudo' para que solo se pudiera usar con un puñado de comandos (ls, chmod, chown, vi, etc.), pero de todos modos pude usar vim para obtener un shell raíz:
fuente
A menudo, me gusta cambiar los directorios actuales durante la edición, por lo que tengo que especificar menos rutas.
fuente
A menudo uso muchas ventanas cuando trabajo en un proyecto y a veces necesito cambiarles el tamaño. Esto es lo que uso:
Estas asignaciones permiten aumentar y disminuir el tamaño de la ventana actual. Es bastante simple pero rápido.
fuente
No es una característica oscura, pero es muy útil y ahorra tiempo.
Si desea guardar una sesión de sus buffers abiertos, pestañas, marcadores y otras configuraciones, puede emitir lo siguiente:
Puede abrir su sesión usando:
fuente
:so session.vim
dentro de vim.pega la salida de un comando externo en el búfer.
Haz algunos cálculos y obtén el resultado directamente en el texto:
Obtenga la lista de archivos para compilar al escribir un Makefile:
No busque el hecho que leyó en wikipedia, pídalo directamente en el documento que está escribiendo:
fuente
Mapa F5 para ROT13 rápidamente su búfer:
Puedes usarlo como una clave de jefe :).
fuente
nmap i ggg?G``
. O la diabólica:nmap i ggg?G``i
!Acabo de encontrar este hoy a través de NSFAQ :
Comenta bloques de código.
Ingrese al modo visual Blockwise presionando CTRL-V.
Marque el bloque que desea comentar.
Presione I (mayúscula I) e ingrese su cadena de comentarios al comienzo de la línea. (// para C ++)
Presione ESC y todas las líneas seleccionadas tendrán // antepuesto al frente de la línea.
fuente
git checkout
). En cuanto a los mejores usos para la inserción de bloque, no hay ningún conjunto de piedra. Simplemente utilícelo siempre que tenga varias líneas donde desee insertar la misma secuencia de caracteres en el mismo lugar.Uso vim para casi cualquier edición de texto que hago, por lo que a menudo uso copiar y pegar. El problema es que vim por defecto a menudo distorsiona el texto importado a través de pegar. La forma de detener esto es usar
antes de pegar sus datos. Esto evitará que se estropee.
Tenga en cuenta que tendrá que emitir
:set nopaste
para recuperar la sangría automática. Las formas alternativas de pegar texto preformateado son los registros del portapapeles (*
y+
) y:r!cat
(tendrá que finalizar el fragmento pegado con ^ D).A veces también es útil activar un esquema de color de alto contraste. Esto se puede hacer con
Me di cuenta de que no funciona en todas las versiones de vim que uso, pero sí funciona en la mayoría.
fuente
set paste
o especificar una tecla para lapastetoggle
opción es una forma común de evitar esto, pero se puede lograr el mismo efectoset mouse=a
cuando Vim sepa que la avalancha de texto que ve es una pasta activada por el mouse."*p
para pegar desde el X xlipboard. (También funciona desde la terminal vim, es solo que es posible que necesite el paquete gvim si están separados)*
es el registroPRIMARY
("clic central"). El portapapeles es+