droWMark, postea en WordPress desde Vim

Hola hijos,

Hoy vengo a contaros una cosa loca que he estado desarrollando para mí durante el último año en ratos libres.

Hace tiempo que salió su primera versión pero no lo publiqué porque no saqué tiempo y porque me daba un poco de vergüenza porque era muy cutre, pero ahora que tengo más tiempo (ya os contaré por qué) me he decidido a añadirle unas funcionalidades nuevas y estoy contento.

Vengo a presentaros droWMark, un plugin para Vim que sirve para postear a WordPress desde el editor, escribiendo en Markdown (con sabor a Pandoc). Por si os lo preguntabais, sí, llevo como un año posteando en este foro directamente desde Vim.

Hasta hace muy poquito el plugin no soportaba la subida de imágenes, pero tampoco lo necesitaba porque pocas veces añado imágenes a los posts. 🙂

Os cuento un poco cómo funciona por debajo y si queréis más información os leeis la documentación del plugin, que es bastante clara. Para leerla con entrar en la carpeta doc en el repo es suficiente pero mola más que os lo instaléis (usad Vundle o algo por favor) y hagáis :help drowmark.

El plugin se separa en dos partes, una en VimL (o VimScript) y otra en Python.

La parte en VimL se encarga de gestionar todo lo relacionado con Vim y llamar a la parte de Python. Hace las siguientes cosas:

  • Syntax highlighting de los ficheros especiales que utilizo. Son una mezcla de Markdown con un poco de INI1 en la cabecera (aunque no por mucho tiempo).
  • La documentación del plugin, para poder hacer :help drowmark y esas cosas.
  • Define el nuevo tipo de fichero WP. Para esto necesita detectar el tipo de fichero y marcarlo bien. De esto se encarga ftdetect.
  • Gestionar el post de plantilla para que se pueda hacer :NewWordPress y te prepare el archivo. Simplemente se guarda un fichero de referencia que se escribe en el búfer actual al llamar al comando. Fácil.
  • Llama al script de python de forma ordenada pidiéndole los credenciales al usuario. Mientras escribes la contraseña no muestra nada en la pantalla, pero no está muy fino y si te equivocas y borras no funciona. Si leéis el código entenderéis por qué.

La parte de python es todo lo relacionado con WordPress y la funcionalidad que se quería ofrecer. Así puede separarse y usarse sola o migrarse a otros editores. Tengo pendiente migrar a Emacs pero necesito la ayuda de mi divertida hermana Emacsera para eso. La parte de Python hace lo siguiente por el momento.

  • Captura las opciones puestas en la cabecera INI y construye un blogpost con ellas.
  • Convierte el MarkDown a HTML usando panflute. En las versiones anteriores lo hacía con pypandoc.
  • Durante la conversión (esto es la novedad de la versión 1.1) busca todas las imágenes en el texto y las sube si son ficheros locales cambiando la URL para que referencia al recién subido archivo. Lo mismo ocurre con el campo thumbnail de la cabecera.
  • Postea el documento convertido.

Y eso es todo.

Fijaos que esta entrada tiene un thumbnail (o imagen destacada) y una imagen aquí debajo. Están únicamente puestas para demostrar que puedo.

Imagen puesta para fardar

No os toméis este Plugin como la mejor manera de hacer las cosas, sólo quiero que veáis que cuando nos apetece cambiar nuestro workflow con un poco de esfuerzo podemos conseguirlo. No hace falta volverse muy loco.

Si leéis el código fuente veréis que es un script de Python muy corto y bastante cutre. A veces merece la pena programar agresivo si el programa cumple con lo que debe.

Ahora mismo estoy en ese proceso de ir convirtiéndolo en un programa razonable, pero, de momento, es un poco mierda porque funciona y para mí es suficiente. Si empezamos grande a veces nos aburrimos antes de terminar. Mejor empezar pequeño y cuando la cosa dé unos frutos recuperar la motivación para poder crecer.

¡Espero que os mole y lo probéis!

Comentarios y críticas, en la sección de abajo.

Un abrazo.


  1. INI son los ficheros como la configuración de Git, hice un parser de esto en C hace un tiempo
Anuncios

NeoVim True colors

Hola,

Ayer, después un año investigando (no muy bien por lo que he visto finalmente) he conseguido configurar NeoVim para que utilice true colors. La última vez que me puse con esto lo di por imposible pero he vuelto a ello porque he añadido un ColorColumn y necesitaba que tuviera un color más oscuro.

Resulta que no era para nada difícil pero no sé por qué me costó tanto en el pasado.

Antes de empezar NeoVim es una extensión de VIM para añadir alguna funcionalidad extra que seguramente nunca se verán en VIM. Os dejo la página del proyecto y vosotros investigáis.

Ahora al lío.

Para que soporte true colors hay que tener una variable de entorno activada: NEOVIM_TUI_ENABLE_TRUE_COLOR. Que se puede hacer en la propia terminal con un export o haciendo un let en la configuración de NeoVim.

En muchos sitios pone que esta configuración es suficente pero no es cierto. NeoVim necesita más cosas para que los true colors se vean. Si se añade :set termguicolors empezará a funcionar como debe. Esto es un bypass muy loco que hace que la terminal utilice los colores de la GUI.

En Vim hay dos modos de trabajo: el clásico de la terminal y el de la GUI. GUI implica que hay una aplicación de escritorio con sus ventanitas y eso que muestra Vim (gvim, por ejemplo). Los colores de una a la otra opción son diferentes porque se supone que la terminal no es capaz de manejar los mismos colores que una interfaz gráfica, pero eso ya no es del todo cierto. Muchos terminales modernos soportan true colors por lo que pueden usar los colores que, en principio, están hechos para mostrarse en la GUI.

NeoVim sabe esto así que diciéndole que use los colores de la GUI en la terminal lo hará y tendremos los true colors. Otro problema es que muchos esquemas de color comprueban si se está utilizando el modo GUI o el de terminal para decidir qué esquema utilizan (el complejo o uno simplificado especial para la terminal). Esa comprobación se hace con has('gui_running'), cuidado con eso. Hay algunos esquemas de color que son para true colors y algunos no lo comprueban y funcionarán bien (ejemplo).

Ya que estaba me decidí también por buscar otras opciones similares. Existe una muy chula que te cambia la forma del cursor dependiendo del modo en el que estés. Usa el cuadradito para modo normal, un subrayado del carácter en el modo reemplazar y una barrita vertical que se sitúa entre caracteres en el modo insertar. De esta manera tenemos un pequeño apoyo visual al trabajar. Esto se activa con NVIM_TUI_ENABLE_CURSOR_SHAPE que igual que la de antes de “enable true color” se puede setear como variable de entorno en la terminal o con un let dentro de la configuración de NeoVim.

Otro día os hablo más de NeoVim e incluso puede que haga una especie de manual a mi manera. Pero eso otro día.

Os dejo con el patch que he aplicado a mi configuración:


" Enable TRUE COLORS
+let $NVIM_TUI_ENABLE_TRUE_COLOR=1
+let $NVIM_TUI_ENABLE_CURSOR_SHAPE=1
+set termguicolors

" Highlight where the lines are more than 80 characters wide
set colorcolumn=80
-highlight ColorColumn ctermbg=DarkGrey
+highlight ColorColumn ctermbg=DarkGrey guibg=#262626

Como veis en el ColorColumn, ahora aplico el guibg=#262626 que es un gris bastante oscuro en su color RGB. Al estar aplicado el termguicolors utilizará ese color también en la terminal.

¡Conseguido!

Probad y me decís.


PD: Os dejo mis dotfiles para que veáis mi configuración entera: https://github.com/ekaitz-zarraga/dotfiles

Vim, buffers etc

Hola,

Ya hablé de las pestañas de Vim. Ahora toca hablar de los buffers y de contar como gestionarlos.

Inicialmente las pestañas en Vim, de las que hablo en el otro artículo, sirven para cambiar de estructura de pantalla o para tener una diferenciación a nivel de UI. Los buffers son una diferenciación a nivel de contenido. Los buffers representan los archivos que tiene abiertos el programa controlarlos nos permite cambiar el contenido de las diferentes ventanas y mandar archivos abiertos a un segundo plano, entre otras cosas.

Para mostrar los buffers abiertos podemos usar 'ls' o ':buffers'. Si buscáis en la ayuda podéis ver todos los diferentes flags que aparecen en el listad para entenderlo un poco mejor.

Podemos cambiar de buffer actual usando muchos comandos molones, ejemplos:

':bprevious' o ':bp': Cambia el buffer activo por el anterior en la lista.

':bnext' o ':bn': Cambia el buffer activo por el siguiente en la lista.

':b NOMBRE': Cambia al buffer que contenga NOMBRE en su nombre.

':bN': Cambia al buffer número N.

':bdelete' o ':bd': Cierra el buffer. Por defecto el actual pero se puede decidir cuál. Buscad.

Con estos podemos jugar mucho pero no se entiende el verdadero potencial hasta que se juega de verdad. Una vez entendamos cómo funcionan comprenderemos Vim por dentro y sabremos lo que ocurre cuando nos salta a otro fichero con algún comando loco como 'gf'.

Una cosa un poco molesta de esto es que por defecto te obliga a guardar los cambios en los buffers antes de abrir otros nuevos. Esto se debe a que en cierta manera “cierra” los archivos al cambiar a otro buffer. Para evitar estos molestos mensajes y la obligación de guardar los cambios o perderlos se puede activar la opción 'hidden' para que Vim considere los buffers que abandonamos buffers abiertos pero ocultos. Así se comportan normal y mantienen los cambios pero no se muestran en ninguna parte de la pantalla.

Investigad también, para setearlo:

set hidden

Además Vim tiene un explorador de ficheros integrado llamado netrw. Controlando los buffers y este explorador podemos ir cambiando de fichero sin salir nunca del programa y si dominamos los splits y las pestañas podemos crear un entorno de desarrollo realmente potente. Ejemplo: dividir la pantalla en una columna lateral con el explorador que al seleccionar un fichero nos lo abra en la parte principal y tener otras pestañas para guardar diferentes layouts.

Probad, investigad y me contáis.

Iré añadiendo más cosas en esta línea hasta que seamos todos los poderosísimos amos del editor.

Vim: saltar a la definición de una función

Hola,

Hoy he aprendido una cosa nueva de Vim.

Ya os hablé de cómo se puede ir saltando entre los cambios que se han hecho y como se puede saltar entre los saltos en el historial.

Hoy toca hablar de cómo saltar a la definición de las funciones. Esto se hace usando 'tags' en Vim (buscad en la ayuda).

Este mismo concepto se utiliza para saltar entre los campos de la ayuda de Vim, que es simplemente usar 'Ctrl+]' para ir a la definición de la sección bajo el cursor y 'Ctrl+t' para volver. Como ya vimos en la otra entrada también podríamos ir atrás en el salto si usásemos 'Ctrl+o' pero si hubiésemos hecho un salto en el medio no sería tan sencillo. Lo miráis.

Para poder usar estas cosas en vuestros proyectos necesitáis usar un fichero de tags (para la ayuda no). Estos tags pueden generarse con 'ctags', un programa independiente que sirve para esto. Yo he instalado 'exuberant-ctags' para esto porque soporta un montón de lenguajes y la descripción me ha molado pero hay más por ahí.

Creamos los tags en la carpeta del proyecto:

ctags -R

Y ya los tenemos disponibles.

Eso sí, hay que actualizarlos a medida que se van creando nuevas funciones y eso, investigad cosas porque podéis automatizar la actualización de tags para cuando guardéis los ficheros.

Ahí lo dejo.

Saludos.

Vim autocompletando a lo loco

Hola,

Hoy un truco rápido sobre cómo autocompletar palabras en Vim y otro día me meto en cosas más locas como qué son los buffers, ventanas y otras cosas.

Vim es montón de inteligente y sabe autocompletar, otra cosa es que nosotros sepamos usar este concepto.

En el modo insertar (sí, en el insertar, like a sir) podemos pulsar 'Ctrl + n' y 'Ctrl + p‘ para movernos en una lista de palabras sugeridas cuando tenemos una palabra a medioescribir. Esto miraría la lista de cosas que hemos escrito y nos sugeriría palabras que empiecen igual.

Los diccionarios pueden editarse, pero eso lo investigáis vosotros.

Espero que os haya parecido útil.

Dadle a ver.

Moverse entre cambios y saltos en Vim

¡Hola amigos!

¡Pues sí!

Resulta que eso que tanto hemos deseado se puede hacer sin tener que hacer el monguer. Sólo hay que buscar lo suficiente (o leer este blog maravilloso) para darse cuenta de que en Vim se puede saltar a la última zona en la que hemos hecho un cambio.

Para esto usamos ‘g,‘ (siguiente) y ‘g;‘ (anterior) en el modo normal.

¡Hay más!

El comando :changes muestra una lista de los cambios que se pueden deshacer (recordemos: ‘u‘ en el modo normal) que, al mismo tiempo, son los cambios por los que podemos movernos. Así podemos ver qué cambios hay y saber a cuál queremos ir. La lista muestra el número del cambio (están ordenados por números, con el cambio actual como referencia), la línea en la que se ha producido, la columna y el texto cambiado. Usando el número podemos repetir los comandos con un número por delante para saltar al que queramos ir. Ejemplo: ‘5g;‘ nos lleva al 5º cambio hacia atrás.1

Esto no edita nada, sólo cambia la posición del cursor a las últimas zonas donde hemos editado.

Mola a saco.

Ahí lo dejo para que le deis cañita.

Ahora más: podemos hacer lo mismo con los saltos que hemos hecho por el fichero. En lugar de usar la ‘g‘ se usa Ctrl-o (anterior) y Ctrl-i (siguiente). Para ver los saltos :jump.1

Y eso es todo.

A usarlo por ahí.


  1. Cuidado con esto que el habitual será ir hacia atrás (‘g;‘, Ctrl-o) en la lista porque si no hemos empezado a navegar entre los cambios el cambio siguiente no existe porque sería el futuro. 

Tabs en Vim

Hola,

Ya sé que parece que esto se está convirtiendo en un blog para hablar de Vim, pero cada vez que pruebo y aprendo una nueva funcionalidad necesito ponerla para que no se me olvide.

Bien.

Resulta que he aprendido, accidentalmente, cómo sólo el mejor aprendizaje puede ser, a usar tabs en Vim y todo ha sido porque si das gf te abre el archivo que se llame como lo que tienes bajo el cursor. Ahora lo interesante era abrirlo en una nueva pestaña (o tab) así que ya que estaba he aprendido eso.

Para hacer eso hay que pulsar Ctrl + w y luego gf. Ejemplo: Si tenemos #include<stdio.h> en nuestro archivo y hacemos el gf sobre el stdio.h, Vim abrirá el archivo stdio.h, si es necesario buscándolo por los include paths1.

Ahora lo tenemos en un tab.

Para cambiar de tab usamos gt para ir hacia la derecha y gT para ir a la izquierda. Si queremos ir a uno en concreto usamos Ngt donde N sea un número Natural.

También podemos mover los tabs de sitio. Si hacemos :tabm N  (tabmove) donde N sea un número Natural movemos el tab actual a la posición indicada. Si introducimos N = 0 la llevamos a la primera posición y si no introducimos N la llevamos a la última. Podemos usar también comandos para movernos por los tabs con :tabn:tabp hacemos tabnext (siguiente tab) y tabprevious (tab anterior) y con :tabfirst o :tablast pues es evidente lo que se hace.

Y ahí lo dejo por el momento.

Probadlo. Yo he flipado.


  1. Esto es un FUCK YEAH en toda regla.