miércoles, 16 de noviembre de 2011

Cómo hacer un bookmarklet con vim


Supongamos el caso de uso de mi otro post, en el cual hice un js que estuve probando y mejorando una y otra vez en chrome vía ctrl+shift+i y luego solapa consola.

Un script como este:

Se puede pasar a bookmarklet con:

gg: voy al inicio de archivo
O: abro una línea arriba y escribo "javascript:(function(){"
Esc: salgo de modo insert
G: voy al final
o: abro línea debajo y escribo "})()"

Luego falta:
ggvG1000<: desindento todo
:%s/ /%20/g: reemplazo todos los espacios por %20 ya que es url encoding lo que necesitamos.
:%s/\n//g: borramos todos los newline.

Para guardar toda la secuencia en una macro tenemos que hacer lo mismo, pero previamente:
qa: empiezo a grabar macro en el registro 'a' (pero puede ser cualquier otro).

Y al finalizar:
q: terminar de grabar la macro

Para reproducir la macro:
@a
para reproducir 10 veces:
10@a

Ahora bien, para qué quiero reproducir la macro si ya está hecho el bookmarklet?

Lo que necesito es guardar la macro permanentemente.

La macro quedó guardada en el registro 'a', y para ver eso podemos ejecutar
:reg
Que muestra todos los registros.

Para pegar en un archivo se hace con
ctrl+r ctrl+r a

Por lo tanto editamos el archivo ~/.vimrc y agregamos la asignación del registro a de forma permanente:


NOTA: se asume que el bookmarklet solo tiene espacios necesarios, es decir en
var a="hola";
SI
y no como en:
var a = "hola";

También se asume que todas las líneas tienen ; al final salvo los bloques.

Otra cosa a tener en cuenta es que la macro se pega con el ^[ como escape y el ^M como enter. Pero vim los toma distintos a estos caracteres y pegar y copiar del gist no va a funcionar. Hay que ejecutar la macro a mano y luego guardarla.

Con este truco la macro está permanente. Sin peligro que se pise con otra macro.

Otra forma de hacerlo, y más detalle de lo que expliqué está acá

Hatter gonna hate

Hace bastante tiempo que me gusta navegar 9gag.com

En la misma se pueden subir imágenes y la gente vota, compara y comenta las mísmas.

Son todos chistes con memes.

Tiene 3 categorías:
- hot: con lo mejor de lo mejor, lo más votado. Cambia poco.
- trending: con lo mejor de vote, cambia un poco más rápido.
- vote: solo para votar por hate o love ( y con eso terminan de usar todas las letras de vim h(ate) l(ove) j y k para moverse entre posts, así como en gmail).

Alguien se quejó en un post que quería votar hate también en trending y hot.

Así que me dio la idea para hacer un bookmarklet:


El fuente sería:


En el mismo primero se carga jquery que 9gag no usa. Y cuando se carga agrega el botón hate con la funcionalidad necesaria.

En chrome y firefox anda. Digo, en mi máquina anda...

viernes, 11 de noviembre de 2011

Identando groovy:



Supongamos que tenemos un archivo como el siguiente:



Cuando hacemos la típica secuencia de vim para identar que sería:
- gg: ir al inicio,
- =: identar...
- G: ...hasta el final
gg=G

Queda así:


Notar que no está bien identado, por ejemplo líneas 12, 17, 27 deberían estar un nivel antes.


gg=G funciona muy bien para C, java, javascript, xml pero no en groovy.

Hay una forma mejor?

Sería ideal que cada vez que vim encuentre un {\n idente un nuevo nivel a lo que está adentro.

Para eso podemos hacer dentro del { un:

>: identar lo que está...
i: dentro de...
{: la llave

>i{

También funciona con corchetes u otros wrappers (>i[, >i", etc).

De esta forma podemos ir a mano llave por llave ejecutando la secuencia >i{.

Para facilitar la tarea vim tiene un comando llamado globals, con lo cual le podemos decir que cada vez que encuentre una regexp haga una secuencia.

Sería:

: : entra en modo comando
g : globalmente...
/{\n: a todo lo que matchea con una llave seguida de un newline...
/normal : ejecutá en modo normal...
j: baja una línea
0: ir posición 0 (para no hacer conflicto con una llave que se pueda abrir en la misma posición
>i{: identá lo que está dentro de llaves

:g/{\n/normal j0>i{

Antes de eso deberíamos des-identar, para eso pintamos todo el código y lo bajamos a nivel 0

con:

ggvG: pinto todo el código
1000<: desidentar 1000 veces (exagerado?) quedaría así:

Y luego aplicamos la secuencia:
:g/{\n/normal j0>i{

y queda así:


Luego de aprender podemos escribir una función que haga todo esto llamada GIdent y también pensar en los closures que en vez de comenzar con { comienzan con { argumentos ->\n.




Por cualquier cosa pueden bajarse addiciones de mis dotfiles en github.com

domingo, 6 de noviembre de 2011

F3 de eclipse en vim

Cuando me pasé a vim, cosa que me costó unos 2 meses, mientras los que usaba eclipse %50 vim %50, lo primero que quise es la funcionalidad de buscar archivos como en eclipse con control+shift+R.

Encontré un código que hacía eso, y basado en ese escribí uno que buscaba por contenido:



Ahora lo que quería era sacarme la repetitiva tarea de buscar justo lo que selecciono, o la palabra bajo el cursor como referencia. Algo similar al F3 de eclipse.

Busqué como acceder la Word Under the cursor y terminé con estas 2 expresiones:



Resumen, poniendo las 2 en ~/.vimrc tenés el F3 de eclipse funcionando

sábado, 5 de noviembre de 2011

Idea rara

si el realismo mágico es contar algo mágico como si fuera real, y algo real como si fuera mágico.

Se podría hacer algo similar con el trivialismo épico, no?