Recientemente me di cuenta de cómo vim funciona muy bien para el golf, especialmente para la complejidad de kolmogorov . Además, de acuerdo con meta vim es un 'lenguaje de programación' perfectamente aceptable, al menos, para el alcance de este sitio, eso es.
¿Qué consejos generales tienes para jugar al golf en Vim? Estoy buscando ideas que se puedan aplicar a problemas de código de golf y que también sean al menos algo específicas para Vim (por ejemplo, "eliminar comentarios" no es una respuesta).
Por favor, publique un consejo por respuesta.
Respuestas:
Tenga en cuenta las variantes en mayúsculas de los comandos comunes. Esto puede ahorrar trivialmente una pulsación de tecla en muchos contextos. Por ejemplo:
¡Otro es usar en
G
lugar degg
, pero solo si usa un conteo! Por ejemplo, sin un conteo, segg
mueve al principio y seG
mueve al final. Sin embargo, con un recuento, ambos se mueven a la línea que especifique, por lo que5G
es más corto pero equivalente a5gg
.Otro, es usar
H
en lugar degg
, pero es importante tener en cuenta que esto solo funciona si puede garantizar que cualquier entrada no ocupará más que el número predeterminado de filas (creo que es 24, pero puede variar).fuente
$
, al menosC
yD
ahorraría algo).G
ygg
no son equivalentes El primero va al final del búfer y el segundo va al principio.5G
es equivalente a5gg
. Agregaré más detalles sobre ese punto.Cada vez que falla un comando, emitirá un ruido ding, que cancelará la macro actual. Puede (ab) usar esto para crear una forma cruda de bucle. Por ejemplo, si desea repetir las pulsaciones de teclas
<foobar>
hasta que el búfer tenga menos de 3 líneas. Tu puedes hacerlo que significa:
Es importante tener en cuenta que si está probando esto en una sesión vim,
@q
podría tener efectos secundarios no deseados, ya que las macros se cargan desde.vim_profile
. Puede solucionar esto de dos maneras diferentes. Probablemente la mejor solución es lanzar vim conTambién puedes eliminar tu
.viminfo
.Si ya ha lanzado vim, puede escribir
al principio para poner a cero la macro.
Otras condiciones con las que puede reemplazar el 3G son
o
fuente
Hay más versiones abreviadas de comandos ex que crees. Por ejemplo, probablemente ya sabía que
:global
se puede acortar:g
, pero ¿sabía que eso:nnoremap
es equivalente a:nn
?Es una buena idea ejecutar
:h :foo
todos los comandos ex que está utilizando en su respuesta para ver si hay una versión más corta.fuente
siempre es equivalente a
que también es equivalente a
Sorpresivamente suficiente. (En general, sin ningún indicador, la última barra diagonal en una
:s
expresión nunca es necesaria).fuente
:%s/x
, no elimina cada aparición de x, solo la primera en cada línea.:&&
para repetir un comando sustituto y sus banderas.Digamos que está en modo de inserción y desea hacer un solo comando de modo normal. Puedes escribir eso así:
No lo hagas así. En su lugar, use
<C-o>
, que ejecuta un solo comando normal y luego vuelve inmediatamente al modo de inserción.fuente
<CR>
después<foobar>
para enviar el comando?:
,/
o?
)Hay tres operadores de "cambio de caso",
Dado que estos son operadores, toman un movimiento, por lo que para convertir el carácter actual en minúsculas usaría
Aquí es donde entra el truco divertido. :) Si desea cambiar el caso de un solo personaje o la línea actual, es un byte más corto en modo visual. Por ejemplo
gul
es equivalente aY
gu_
(_ es la línea actual) es equivalente aEste truco no funciona para alternar, ya que
v?
desencadena una búsqueda hacia atrás en modo visual, (comov/
si se moviera en la dirección opuesta), por lo que necesita en suvg?
lugar. Sin embargo, aquí es donde puede usar el~
operador para guardar aún más bytes! (Gracias @Doorknob por señalar esto)Puedes ver este truco en acción en mi respuesta vim aquí , y en la respuesta V equivalente en la publicación.
fuente
~
, lo que alterna el caso del personaje debajo del cursor y mueve uno hacia la derecha!El alfabeto en 10 pulsaciones de teclas
Todo el crédito por esta técnica es para Lynn, quien la utilizó por primera vez en esta respuesta . Lo escribo aquí para la posteridad.
Use las siguientes diez teclas para tirar del alfabeto en minúsculas:
(Dónde
␍
hay un retorno de carro, es decir, la tecla Intro).Explicación
:h<_␍
abre la sección de ayudav_b_<_example
(un ejemplo de selección visual en bloque), que contiene el textoabcdefghijklmnopqrstuvwyxz
.jjY
baja a esa línea y tira de ella, luegoZZ
cierra la ventana de ayuda.fuente
Conoce tus registros
Yankear o eliminar texto en un registro específico (p
"aY
. Ej. ) Para usarlo más tarde no siempre es necesario. Vim tiene varios registros que se rellenan automáticamente con los sujetos de varios comandos. Escriba:help registers
para verlos todos, pero aquí hay algunos de particular interés:Registro sin nombre:
""
- El último texto que fue eliminado o eliminado.Registro numerado
"0
: el último texto que se tiró.Registros numerados
"1
-"9
- El último texto que se eliminó a menos que fuera menos de una línea. Cada vez que"1
se llena, sus contenidos anteriores se desplazan"2
y así sucesivamente.Pequeño registro de eliminación:
"-
- El último texto más corto que una línea que se eliminó.Último texto insertado:
".
En particular, los registros
"-
y"1
pueden ser útiles juntos, permitiéndole borrar un texto con, por ejemplo,dd
en el"1
registro y borrar otro texto conD
el"-
(por supuesto, la semántica no es idéntica, pero a menudo no es necesario que sea )Todos los registros pueden ser un poco difíciles de controlar, pero puede ver el contenido de todos sus registros en cualquier momento escribiendo
:registers
.fuente
Esto surgió en el chat antes, así que pensé que podría publicarlo como un consejo completo.
<C-a>
e<C-x>
incrementa y disminuye el siguiente número en la línea. Esta es una característica extremadamente útil para algunas matemáticas simples, pero también permite un pequeño truco ordenado.Digamos que necesitas saltar al siguiente número. Por ejemplo, necesitamos cambiar
a
La forma obvia es saltar al 2, luego hacer:
Como esto es más corto que
Hay muchas formas diferentes de saltar al 2. Por ejemplo,
Así como muchas otras formas.
Estas son todas 2 (o más) pulsaciones de teclas. Sin embargo, puesto
<C-a>
y<C-x>
no sólo los números de aumento / disminución, sino también saltar al siguiente número, podemos tomar un byte confuente
Movimientos golfistas
Con frecuencia, si está trabajando con un bloque de texto (especialmente en desafíos de ascii-art ), deberá pasar al primer o último carácter en el búfer.
G
ygg
son bastante buenos, pero hay algunas cosas molestas. Por ejemplo, para obtener el último carácter, necesitaG$
ygg
no necesariamente lo colocará en la primera columna si hay espacios en blanco iniciales. Aquí hay algunos movimientos más agradables, aunque tenga en cuenta que solo funcionan si su texto no tiene líneas vacías en el medio:Primer carácter del búfer:
{
es mejor quegg0
. Si hay líneas vacías en el medio del texto, también puede usar logo
que lo lleva al primer carácter en el búfer sin importar qué.Último carácter del búfer:
}
es mejor queG$
¡Estos también funcionan como argumento para un operador, pero tenga en cuenta que son movimientos de carácter inteligente, no movimientos de línea inteligente!
fuente
H
es más golfista quegg
H
no es confiable. Su comportamiento depende del tamaño de la ventana visible y de dónde se encuentre en el búfer. (Se reasigna en V para evitar esta confusión)Hacer cálculos con el registro de expresión
Puede hacer cálculos tanto en modo normal como en modo inserción.
Modo normal
En modo normal, si escribe
@=
su cursor se moverá a la línea de comando, donde puede ingresar cualquier expresión. Cuando presiona Intro, el resultado de la expresión se ejecutará como comandos de modo normal.Por ejemplo, suponga que desea ir a la columna central de la línea actual. La llamada a la función
col('$')
devuelve el número de columnas en la línea, por lo que podemos lograrlo escribiendo lo siguiente:Cuando presiona enter, el cursor vuelve al búfer y vim espera a un operador (como
|
) como si acabara de ingresar un número. Alternativamente, podría haber ingresado esto:... pero por supuesto eso es más bytes.
Modo de inserción
También puede usar el registro de expresión en modo de inserción presionando en
<Ctrl-r>=
lugar de@=
. Funciona igual en modo normal, excepto que el resultado de la expresión que ingrese se ejecutará en modo de inserción. Por ejemplo, si escribiste<Ctrl-r>=col('$')<CR>
, el número de columnas en la línea actual se insertaría en el cursor como si lo hubiera escrito.Para obtener más información sobre el registro de expresiones, escriba
:help "=
.Reutilizando expresiones
La última expresión que utilizó se almacena en el registro de la expresión,
"=
. Escribir@=<CR>
en modo normal o<Ctrl-r>=<CR>
en modo de inserción evaluará la expresión nuevamente, permitiéndole usarlos de manera muy parecida a las macros.Hacer cálculos en sustituciones
También puede evaluar expresiones al hacer sustituciones de expresiones regulares. Todo lo que tiene que hacer es comenzar su sustitución con
\=
. Por ejemplo, suponga que desea numerar las líneas en este archivo:La llamada a la función
line('.')
devuelve el número de línea actual, por lo que el trabajo es fácil. Ingresando esto:... produce el resultado deseado:
Para usar grupos capturados en tal expresión, puede usar la
submatch()
función, donde, por ejemplo,submatch(0)
es equivalente a\0
una sustitución ordinaria,submatch(1)
es equivalente a\1
, etc. Esto, desafortunadamente, consume muchas teclas.Para obtener más información sobre la sustitución de expresiones, escriba
:help sub-replace-expression
.fuente
i1 <esc>bqqywjPb<C-a>@qq@q
es una solución de modo normal puro que es 5 bytes más corta. Y si estás en Unix, incluso podrías hacerlo:%!nl
. Aún así buenos consejos!Puede modificar directamente el texto de una macro, que puede ser significativamente más corto que un condicional enrevesado. Por ejemplo, supongamos que desea pegar algo n veces, donde n es la entrada del usuario. Primero intenté hacer esto:
Explicación:
Esto es 18 pulsaciones de teclas, y una forma realmente fea de hacerlo. En su lugar, vaya a la ubicación de ese número y haga esto:
Explicación:
Esto es 9 pulsaciones de teclas, una gran mejora.
Editar:
Aún más corto es ejecutar la macro para su número y luego escribir su comando. Por ejemplo:
Explicación:
7 pulsaciones de teclas.
fuente
D
, nodd
. 2. Si el comando no involucra registros, puede hacerlo aún más corto. Por ejemplo, si desea repetir el carácterx
tantas veces como el número debajo del cursor, en lugar de"qD@qix<esc>
, useD@"ix<esc>
.