He escuchado mucho sobre Vim , tanto pros como contras. Realmente parece que deberías ser (como desarrollador) más rápido con Vim que con cualquier otro editor. Estoy usando Vim para hacer algunas cosas básicas y, en el mejor de los casos, soy 10 veces menos productivo con Vim.
Las dos únicas cosas que debe importarle cuando habla de velocidad (puede que no le importe lo suficiente, pero debería) son:
- El uso alternativo de las manos izquierda y derecha es la forma más rápida de usar el teclado.
- Nunca tocar el mouse es la segunda forma de ser lo más rápido posible. Le toma años mover su mano, agarrar el mouse, moverlo y traerlo de regreso al teclado (y a menudo tiene que mirar el teclado para asegurarse de que regresó su mano correctamente al lugar correcto)
Aquí hay dos ejemplos que demuestran por qué soy mucho menos productivo con Vim.
Copiar / Cortar y pegar. Lo hago todo el tiempo. Con todos los editores contemporáneos, presiona Shift con la mano izquierda y mueve el cursor con la mano derecha para seleccionar texto. Luego Ctrl+ Ccopias, mueve el cursor y Ctrl+ Vpega.
Con Vim es horrible:
yy
copiar una línea (¡casi nunca quieres la línea completa!)[number xx]yy
para copiarxx
líneas en el búfer. Pero nunca sabes exactamente si has seleccionado lo que querías. A menudo tengo que hacer[number xx]dd
entoncesu
para deshacer!
¿Otro ejemplo? Buscar y reemplazar.
- En PSPad : Ctrl+ fluego escriba lo que desea buscar, luego presione Enter.
- En Vim:,
/
escriba lo que desea buscar, luego, si hay algunos caracteres especiales\
antes de cada carácter especial, presione Enter.
Y todo con Vim es así: parece que no sé cómo manejarlo de la manera correcta.
NB: ya he leído la hoja de trucos de Vim :)
Mi pregunta es:
¿Cuál es la forma en que usa Vim que lo hace más productivo que con un editor contemporáneo?
Respuestas:
Tu problema con Vim es que no entiendes vi .
Menciona cortar con
yy
y se queja de que casi nunca quiere cortar líneas enteras. De hecho, los programadores, que editan código fuente, muy a menudo quieren trabajar en líneas enteras, rangos de líneas y bloques de código. Sin embargo,yy
es solo una de las muchas formas de tirar texto al búfer de copia anónimo (o "registrarse" como se llama en vi ).El "Zen" de vi es que estás hablando un idioma. La inicial
y
es un verbo. La declaraciónyy
es sinónimo dey_
. Sey
duplica para que sea más fácil escribir, ya que es una operación tan común.Esto también se puede expresar como
dd
P
(eliminar la línea actual y pegar una copia en su lugar; dejando una copia en el registro anónimo como efecto secundario). Lasy
y losd
"verbos" toman cualquier movimiento como su "sujeto". PoryW
lo tanto, es "tirar de aquí (el cursor) al final de la palabra actual / siguiente (grande)" yy'a
es "tirar de aquí a la línea que contiene la marca llamada ' a '".Si solo comprende los movimientos básicos del cursor hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, vi no será más productivo que una copia del "bloc de notas" para usted. (De acuerdo, aún tendrá resaltado de sintaxis y la capacidad de manejar archivos más grandes que un piddling ~ 45KB más o menos; pero trabaje conmigo aquí).
vi tiene 26 "marcas" y 26 "registros". Una marca se establece en cualquier ubicación del cursor usando el
m
comando. Cada marca se designa con una letra minúscula. Por lo tanto,ma
establece la marca ' a ' en la ubicación actual ymz
establece la marca ' z '. Puede moverse a la línea que contiene una marca utilizando el'
comando (comillas simples). Así se'a
mueve al principio de la línea que contiene la marca ' a '. Puede moverse a la ubicación precisa de cualquier marca utilizando el`
comando (backquote). Por`z
lo tanto, se moverá directamente a la ubicación exacta de la marca ' z '.Debido a que estos son "movimientos", también pueden usarse como temas para otras "declaraciones".
Entonces, una forma de cortar una selección arbitraria de texto sería soltar una marca (generalmente uso ' a ' como mi "primera" marca, ' z ' como mi siguiente marca, ' b ' como otra y ' e ' como otro más (no recuerdo haber usado interactivamente más de cuatro marcas en 15 años de uso de vi ; una crea las propias convenciones sobre cómo las marcas y los registros son utilizados por las macros que no perturban el contexto interactivo de uno). al otro extremo de nuestro texto deseado; podemos comenzar en cualquier extremo, no importa. Luego podemos simplemente usar
d`a
para cortar oy`a
copiar. Por lo tanto, todo el proceso tiene una sobrecarga de 5 teclas (seis si comenzamos en "insertar "modo y necesitabaEscfuera del modo de comando). Una vez que hemos cortado o copiado a continuación, pegar en una copia es una sola tecla:p
.Digo que esta es una forma de cortar o copiar texto. Sin embargo, es solo uno de muchos. Con frecuencia podemos describir de manera más sucinta el rango de texto sin mover el cursor y soltar una marca. Por ejemplo, si estoy en un párrafo de texto, puedo usar
{
y}
movimientos al principio o al final del párrafo, respectivamente. Entonces, para mover un párrafo de texto, lo corto usando{
d}
(3 pulsaciones de teclas). (Si ya estoy en la primera o última línea del párrafo, entonces simplemente puedo usard}
od{
respectivamente.La noción de "párrafo" por defecto es algo que generalmente es intuitivamente razonable. Por lo tanto, a menudo funciona tanto para el código como para la prosa.
Con frecuencia conocemos algún patrón (expresión regular) que marca un extremo u otro del texto en el que estamos interesados. Buscar hacia adelante o hacia atrás son movimientos en vi . Por lo tanto, también pueden usarse como "sujetos" en nuestras "declaraciones". Así que puedo usar
d/foo
para cortar de la línea actual a la siguiente línea que contiene la cadena "foo" yy?bar
copiar de la línea actual a la línea más reciente (anterior) que contiene "barra". Si no quiero líneas enteras, todavía puedo usar los movimientos de búsqueda (como declaraciones propias), soltar mis marcas y usar los`x
comandos como se describió anteriormente.Además de "verbos" y "sujetos", vi también tiene "objetos" (en el sentido gramatical del término). Hasta ahora solo he descrito el uso del registro anónimo. Sin embargo, puedo usar cualquiera de los 26 registros "con nombre" prefijando la referencia "objeto" con
"
(el modificador de comillas dobles). Por lo tanto, si lo uso"add
, estoy cortando la línea actual en el registro ' a ' y si lo uso"by/foo
, estoy sacando una copia del texto de aquí a la siguiente línea que contiene "foo" en el " pega una copia de" b registro b '. Para pegar de un registro simplemente el prefijo pasta con la misma secuencia de modificador:"ap
pega una copia de la ' un ' registro'"bP
' a antes de la línea actual.Esta noción de "prefijos" también agrega los análogos de los "adjetivos" y "adverbios" gramaticales a nuestro lenguaje de manipulación de texto ". La mayoría de los comandos (verbos) y el movimiento (verbos u objetos, dependiendo del contexto) también pueden tomar prefijos numéricos.
3J
significa "unir las siguientes tres líneas" yd5}
significa "eliminar de la línea actual hasta el final del quinto párrafo desde aquí".Todo esto es nivel intermedio vi . Nada de esto es específico de Vim y hay trucos mucho más avanzados en vi si estás listo para aprenderlos. Si fuera a dominar solo estos conceptos intermedios, probablemente encontraría que rara vez necesita escribir macros porque el lenguaje de manipulación de texto es lo suficientemente conciso y expresivo para hacer la mayoría de las cosas con la suficiente facilidad usando el lenguaje "nativo" del editor.
Una muestra de trucos más avanzados:
Hay una serie de
:
comandos, sobre todo la:% s/foo/bar/g
técnica de sustitución global. (Eso no es avanzado pero otros:
comandos pueden serlo). El:
conjunto completo de comandos fue heredado históricamente por las encarnaciones anteriores de vi como ed (editor de líneas) y más tarde las utilidades ex (editor de líneas extendidas). De hecho, vi se llama así porque es la interfaz visual para ex .:
los comandos normalmente operan sobre líneas de texto. ed y ex se escribieron en una época en la que las pantallas de terminal eran poco comunes y muchos terminales eran dispositivos de "teletipo" (TTY). Por lo tanto, era común trabajar a partir de copias impresas del texto, utilizando comandos a través de una interfaz extremadamente concisa (las velocidades de conexión comunes eran 110 baudios, o, aproximadamente, 11 caracteres por segundo, lo que es más lento que un mecanógrafo rápido; los retrasos eran comunes en sesiones interactivas multiusuario; además, a menudo hubo cierta motivación para conservar el papel).Entonces, la sintaxis de la mayoría de los
:
comandos incluye una dirección o rango de direcciones (número de línea) seguido de un comando. Naturalmente, uno podría usar números de línea literales::127,215 s/foo/bar
para cambiar la primera aparición de "foo" en "barra" en cada línea entre 127 y 215. También podría usar algunas abreviaturas como.
o$
para las líneas actuales y últimas respectivamente. También se podrían usar prefijos relativos+
y-
referirse a las compensaciones después o antes de la línea de curado, respectivamente. Por:.,$j
lo tanto: significa "desde la línea actual hasta la última línea, únalas todas en una sola línea".:%
es sinónimo de:1,$
(todas las líneas).Los comandos
:... g
y:... v
tienen alguna explicación, ya que son increíblemente poderosos.:... g
es un prefijo para "globalmente" aplicar un comando posterior a todas las líneas que coinciden con un patrón (expresión regular) mientras que:... v
aplica dicho comando a todas las líneas que NO coinciden con el patrón dado ("v" de "conVerse"). Al igual que con otros comandos ex , estos pueden tener el prefijo direccionamiento / referencias de rango. Por:.,+21g/foo/d
lo tanto, significa "eliminar cualquier línea que contenga la cadena" foo "desde la actual hasta las siguientes 21 líneas" mientras que:.,$v/bar/d
significa "desde aquí hasta el final del archivo, eliminar cualquier línea que NO contenga la cadena" barra ".Es interesante que el comando grep común de Unix se haya inspirado realmente en este comando ex (y lleva el nombre de la forma en que se documentó). El comando ex
:g/re/p
(grep) fue la forma en que documentaron cómo "globalmente" "imprimir" líneas que contienen una "expresión regular" (re). Cuando se usaron ed y ex , el:p
comando fue uno de los primeros que alguien aprendió y, a menudo, el primero que se usó al editar cualquier archivo. Fue así como imprimiste el contenido actual (generalmente solo una página llena a la vez usando:.,+25p
o algo así).Tenga en cuenta que
:% g/.../d
o (su contraparte reVerse / conVerse::% v/.../d
son los patrones de uso más comunes. Sin embargo, hay otrosex
comandos que vale la pena recordar:Podemos usar
m
para mover líneas yj
unir líneas. Por ejemplo, si tiene una lista y desea separar todas las cosas que coinciden (o, por el contrario, NO coinciden con algún patrón) sin eliminarlas, puede usar algo como::% g/foo/m$
... y todas las líneas "foo" se habrán movido a El final del archivo. (Tenga en cuenta el otro consejo sobre el uso del final de su archivo como un espacio de memoria virtual). Esto habrá preservado el orden relativo de todas las líneas "foo" mientras las ha extraído del resto de la lista. (Esto sería equivalente a hacer algo como:1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d
(copie el archivo en su propia cola, filtre la colagrep
y elimine todas las cosas de la cabeza).Para unir líneas, generalmente puedo encontrar un patrón para todas las líneas que deben unirse a su predecesor (todas las líneas que comienzan con "^" en lugar de "^ *" en alguna lista de viñetas, por ejemplo). Para ese caso, usaría:
:% g/^ /-1j
(para cada línea coincidente, sube una línea y únete a ellas). (Por cierto: para listas de viñetas tratando de buscar las líneas de bala y unirse a la siguiente no funciona para un par de razones ... que puede unirse a una línea de bala a otro, y no va a unirse a cualquier línea de bala en todo de sus continuaciones; solo funcionará en parejas en los partidos).Casi no hace falta mencionar que puede usar nuestro viejo amigo
s
(sustituto) con los comandosg
yv
(global / converse-global). Por lo general, no necesita hacerlo. Sin embargo, considere algún caso en el que desee realizar una sustitución solo en líneas que coincidan con otro patrón. A menudo puede usar un patrón complicado con capturas y usar referencias posteriores para preservar las partes de las líneas que NO desea cambiar. Sin embargo, a menudo será más fácil separar la coincidencia de la sustitución::% g/foo/s/bar/zzz/g
- para cada línea que contenga "foo", sustituya todas las "barras" por "zzz". (Algo como:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g
solo funcionaría para los casos de instancias de "barra" que fueron PREDEDADAS por "foo" en la misma línea; ya es bastante desgarbado, y habría que destrozarlo más para detectar todos los casos en que "bar" precedió a "foo")El punto es que no son más que simples
p
,s
yd
líneas en elex
conjunto de comandos.Las
:
direcciones también pueden referirse a marcas. Por lo tanto, puede usar::'a,'bg/foo/j
para unir cualquier línea que contenga la cadena foo a su línea posterior, si se encuentra entre las líneas entre las marcas ' a ' y ' b '. (Sí, todos losex
ejemplos de comandos anteriores se pueden limitar a subconjuntos de las líneas del archivo con el prefijo de este tipo de expresiones de direccionamiento).Eso es bastante oscuro (solo he usado algo así unas pocas veces en los últimos 15 años). Sin embargo, admitiré libremente que a menudo he hecho cosas de forma iterativa e interactiva que probablemente podrían haberse hecho de manera más eficiente si me hubiera tomado el tiempo para pensar en el encantamiento correcto.
Otro comando vi o ex muy útil es
:r
leer el contenido de otro archivo. Por lo tanto::r foo
inserta el contenido del archivo llamado "foo" en la línea actual.Más poderoso es el
:r!
comando. Esto lee los resultados de un comando. Es lo mismo que suspender la sesión vi , ejecutar un comando, redirigir su salida a un archivo temporal, reanudar su sesión vi y leer el contenido de la temp. archivo.Aún más potentes son los comandos
!
(bang) y:... !
( ex bang). Estos también ejecutan comandos externos y leen los resultados en el texto actual. Sin embargo, ¡también filtran selecciones de nuestro texto a través del comando! Esto podemos ordenar todas las líneas en nuestro archivo usando1G!Gsort
(G
es el comando vi "goto"; el valor predeterminado es ir a la última línea del archivo, pero puede ir precedido de un número de línea, como 1, la primera línea). Esto es equivalente a la variante ex:1,$!sort
. Los escritores a menudo usan!
las utilidades fmt o fold de Unix para reformatear o "envolver palabras" selecciones de texto. Una macro muy común es{!}fmt
(formatear el párrafo actual). Los programadores a veces lo usan para ejecutar su código, o solo partes de él, a través de sangría u otras herramientas de reformateo de código.El uso de los comandos
:r!
y!
significa que cualquier utilidad o filtro externo puede tratarse como una extensión de nuestro editor. Ocasionalmente los he usado con scripts que extrajeron datos de una base de datos, o con comandos wget o lynx que extrajeron datos de un sitio web, o comandos ssh que extrajeron datos de sistemas remotos.Otro comando ex útil es
:so
(abreviatura de:source
). Esto lee el contenido de un archivo como una serie de comandos. Al iniciar vi normalmente, de manera implícita, realiza una:source
de~/.exinitrc
archivo (y Vim normalmente lo hace en este~/.vimrc
, como es natural). El uso de esto es que puede cambiar su perfil de editor sobre la marcha simplemente buscando un nuevo conjunto de macros, abreviaturas y configuraciones de editor. Si eres astuto, incluso puedes usar esto como un truco para almacenar secuencias de comandos de edición ex para aplicar a archivos a pedido.Por ejemplo, tengo un archivo de siete líneas (36 caracteres) que ejecuta un archivo a través de wc e inserta un comentario de estilo C en la parte superior del archivo que contiene los datos de conteo de palabras. Puedo aplicar esa "macro" a un archivo usando un comando como:
vim +'so mymacro.ex' ./mytarget
(La
+
opción de línea de comando para vi y Vim se usa normalmente para iniciar la sesión de edición en un número de línea dado. Sin embargo, es un hecho poco conocido que uno puede seguir+
cualquier comando / expresión ex válido , como un comando "fuente" como Lo he hecho aquí; para un ejemplo simple, tengo scripts que invocan:vi +'/foo/d|wq!' ~/.ssh/known_hosts
para eliminar una entrada de mi archivo de hosts conocidos de SSH de forma no interactiva mientras estoy volviendo a generar imágenes de un conjunto de servidores).Por lo general, es mucho más fácil escribir tales "macros" usando Perl, AWK, sed (que, de hecho, es como grep, una utilidad inspirada en el comando ed ).
El
@
comando es probablemente el comando vi más oscuro . Al enseñar ocasionalmente cursos avanzados de administración de sistemas durante casi una década, he conocido a muy pocas personas que lo hayan usado.@
ejecuta el contenido de un registro como si fuera un comando vi o ex .Ejemplo: a menudo uso:
:r!locate ...
para encontrar algún archivo en mi sistema y leer su nombre en mi documento. A partir de ahí, elimino cualquier golpe extraño, dejando solo la ruta completa al archivo que me interesa. En lugar de Tabpasar laboriosamente a través de cada componente de la ruta (o peor, si estoy atascado en una máquina sin soporte para completar Tab) en su copia de vi ) solo uso:0i:r
(para convertir la línea actual en un comando válido : r ),"cdd
(para eliminar la línea en el registro "c") y@c
ejecutar ese comandoEso es solo 10 pulsaciones de teclas (y la expresión
"cdd
@c
es efectivamente una macro de dedo para mí, por lo que puedo escribirla casi tan rápido como cualquier palabra común de seis letras).Un pensamiento aleccionador
¡Solo he arañado a la superficie el poder de vi y nada de lo que he descrito aquí es parte de las "mejoras" por las cuales se nombra vim ! Todo lo que he descrito aquí debería funcionar en cualquier copia antigua de vi de hace 20 o 30 años.
Hay personas que han usado considerablemente más poder de vi que yo.
fuente
@
comando (en combinación conq
: macro de registro)Estás hablando de seleccionar y copiar texto, creo que deberías echarle un vistazo al modo visual de Vim .
En el modo visual, puede seleccionar texto usando los comandos de Vim, luego puede hacer lo que quiera con la selección.
Considere los siguientes escenarios comunes:
Debe seleccionar el siguiente paréntesis coincidente.
Podrías hacerlo:
v%
si el cursor está en el paréntesis inicial / finalvib
si el cursor está dentro del bloque de paréntesisDesea seleccionar texto entre comillas:
Desea seleccionar un bloque de llaves (muy común en los lenguajes de estilo C):
viB
vi{
Desea seleccionar el archivo completo:
ggVG
La selección del bloque visual es otra característica realmente útil, le permite seleccionar un área rectangular de texto, solo tiene que presionar Ctrl- Vpara iniciarlo, y luego seleccionar el bloque de texto que desee y realizar cualquier tipo de operación como tirar, eliminar, pegar, editar, etc. Es genial editar texto orientado a columnas .
fuente
o
saltará al otro extremo. Por lo tanto, puede mover tanto el principio como el final de la selección tanto como desee.Algunos consejos de productividad:
Movimientos inteligentes
*
y#
busque la palabra debajo del cursor hacia adelante / atrás.w
a la siguiente palabraW
a la siguiente palabra separada por espaciosb
/e
al comienzo / final de la palabra actual. (B
/ soloE
para espacios separados)gg
/G
saltar al inicio / final del archivo.%
saltar a la coincidencia {..} o (..), etc.{
/}
saltar al siguiente párrafo.'.
volver a la última línea editada.g;
volver a la última posición editadaComandos de edición rápida
I
insertar al comienzo.A
agregar al final.o
/O
abrir una nueva línea después / antes de la actual.v
/V
/Ctrl+V
modo visual (para seleccionar texto!)Shift+R
reemplazar textoC
cambiar la parte restante de la línea.Combinando comandos
La mayoría de los comandos aceptan una cantidad y dirección, por ejemplo:
cW
= cambiar hasta el final de la palabra3cW
= cambiar 3 palabrasBcW
= al comienzo de la palabra completa, cambie la palabra completaciW
= cambiar la palabra interna.ci"
= cambio interno entre ".."ci(
= cambiar texto entre (..)ci<
= cambiar texto entre <..> (necesitaset matchpairs+=<:>
en vimrc)4dd
= eliminar 4 líneas3x
= eliminar 3 caracteres.3s
= sustituir 3 caracteres.Comandos útiles del programador
r
reemplazar un carácter (por ejemplo,rd
reemplaza el carácter actual cond
).~
Cambia el caso.J
une dos líneas.
repetir el último comando (una macro simple)==
sangrado de línea fija>
bloque de sangría (en modo visual)<
bloque no sangrado (en modo visual)Grabación macro
q[ key ]
para comenzar a grabar.q
para detener la grabación.@[ key ]
.Mediante el uso de comandos y movimientos muy específicos, VIM puede reproducir esas acciones exactas para las siguientes líneas. (p. ej., A para agregar al final,
b
/e
para mover el cursor al principio o al final de una palabra, respectivamente)Ejemplo de configuraciones bien construidas
La configuración puede almacenarse en todo el
~/.vimrc
sistema/etc/vimrc.local
y luego leerse desde el/etc/vimrc
archivo usando:(tendrá que reemplazar el
#
carácter de comentario con"
para que funcione en VIM, quería dar un resaltado de sintaxis adecuado aquí).Los comandos que he enumerado aquí son bastante básicos, y los principales que uso hasta ahora. Ya me hacen más productivo, sin tener que saber todas las cosas elegantes.
fuente
'.
esg;
, lo que salta de nuevo a través delchangelist
. Va a la última posición editada, en lugar de la última línea editadaEl mecanismo Control+ Res muy útil :-) En el modo de inserción o en el modo de comando (es decir, en la
:
línea al escribir comandos), continúe con un registro numerado o con nombre:Ver
:help i_CTRL-R
y:help c_CTRL-R
para más detalles, y husmear cerca para obtener más bondad CTRL-R.fuente
Control-A
también funciona en modo de inserción para el último texto insertado, yControl-@
para insertar el último texto insertado e inmediatamente cambiar al modo normalVim Plugins
Aquí hay muchas buenas respuestas, y una sorprendente sobre el zen de vi. Una cosa que no veo mencionada es que vim es extremadamente extensible a través de complementos. Hay scripts y complementos para que haga todo tipo de locuras que el autor original nunca consideró. Aquí hay algunos ejemplos de complementos vim increíblemente útiles:
rails.vim
Rails.vim es un complemento escrito por tpope. Es una herramienta increíble para las personas que desarrollan rieles. Hace cosas mágicas sensibles al contexto que le permiten saltar fácilmente de un método en un controlador a la vista asociada, a un modelo y hasta pruebas unitarias para ese modelo. Ha ahorrado docenas, si no cientos de horas, como desarrollador de rieles.
gist.vim
Este complemento le permite seleccionar una región de texto en modo visual y escribir un comando rápido para publicarlo en gist.github.com . Esto permite un fácil acceso a Pastebin, que es increíblemente útil si estás colaborando con alguien a través de IRC o IM.
space.vim
Este complemento proporciona una funcionalidad especial a la barra espaciadora. Convierte la barra espaciadora en algo análogo al período, pero en lugar de repetir acciones, repite movimientos. Esto puede ser muy útil para moverse rápidamente a través de un archivo de la manera que usted defina sobre la marcha.
surround.vim
Este complemento le brinda la capacidad de trabajar con texto delimitado de alguna manera. Le da objetos que denotan cosas dentro de parens, cosas dentro de comillas, etc. Puede ser útil para manipular texto delimitado.
supertab.vim
Este script trae una funcionalidad de finalización de pestañas elegante a vim El material de autocompletar ya está allí en el núcleo de vim, pero esto lo lleva a una pestaña rápida en lugar de múltiples accesos directos diferentes. Muy práctico e increíblemente divertido de usar. Si bien no es la inteligencia de VS, es un gran paso y ofrece una gran cantidad de la funcionalidad que le gustaría esperar de una herramienta de finalización de pestañas.
syntastic.vim
Esta herramienta trae comandos externos de verificación de sintaxis a vim. No lo he usado personalmente, pero he escuchado grandes cosas al respecto y el concepto es difícil de superar. Verificar la sintaxis sin tener que hacerlo manualmente es un gran ahorro de tiempo y puede ayudarlo a detectar errores sintácticos a medida que los presenta, en lugar de cuando finalmente se detiene para probar.
fugitivo.vim
Acceso directo a git desde el interior de vim. Nuevamente, no he usado este complemento, pero puedo ver la utilidad. Desafortunadamente, estoy en una cultura donde svn se considera "nuevo", por lo que es probable que no vea a git en el trabajo por bastante tiempo.
nerdtree.vim
Un navegador de árbol para vim. Empecé a usar esto recientemente, y es realmente útil. Le permite colocar una vista de árbol en una división vertical y abrir archivos fácilmente. Esto es ideal para un proyecto con muchos archivos fuente entre los que saltas con frecuencia.
FuzzyFinderTextmate.vim
Este es un complemento no mantenido, pero sigue siendo increíblemente útil. Proporciona la capacidad de abrir archivos usando una sintaxis descriptiva "difusa". Significa que en un árbol escaso de archivos solo necesita escribir suficientes caracteres para desambiguar los archivos que le interesan del resto de la muesca.
Conclusión
Hay muchas herramientas increíbles disponibles para vim. Estoy seguro de que solo he arañado la superficie aquí, y vale la pena buscar herramientas aplicables a su dominio. La combinación del poderoso conjunto de herramientas tradicionales de vi, las mejoras de vim y los complementos que extienden vim aún más, es una de las formas más poderosas para editar texto jamás concebido. Vim es fácilmente tan poderoso como emacs, eclipse, visual studio y textmate.
Gracias
Gracias a duwanis por sus configuraciones vim de las cuales aprendí mucho y tomé prestados la mayoría de los complementos listados aquí.
fuente
.
Repita el último comando de cambio de textoAhorro mucho tiempo con este.
El modo visual se mencionó anteriormente, pero el modo visual de bloque me ha ahorrado mucho tiempo al editar columnas de tamaño fijo en un archivo de texto. (Accedido con Ctrl-V).
fuente
.
tecla.soldado americano
Vaya a la última ubicación editada (muy útil si realizó alguna búsqueda y luego desea volver a editar)
^ P y ^ N
Complete el texto anterior (^ P) o siguiente (^ N).
^ O y ^ I
Ir a la ubicación anterior (
^O
-"O"
para la anterior) o a la siguiente (^I
-"I"
cerca de"O"
). Cuando realiza búsquedas, edita archivos, etc., puede navegar a través de estos "saltos" hacia adelante y hacia atrás.fuente
Recientemente descubrí este sitio: http://vimcasts.org/
Es bastante nuevo y realmente muy bueno. El tipo que está ejecutando el sitio cambió de textmate a vim y presenta elenco muy bueno y conciso sobre temas específicos de vim. ¡Echale un vistazo!
fuente
CTRL+A incrementa el número en el que estás parado.
fuente
Todo en modo Normal:
f <char> para pasar a la siguiente instancia de un personaje en particular en la línea actual, y ; repetir.
F <char> para pasar a la instancia anterior de un personaje en particular en la línea actual y ; repetir.
Si se usa de manera inteligente, los dos anteriores pueden hacer que te muevas rápidamente en una línea.
* en una palabra para buscar la siguiente instancia.
# en una palabra para buscar la instancia anterior.
fuente
ct(
borrará la palabra y lo pondrá en modo de inserción, ¡pero mantenga las paréntesis!Sesión
a. guardar la sesión
si. forzar guardar sesión
C. sesión de carga
Sumar y restar
a. Sumar y restar
si. Desasignación de teclas de ventana
C. Con macro
fuente
La semana pasada en el trabajo, nuestro proyecto heredó mucho código Python de otro proyecto. Desafortunadamente, el código no se ajustaba a nuestra arquitectura existente: todo se hizo con variables y funciones globales, que no funcionarían en un entorno de subprocesos múltiples.
Teníamos ~ 80 archivos que debían modificarse para orientarlos a objetos: todas las funciones se movían a clases, los parámetros cambiaban, se agregaban declaraciones de importación, etc. Teníamos una lista de aproximadamente 20 tipos de arreglos que debían hacerse en cada archivo. Yo estimaría que hacerlo a mano, una persona podría hacer de 2 a 4 por día.
Así que hice el primero a mano y luego escribí un script vim para automatizar los cambios. La mayor parte era una lista de comandos vim, por ejemplo
El último merece un poco de explicación:
Para un par de transformaciones más complejas, como la generación de todas las declaraciones de importación, incrusté algo de Python en el script vim.
Después de algunas horas de trabajo, tenía un script que haría al menos el 95% de la conversión. Acabo de abrir un archivo en vim, luego ejecuto
:source fixit.vim
y el archivo se transforma en un abrir y cerrar de ojos.Todavía tenemos el trabajo de cambiar el 5% restante que no valía la pena automatizar y probar los resultados, pero al pasar un día escribiendo este script, calculo que hemos ahorrado semanas de trabajo.
Por supuesto, habría sido posible automatizar esto con un lenguaje de script como Python o Ruby, pero habría tardado mucho más en escribir y sería menos flexible; el último ejemplo habría sido difícil ya que la expresión regular por sí sola no sería capaz de manejar paréntesis anidados, p. ej. para convertir
bar(foo(xxx))
afoo(xxx).bar()
. Vim fue perfecto para la tarea.fuente
%s/\(bar\)(\(.\+\))/\2.\1()/
haría eso también. (Los escapes son compatibles con:set magic
). Solo para el registro. :)%s/\v(bar)\((.+)\)/\2.\1()/
if bar(foo(xxx)) or wibble(xxx):
convierte en loif foo(xxx)) or wibble(xxx.bar():
que está completamente equivocado.¡Utiliza el explorador de archivos integrado! El comando es
:Explore
y le permite navegar a través de su código fuente muy, muy rápido. Tengo estos mapas en mi.vimrc
:El explorador también le permite realizar modificaciones en los archivos. Publicaré algunas de mis teclas favoritas, presionar
<F1>
le dará la lista completa:cd ..
)fuente
:find
,:tag
y las diversas pulsaciones de teclas relacionadas para saltar. (Tal vez esto se debe a que los árboles de fuentes en las que trabajo son grandes y organizadas de manera diferente de lo que hubiera hecho :)?)Soy miembro de la American Cryptogram Association. La revista bimestral incluye más de 100 criptogramas de varios tipos. Aproximadamente 15 de estos son "criptaritmos", varios tipos de problemas aritméticos con letras sustituidas por los dígitos. Dos o tres de estos son sudokus, excepto con letras en lugar de números. Cuando se completa la cuadrícula, las nueve letras distintas deletrearán una palabra o palabras, en alguna línea, diagonal, espiral, etc., en algún lugar de la cuadrícula.
En lugar de trabajar con lápiz o escribir los problemas a mano, descargo los problemas del área de miembros de su sitio web.
Cuando trabajo con estos sudokus, uso vi, simplemente porque estoy usando las instalaciones que tiene vi que pocos otros editores tienen. Principalmente al convertir la cuadrícula con letras en una cuadrícula numerada, porque me resulta más fácil de resolver, y luego la cuadrícula numerada completa de nuevo en la cuadrícula con letras para encontrar la palabra o palabras de solución.
El problema está formateado como nueve grupos de nueve letras, con
-
s representando los espacios en blanco, escritos en dos líneas. El primer paso es formatearlos en nueve líneas de nueve caracteres cada una. No hay nada especial en esto, solo inserta ocho saltos de línea en los lugares apropiados.El resultado se verá así:
Entonces, el primer paso para convertir esto en números es hacer una lista de las letras distintas. Primero, hago una copia del bloque. Coloco el cursor en la parte superior del bloque y luego escribo
:y}}p
.:
me pone en modo comando,y
tira del siguiente comando de movimiento. Como}
es un movimiento al final del siguiente párrafo,y}
tira del párrafo.}
luego mueve el cursor al final del párrafo yp
pega lo que habíamos arrancado justo después del cursor. Entoncesy}}p
crea una copia del siguiente párrafo y termina con el cursor entre las dos copias.A continuación, debo convertir una de esas copias en una lista de letras distintas. Ese comando es un poco más complejo:
:
nuevamente me pone en modo comando.!
indica que el contenido del próximo tirón debe canalizarse a través de una línea de comando.}
tira del siguiente párrafo, y la línea de comando luego usa eltr
comando para eliminar todo excepto las letras mayúsculas, elsed
comando para imprimir cada letra en una sola línea y elsort
comando para ordenar esas líneas, eliminar duplicados y luegotr
eliminar las nuevas líneas, dejando las nueve letras distintas en una sola línea, reemplazando las nueve líneas que habían formado el párrafo originalmente. En este caso, las letras son:ACELNOPST
.El siguiente paso es hacer otra copia de la cuadrícula. Y luego utilizar las cartas que hemos identificado simplemente para reemplazar cada una de esas cartas con un dígito del 1 al 9. Eso es simple:
:!}tr ACELNOPST 0-9
. El resultado es:Esto puede resolverse de la manera habitual o ingresarse en cualquier solucionador de sudoku que prefiera. La solución completa se puede volver a convertir en letras con
:!}tr 1-9 ACELNOPST
.Hay poder en vi que es igualado por muy pocos. El mayor problema es que solo unos pocos libros de tutoriales vi, sitios web, archivos de ayuda, etc., hacen más que apenas tocar la superficie de lo que es posible.
fuente
:
ingresar al modo de comando, pero luego invariablemente especifica comandos de modo normal (comoy}}p
) que posiblemente no funcionen desde el modo de comando ?!:se tw=1 fo=
(preparación)VG:s/./& /g
(insertar espacios),gvgq
(dividir en líneas separadas),V{:sort u
(ordenar y eliminar duplicados)Manipulaciones de texto a granel!
Ya sea a través de macros:
qq
q
@q
(la primera vez),@@
después de eso.20@@
O a través de expresiones regulares:
:%s/[fo]+/bar/g
(Pero ten cuidado: si haces lo último, tendrás 2 problemas :).)
fuente
:% g/foo/-1j
o:'a,'z v/bar/-1j
por ejemplo (donde el primero es "todas las líneas y coinciden con el patrón" mientras que el último es "líneas entre la marca a y la marca z que no coinciden con el patrón"). La parte después del patrón en un comandog
ov
ex puede ser cualquier otro comando ex, -1j es solo un movimiento de línea relativo y un comando de unión.Hace poco descubrí
q:
. Abre la "ventana de comandos" y muestra sus comandos ex-mode (modo comando) más recientes. Puede moverse como de costumbre dentro de la ventana y presionar<CR>
ejecuta el comando. Puedes editar, etc. también. No tiene precio cuando está jugando con algún comando complejo o expresión regular y no desea volver a escribir todo el asunto, o si lo complejo que desea hacer es devolver 3 comandos. Es casi como bashset -o vi
, pero para vim en sí (¡je!).Vea
:help q:
más partes interesantes para ir y venir.fuente
Acabo de descubrir el omnicompletion de Vim el otro día, y aunque admitiré que estoy un poco confuso en lo que hace, he tenido resultados sorprendentemente buenos simplemente combinando Ctrl+ x Ctrl+ uo Ctrl+ n/ Ctrl+ pen modo de inserción. No es del todo IntelliSense , pero todavía lo estoy aprendiendo.
¡Pruébalo!
:help ins-completion
fuente
Estos no son atajos, pero están relacionados:
Aumentan mi productividad.
fuente
Capslock::Escape
Otro útil "atajo" vi que uso con frecuencia es 'xp'. Esto cambiará el carácter debajo del cursor con el siguiente carácter.
fuente
Xp
ir por el otro lado<Ctrl> + W, V para dividir la pantalla verticalmente
<Ctrl> + W, W para cambiar entre las ventanas
! python% [args] para ejecutar el script que estoy editando en esta ventana
ZF en modo visual para doblar líneas arbitrarias
fuente
<C-w>n
o<C-w>s
es una nueva ventana horizontal,<C-w>b
es la ventana inferior derecha,<C-w>c
o<C-w>q
está cerca de la ventana,<C-w>x
aumenta y luego disminuye el ancho de la ventana (??),<C-w>p
es la última ventana,<C-w>backspace
se mueve hacia la izquierda (ish) ventana:help ctrl-w
FTW ... ¡hazte un favor y obliga a probar estas cosas durante al menos 15 minutos!Modo visual
Como han dicho otras personas, el modo visual es la respuesta a su problema de copiar / cortar y pegar. Vim te da 'v', 'V' y Cv. Minúscula 'v' en vim es esencialmente la misma que la tecla shift en el bloc de notas. Lo bueno es que no tienes que mantenerlo presionado. Puede usar cualquier técnica de movimiento para navegar de manera eficiente al punto inicial (o final) de su selección. Luego presione 'v', y use técnicas de movimiento eficientes nuevamente para navegar al otro extremo de su selección. Entonces 'd' o 'y' le permite cortar o copiar esa selección.
La ventaja que tiene el modo visual de vim sobre la descripción de Jim Dennis de cortar / copiar / pegar en vi es que no tiene que obtener la ubicación correcta. A veces es más eficiente usar un movimiento rápido para llegar a la vecindad general de donde quieres ir y luego refinarlo con otros movimientos que pensar en un comando de movimiento único más complejo que te lleve exactamente a donde quieres ir.
La desventaja de usar el modo visual ampliamente de esta manera es que puede convertirse en una muleta que usa todo el tiempo, lo que le impide aprender nuevos comandos vi (m) que le permitirán hacer las cosas de manera más eficiente. Sin embargo, si eres muy proactivo para aprender nuevos aspectos de vi (m), entonces esto probablemente no te afectará mucho.
También volveré a enfatizar que la línea visual y los modos de bloqueo visual le brindan variaciones sobre este mismo tema que pueden ser muy poderosas ... especialmente el modo de bloque visual.
Sobre el uso eficiente del teclado
También estoy en desacuerdo con su afirmación de que alternar las manos es la forma más rápida de usar el teclado. Tiene un elemento de verdad en él. Hablando de manera muy general, el uso repetido de la misma cosa es lento. El ejemplo más significativo de este principio es que las pulsaciones de teclas consecutivas escritas con el mismo dedo son muy lentas. Su afirmación probablemente se deriva de la tendencia natural a usar la transformación s / finger / hand / en este patrón. Hasta cierto punto es correcto, pero en el extremo extremadamente alto del espectro de eficiencia es incorrecto.
Solo pregúntale a cualquier pianista. Pregúnteles si es más rápido tocar una sucesión de algunas notas alternando manos o usando dedos consecutivos de una sola mano en secuencia. La forma más rápida de escribir 4 pulsaciones de teclas no es alternar manos, sino escribirlas con 4 dedos de la misma mano en orden ascendente o descendente (llame a esto una "carrera"). Esto debería ser evidente una vez que haya considerado esta posibilidad.
El problema más difícil es la optimización para esto. Es bastante fácil de optimizar para la distancia absoluta en el teclado. Vim hace eso. Es mucho más difícil de optimizar en el nivel de "ejecución", pero vi (m) con su edición modal le brinda una mejor oportunidad de poder hacerlo que cualquier enfoque no modal (ejem, emacs).
En Emacs
Para que los fanáticos de emacs ignoren completamente mi publicación completa debido a ese último comentario entre paréntesis, creo que debo describir la raíz de la diferencia entre las religiones emacs y vim. Nunca he hablado en las guerras de los editores y probablemente no lo volveré a hacer, pero nunca escuché a nadie describir las diferencias de esta manera, así que aquí va. La diferencia es la siguiente compensación:
Vim le brinda una eficiencia de edición de texto sin procesar sin igual Emacs le brinda una capacidad sin igual para personalizar y programar el editor
Los fanáticos ciegos de vim afirmarán que vim tiene un lenguaje de script. Pero es un lenguaje oscuro y ad-hoc diseñado para servir al editor. Emacs tiene Lisp! Basta de charla. Si no aprecia la importancia de esas dos últimas oraciones o desea aprender lo suficiente sobre programación funcional y Lisp para desarrollar esa apreciación, entonces debe usar vim.
Los fanáticos de emacs afirmarán que emacs tiene el modo viper, por lo que es un superconjunto de vim. Pero el modo víbora no es estándar. Tengo entendido que el modo viper no es utilizado por la mayoría de los usuarios de emacs. Como no es el valor predeterminado, la mayoría de los usuarios de emacs probablemente no desarrollen una verdadera apreciación de los beneficios del paradigma modal.
En mi opinión, estas diferencias son ortogonales. Creo que los beneficios de vim y emacs como los he declarado son válidos. Esto significa que el último editor aún no existe. Probablemente sea cierto que emacs sería la plataforma más fácil en la que basar el editor final. Pero la edición modal no está arraigada en la mentalidad de emacs. La comunidad emacs podría moverse de esa manera en el futuro, pero eso no parece muy probable.
Entonces, si desea una eficiencia de edición sin procesar, use vim. Si desea el mejor entorno para crear secuencias de comandos y programar su editor, use emacs. Si desea alguno de los dos con énfasis en la capacidad de programación, use emacs con modo viper (o programe su propio modo). Si quieres lo mejor de ambos mundos, no tienes suerte por ahora.
fuente
Pase 30 minutos haciendo el tutorial de vim (ejecute vimtutor en lugar de vim en la terminal). Aprenderá los movimientos básicos y algunas pulsaciones de teclas, esto lo hará al menos tan productivo con vim como con el editor de texto que utilizó anteriormente. Después de eso, bueno, lea la respuesta de Jim Dennis nuevamente :)
fuente
Ser capaz de ejecutar ediciones complejas y repetitivas con muy pocas pulsaciones de teclas (a menudo utilizando macros ). ¡Eche un vistazo a VimGolf para presenciar el poder de Vim!
Después de más de diez años de uso casi diario, es difícil imaginar usar cualquier otro editor.
fuente
Use
\c
en cualquier lugar de una búsqueda para ignorar mayúsculas y minúsculas (anulando su configuración de ignorar caso o caso inteligente). Por ejemplo,/\cfoo
o/foo\c
coincidiráfoo
,Foo
,fOO
,FOO
, etc.Use
\C
en cualquier lugar de una búsqueda para forzar la coincidencia de mayúsculas y minúsculas. Por ejemplo,/\Cfoo
o/foo\C
solo coincidirá con foo.fuente
Me sorprendió encontrar que nadie mencionara el
t
movimiento. Con frecuencia lo uso con listas de parámetros en forma dedt,
oyt,
fuente
Extraño, nadie ha mencionado las etiquetas. Descargue "etiquetas exuberantes" y colóquelo delante de la versión preinstalada que ya tiene en su ruta de búsqueda. Cd a la raíz de lo que sea que estés trabajando; por ejemplo la distribución del kernel de Android. Escriba "ctags -R". para crear un índice de archivos de origen en cualquier lugar debajo de ese directorio en un archivo llamado "etiquetas". Esto contiene todas las etiquetas, nomatter el idioma ni en qué parte del directorio, en un archivo, por lo que el trabajo en varios idiomas es fácil.
Luego abra vim en esa carpeta y lea: help ctags para algunos comandos. Algunas que uso a menudo:
Coloque el cursor en una llamada al método y escriba CTRL-] para ir a la definición del método.
Escriba: ta name para ir a la definición de nombre.
fuente
Sangría automática:
gg
(ir al inicio del documento)=
(tiempo de sangría)shift-g
(ir al final del documento)Necesitará 'sangría de plugin de tipo de archivo' en su
.vimrc
archivo, y probablemente la configuración apropiada de 'shiftwidth' y 'expandtab'.fuente
Preguntaste sobre atajos productivos, pero creo que tu verdadera pregunta es: ¿Vale la pena vim? La respuesta a esta pregunta de stackoverflow es -> "Sí"
Debes haber notado dos cosas. Vim es poderoso, y vim es difícil de aprender. Gran parte de su poder radica en su capacidad de expansión y una combinación interminable de comandos. No te sientas abrumado. Ve lento. Un comando, un complemento a la vez. No te excedas.
Toda esa inversión que pones en vim pagará mil veces. Vas a estar dentro de un editor de texto por muchas, muchas horas antes de morir. Vim será tu compañero.
fuente
Múltiples buffers, y en particular saltos rápidos entre ellos para comparar dos archivos con
:bp
y:bn
(correctamente reasignados a un solo Shift+ po Shift+ n)vimdiff
modo (se divide en dos buffers verticales, con colores para mostrar las diferencias)Copia de área con Ctrl+v
Y, por último, la finalización de tabulación de los identificadores (busque "mosh_tab_or_complete"). Eso es un cambio de vida.
fuente
De acuerdo con el cartel superior: el : r! El comando es muy útil.
Muy a menudo lo uso para "pegar" cosas:
De esta manera no tengo que jugar
:set paste
.fuente
clipboard
opción enunnamed
(set clipboard=unnamed
en su .vimrc) para usar el portapapeles del sistema de forma predeterminada. O si todavía quiere que el sistema Separar el portapapeles del registro sin nombre, utilice el registro portapapeles apropiado nombre:"*p
.:set paste
no funciona tan bien si el autoindent está habilitado.