¿Cuáles son los rincones oscuros de Vim que tu madre nunca te contó? [cerrado]

799

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.

Sasha
fuente
10
: Ventana de división de sexo y explorador de archivos integrado abierto (división horizontal)
user3218088
2
Esta pregunta parece ser bastante constructiva: al observar la cantidad de votos a favor ..., se votó para reabrir, tal vez llegue una respuesta aún más genial, que se puede votar si es útil, por lo que le da más valor a SOF. Ordenando las respuestas por votos He aprendido muchas cosas interesantes en solo 5 minutos ... cosas realmente valiosas aquí, ¿por qué cerrar algo tan valioso? ¿Cómo es esto no constructivo?
jhegedus
77
Ridículo que esta pregunta está cerrada. Habla sobre legalismo.
Lepidopterista
2
Creo que esta pregunta es muy constructiva pero, más apropiada en Quora.
Diogo Melo
2
¿Por qué hay 2 (a partir de ahora) votos para eliminar esta pregunta? ¿Qué bien podría hacer?
Akavall

Respuestas:

782

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.

:w !sudo tee %

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.

skinp
fuente
116
Posiblemente, ¡eso es incluso mejor que ejecutar vim como root! ¡Votado!
Arafangion
27
Para un novato, ¿qué hace exactamente tee? ¿A alguien le importaría analizar este comando por mí?
AndyL
41
cmap w !! w! sudo tee%
jm666
58
Nunca deberías correr sudo vim. En su lugar, debe exportar EDITORcomo vim y ejecutar sudoedit.
Gerardo Marset
8
@maximus: vim reemplaza% por el nombre del búfer / archivo actual.
migu
617

Algo que acabo de descubrir recientemente que me pareció genial:

:earlier 15m

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

Abedul Chad
fuente
66
@skinp: si deshace y luego realiza más cambios desde el estado deshecho, pierde ese historial de rehacer. Esto le permite volver a un estado que ya no está en la pila de deshacer.
ephemient
39
También es muy útil g + y g- para retroceder y avanzar en el tiempo. Esto es mucho más poderoso que una pila de deshacer / rehacer, ya que no pierde el historial cuando hace algo después de deshacer.
Etienne PIERRE
99
No pierde el historial de rehacer si realiza un cambio después de deshacer. Simplemente no es de fácil acceso. Hay complementos para ayudarlo a visualizar esto, como Gundo.vim
Ehtesh Choudhury
559
Wow, ¿entonces ahora puedo hacer :later 8hy he terminado por hoy? : P
Igor Popov
77
¡Su comando asume que uno pasará al menos 15 minutos en vim !
e2-e4
411

:! [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:

:.! ls

Lo uso mucho para cosas como agregar la fecha actual en un documento que estoy escribiendo:

:.! date
Jeffrey Knight
fuente
74
Esto es bastante similar a: r! La única diferencia hasta donde puedo decir es que: r! abre una nueva línea,:.! sobrescribe la línea actual.
saffsd
66
Una alternativa :.!datees 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.
hlovdal
43
:.!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.
Nefrubyr
2
@sundar: ¿Por qué pasar una línea a sed, cuando puedes usar los comandos ed/ incorporados similares ex? Intenta correr :.s/old/new/g;-)
jabirali
44
Y también tenga en cuenta que '!' es como 'y', 'd', 'c', etc., es decir, puede hacer: !!, number !!,! motion (por ejemplo,! Gshell_command <cr> reemplazar de la línea actual al final del archivo ('G') con salida de shell_command).
aqn
312

No es exactamente oscuro, pero hay varios comandos "eliminar en" que son extremadamente útiles, como ...

  • diw para eliminar la palabra actual
  • di( para eliminar dentro de los padres actuales
  • di" para eliminar el texto entre comillas

Otros se pueden encontrar en :help text-objects

revs dbr
fuente
8
DAB "soportes arounb Borrar", DAB para corchetes rizado, t para etiquetas de tipo xml, combinaciones con los comandos normales son como se esperaba CIB / YAB / DIT / cuba etc
sjh
15
@Masi: yi (va (p elimina solo los corchetes
Don Reba el
42
Esta es posiblemente la razón más importante para que me quede con Vim. Eso y sus comandos equivalentes de "cambio": ciw, ci (, ci ", así como dt <space> y ct <space>
thomasrutter
44
@thomasrutter: ¿Por qué no dW / cW en lugar de dt <space>?
99
@Masi: Con el complemento surround: ds (.
237

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 alugar de isi 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 con w.

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 viwUaumenta la palabra

~ - cambia de mayúsculas y minúsculas, por viw~lo que invertirá el uso de mayúsculas y minúsculas

Ctrl + 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 dEpara 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 Slugar. También hay una tapa inferior sque corta el carácter actual y cambia al modo de inserción.

viwy o viwc . Yank o cambiar la palabra actual. Golpee wvarias veces para seguir seleccionando cada palabra subsiguiente, use bpara moverse hacia atrás

vi { - 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, ecoloca el cursor al final de la palabra actual y de cada palabra subsiguiente.

similar a b/ e, capital By Emueva 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)

ultraman
fuente
15
zt es bastante útil si lo usa al comienzo de una definición de función o clase.
Nick Lewis
99
vityy vitcse puede acortar a yity citrespectivamente.
Nathan Fellman
33
Todo lo que llamas "cortar" es "cambiar". Por ejemplo: C es el cambio hasta el final de la línea. El equivalente de Vim de "cortar" es "eliminar", hecho con d / D. La principal diferencia entre cambiar y eliminar es que eliminar lo deja en modo normal, pero el cambio lo pone en una especie de modo de inserción (aunque todavía está en el comando de cambio, que es útil ya que todo el cambio se puede repetir con .).
Laurence Gonsalves
11
Pensé que esto era para una lista de cosas que no mucha gente sabe. yy es muy común, habría pensado.
Almo
19
byeno funciona cuando estás en el primer carácter de la palabra. yiwsiempre lo hace
Andrea Francia
204

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

Xavier Guardiola
fuente
29
de manera similar, '.irá a la última línea editada, e `.irá a la última posición editada
aehlke
8
Ctrl-O y Ctrl-I (pestaña) funcionarán de manera similar, pero no igual. Se mueven hacia atrás y hacia adelante en la lista de "salto", que se puede ver haciendo: saltos o: ju Para más información hacer: ayuda jumplist
Kimball Robinson
17
Puede enumerar la lista de cambios haciendo: cambios
Kimball Robinson
Dang caliente que es útil. Yo uso <C-o>/ <C-i>para esto todo el tiempo - o marcando mi lugar.
Wayne Werner
187
:%!xxd

Convierta vim en un editor hexadecimal.

:%!xxd -r

Revertir.

Advertencia: si no edita con binario (-b), puede dañar el archivo. - Josh Lee en los comentarios.

sharth
fuente
99
¿Y cómo lo reviertes?
Christian
40
:! xxd -r // Para volver de HEX
Naga Kiran
21
De hecho, creo que es :%!xxd -rpara revertirlo
Andreas Grech
@JoshLee: Si uno tiene cuidado de no atravesar nuevas líneas, ¿es seguro no usar la opción -b? Pregunto porque a veces quiero hacer un cambio hexadecimal, pero no quiero cerrar y volver a abrir el archivo para hacerlo.
dotancohen
44
@dotancohen: si no desea cerrar / volver a abrir el archivo, puede hacerlo: establecer binario
Bambu
129
gv

Vuelve a seleccionar la última selección visual.

AaronS
fuente
119

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:

:verbose set cindent?

Esto generará algo como:

cindent
    Last set from /usr/share/vim/vim71/indent/c.vim

Esto también funciona con mapas y resaltados. (Gracias joeytwiddle por señalar esto). Por ejemplo:

:verbose nmap U
n  U             <C-R>
        Last set from ~/.vimrc

:verbose highlight Normal
Normal         xxx guifg=#dddddd guibg=#111111 font=Inconsolata Medium 14
        Last set from ~/src/vim-holodark/colors/holodark.vim
Laurence Gonsalves
fuente
8
Excelente consejo: exactamente lo que estaba buscando hoy.
Artem Russakovskii
Excelente consejo hombre! ¿Cómo llegas a conocer estas cosas geek?
Rafid
1
:verbosetambién se puede usar antes nmap lo highlight Normalpara averiguar dónde se definió por última vez el lmapa de teclas o el Normalresaltado. Muy útil para la depuración!
joeytwiddle
@joeytwiddle Gracias! Agregué esa información a la respuesta.
Laurence Gonsalves
Cuando comiences a crear asignaciones personalizadas, esto te salvará el culo tantas veces, ¡probablemente una de las más útiles aquí (IMO)!
SidOfc
98

No estoy seguro si esto cuenta como dark-corner-ish, pero acabo de enterarme ...

:g/match/y A

tirará (copiará) todas las líneas que contengan "coincidencia" en el registro "a/ @a. (El uso de mayúsculas Ahace 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.

sjh
fuente
cuenta, cuenta como no he visto este :)
Buena esa. Nunca he oído hablar de él ... Podría ser útil: P
skinp
55
Puedes usar: g! para encontrar las líneas que no coinciden con un patrón ejemplo: g / set / dd normal (borrar todas las líneas que no contienen set)!
tsukimi
3
A veces es mejor hacer lo que dijo tsukimi y simplemente filtrar las líneas que no coinciden con su patrón. Sin embargo, una versión abreviada de ese comando: :v/PATTERN/dExplicación::v es una abreviatura de :g!, y el :gcomando 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].
pandubear
También puede hacerlo :g/match/normal "Ayy: la normalpalabra clave le permite indicarle que ejecute comandos en modo normal (con los que probablemente esté más familiarizado).
Kimball Robinson
93

¿Quieres ver tu: historial de comandos?

q:

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

:set hidden
:map <TAB> :e#<CR>

Luego tabula hacia adelante y hacia atrás entre esos archivos.

MikeyB
fuente
131
Golpeé q:por accidente todo el tiempo ...
Josh Lee
11
Alternativamente, desde el editor ex (:), puede hacer CTRL-f para abrir la ventana del historial de comandos.
Jason Down
66
@jleedev yo también. Casi odio este comando, solo porque lo uso accidentalmente demasiado.
bradlis7
99
q / y q? puede usarse para hacer algo similar para sus patrones de búsqueda.
bpw1621
55
Al presionar <Cf> después de: o / (o cada vez que esté en modo comando), aparecerá el mismo menú de historial. Entonces puede reasignar q: si lo golpea accidentalmente mucho y aún accede a este modo impresionante.
idbrii
82

Vim abrirá una URL, por ejemplo

vim http://stackoverflow.com/

Agradable cuando necesitas abrir la fuente de una página para referencia.

Cercerilla
fuente
2
Para mí no abrió la fuente; en cambio, aparentemente utilizó enlaces para volcar la página renderizada en un búfer, y luego la abrió.
Ivan Vučica
hay un error cuando se ejecuta este comando
Dzung Nguyen
55
Funciona mejor con una barra al final. Truco aseado!
Thomas
@Vdt: Sería útil si publicaras tu error. Si es este: " error (netrw), ni el comando wget ni el comando fetch están disponibles", obviamente debe hacer que una de esas herramientas esté disponible desde su variable de entorno PATH.
Isaac Nequittepas
Me parece particularmente útil cuando las personas envían enlaces a un servicio de pegado y se olvidan de seleccionar un resaltado de sintaxis, generalmente solo tengo que abrir el enlace en vim después de agregar "& raw".
Desvío
68

Las macros pueden llamar a otras macros, y también pueden llamarse a sí mismas.

p.ej:

qq0dwj@qq@q

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

spence91
fuente
2
No sabía que las macros pudieran repetirse. Frio. Nota: qx comienza a grabar en el registro x (usa qq para el registro q). 0 se mueve al inicio de la línea. dw elimina una palabra. j baja una línea. @q ejecutará la macro nuevamente (definiendo un bucle). Pero se olvidó de finalizar la grabación con una "q" final y luego ejecutar la macro escribiendo @q.
Kimball Robinson
2
Creo que es intencional, como una macro anidada y recursiva.
Yktula
77
qqqqqifuu<Esc>h@qq@q
Gerardo Marset
66
Otra forma de lograr esto es registrar una macro en el registro a que realice alguna transformación en una sola línea, luego resalte linealmente un montón de líneas con V y escriba :normal! @apara aplicar su macro a cada línea en su selección.
Nathan Long
Encontré esta publicación buscando en Google macros recursivas de VIM. No pude encontrar la manera de detener la macro que no sea matar el proceso VIM.
dotancohen
55

Suponiendo que tiene compilado el soporte de Perl y / o Ruby, :rubydoy :perldoejecutará 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:

:perldo $_ = join ' ', reverse split

Para insertar una cadena aleatoria de 8 caracteres (AZ) al final de cada línea:

:rubydo $_ += ' ' + (1..8).collect{('A'..'Z').to_a[rand 26]}.join

Está limitado a actuar en una línea a la vez y no puede agregar nuevas líneas.

Brian Carper
fuente
¿Qué pasa si solo quiero que Perldo se ejecute en una línea específica? o unas pocas líneas seleccionadas?
Sujoy
55
Puede darle un rango como cualquier otro comando. Por ejemplo: 1,5perldo solo operará en las líneas 1-5.
Brian Carper
¿Podría hacer $ _ + = '\ nNUEVO LÍNEA!' para obtener una nueva línea después de la actual?
Greg el
Lamentablemente no, solo agrega un personaje de control funky al final de la línea. Sin embargo, podría usar una búsqueda / reemplazo de Vim para cambiar todos esos caracteres de control a nuevas líneas reales.
Brian Carper el
3
Del mismo modo, pydoy py3dotrabaje para Python si tiene el soporte requerido compilado.
Derecho
54

^ 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:

  • presione ^ Z (para poner vi en segundo plano) para volver al shell original y presione fg para regresar a vim
  • presione: sh para ir al sub shell y presione ^ D / exit para regresar a vi back
revs dimba
fuente
Con ^X^Fmi 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 uso se isfname-==de acabar con esa molestia
sehe
3
+1 el autocompletado incorporado está sentado allí esperando a ser descubierto.
joeytwiddle
48
" insert range ip's
"
"          ( O O )
" =======oOO=(_)==OOo======

:for i in range(1,255) | .put='10.0.0.'.i | endfor
usuario107745
fuente
2
No veo para qué sirve esto (además de parecer una respuesta de broma). ¿Alguien más puede iluminarme?
Ryan Edwards el
2
abra vim y luego haga ": para i en rango (1,255) | .put = '10 .0.0. '. i | endfor"
codygman
2
@RyanEdwards llenando / etc / hosts quizás
Ruslan
26
Esta es una excelente respuesta. No es el bit sobre la creación de las direcciones IP, sino el bit que implica que VIM puede usar para bucles en los comandos .
dotancohen
44
Sin modo ex:i10.0.0.1<Esc>Y254p$<C-v>}g<C-a>
BlackCap
47

Este es un buen truco para volver a abrir el archivo actual con una codificación diferente:

:e ++enc=cp1250 %:p

Útil cuando tiene que trabajar con codificaciones heredadas. Las codificaciones compatibles se enumeran en una tabla debajo de encoding-values(ver help 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 (consulte help ff).

revs zoul
fuente
Nunca tuve que usar este tipo de cosas, pero sin duda lo agregaremos a mi arsenal de trucos ...
Un gran consejo, gracias. Para obtener puntos de bonificación, agregue una lista de codificaciones válidas comunes.
Adriano Varoli Piazza
2
Lo he usado hoy, pero creo que no necesitaba especificar "%: p"; simplemente abriendo el archivo y: e ++ enc = cp1250 fue suficiente. I
Ivan Vučica
would: set encoding = cp1250 tiene el mismo efecto?
laz
1
`: e + b% 'es igualmente útil para la reapertura en modo binario (sin munging de nuevas líneas)
intuido
47

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:

if (thisA == that) {
//not indented
if (some == other) {
x = y;
}
}

Y presione =% para obtener esto al instante:

if (thisA == that) {
    //not indented
    if (some == other) {
        x = y;
    }
}

Alternativamente, podría hacer = a { dentro del bloque de código, en lugar de posicionarse directamente en el {carácter.


Hm, no sabía esto sobre la sangría.
Ehtesh Choudhury

No es necesario, por lo general, estar exactamente en las llaves. Pensé con frecuencia simplemente porque =}o vaBaB=es menos dependiente. Además, v}}:!astyle -bjcoincide con mi estilo de código mejor, pero puedo conseguir de nuevo en su estilo con un simple%!astyle -aj
sehe

77
gg=Ges bastante ordenado al pegar algo.
kyrias


@kyrias Oh, lo he estado haciendo así ggVG=.
Braden Best

42
imap jj <esc>

77
¿cómo vas a escribir jj entonces? : P
hasen

66
¿Con qué frecuencia tecleas jj? ¿En inglés al menos?
ojblass

50
En cambio, reasigné el bloqueo de mayúsculas a esc, ya que es una clave inútil. Sin embargo, mi mapeo era para todo el sistema operativo, por lo que tiene el beneficio adicional de nunca tener que preocuparme por golpearlo accidentalmente. El único inconveniente es que es más difícil gritarle a la gente. :)
Alex

77
@Alex: definitivamente, el bloqueo de mayúsculas es la muerte. "espera, wtf? oh, eso fue ZZ? ... mierda".
intuido

55
@ojblass: No estoy seguro de cómo muchas personas nunca código de MATLAB justo en Vim, pero iiy jjse utilizan comúnmente para variables de control, porque i, y jestán reservados para los números complejos.
brianmearns

37

Veamos a un editor IDE bastante pequeño haciendo transposición de columnas.

:%s/\(.*\)^I\(.*\)/\2^I\1/

Explicación

\(y \)es cómo recordar cosas en regex-land. Y \1, \2etc. es cómo recuperar las cosas recordadas.

>>> \(.*\)^I\(.*\)

Recuerda todo seguido de ^I(tabulación) seguido de todo.

>>> \2^I\1

Reemplace las cosas anteriores con "2da cosa que recordaba" seguido de "1ra cosa que recordaba" - esencialmente haciendo una transposición.


44
Cambia un par de columnas separadas por tabulaciones (separador arbitrario, todo es expresión regular) entre sí.
caos

39
Esto es solo una expresión regular; Muchos IDEs tienen expresiones regulares de búsqueda y reemplazo.
rlbond

77
@rlbond: todo se reduce a lo bueno que es el motor de expresiones regulares en el IDE. Las expresiones regulares de Vim son bastante poderosas; otros ... no tanto a veces.
romandas

3
El * será codicioso, por lo que esta expresión regular supone que solo tiene dos columnas. Si desea que no sea codicioso, use {-} en lugar de * (consulte: ayuda no codicioso para obtener más información sobre el multiplicador {})

fuente
30

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

map - :Explore<cr>

Estos también pueden ser útiles para alguien. Me gusta desplazar la pantalla y avanzar el cursor al mismo tiempo:

map <c-j> j<c-e>
map <c-k> k<c-y>

Navegación con pestañas: me encantan las pestañas y necesito moverme fácilmente entre ellas:

map <c-l> :tabnext<enter>
map <c-h> :tabprevious<enter>

Solo en Mac OS X: navegación de pestañas tipo Safari:

map <S-D-Right> :tabnext<cr>
map <S-D-Left> :tabprevious<cr>
KKovacs
fuente
También puede buscar archivos dentro de Vim, usando: Explore
Roman Plášil
Hola Roman, esto es exactamente lo que hace este mapeo, pero lo asigna a una "tecla de acceso rápido". :)
KKovacs
27

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:

bash$ sudo vi +'silent !bash' +q
Password: ******
root#
demasiado php
fuente
99
FWIW, sudoedit (o sudo -e) edita archivos privilegiados pero ejecuta su editor como su usuario normal.
RJHunter
12
sí ... yo también te odiaría;) solo deberías necesitar un shell de root MUY RARAMENTE, a menos que ya tengas la costumbre de ejecutar demasiados comandos como root, lo que significa que todos tus permisos están jodidos.
Todos somos Mónica
55
¿Por qué tu administrador de sistemas incluso te da root? : D
d33tah
26

A menudo, me gusta cambiar los directorios actuales durante la edición, por lo que tengo que especificar menos rutas.

cd %:h
rampion
fuente
¿Qué hace esto? ¿Y funciona con autchdir?
Leonard
2
Supongo que anularía el autochdir temporalmente (hasta que vuelva a cambiar los búferes). Básicamente, cambia el directorio al directorio raíz del archivo actual. Me da un poco más de control manual que el autochdir.
rampion
1
: Conjunto autochdir // esto también sirve la misma funcionalidad y cambia el directorio actual a la de archivo en memoria intermedia
Naga Kiran
25

A menudo uso muchas ventanas cuando trabajo en un proyecto y a veces necesito cambiarles el tamaño. Esto es lo que uso:

map + <C-W>+
map - <C-W>-

Estas asignaciones permiten aumentar y disminuir el tamaño de la ventana actual. Es bastante simple pero rápido.

Tauro Olson
fuente
16
También hay Ctrl-W =, que hace que las ventanas tengan el mismo ancho.
Bill Lynch
2
No olvide que puede anteponer números para realizar una acción varias veces en Vim. Entonces, para expandir la altura de la ventana actual en 8 líneas: 8 <CW> +
joeytwiddle
23

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:

mksession session.vim

Puede abrir su sesión usando:

vim -S session.vim
mohi666
fuente
55
También puedes :so session.vimdentro de vim.
TankorSmash el
22
:r! <command>

pega la salida de un comando externo en el búfer.

Haz algunos cálculos y obtén el resultado directamente en el texto:

:r! echo $((3 + 5 + 8))

Obtenga la lista de archivos para compilar al escribir un Makefile:

:r! ls *.c

No busque el hecho que leyó en wikipedia, pídalo directamente en el documento que está escribiendo:

:r! lynx -dump http://en.wikipedia.org/wiki/Whatever
Roberto Bonvallet
fuente
14
^ R = 3 + 5 + 8 en modo de inserción le permitirá insertar el valor de la expresión (3 + 5 + 8) en el texto con menos pulsaciones de teclas.
Sudhanshu
¿Cómo puedo obtener el resultado / salida a un búfer diferente al actual?
dcn
21

Mapa F5 para ROT13 rápidamente su búfer:

map <F5> ggg?G``

Puedes usarlo como una clave de jefe :).

jqno
fuente
14
No sé lo que usted está escribiendo ... Pero, sin duda, mi jefe estaría más curioso cuando vio a escribir ROT13 revoltijo :)
sehe
o para suplantar a tus amigos: nmap i ggg?G`` . O la diabólica: nmap i ggg?G``i!
romeovs
1
@romeovs 2nd one is infinite loop, use nnoremap
Amit Gold
19

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.

Grant Limberg
fuente
Agregué # para comentar un bloque de código en ruby. ¿Cómo lo deshago?
Neeraj Singh
3
Puede presionar ctrl + v nuevamente, marcar los // y presionar x para "descomentar"
nos
66
Yo uso NERDCommenter para esto.
ZyX
1
El código comentado es probablemente uno de los peores tipos de comentarios que podría incluir en su código. Hay mejores usos para la increíble inserción de bloque.
Braden Best
1
@ Pie porque el código comentado es código muerto . El código muerto no tiene ningún propósito útil y crea desorden. Usted piensa que está preservando código es posible que desee traer de vuelta más tarde, pero siempre hay una mejor manera. Puede usar su historial de deshacer, puede duplicar el archivo o puede usar git, que tiene esta funcionalidad incorporada ( 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.
Braden Best
17

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

:set paste

antes de pegar sus datos. Esto evitará que se estropee.

Tenga en cuenta que tendrá que emitir :set nopastepara 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

:color blue

Me di cuenta de que no funciona en todas las versiones de vim que uso, pero sí funciona en la mayoría.

Ian H
fuente
10
La "distorsión" está sucediendo porque tiene alguna forma de sangría automática habilitada. Usar set pasteo especificar una tecla para la pastetoggleopción es una forma común de evitar esto, pero se puede lograr el mismo efecto set mouse=acuando Vim sepa que la avalancha de texto que ve es una pasta activada por el mouse.
jamessan
1
Si tiene instalado gvim, a menudo (aunque depende de las opciones con las que su distribución compile vim) use el portapapeles X directamente desde vim a través del registro *. Por ejemplo, "*ppara 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)
kyrias
2
@kyrias para el registro, *es el registro PRIMARY("clic central"). El portapapeles es+
Braden Best