MGallego: Lanzando Hook al Guardar Buffer en Un Modo en Particular de Emacs

Para programar en PHP me gusta usar el modo mayor php+-mode y uno de los modos menores que uso es ac-php para usar company-mode y realizar el autocompletado. Este modo menor es bastante útil, sobre todo porque crea una tabla de tags muy buena, pero no he encontrado una forma automática de crearla, cada cierto tiempo ejecutaba el comando de generación de tags para autocompletar.

Tenía previsto desde hace mucho tiempo hacer que se regenere cuando guardo un buffer en modo php+ pero por pereza lo he ido dejando, incluso asigné una tecla al comando de tags, pero al final me decidí a hacer las cosas bien.

Actualizando tags de PHP cuando guardo un fichero en modo PHP

Este es el código que finalmente he añadido a mi configuración, a continuación os lo explico.

   (defun remake-ac-php-tags ()
   "Remake php tags from current buffer"
   (when (eq major-mode 'php+-mode)
      (ac-php-remake-tags))
    )

   (add-hook 'after-save-hook #'remake-ac-php-tags)
   

Como veis lo primero que hago es crear una función que será la que lanzaremos con el hook, podría decirle al hook que lanzase directamente la de generación de tags, pero la que he creado también filtra por el modo en el que nos encontramos.

(when (eq major-mode 'php+-mode) (ac-php-remake-tags))) Aquí está lo interesante, la condicion que dice que el modo mayor debe ser php+-mode y dentro la ejecución del comando que deseamos.

(add-hook 'after-save-hook #'remake-ac-php-tags) El siguiente paso ya es simplemente añadir la función al hook que se lanzará siempre que se guarde un fichero.

Al final el código es sencillo a mas no poder, es mas la pereza de buscar el cómo se hace, que el hacerlo. Espero que os sirva de ayuda a la hora de lanzar vuestras acciones al guardar un fichero.

Debería mejorarlo para que en realidad mirase si está el modo menor ac-php activo, pero la verdad es que aún no se como hacerlo.

-1:-- Lanzando Hook al Guardar Buffer en Un Modo en Particular de Emacs (Post )--L0--C0--April 18, 2018 08:26 PM

MGallego: Enlaces Sobre Emacs Abril 2018

Hará un mes mas o menos que no reviso los feeds que sigo sobre emacs y creo que ya va siendo hora, y de paso había pensado en compartir aquellos que me resulten interesantes, tal y como hace Sacha Chua en su blog, pero no como algo recurrente, si no como algo puntual ya que justamente ahora tengo mas de 130 posts relacionados con emacs pendientes de leer, incluso es posible que de para mas de un post.

No tengo intención de leerlos todos a fondo, son mas que nada una lista de post que quiero revisar a fondo, así que es posible que se me cuele alguno poco interesante.

Vamos allá.

Enlaces sobre Emacs para revisar en profundidad:

Seguro que me viene muy bien, contando con que son las dos tecnologías que uso para escribir este blog.

Convertir y procesar imágenes en dired. Por curiosidad del código elisp.

Un breve post sobre la motivación de alguien para aprender emacs lisp.

Una función para alternar fácilmente entre un tema claro y otro oscuro

No se muy bien que es, según dice el post es un org-clock con esteroides, debería probarlo y de paso revisar algunos enlaces que vienen dentro del post sobre hydra

Como usar las macros de teclado, acompañado de un gráfico muy divertido sobre los geeks y las tareas repetitivas

Un paseo por la interfaz de Magit. Tiene muy buena pinta, debería leerlo en profundidad, es una herramienta que uso mucho a diario.

Quiero echarle un ojo al elisp que viene, que parece para abrir un frame con dired desde consola y parece interesante.

Un vídeo sobre Magit de la serie Using Emacs. Si no conocéis estos vídeos os los recomiendo, se aprende mucho de ellos.

Listando los comentarios del buffer con Imenu. Quiero revisar el código, que tengo muchas ganas de aprender a usar imenu.

Gestionando los paquetes del SO con helm desde emacs. Se merece un try para ver como funciona.

Servir ficheros HTML directamente desde Emacs. Curiosidad.

¿Qué modos menores usas siempre?. Estas preguntas son muy interesantes para ver que responde la gente y conocer nuevos modos.

Añade iconos a company. No creo que lo use, pero puede ser interesante

Bueno, una vez que he anotado las cosas que creo que pueden ser interesantes creo que lo suyo es que las revise en profundidad antes de ponerme a mirar otras cosas, y si puedo compartir algo de lo que aprenda pues mucho mejor.

-1:-- Enlaces Sobre Emacs Abril 2018 (Post )--L0--C0--April 18, 2018 06:38 PM

nba - GNU's Rock: Keep Regexp

es muy vergonZoSo sentirse capaz y al enfrentar un reto quedarse congelado al borde del fracaso

El asunto es el siguiente, tenemos un fichero con correos (muchos correos, 79 exactamente). El fichero ademas de los correos incluye nombres y comas y la meta es obtener unicamene los correos.

Empece el reto substituyendo comas por saltos de linea, luego probe una complicada regexp para buscar los correos, pero tras muchos fallidos intentos, abandone la idea… ademas, que esperaba encontrando la regexp? no es como si la coincidencia colocara la region en la coincidencia y luego se pudiera “cortar” y “pegar”

Lo siguiente, fue utilizar el comando flush-lines para borrar las lineas que no coincidieran con el patron [^@], “obviamente” no funciono, auque en mi ignorancia culpe al patron… (risa histerica) y bueno, sucede que no te aclaras y hasta se te olvida utilizar la ayuda del emacs

un par de intentos mas tarde, termine por utilizar una poco elegante macro, que cumplia el objetivo chapuceramente

luego, tras ver la primer solucion, mas simple, conpacta, no del todo “segura”, pero para el caso efectiva

cat lista_correos.txt | tr " " '\n' | grep @ | xargs

e inmediatamente despues un vi-liever solucionaba el asunto con

:%s/  */^M/g
:v/@/d
:%join

como podia evitar la inminente culpa y herida en el orgullo klingon-emacsero?

intetentando superar la frustracion, dio inicio un aprendizage formal y profundo de las regexes en emacs y alguno que otro comando mas. Pero antes de pasar a ello, fue nesesario aminorar el trauma implementando una solucion en awk y otra en C….

# esto a un fichero, por ejemplo a.awk
1 {
    for( i=1; i<=NF; i++ )
        if( $i ~ /@/ ){
            printf( "%s\n", $i)
        }
}

# y luego ejecutar con:
# $ awk -f a.awk lista_correos.txt

aca la solucion con C. Compilar con gcc a.c regexp4.c y ejecutar con $ a.out lista_correos.txt

Un dia despues, con la agonia mental aun fresca, llego la solucion en emacs

M-<
M-x replace-regexp RET " +\|," RET C-o RET
M-<
M-x keep-lines RET "@" RET

(no conocia keep-lines si tu tampoco, te la presento. Ignorar las comillas son para delimitar la cadena de entrada)

ciertamente mas extensa que vi, pero consideremos que emacs no tiene una simbiosis con el comando sed, ni tampoco una implementacion de sus comandos de tal forma que puedan ejecutarse “en bloques”. No esta tan mal, supongo.

aqui es donde se podria iniciar una “guerra santa”. Pero bueno, la naturaleza extensible e ilimitada de emacs para un tema concreto puede ser menos eficiente, es cierto… aunque, nada impide que se implemente un comando interprete tipo sed e incluso otro para aplicar acciones por lineas y de manera global (sin recurrir a macros)

Supongo que los usuarios del modo maligno, han hecho algo asi, mas profanar emacs con tales paganismos, ni utilizar “modos” que fuerzan a presionar ESC de forma inconciente, son algo a contemplar por mi parte, las cosas “modales” son un dolor, ya es suficientemente modal tener que usar el firefox, o el navegador de ficheros y andar presionando ahi teclas de otros “modos”

o, por aca un semi-equivalente en elisp de la solucion

(defun emailtor ()
  "Separa los correos en lista_correos.txt"
  (interactive)
  (goto-char (point-min))
  (while (re-search-forward " +\\|," nil t)
    (replace-match "\n" nil nil))
  (goto-char (point-min))
  (delete-non-matching-lines "@"))

ha, no es lo mas fino, pero para el caso cumple

regexp

  • Conjunto []. Conjunto inverso [^]. Dentro de los conjuntos (con la syntaxis completa [[:clase:]]) se permiten las clases

    • [:alnum:] caracter alfanumerico
    • [:alpha:] una letra, incluidos caracteres unicode
    • [:blank:] espacio y tabulacion
    • [:cntrl:] caracteres ASCII de control
    • [:digit:] numeros ascii del 0 al 9
    • [:graph:] cualquier caracter visible, exepto espacios en blanco
    • [:print:] cualquier caracter visible, incluidos espacios en blanco
    • [:lower:] caracteres en minusculas
    • [:upper:] caracteres en mayusculas
    • [:punct:] signos de puntuacion
    • [:space:] espacios en blanco
    • [:word:]caracteres que formen parte de las palabras
    • [:xdigit:] caracteres hexadecimales (0-9, a-f y A-F)
    • [:ascii:] caracter ASCII
    • [:nonascii:] cualquier caracter no ASCII
    • [:multibyte:] caracteres unicode multibyte
    • [:unibyte:] caracteres codificados en un solo byte (basicamente todo ASCII)
  • punto .

  • metacaracter \

  • agrupacion y captura \(\)

  • coincidencia con la anterior captura \d. (Substituir d por el numero de captura)

  • agrupacion sin captura \(?:\)

  • alternativa \|

  • cuantificadores

    • ? cero o uno
    • * cero o mas
    • + uno o mas
    • \{n\} exactamente n
    • \{n,\} n o mas
    • \{n,m\} entre n y m
  • modificadores

    • $ coincidencia al fin de linea
    • ^ coincidencia al inicio de linea
    • \= coincidencia en la posicion del punto
    • \' coincidencia al final del buffer
    • \` coincidencia al inicio del buffer
  • fin o inicio de palabra \b

  • (deacuerdo al modo) un caracter que forme palabras \w o \sw

  • (deacuerdo al modo) un carac,ter que no forme palabras \w o \Sw o \sW

  • espacios \s- o \s (”\s”)

  • symbolos \s_

  • delimitador de apertura \s(

  • delimitador de cierre \s)

  • caracteres de puntuacion \s.

comandos de utilidad

  • (search-forward) busqueda de texto hacia adelante
  • (search-backward) busqueda de texto hacia atras

  • C-s (isearch-forward) busqueda de texto de forma interactiva hacia adelante

  • C-r (isearch-backward) busqueda de texto de forma interactiva hacia atras

  • (search-forward-regexp) busqueda de regexp hacia adelante

  • (search-backward-regexp) busqueda de regexp hacia atras

  • C-M-s (isearch-forward-regexp) busqueda de regexp de forma interactiva hacia adelante

  • C-M-r (isearch-backward-regexp) busqueda de regexp de forma interactiva hacia atras

  • (replace-string) substitucion de texto

  • (replace-regexp) substitucion de regexp

  • M-% (query-replace) substitucion interactiva de texto

  • C-M-% (query-replace-regexp) substitucion interactiva de regexp

  • (highlight-lines-matching-regexp) resaltar cualquier linea que coincida con una regexp

  • (highlight-regexp) resaltar una regexp

  • (unhighlight-regexp) des-resaltar regexp

  • (flush-lines) eliminar lineas que coincidan con la regexp. (el patron ^$ eliminara todas las lineas en blanco)

  • (keep-lines) se eliminan las lineas que no coincidan con la regexp

  • (align-regexp) alinea (verticalmente la parte en varias lineas que coincida con la regexp

re-builder, isearch, isearch+

De entre las muchas cosas relacionadas con regexes, el modo re-builder es uno muy interesante, pues nos permite escribir y editar una regexp con suma facilidad y luego copiar el resultado.

Supongo que este modo, es una facilidad para los programadores de emacs, basandome en que la expresion esta entrecomillada y al copiar la regexp con el comando reb-copy (C-c C-w) incluye las comillas y ademas el formato de escape de caracteres esta dispuesto a la forma que requiere el codigo fuente en elisp.

Dicho escape de caracteres y metacaracteres, se debe a la naturaleza de las cadenas en C de hay que las cosas suelan requerir escapes para los escapes. Por defecto re-builder viene en modo de syntaxis read que es de la que hablo, pero tambien podemos cambiar a sintaxis string (la que utiliza isearch), bien presionando la combinacion C-c TAB y escribiendo string o directamente colocando lo siguiente en nuestra configuracion

;; re-builder
(setq reb-re-syntax 'string)

pese a la facilidad de edicion y creacion de regexes, me pregunto la razon de no vincular este modo con isearch. Mas adelante (o no) una posible razon y un par de soluciones.

los comandos basicos de utilidad

  • C-c C-w copiar regexp (comillas incluidas)
  • C-c C-q salir del modo
  • C-c TAP cambiar syntaxis de entrada
  • C-c C-r ir a coincidencia previa
  • C-c C-s ir a coincidencia siguiente

isearch en sus modalidades mas conocidas isearch-forward-regexp (C-M-s) e isearch-backward-regexp nos permiten buscar expresiones regulares hacia adelante y hacia atras del punto interactivamente, mas no dejeis que os engañen las funciones basicas de estos comandos, pues no son simples comandos, son modos por si mismos, podemos averiguar sus muchas posibilidades (ya dentro de isearch) presionando C-h m o con la documentacion de la funcion C-h f isearch-forward-regexp

quiza el comando mas conocido de las busquedas interactivas sea C-w que toma la entrada sobre y delante del punto como texto de entrada (dividida por palabras). Pero ademas de esa combinacion tenemos otras muy interesantes

  • M-s e para editar “con papeles” la regexp, aunque no interactivamente
  • C-M-y ingresar a la regexp el caracter del buffer sobre el que esta el punto
  • C-M-w borrar el ultimo caracter de la regexp
  • M-s C-e ingresar a la regexp el resto de la linea apartir de la posicion del punto
  • C-y traer ultima cadena del anillo de la muerte
  • M-y iterar sobre el contenido del anillo de la muerte
  • M-c cambiar la sensivilidad a las mayusculas-minusculas
  • C-s siguiente coincidencia
  • C-r anterior coincidencia

y muchas otras cosas misticas y confusas mas trae el modo. La cuestion problematica tiene que ver con la forma en que isearch incorpora el contenido del anillo de la muerte a la busqueda, pues si por ejemplo matamos la cadena \(group\)[set] al hacer el yank (C-y) en lugan de ingresar \(group\)[set] escapara los caracteres significativos en la regexp, dejando \\(group\\)\[set] lo que obligaria a editar de forma penosa la expresion

preguntando en reddit, el unico lugar donde aparecen respuestas prontas y en ociones con feliz resultado, oantolin proporcionaba el siguiente comando alternativo para hacer el yank con su contenido tal cual dentro de la expresion

(defun isearch-yank-kill-literally ()
  "Pull string from kill ring into search string literally."
  (interactive)
  (setq isearch-yank-flag t)
  (let ((string (current-kill 0)))
    (isearch-process-search-string
     string
     (mapconcat 'isearch-text-char-description string ""))))

(define-key isearch-mode-map (kbd "C-S-y") #'isearch-yank-kill-literally)

como puede verse, se sugiere la vinculacion al atajo Control-Super-y, pero en mi caso me es incompatible con otro comando… lo que sirvio fue suplantar directamente el comando yank de isearch dejando como nombre de la nueva definicion solamente isearch-yank-kill

cabe aclarar, que la copia tal cual del contenido del anillo de la muerte, no es una caracteristica considerada de inicio en isearch, por lo que al hacer un M-y, el demas contenido del anillo seguira siendo modificado con escapes. De hay que otro colega, 00-11, suguiriera el uso del modo isearch+, que si considero esta necesidad en su base

isearch+ (supongo) es una capa sobre el modo isearch que ademas de agregar la posivilidad de hacer yanks sin modificar el contenido, nos colorear la busqueda en secciones y proporciona varios comandos de utilidad extra. Todo esto manteniendo los atajos de isearch (casi) intactos

isearch+, no viene en el repositorio melpa, para instalarlo deberemos copiar directamente su codigo desde emacswiki a un fichero, y luego cargarlo “a mano”.

https://www.emacswiki.org/emacs/download/isearch%2b.el

En el mismo fichero proponen cargar el modo con el comando

(eval-after-load "isearch" '(require 'isearch+))

pero he preferido agregar lo siguiente en mi init

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE*: isearch+            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; source: https://www.emacswiki.org/emacs/download/isearch%2b.el
(load-file "~/.emacs.d/plugins/isearch+.el")

vamos con la justificacion de utilizar isearch+, que era poder hacer yanks.

En la linea 2547, tenemos la variable customizable isearchp-regexp-quote-yank-flag que si la ponemos a nil, asi

    (defcustom isearchp-regexp-quote-yank-flag nil

nos dara el resultado que buscamos.

Si, se puede hacer el cambio de la varible en el init, pero ya que tenemos y vamos a cargar el codigo directamente, mejor dejarse de historias y hacer el cambio in-situ

(nota: al cargar isearch+ substituye automaticamente a isearch. He probado el modo con emacs 25 sin ninguna extencion y funciona sin problemas)

ahora si, despues de tener isearch+ configurado, podemos escribir nuestra funcion en re-builder (modo de syntaxis string) y copiar la regexp (manualmente) ignorando los parentesis, para luego “pegarlo” directamente en isearch(+) con un yank

Enlaces, fuentes y otras cosas

-1:-- Keep Regexp (Post )--L0--C0--April 08, 2018 04:50 PM

nba - GNU's Rock: The Holy War

Post original (04/12/2001) -> https://www.linux.com/news/emacs-vs-vi-endless-geek-holy-war

Author: JT Smith

Ahí van de nuevo. El presidente de nuestro grupo local de usuarios de Linux envió el mensaje de que el tutorial de la semana sería cancelado. El hecho de que el tutorial fuera sobre el uso del editor de texto vi fue suficiente para iniciar una nueva ronda de tiros de última hora.

Greg Menke disparó la primera salva. Usar vi? ¿Qué tan difícil puede ser? Envió por correo electrónico sus propios pasos para usar vi. Fueron estos:

  1. Adquirir un pecado, de cualquier tipo, longitud > 30 cm

  2. Congelarlo durante la noche

  3. Siéntese frente a la PC, ejecute vi

  4. Sosteniendo el pez por la cola, golpéelo repetidamente contra su frente hasta que decida darle una oportunidad a EMACS porque las escamas de pescado están volando alrededor de su cabeza y comienza a doler.

Menke, por supuesto, insinuaba que no sólo vi era insensatamente obstinado sino que los usuarios de vi también lo eran por negarse a admitir cómo se estaban infligiendo a sí mismos brutales golpes en la cabeza con un pescado congelado.

No tardó mucho para que los amantes de vi devolvieran el fuego. Uno sugirió a Menke que agregara esta línea a sus instrucciones: Escriba 'emacs' antes del paso 1, para que cuando el paso 4 esté hecho, finalmente haya terminado de cargarse.

¿Intentaba decir que EMACS es lento?

Al igual que los batallones fatigados por la lucha llegan a una tregua temporal pero se niegan a abandonar la guerra, los usuarios de vi y EMACS mantienen un intranquilo punto muerto en GNU/Linux, SAGE y muchas comunidades virtuales relacionadas con computadoras. Es el tipo de empate que puede permanecer inactivo durante meses, pero sólo se necesita una pizca de vaguedad de un lado para que una vez más las llamas se propaguen por los grupos de noticias y las listas de correo. Porque justo por debajo de su conducta civilizada, cada bando siente que el editor que usa es el mejor de todos los editores posibles y aquellos que usan cualquier otro editor, particularmente ese otro editor, son tontos que se daran cuenta de su erronea forma de pensar aunque sólo sea posible a base de muchas burlas.

Ahora, una escision sobre cual editor de texto en Unix es una construccion del mismisimo Dios puede no parecer significativa dados todos los problemas del mundo, un empate de Coca-Cola vs. Pepsi sin consecuencias, sin motivaciones más allá de la simple unión grupal (¡Vamos Equipo!).

Pero, ¿por qué esta diferencia de puntos de vista ha seguido siendo un divisor de la cultura de los programadores durante más de dos décadas? ¿Por qué ha permanecido intacta en el PC, luego de que las interfaces gráficas de usuario, el ratón, Internet y el código abierto han alteraron el panorama computacional?

Desde que tengo uso de razon, la población de hackers se ha dividido 50/50 [entre] EMACS [y] vi, escribe en un email Eric Raymond, quien tiene varios roles en las comunidades de software de código abierto y hackers como antropólogo observador y participante desde hace mucho tiempo. Pico, Joe, MicroEmacs, y otros editores han estado básicamente abajo en el ruido estadístico durante todo el período. Raymond puede datar personalmente la división vi/EMACS en 1985 y estipula que, con toda probabilidad, fue mucho antes de eso.

Ya en 1991, Raymond registro la guerra santa vi vs. EMACS en el Jargon File, quizás la colección definitiva de la terminología hacker.

Cuando se presiona, la mayoría de la gente familiarizada con ambos editores dirá que la diferencia entre los dos es de velocidad vs. flexibilidad, con los usuarios de vi señalando lo rápido que pueden moverse y los amantes de EMACS pregonando su inmenso número de opciones. Los usuarios de vi se burlan de EMACS por ser innecesariamente ostentosos; los usuarios de EMACS se burlan de vi por ser difícil de aprender y tener un alcance limitado.

Así que el gran debate del editor de textos de nuestro tiempo se reduce al equivalente técnico del gustos menos/o-mas relleno. Bueno, sí, más o menos. Pero como en todos los asuntos relacionados con la religion ––o la guerra––, cuanto más se profundiza, más oscuros se vuelven los temas.

Pero aqui hay algo significativo. Estos editores son la tabula rasa sobre la que se ha construido gran parte del ciberespacio. El hecho de que estas herramientas, cada una diseñada para ser transparente para el usuario final, estén sujetas a lealtades tan feroces y competitivas, revela algo acerca de algunas suposiciones primordiales que la gente tiene acerca de las mejores maneras de hacer las cosas.

Vi: ¿El editor que el tiempo olvidó?

A primera vista, los forasteros podrían ver a vi como el editor que el tiempo olvidó. No es sólo que tienes que abrir una ventana de terminal sólo para usar la cosa. Esa también es la mejor manera de conseguir EMACS. Pero incluso con VIM, la versión actualizada que la mayoría de los usuarios de vi emplean hoy en día, uno no puede evitar maravillarse (o frustrarse) por la falta de intuición sobre su funcionamiento.

Incluso el webmaster de la página de inicio de los Amantes de VI admite que la curva de aprendizaje es empinada. Vi no es mas veloz antes de conocer 25 comandos más o menos, escribe Thomer Gil, oriundo de Ámsterdam, que actualmente trabaja en un doctorado en ciencias de la computación en el Instituto Tecnológico de Massachusetts.

Gil ha sido comparado por sus compañeros de oficina con un cavernícola que blandía un hacha y un garrote por su uso de VIM.

De todas las deficiencias percibidas en vi, tal vez la más notable sea la necesidad de ingresar la tecla de inserción sólo para escribir cualquier cosa en la pantalla. Vi tiene dos modos: Uno es el modo insertar en el que se puede introducir texto. Se accede a este modo pulsando la tecla insertar del teclado. Pero también existe el modo de comando en el que no se puede introducir texto, sino comandos relevantes. Desde el modo de inserción puede llegar a este ultimo pulsando la tecla de escape.

Así que imagínese al usuario desprevenido escribiendo por primera vez y que accidentalmente presiona la tecla de escape, sólo para descubrir que no sólo no puede ingresar más texto, sino que sus pulsaciones envian extrañas instrucciones al programa .

El Jargon File observa secamente que esta característica de vi tiende a frustrar infinitamente a los nuevos usuarios, ya que no toma comandos mientras espera texto de entrada ni viceversa, y la configuración predeterminada no proporciona ninguna indicación del modo en el que se encuentra el editor.

Los múltiples modos asustan a la gente, admite Gil.

Vi fue escrito por Bill Joy en 1976, quien lo forjó a partir de dos herramientas de edición aún más primitivas, ed y ex. Vi significaba interfaz visual, que en 1976 estaba en la vanguardia de la informática, según una entrevista a Joy en la Linux Magazine.

Intentaba hacerlo utilizable con un módem de 300 baudios. Esa también es la razón por la que tienes todos estos comandos divertidos. Apenas funcionaba usar un editor de pantalla sobre un módem, dijo Joy, Así que el editor estaba optimizado para que pudieras editar y sentirte productivo cuando pintaba más lento de lo que pensabas.

En esa entrevista, Joy contrastó el entorno de desarrollo de vi con el de EMACS, dijo que fue escrito para sistemas con enlaces de canales de fibra y un monstruo PDP-10.

Así que podrían tener comandos divertidos con la pantalla brillando y todo eso, y mientras tanto, estoy sentado en casa en una especie de vivienda excedente de la Segunda Guerra Mundial en Berkeley con un módem y un terminal que apenas puede sacar el cursor de la línea de fondo, dijo Joy, tal vez sonando un poco envidioso. La gente no sabe que vi fue escrito para un mundo que ya no existe.

Sin embargo, aunque vi debería haber desaparecido a principios de los años 80 a medida que aumentaba la velocidad de la red y del procesador, ha florecido. Las VI Pages listan cerca de 30 clones vi desde elvis y VIM hasta obscuridades tales como WinVi y vigor.

Tim O'Reilly, autor intelectual de la editorial O'Reilly & Associates, señaló en la columna Ask Tim de su empresa, que su empresa vende el doble de libros de vi que de EMACS. Además, O'Reilly apoya un juego de pintura de vi vs. EMACS en alguna convención, invariablemente el doble de voluntarios se inscriben para defender el honor de vi sobre EMACS.

Entonces, ¿cuál es el atractivo? Esto se describe mejor en el Culto de VI, en el que John Arundel escribe: Al ver a un gurú de vi haciendo una edición intensa en un archivo, mientras sus dedos sobrevuelan las teclas y las transformaciones textuales barren la pantalla, uno podría creer que está en presencia de poderes sobrenaturales.

Gil publica algunos ejemplos de esta magia en su sitio web. Un concepto clave en vi es combinar una determinada acción (borrar, copiar a búfer, escribir en mayúsculas, etc. con un movimiento (ir a la línea 25, ir al final del documento, ir a la siguiente coincidencia de 'foo', ir a la segunda coincidencia del carácter 'x' en esta línea, etc.)).

¿Eh? Le envié un correo electrónico.

Gil devuelve un ejemplo: Si, por ejemplo, un documento contiene las líneas: 'a b c d e f g h' y el cursor está situado en 'b', luego puedo escribir d/f.

La primer d significa borrar, la / es una función de búsqueda, así que lo que hará este comando es borrar de b a f.

No se requieren circunstancias especiales para usar esto... Borrar palabras, oraciones. Vuelve a donde estaba antes. Oh, no, salta de nuevo. Deshacer lo que hice, rehacerlo, escribe Gil.

Gil estipula que también puedes hacer trucos como este en EMACS. Sin embargo, se requiere memorizar combinaciones de teclas apestosas Ctrl-X Ctrl-c Alt-F4 para su ejecución.

Otro truco que Gil revela es cómo VI permite a los usuarios moverse dentro de los ficheros. La manera estúpida es usar las teclas de flecha; hay muchas otras maneras más avanzadas de moverse, escribe Gil. Entre las formas avanzadas de movimiento que ofrece vi se encuentra la opción de saltar a los últimos saltos del cursor, o a la siguiente ocurrencia de una palabra en particular, o a la siguiente oración o párrafo.

Incluso la característica de modo dual se vuelve transparente para los usuarios. Hace un año entrevisté a Jon Lasser para escribir sobre su entonces reciente libro Think Unix, (cuyo manuscrito, me dijo, fue compuesto enteramente en vi). La conversación finalmente llegó a vi, y me quejé de los dos modos.

Lasser explicó que no veía ninguna diferencia entre trabajar en vi y en procesadores de texto como StarOffice o Microsoft Word. En Word, cuando mueve el puntero fuera del área de pantalla, no puede escribir texto. De hecho, pasar del modo de inserción al modo de comando. Es lo mismo, explica.

Como O'Reilly escribió sobre vi: Como muchas cosas sobre UNIX, sólo parece difícil.

Más es más con EMACS?

Cuando el lealista de vi O'Reilly escribió en Ask Tim que primero cambió de EMACS a vi sólo después de que su perfil personalizado de EMACS fue destrozado, fue uno de esos jabs sutiles que a los usuarios de vi les gusta usar en contra de EMACS.

EMACS contrasta con la prístina limitación de comandos de vi, con su personalización casi infinita. Sin embargo, dado que la naturaleza humana es lo que es, tal poder en manos de los usuarios puede no ser siempre lo mejor.

Como dice el Emacs-Beginner-HOWTO, EMACS puede ser un editor de texto, un cliente de correo, un lector de noticias, un procesador de texto, un editor de scripts y un entorno de desarrollo integrado para lenguajes de programación.

La clave para esto son los múltiples modos, cada uno con un conjunto de comandos único, que EMACS ofrece. ¿Quieres comprobar el correo electrónico? Sólo tienes que pasar al modo de correo electrónico. ¿Quieres escribir un programa en C++? Utiliza el modo C++. ¿Necesita crear algunas páginas Web? Salta dentro del modo html-helper.

Y además de todo esto, también puedes personalizar EMACS e incluso añadir nuevas funciones, normalmente modificando su código en Lisp.

Es por todo esto que muchos usuarios de vi lo ven como terriblemente presuntuoso para lo que se supone que es un simple editor de texto, sin mencionar que distrae al usuario. La broma en curso sobre EMACS es que es un sistema operativo con un editor de texto adjunto.

EMACS como tal comenzó como un proyecto de estándares, escribe Guy Steele, uno de los creadores de EMACS, junto con Richard Stallman, quien más tarde fundó la Free Software Foundation.

Tal y como recuerda Steele, Stallman mantuvo un primer editor para el PDP-10 llamado TECO, que significaba Text Editor and COrrector. A pesar de que ciertas pulsaciones de teclas realizaban comandos de edicion, Stallman creo una tabla programable por el usuario, de manera que cada pulsación de tecla realizaba una búsqueda en la tabla que describía qué hacer para esa pulsación, según dice Steele. Una opción era ejecutar una macro TECO especificada por el usuario.

Usando esta funcionalidad de macros, los usuarios estaban programando conjuntos personalizados de macros para ser vinculados a varias pulsaciones de teclas, pero esto se volvió problemático cuando los programadores comenzaron a colaborar en programas y descubrieron que tenían pocas pulsaciones de teclas comunes entre ellos.

La comunidad de usuarios se había fragmentado con respecto a las habilidades de edición de textos (y programas), escribe Steele. Así que Steele, junto con David Moon y Stallman, asumió el proyecto de integrar todas las ideas en un conjunto de comandos unificado.

Inventé una matriz en papel y corrí mucho de un lado a otro entre los implementadores y usuarios de los distintos paquetes de macros, dice Steele en un correo electrónico.

Recuerdo esto muy bien, recuerda Dan Weinreb, quien fue uno de los primeros alfa testers de EMACS. El tipo tenía un portapapeles con un pedazo de papel que mostraba todas los atajos, y recogió cuidadosa y diplomáticamente los comentarios de todo el mundo para unificarlos, en atajos estándar.

Después de unos meses, Steele, ocupado tratando de terminar su tesis de maestría, entregó la obra a Stallman. Y el resto es historia.

El hecho de que la flexibilidad se horneara desde el inicio le da a EMACS su ventaja, dicen los usuarios hardcore.

Pienso en EMACS como la navaja suiza de los editores, menciona en un correo electrónico a Debra Cameron, coautora de Learning GNU Emacs y presidenta de Cameron Consulting. Es un ambiente de trabajo completo, un microcosmos. Si piensas en algo que desearías que hiciera, probablemente descubrirás (después de mirar a tu alrededor) que ya lo hace. Si no lo hace, puedes extenderlo y hacer que haga lo que quieras que haga.

¿No podemos llevarnos todos bien?

Entonces, ¿cómo difiere EMACS de vi?

He visto a usuarios de vi muy hábiles hacer algunos trucos bastante ingeniosos, pero sigo pensando que vi es (sólo) un editor, incluso si para algunos es un gran editor, menciona Cameron. Siempre, siempre funciona de la misma manera. En este sentido, vi es como McDonald's; no importa a donde vayas, es exactamente lo mismo.

¿Quieres un editor que se adapte a tus necesidades y peculiaridades y que haga muchas, muchas cosas o simplemente quieres ser capaz de editar archivos rápidamente en cualquier máquina? pregunta ella. Para la gente que tiene que moverse de un ordenador a otro constantemente, esta consistencia puede ser una ventaja real.

En otras palabras, EMACS = flexibilidad, mientras que vi = uniformidad?

Aquí es donde las cosas se ponen turbias.

EMACS es ciertamente más complejo que vi, pero no creo que sea más poderoso de ninguna manera útil, porque vi fue diseñado para ser parte de un sistema UNIX e interactuar con esas herramientas, replica Jon Lasser.

Tenga en cuenta que, para Lasser, útil significa la forma en que vi le permite leer documentos directamente desde una tubería UNIX desde otro proceso, como lo haría en cualquier otra aplicación UNIX, explica. Así, la cadena arcana de pulsaciones de teclas <esc> :r !ls<enter> introducidas en vi (en modo comando, recuerde) lee en el búfer la salida del programa ls, o una lista de archivos del directorio actual. Y una tubería de cualquier otro programa UNIX también funcionaría.

En cuanto a la edición automática de un gran número de archivos en vi, Lasser dice que es por eso que tenemos sed, awk, y todas las demás herramientas de procesamiento de texto UNIX.

El procesamiento de texto es para lo que UNIX fue diseñado, y vi fue diseñado para ser parte de ese sistema, escribe Lasser.

Tal vez el problema subyacente entre EMACS y vi no es el de la uniformidad frente a la flexibilidad en absoluto. Después de todo, ambos editores ofrecen flexibilidad, es sólo que con vi, lo hace a través del propio UNIX, mientras que EMACS lo logra construyendo sobre el sistema.

Y, para el caso, el único punto de la flexibilidad es hacer que el trabajo vaya más rápido. Si desea un procesamiento de texto sencillo y sin complicaciones, puede optar por Pico, que ofrece sólo una pantalla en blanco y ninguna de las características de vi o EMACS que confunden a los novatos. Lo que ambos editores ofrecen son formas avanzadas de reducir la distancia entre la velocidad de los dedos en el teclado y la velocidad del cerebro del programador.

En otras palabras, ¿podría ser que estos editores ofrezcan lo mismo, pero exijan diferentes maneras de pensar a sus usuarios? Vi requiere la paciencia para aprender sus extravagantes formas, aunque una vez que las dominas, eres libre de llevar tu acto a cualquier sistema UNIX. EMACS te da la libertad de personalizar tu configuración como mejor te parezca, aunque si no eres cuidadoso, te convertirás en prisionero de tu propia configuración.

En algún momento durante la gran caminata de mejora de la auto-eficiencia que todos los buenos programadores toman, los usuarios de vi y EMACS se cruzan, cada uno viniendo de una dirección diferente. Y cuando se encuentran, normalmente se tiran piedras unos a otros.

Pero todo está bien.

No creo que haya una gran diferencia en la funcionalidad. Ambos editores hacen un buen trabajo y todo se reduce a lo que la gente aprende primero, escribe Gil. Ya que la mayoría de las personas conocen EMACS, les enseñarán a otros EMACS. Por lo tanto, la mayoría de la gente usa EMACS, etc.

Y así la disputa continuará...

(Nota: Las mayúsculas de EMACS, UNIX y vi pueden haber sido cambiadas en comillas a sus formas originales, excepto en los títulos directos de libros y páginas Web).

-1:-- The Holy War (Post )--L0--C0--April 08, 2018 03:35 PM

La Pipa Plena: Curso emacs 28. Procesos, crux, bf-modes y cerrar a lo bruto

Con emacs podemos ver los procesos abiertos, por ejemplo, como ya digimos, en un buffer con eshell lanzamos htop. Para ver los procesos abiertos en la sesión: M-x list-processes RET Imaginamos que htop no se puede cerrar, que no es el caso. El equivalente al comando *killall htop* de linux, en los procesos abiertos en emacs es: M-x … Sigue leyendo Curso emacs 28. Procesos, crux, bf-modes y cerrar a lo bruto
-1:-- Curso emacs 28. Procesos, crux, bf-modes y cerrar a lo bruto (Post la pipa plena)--L0--C0--April 08, 2018 01:13 PM

La Pipa Plena: Curso emacs 27. Más encriptaciones, traducciones y guardar buffers

Hemos visto en varias entradas como codificar archivos y textos, pues en esta veremos otro método y además muy simple: M-x package-install RET kaesar-mode RET M-x package-install RET kaesar-file RET No es necesaria ninguna entrada en el archivo de configuración. Abrimos un archivo, que como podeis ver es el lorem-ipsum que tuneamos con frases del … Sigue leyendo Curso emacs 27. Más encriptaciones, traducciones y guardar buffers
-1:-- Curso emacs 27. Más encriptaciones, traducciones y guardar buffers (Post la pipa plena)--L0--C0--April 07, 2018 01:52 AM

La Pipa Plena: Curso emacs 26. Calculos, which y hooks

Si no se precisan operaciónes matemáticas muy complejas con la quick-calc que se ejecuta en el minibuffer sobra. Lanzamos: C-x * q  Tecleamos cualquier operación Y en el mismo minibuffer nos muestra el resultado: Este resultado se guarda y con C-y lo pega en el punto del cursor. Las opciones de calc son un montón … Sigue leyendo Curso emacs 26. Calculos, which y hooks
-1:-- Curso emacs 26. Calculos, which y hooks (Post la pipa plena)--L0--C0--April 01, 2018 05:36 AM

Onda Hostil: Lo que he aprendido: magit

He empezado a usar Magit. Tanto escuchar Magit es el mejor modo para git jamás creado y yo empecé a usar Emacs por Magit me han convencido a darle una oportunidad. Eso y que el modo git normal que usaba no me carrula bien en el ordenador del curro (¡Windows!).

La cuestión es que Magit me flipa, puedo manejar mi repo desde Emacs solo dando a un par de teclas y ayudando por tanto a mis pobres bracitos lesionados por el ordenador.

Lo más curioso de este modo es que funciona a base de ventanitas (pop ups) en las que se nos dan opciones diversas. A cada ventanita se accede con una tecla y podemos acceder a la ventanita de las ventanitas con h (help). Cada ventanita se divide en dos pedazos, en la parte superior activamos las opciones y en la inferior elegimos el comando. No os preocupéis que enseguida lo veremos todo mucho más claro.

Por cierto, si como yo usáis Emacs con GUI y menús (¡sacrilegio!) tendréis en la barrita un menú de Magit con las diferentes órdenes y sus teclas correspondientes.

Lo básico: status, add y commit

Empezamos a usar Magit en un repositorio existente diciéndole que nos muestre el estado del mismo en una de sus ventanitas con la siguiente orden:

M-x magit-status RET
magitStatus

La ventanita de estado

La documentación nos aconseja asignarle la combinación de teclas C-x g a este comando ya que lo usaremos a menudo. Esto ya lo hemos hecho otras veces, no hace falta más que añadir una línea mágica al archivo de configuración:

(global-set-key (kbd "C-x g") 'magit-status)

Si no empezamos desde un repo existente, podemos iniciar uno con M-x magit-init o clonarlo con M-x magit-clone, que nos pedirá un nombre y una URL.

La ventanita de estado nos lista todos los archivos del repo, categorizados como Unstaged, Staged y Modified. Podemos movernos por la ventanita y decirle a Magit que haga el seguimiento a archivos o a trocitos de archivos, que haga un commit o que envíe los cambios a un repositorio remoto solo dando a una tecla.

Posicionándonos sobre el nombre de un archivo sin seguimiento o uno modificado y pulsando s (stage) lo añadiremos a los archivos a vigilar. Si nos posicionamos en el título y le damos a la s, añadiremos todos los de la sección. También podemos ignorar archivos con u (unstage).

Cuando estemos satisfechos de los añadido, le damos a la c para que se abran las opciones del commit y le vamos siguiendo el juego: pulsamos c para un commit normal, escribimos el mensaje y hacemos C-c C-c para decirle que hemos acabado. Antes os decía que las ventanitas tenían dos partes, la de las opciones y la de los comandos, los comandos se eligen dándole a la tecla correspondiente y las opciones superiores se activan posicionándose en la línea y pulsando RET, son los flags con los que Magit llamará al comando de git en cuestión.

Una de las cosas que más me gusta de Magit es que la información de las ventanitas se divide en secciones que se comportan como las de mi adorado Org y, por lo tanto, se expanden una vez con TAB y del todo con C-TAB.

Ver diferencias: diff

La ventanita de estado ya nos muestra los cambios al expandir el archivo con TAB, pero si queremos hacer más cosas tenemos la ventanita de los diffs, que contra todo pronóstico abrimos con d cuando estamos en la ventana de estado.

magitDiff

La ventanita de los diff

Sobre las ramas: branch, stash, checkout y merge

Las ramas en sí se tratan en la ventanita de las ramas que se abre con b y gestiona la creación y la destrucción de ramas así como saltar de una a otra con checkout.

Las fusiones de ramas, en cambio se tratan en la ventanita de merge que se abre con m y los stash en otra ventanita específica a la que llamamos con la z.

Manejar remotos: configuración, push y pull

El tema de los remotos tiene su miga por los términos que se utilizan. Yo como de git sé bastante poco, voy a contar el par de cosas que uso yo y os dejo unos enlaces para que leáis el manual.

Los remotos se gestionan con la ventanita que aparece al darle a la M, ahí se puede añadir un remoto, quitarlo o cambiarle el nombre. Cuando ya lo tengamos configurado, podemos hacer fetch o pull con f y F respectivamente, cada cual con su ventana de opciones correspondiente. Luego con P abrimos la ventanita de hacer push y mandamos los cambios a la rama remota que nos parezca.

En Windows, como suele ser habitual, el tema de pushear funciona distinto. Si estáis en ese caso el manual es vuestro amigo.

Otras cosicas

Un tema interesante para no malgastar recursos es desactivar VC, el modo de Emacs para el control de versiones. Nos dicen en la docu que para ello añadamos esta línea al archivo de configuración:

(setq vc-handled-backends nil)

Conclusión

Así como resumen os diré que me ha gustado Magit, es sencillo e intuitivo y a pesar de que me encante usar git desde la terminal y liarla petarda porque no me acuerdo de los comandos, usaré Magit siempre que edite cosas bajo control de versiones en Emacs.

¡Recordad! Para usar Magit solo hace falta abrir la ventanita de estado (M-x magit-status) y luego darle a teclas diversas. No nos exige además mucha memoria, solo con acordarnos de que la h nos abre la ventanita de ventanitas es suficiente. ¡Ah! Salir de las ventanitas es tan fácil como darle a la q.

Ya me contaréis qué tal.

magitAyuda

La ventanita de ayuda

Referencias

El manual de Magit

Getting started in Magit

FAQ de Magit


Sonando:


-1:-- Lo que he aprendido: magit (Post Ondiz)--L0--C0--March 31, 2018 02:00 PM

uGeek: ORGMODE: Focus Mode

Publicado por Angel

focusmode

Si queremos centrar nuestra atención cuando estamos escribiendo en emacs con Org Mode, podemos instalar Focus Mode.

fucusmode

INSTALAR

M-x package-install RET focus RET

ACTIVAR

Para activar, escribir:

M-x focus-mode

ACTIVAR READ ONLY

M-x focus-read-only-mode

La cantidad de opacidad, podemos personalizarlo configurando el focus-dimness

Fuente


Cuando Canal en Telegram

Grupo en Telegram

uGeekPodcast en Twitter

Escucha más Podcast en el Reproductor de la web ►Play

Tags: , blog , emacs , focusmode , orgmode ,

<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
-1:-- ORGMODE: Focus Mode (Post )--L0--C0--March 24, 2018 03:30 PM

uGeek: OrgMode: Automarcado DONE al Realizar un Grupo de Tareas

Publicado por Angel

Cuando tenemos que realizar una tarea muy grande, un modo para motivarse a realizar esta, es dividirla en subtareas.
Gracias al Org Mode y sus sistema jerárquico de tareas, es posible hacerlo, pero por defecto no permite que una vez realizadas todas las subtareas, marcar la tarea global automáticamente con el DONE.

Para poder realizar esto, añadiremos en nuestro .emacs o init.el:

(defun org-summary-todo (n-done n-not-done)
  "Switch entry to DONE when all subentries are done, to TODO otherwise."
  (let (org-log-done org-log-states)   ; turn off logging
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))

(add-hook 'org-after-todo-statistics-hook 'org-summary-todo)

El modo de representar la tarea y subtareas, seria de la siguiente manera:

* TODO tarea[0/2]
** TODO uno
** TODO dos[1/2]
*** TODO uno de dos
*** DONE dos de deos

Una vez todas las subtareas estén realizada y marcada con DONE, ahora si la tarea principal cambiará automáticamente a DONE.

rss de OrgMode y Emacs


Cuando Canal en Telegram

Grupo en Telegram

uGeekPodcast en Twitter

Escucha más Podcast en el Reproductor de la web ►Play

Tags: , blog , checklist , emacs , orgmode ,

<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
-1:-- OrgMode: Automarcado DONE al Realizar un Grupo de Tareas (Post )--L0--C0--March 22, 2018 09:30 AM

La Pipa Plena: Curso de emacs 25. Gráficos con ascii, extensiones instaladas y caracteres raros.

Hemos hablado de la confección de gráficos con org-mode pero si no estamos en esta opción existe aa2u (ascii-art-to-unicode) que también los deja aparentes. Una vez instalado: M-x package-install RET ascii-art-to-unicode RET Simplemente realizamos un gráfico de forma clásica (en ascii) con el teclado: Lo seleccionamos Pulsamos: M-x aa2u Y se verá La conversión a html … Sigue leyendo Curso de emacs 25. Gráficos con ascii, extensiones instaladas y caracteres raros.
-1:-- Curso de emacs 25. Gráficos con ascii, extensiones instaladas y caracteres raros. (Post la pipa plena)--L0--C0--March 21, 2018 03:29 PM

La Pipa Plena: Curso emacs 24. zpresent, narrows y rectangulos

Hemos tocado un poco de beamer, zpresent tambien puede mostrar una presentación muy simple, previa instalación de la extensión sita en MELPA: M-x package-install RET zpresent RET Y si en un buffer .org lanzamos: M-x zpresent Vemos una muestra del resultado que con el propio curso de emacs seria: Con C-n y C-p o con … Sigue leyendo Curso emacs 24. zpresent, narrows y rectangulos
-1:-- Curso emacs 24. zpresent, narrows y rectangulos (Post la pipa plena)--L0--C0--March 20, 2018 08:02 PM

MGallego: Emacs con Fondo Transparente

Esto mas que un post va a ser un breve apunte de algo que vi por casualidad el otro día, y se trata de como poner emacs con fondo transparente.

emacs transparente

No se trata de una funcionalidad que me interese ni que esté pensando en utilizar, pero quería dejar el apunte por si le puede interesar a alguien o incluso a mi yo del futuro.

Para conseguir este efecto deberemos modificar el valor del parámetro alpha del frame de la siguiente forma:

   (set-frame-parameter (selected-frame) 'alpha '(92 . 90))
   (add-to-list 'default-frame-alist '(alpha . (92 . 90)))
   

Alpha

Según podemos ver en la documentación, este parámetro especifica la opacidad que queremos darle al frame. Debe ser un número entero del 0 al 100, donde 0 es completamente transparente y 100 completamente opaco. Si ponemos un nil le decimos a Emaca que no se modifique la opacidad del frame, dejándolo al gestor de ventanas.

Para prevenir que el frame desaparezca y no podamos editar existe una variable frame-alpha-lower-limit que define la mínima opacidad que puede tener el frame. Por defecto es 20.

Ojo, en la documentación avisan de que el parámetro está semi-obsoleto. A parte de que puede no funcionar correctamente en todos los sistemas operativos ni en todas las versiones de Emacs.

Fuentes

-1:-- Emacs con Fondo Transparente (Post )--L0--C0--March 16, 2018 10:37 PM

Quijote Libre: Aprendiendo GNU Emacs y org-mode (IX) – La ayuda de Emacs.

Lo cierto es que hoy en día parece imposible vivir este mundo de la informática sin acceso a la Web. Estamos tan acostumbrados a youtubers, influencers y otros palabros que no me volveréis a oír nombrar ;), que olvidamos lo esencial. Hace unos días recordaba mis inicios cómo programador, a finales de los 70, primeros […]
-1:-- Aprendiendo GNU Emacs y org-mode (IX) – La ayuda de Emacs. (Post Quijote Libre)--L0--C0--March 16, 2018 04:54 PM

Quijote Libre: Sacar de en medio ficheros auto-save y backup de Emacs.

La realidad me tiene superado y es tal  mi descontrol que os tengo a todos abandonados, lo cual no quiere decir que no os eche de menos es sólo que no puedo escribir con la dedicación necesaria. Esta falta de concentración me lleva a hacer mil “monadas” en mi equipo que no sirve absolutamente para […]
-1:-- Sacar de en medio ficheros auto-save y backup de Emacs. (Post Quijote Libre)--L0--C0--March 10, 2018 12:43 PM

nba - GNU's Rock: Miscelanea Emacs

aqui una serie de pequeños trucos y apaños recientes

primero, sin buscarlo intencionalmente he estado utilizando emacs en modo consola, en un terminal grafico, pasado por ssh y filtrado bajo gnu screen.

Acostumbrado a la version grafica de emacs y al no tener interferencia en practicamente ninguna combinacion de teclas. Al toparme de lleno primero con la interferencia del terminal y luego la de screen, me descoloque bastante, pero ya empiezo a acostumbrarme e ingresar algunos comandos por su nombre y asignar rutas alternativas a algunos comandos, ademas de explorar modos que por lo general no uso extensivamente, como por ejemplo *eshell* donde descubro estupefacto que de vez en cuando company-mode (autocompletado) interfiere ingresando espacios al azar y/o borrando caracteres… ja, ja, ja, la solucion a este mal es desactivar company en ese modo en especifico

(setq company-global-modes '(not eshell-mode))

el segundo truco suculento esta relacionado con el lenguaje de marcas imaginaria morg al que ni en un futuro cercano, medio (y tal vez lejano) creo contar con la habilidad de programarle un modo propio, asi que sigo ultrajando a org-mode y sus facilidades. Una caracteristica que hechaba mucho en falta es el resaltado de la sintaxis “en linea” de comandos “arroba” asi que cada vez que visitaba un texto, lo unico que se me ocurria era resaltar dicha sintaxis mediante el comando highlight-regexp con una regexp esoterica.

Recientemente le agregue un gancho al emacs para que lance una serie de highlights que automaticen el resaltado. No es perfecto, ya que aveces se resaltan cosas aleatoriamente y otras la regexp es incapas de encajar con la sintaxis, pero de momento sirve de apaño

;; cargar ficheros .morg en modo org
(add-to-list 'auto-mode-alist '("\\.morg\\'" . org-mode))

;; resaltar "cosas"
(add-hook 'org-mode-hook
          (lambda ()
            (highlight-regexp "@[^[<({]+[[<({][^]>})]+[]>})]" 'hi-green-b)
            (highlight-regexp "@[[<({][^]>})]+[]>})]" 'hi-red-b)
            (highlight-regexp "@[^[<({]+[[<({][]>})]" 'hi-red-b)
            (highlight-regexp "[[:space:]]@[[:space:]]" 'hi-yellow)
            (highlight-regexp "@[a-zA-Z]+[[:space:]]" 'hi-yellow)
            (highlight-regexp "^ *@ +.*" 'hi-pink)
            )
          )

y finalmente, la primer funcion en emacs lisp (shell-region-insert-for-markdow) que programo “por ver si funcionaba”. Un poco de corta y pega, un algo de lo traducido del manual de introduccion a emacs lisp y un tanto de prueba y herror (con h)

(defun shell-region (start end)
  "execute region in an inferior shell"
  (interactive "r")
  (shell-command  (buffer-substring-no-properties start end)))

(defun shell-region-insert-for-markdown (start end)
  "execute region in an inferior shell and insert output with markdown sintax"
  (interactive "r")
  (save-excursion
    (goto-char end)
    (insert "\n")
    (dolist (line
             (split-string
              (shell-command-to-string (buffer-substring-no-properties start end))
              "[\n]")
             t)
      (insert "\n" "    " line))
    )
  )

(global-set-key (kbd "C-c x") 'shell-region)
(global-set-key (kbd "C-c i") 'shell-region-insert-for-markdown)

la primer funcion ejecuta la region activa en una shell mostrando la salida en un buffer (si la hay). La segunda funcion hace lo mismo pero agrega el salto mortal de insertar la salida del comando dentro del mismo buffer con el formato de (cuatro espacios al inicio de) markdown. Je, je, a que mola!

por supuesto con las respectivas combinaciones de teclado para parecer aun mas pro. En cuanto a (e)lisp en si, pues esta curioso, sigo creyendo que ajustar todo a listas es un bonito truco academico pero incomodo en el uso diario. No contar con tipado aun si las funciones tienen nombres (medio) claros poco ayuda y desconocer que demonios devuelve una funcion hasta leerse la documentacion a detalle tampoco es motivante, acaso seguimos en los 70’s?

Aun asi curioso, estimulante y esoterico programar para emacs es, de a poco le estoy encontrando el gusto…

este par de comandos los hice un poco pensando en xiki aquella shell montada en emacs con una ambicion desmedida que cerro su codigo una vez (creo) y luego termino en naahhh. Hubiera sido un buen modo, seeh hubiera sido un buen modo… mmm, no parece muy dificil de implementar, no lo habra hecho ya algien (de buen corazon y espiritu GPL hippie)?

actualizacion: si existe un modo que imita a xiki, no muy logrado pero se puede usar y se llama elxiki. Gracias a la gente de r/emacs!.

luego de cargar el modo

$ git clone https://github.com/lahorichargha/elxiki
(add-to-list 'load-path "ruta-a-directorio-elxiki")
(require 'elxiki)

para enterarse de como usarlo visitar ruta-a-directorio-elxiki/menu/elxiki.menu y ejecutar M-x elxiki-mode

happy hacking!

fuentes

-1:-- Miscelanea Emacs (Post )--L0--C0--March 07, 2018 12:00 AM

Onda Hostil: Lo que he aprendido: el ratón y org mode

Como ya os he dicho más veces uso Emacs de una manera un tanto curiosa, con su GUI y hasta con el ratón porque al final me muevo en un entorno gráfico y me encaja mejor así con el resto de herramientas (sí, uso cosas que no son Emacs). Parece ser que yo no soy la única, ya que hay modos de Emacs que añaden funcionalidades molonas al ratón y entre ellos mi favorito es org-mouse.el, que como su nombre indica se usa en mi amado modo Org.

Sirve para lo siguiente:

  • Nos muestra un menú contextual al hacer click derecho en diferentes elementos
  • Permite abrir y cerrar árboles con un click izquierdo
  • Marca casillas de las listas de tareas al hacer click izquierdo sobre ellas

Parece poca cosa pero hacen de Emacs un lugar más amigable para los novatillos, los desmemoriados o los vagos, tres categorías a las que pertenezco.

Para activarlo solo hace falta añadir una línea al archivo de configuración:

;; Cargar org-mouse
(require 'org-mouse)

Podéis ver este modo en acción en este screencast1:

Referencias

How to setup org-mouse to intuitively toggle checkboxes on org-mode? en StackExchange

5.6 Checkboxes en el manual de Org


Os dejo con una canción que he localizado por casualidad:

-1:-- Lo que he aprendido: el ratón y org mode (Post Ondiz)--L0--C0--February 19, 2018 06:00 PM

MGallego: Codificando y Decodificando Urls con Emacs

Últimamente estoy teniendo que hacer muchas pruebas en las que pasar urls codificadas (urlencoded) dentro de una url, mi flujo de trabajo consistía en sacar el listado de urls que tenía que pasar como parámetro y una a una ir convirtiéndolas a través de una aplicación web para formar la url completa y testearlo.

A parte de ser un flujo bastante malo, tanto las urls como los parámetros los edito dentro del emacs, así que obviamente si el paso que tengo que realizar en un servicio externo lo puedo realizar también dentro pues puedo aprovechar todas las ventajas que me da el editor.

Estuve buscando un poco a ver si ya existían funciones nativas de emacs para realizar esta tarea, o quizá en algún modo que ya tuviese instalado y pudiese usar, pero no encontré nada, hasta que llegué a esta web.

Aquí encontré un par de funciones que puedo copiar en mi configuración de emacs para poder usarlas y que me han resultado muy útiles.

Por un lado tenemos una que realiza una codificación de tipo urlencode al texto seleccionado

  (defun url-encode-region (start end)
    "Replace a region with the same contents, only URL encoded."
    (interactive "r")
    (let ((text (url-hexify-string (buffer-substring start end))))
      (delete-region start end)
      (insert text)))

y por otro tenemos la inversa, decodifica el texto seleccionado.

  (defun url-decode-region (start end)
    "Replace a region with the same contents, only URL decoded."
    (interactive "r")
    (let ((text (url-unhex-string (buffer-substring start end))))
      (delete-region start end)
      (insert text)))

Las he probado y funcionan correctamente, así que las he añadido a mi configuración de emacs para poder usarlas cuando quiera con M-x url-encode-region y M-x url-decode-region respectivamente.

Esto y unas cuantas macros es lo único que necesito para crear todas las urls de prueba que necesito y así ahorrarme mucho tiempo.

-1:-- Codificando y Decodificando Urls con Emacs (Post )--L0--C0--February 14, 2018 06:54 PM

MGallego: Instalación del Modo Slack de Emacs

Actualmente en la empresa en la que trabajo, y en varias anteriores, estamos usando slack como herramienta de comunicación. Como me gusta trastear con emacs e intentar integrar todo he estado buscando como instalar el modo slack pero no me ha quedado claro.

En la web oficial a parte de explicar bastante bien como conseguir el token me ha parecido demasiado escaso el resto sobre la instalación, así que he decidido documentar como lo he acabado instalando.

Instalando el paquete

La mejor forma de instalar un paquete actualmente en emacs es a través de use-package. Si aún no lo estás utilizando te recomiendo que lo reviséis.

     (use-package slack
       :ensure t)
   

Con esto simplemente instalamos el paquete, podría poner toda la configuración junta como en la documentación original, pero es justo el motivo por el que me resultaba confuso, así que lo mejor será ir paso a paso

Obteniendo el token

Para obtener el token tenemos dos formas, la sencilla y la complicada, he probado las dos, y me he quedado con la sencilla, ya que para la complicada tenemos que crear nuestra propia app de slack y si no tenemos permisos de administrador del equipo o si como en mi caso ya estamos usando 10 apps, el limite de uso gratuito, pues no vamos a poder usarlo. Para la forma dificil lo mejor es seguir los pasos de la documentación del paquete.

La forma sencilla es la siguiente:

  • Abrimos el cliente web de slack, y accedemos a nuestro equipo (team):

  • Abrimos el inspector del navegador que estemos usando. Botón derecho sobre la web e inspeccionar elemento.

  • Dentro buscamos "xoxs", donde encontraremos el token que necesitamos. Lo copiamos.

Esto es lo único que necesitamos. Llevo poco usándolo y no se si ese token se regenera con el tiempo, yo lo hice por primera vez hace un par de días y me sigue funcionando, si caduca pues o bien lo hacemos por el método difícil o cuando caduque buscamos el token actualizado de la misma manera.

Probando el token

Ahora que tenemos el token, antes de meternos en la conexión a través de configuración, lo mejor es probar la conexión a través de comandos.

Ejecutamos M-x slack-start Esto nos irá pidiendo los datos de conexión.

Aquí es donde no queda nada claro en la documentación oficial que datos deberemos meter, ya que si hemos utilizado la forma sencilla de sacar un token no tenemos ni client ni secret.

Esto son los datos que debemos introducir:

Team Name: Nombre del equipo, en mi caso Devops Chat. Da lo mismo si no es exacto, por dentro lo sacará del token.

Client Id: Lo dejamos en blanco, pulsamos enter

Client Secret: Lo dejamos en blanco, pulsamos enter

Token: Aquí es donde debemos meter el token que hemos sacado del navegador.

Si todo ha ido bien ya tendremos una conexión completa donde podremos probar el modo, ojo esto no la almacenará en ningún sitio, tenemos que registrar el equipo en la configuración de nuestro emacs, para cuando lo abramos e iniciemos slack sepa a que equipos conectarse.

Configuración completa

Esta sería una configuración completa, con use-package, donde ya se registra un equipo y unos canales a los que queremos conectarnos.

     (use-package slack
       :commands (slack-start)
       :init
       (setq slack-prefer-current-team t)
       :config
       (slack-register-team
        :name "DevOps Chat"
        :default t
        :client-id ""
        :client-secret ""
        :token "xoxs-aaaaaaaaaa-bbbbbbbbbbbb-cccccccccccc-dddddddd"
        :subscribed-channels '(aws ideas nix docker)
        :full-and-display-names t
        ))
   

Como podéis ver el token que he pegado no es real, debéis reemplazarlo con el vuestro, este token está asociado a vuestro usuario así que no lo hagáis público, ya que con ese token cualquier persona podría publicar en vuestro nombre.

BUG TimeOut

REQUEST [error] Callback is not called when stopping process! Explicitly calling from timer.

Casualmente cuando estaba escribiendo los ejemplos de este post me topé con un bug en el modo.

Solo he usado el equipo de DevOps Chat porque es un grupo público donde poder coger capturas, pero en el día a día uso el slack de mi empresa.

En el slack del trabajo hay pocos usuarios y no me ha dado ningún problema, pero al sacar el listado de conversaciones del ejemplo me da un error del tipo REQUEST [error] Callback is not called when stopping process! Explicitly calling from timer..

Creo que esto es debido a la cantidad de mensajes y usuarios que hay en ese equipo, he probado a cambiar el timeout a un número mucho mayor, por defecto son 5 segundos y parece que funciona.

   (setq slack-request-timeout 240)
   

En mi caso me ha valido con 240, en tu caso quizá no te haga falta tanto tiempo, o incluso setear nada.

Os dejo el enlace al bug en github por si necesitais mas información.

Comprobando la instalación

Para comprobar lo mas sencillo es comenzar una conversación con el bot de slack, para ello realizaremos los siguientes pasos:

  • Actualizamos el listado de conversaciones directas M-x slack-im-list-update. Nos pedirá el team, podemos usar el tabulador para seleccionarlo (es en este paso cuando puede dar el error del que he hablado antes).

  • Seleccionamos el chat M-x slack-im-select Igual que en el caso anterior con el tabulador veremos la lista de posibles salas.

  • Saludamos con un "hello", a ver si el bot nos responde.

Finalizando

No quiero entrar en mas detalles porque como he comentado antes solo llevo un par de días utilizando y me queda mucho por probar aún y experimentar, lo que vaya aprendiendo lo iré publicando por el blog, mientras tanto podéis continuar con la documentación oficial.

Y como siempre cualquier duda o corrección del post, puedes dejarme un comentario.

-1:-- Instalación del Modo Slack de Emacs (Post )--L0--C0--February 09, 2018 10:37 PM

Bad Daemons: Modificar la salida de una función de emacs lisp sin redefinirla

Casi es más largo el título que la definición o solución del problema.

Por mostrar un caso real explicaré el problema que tenia. Uso el paquete Projectile, que sirve para gestionar proyectos en emacs, recomiendo fuertemente que le echéis un ojo. Cuando se han abierto unos cuantos proyectos puede usarse la función projectile-switch-project, que permite cambiar el proyecto. El tema es que muchos directorios de mi home son en realidad enlaces simbólicos a otros sistemas de ficheros. Esto hace que los proyectos se me muestren con las rutas reales, no las rutas de los enlaces simbólicos. Por ejemplo, un proyecto en /home/drymer/Documentos/Ansible/roles/upgrade-all se me muestra como /media/.secret/Casa/Documentos/Ansible/roles/upgrade-all, lo cual es horroroso.

Lo que yo necesito es hacer que los proyectos en /media/.secret/Casa/ se muestren como /home/drymer/. Investigando, vi que lo que me hacia falta era usar una función de asesoramiento. No tengo claro si se traduce así, en inglés son Advising Functions. El tema es que estas funciones permiten, entre otras cosas, modificar la salida de una función elisp sin tener que redefinirla.

Por lo tanto, hay que averiguar que función es la que hay que modificar. En este caso, la función que da el nombre a los proyectos es projectile-project-root. Ahora crearemos una función simple que ejecute un replace-regexp-in-string en la salida:

(defun daemons/projectile-project-root (arg)
  (replace-regexp-in-string "\\(/media/.secret/Casa\\)" (getenv "HOME") arg))

Un ejemplo de la ejecución de esta función:

(daemons/projectile-project-root "/media/.secret/Casa/Proyectos/nikola.el")

Solo nos queda añadir el filtro:

(advice-add 'projectile-project-root :filter-return #'daemons/projectile-project-root-filter)

Desgranemos el código:

  • advice-add: Añade función de asesoramiento.
  • projectile-project-root: La función que modificaremos.
  • filter-return: De que modo modificamos la función.
  • daemons/projectile-project-root-filter: Función con la que modificaremos el comportamiento de la primera.

La parte más interesante es la de filter-return, ya que este no es el único parámetro que se puede definir. Si quisiésemos, podríamos sustituir la función entera de muchas formas distintas. De hecho, si quisiésemos redefinir una función ya definida en alguna parte, las buenas prácticas dicen que hay que usar las funciones de asesoramiento. Recomiendo leer su sección del manual.

-1:-- Modificar la salida de una función de emacs lisp sin redefinirla (Post drymer)--L0--C0--February 05, 2018 07:30 AM

Bad Daemons: Expandir región por unidades semánticas

Ahí va otro paquete chorra de emacs que me hace la vida más fácil. expand-region, como dice el título, expande la región en unidades semánticas. Pero a que me refiero con una unidad semántica?

Pues a una parte imaginaria en la que partimos el código. Se ve especialmente claro en elisp:

(use-package rainbow-delimiters
  :ensure t
  :config
  (add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode)))

Las unidades semánticas que podemos sacar son:

  • delimiters
  • rainbow-delimiters-mode
  • "\\.el\\'" . rainbow-delimiters-mode
  • ("\\.el\\'" . rainbow-delimiters-mode)
  • '("\\.el\\'" . rainbow-delimiters-mode)
  • add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode)
  • (add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode))
  • use-package rainbow-delimiters :ensure t :config (add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode))
  • (use-package rainbow-delimiters :ensure t :config (add-to-list 'auto-mode-alist '("\\.el\\'" . rainbow-delimiters-mode)))

Como una imágen vale más más que mil palabras, ahí va un gif, que suman unos cuantos millones:

expand-region.gif

También podéis ver el screencast de Magnars, el autor de Emacs Rocks y el propio expand-region.

-1:-- Expandir región por unidades semánticas (Post drymer)--L0--C0--January 29, 2018 07:30 AM

Onda Hostil: Lo que he aprendido: ecuaciones rápidas con CDLaTeX

Ando últimamente bastante liadilla y agradezco cualquier herramienta que me facilite la vida. Una que me hace muy feliz es el modo menor de Emacs CDLaTeX, que acabo de descubrir y se ha convertido en imprescindible en mi día a día. En concreto lo uso en combinación con el modo Org, que trae su propia variante org-cdlatex. Paso a hablaros sobre ello.

El modo CDLaTeX

Tal y como dice en su README, CDLaTeX es un modo menor para la inserción rápida de entornos y movidas matemáticas en LaTeX:

CDLaTeX is a minor mode for Emacs supporting fast insertion of environment templates and math stuff in LaTeX

Lo escribió el mismo señor que el modo Org, Carsten Dominik, y se puede encontrar tanto en MELPA como en Github. Requiere texmathp.el que dicen que es parte de Emacs a partir de la versión 21.3, pero yo tuve que instalar AucTeX (que también lo contiene) para hacerlo funcionar.

Ecuaciones rápidas

La idea de este modo es evitarnos el tedio de escribir desde cero las ecuaciones de LaTeX y los símbolos matemáticos. Es muy listo y sabe cuándo estamos dentro de un bloque matemático (entre \begin{equation} y \end{equation}) y cuándo no, y así activa y desactiva funcionalidades según el contexto. Por ejemplo, al escribir un guión bajo nos añade automáticamente las llaves para que escribamos dentro el subíndice.

La tecla principal de este modo es el TAB, que hace de todo:

  • Predice comandos: si lo pulsamos después de haber escrito una parte de un comando nos lo completa. Me encanta porque equ + TAB inserta directamente un entorno de ecuaciones, ¡así de fácil! Podemos ver todas abreviaturas con M-x cdlatex-command-help.

  • Reduce subíndices y superíndices simples: nos escribe automáticamente las llaves para los subíndices y superíndices pero podemos eliminarlas para los casos de una sola letra pulsando el TAB delante de la llave de cierre.

  • Mueve el cursor a la siguiente unidad de interés: podemos avanzar por las ecuaciones con el TAB alegremente.

No solo del TAB se vive, también tenemos otras funcionalidades chulas:

  • Entornos rápidos C-c { nos mete entornos como align dentro del bloque de ecuaciones.

  • El apóstrofe modifica el carácter anterior, añadiendo un punto encima u otras movidas locas matemáticas. Si lo pulsamos y esperamos un poco nos aparece un cuadro con todas las opciones disponibles.

  • El acento grave introduce comandos, por ejemplo `a escribe \alpha tanto dentro como fuera del entorno matemático, `b escribe \beta y así sucesivamente. Varios acentos cambian de nivel, tomando el caso de la letra l como ejemplo, precedida de un acento escribe \lambda, con dos acentos \ell, y con tres \log. Lo que es utilísimo para los que escribirmos mucha mate. ¡Un truco! Para escribir letras griegas mayúsculas, tras introducir una con el acento grave y la letra, podemos usar M-b para movernos al inicio de la palabra y M-c para que Emacs nos la ponga en mayúsculas. Es fantástico. Al igual que el apóstrofe, si esperamos un poco después de pulsarlos nos aparece un cuadro con las opciones.

Lo único que me queda por contaros es que si este modo os conquista como a mí, podéis activarlo siempre con Org añadiendo esta línea al archivo de configuración:

;; Activar CDLaTeX con Org mode
(add-hook 'org-mode-hook 'turn-on-org-cdlatex)

¡Y hala! ¡Productividad a tope! 😀

¿Vosotras qué modos y herramientas usáis para simplificar vuestro trabajo? Ilustradme, porfis.

Referencias

org-cdlatex en el manual de Org

CDLaTeX en GitHub


Últimamente estoy dejando salir a mi celta interior:

-1:-- Lo que he aprendido: ecuaciones rápidas con CDLaTeX (Post Ondiz)--L0--C0--January 13, 2018 06:30 PM

Quijote Libre: Paquetes Emacs: try, wich-keys y org-bullets.

Cómo dijé en mi anterior entrada vuelvo a retomar el tema Emacs, en que ando enfrascado, con esta entrada en que os presento diferentes paquetes que he descubierto, de entre los cientos que hay para ampliar sus posibilidades, y mi replanteamiento del fichero de configuración. Os cuento … Reaprendiendo Emacs. Aunque la revisión que estoy […]
-1:-- Paquetes Emacs: try, wich-keys y org-bullets. (Post Quijote Libre)--L0--C0--January 11, 2018 07:45 PM

uGeek: Kanban para Org Mode

Publicado por Angel

Kanban para Org Mode


10 Meses utilizando Org Mode + Emacs y cada vez va a ser mas difícil el dejar este método para gestionar mis tareas y tomar notas.

Hace unos 2 meses, gestionando mi listas de tareas en mi Org Mode, eché de menos el poder implementar el método Kanban y poder ver mis tareas de una forma más gráfica.

Tuve el comentario en un grupo reducido de Telegram, donde esta Daniel Primo, que compartió conmigo esta joya que ha encontrado.

asciicast

Christian Köstlin, inspirado en el artículo Emacs, org-mode, Kanban, Pomodoro… Oh my…, creo un paquete que no esta disponible en ningún repositorio pero que podemos instalar de modo manual, para obtener un Panel dinámico Kanban, dentro de nuestro Org Mode. Lo mejor de todo, es que no sólo podremos ver estas tareas gráficamente, sino que también cambiar el estado de las mismas.

Instalación

Instalaremos previamente dash, una librería avanzada para trabajar con tablas, si no la tenemos instalada

M-x package-install RET dash RET

Recuerda que M-x=(Alt+x) y RET=Intro

Descargaremos el archivo con la terminal

wget https://raw.githubusercontent.com/ugeek/emacs-config/master/org-kanban.el

También podemos hacerlo desde el Explorador web
org-kanban.el

Cargamos en Emacs el org-kanban.el que hemos descargado

M-x load-file RET ruta_del_archivo RET

Gestión en nuestro Org Mode

Nuestro archivo .org, debe tener en la cabecera del documento, los estados de las tareas. Yo he decidido añadir más estados y personalizarlo en Castellano

#+TODO: PENDIENTE(t) | SIGuIENTE(s) | PROCESO(p) | ESPERA(e) | REALIZADO(d)

A diferencia del ejemplo de Christian Köstlin, sitúo mi panel Kanban al inicio, seguido de mis tareas, pudiendo ver el resumen del estado de estas de un modo más rápido.

Para generar el Panel Kanban, escribiremos este código:

#+BEGIN: kanban                                                                                                                           
#+END:                                                                                                                                    

Situando el cursor sobre #+BEGIN: kanban pulsamos C-c C-c y nos generará de forma automática el panel kanban

Ahora situándonos sobre una tarea en el panel, podremos cambiar su estado:

Estado Siguiente

M-x org-kanban/next

Estado Anterior

M-x org-kanban/prev

Estado Siguiente o Anterior

M-x org-kanban/shift

Por defecto cambiará al estado siguiente, pero pulsando las teclas j o k, podremos cambiar al estado que deseemos.

  • j = Anterior
  • k = Siguiente

También sobre la tarea en el panel, si tecleamos C-c C-o, nos llevará hasta donde está la entrada de esta tarea y ver si está compuesta de subtareas.

Nota: Recordar que el panel es estático, así que si cambiamos el estado de la taréa fuera del panel, deberemos actualizarlo desde el panel con (C-c C-c).

No se que opináis vosotros, pero para mi esto es alucinante. Tener todo en un único archivo de texto en Modo Org, de tan poco tamaño.

Repositorio original org-kanban de Christian Köstlin


Canal en Telegram

Grupo en Telegram

uGeekPodcast en Twitter

Escucha más Podcast en el Reproductor de la web ►Play

Tags: , blog , emacs , kanban , orgmode ,

<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
-1:-- Kanban para Org Mode (Post )--L0--C0--January 07, 2018 09:00 PM

Onda Hostil: Mi entorno de trabajo en Emacs

Estoy fusionando mi amor por Emacs con mi objetivo de ser más productiva (¡todavía más!) al trabajar. Esto pasa evidentemente por perder menos tiempo, que se traduce a su vez en tres cosas:

  • Usar lo menos posible el ratón, con la ventaja añadida de que mis pobres muñecas sufren mucho menos.

  • Salir lo menos posible de Emacs, si Emacs puede hacer todo ¿por qué abandonarlo? Esto conlleva afinar la configuración, algo que considero una inversión a largo plazo (y me divierte lo suyo, además).

  • Automatizar tareas repetitivas, reducir el tiempo gastado en repetir lo mismo una y otra vez es generar tiempo para otras cosas. También se reduce el número de veces que pulso una combinación de teclas determinada y, por lo tanto, mis manitas están más felices.

Un tema interesante que encaja en las tres categorías anteriores es tener preparado un entorno de trabajo al abrir Emacs la primera vez del día. ¿Cómo hago esto? Con una lista de tareas escrita en org que se abre automáticamente al iniciar Emacs. Como curro en diferentes historietas, en esta lista describo lo que tengo que hacer y enlazo los archivos en los que estoy trabajando. De esta manera, me sirve un poco como acta del trabajo que voy realizando y me permite tener localizados los documentos de los diferentes proyectos en los que ando.

Además, basta configurar con qué programa debe abrirse qué tipo de archivo para que tengamos ya la herramienta correcta dispuesta para que le demos caña, cuando no podemos usar directamente Emacs, claro.

Para que la lista de tareas nos aparezca al abrir Emacs solo hay que añadir una línea al final de nuestro archivo de configuración:

(find-file "RUTA_A_LA_LISTA")

He llegado a este sistema de pura casualidad, pero la verdad es que se adapta muy bien a mis necesidades. Otro día os hablaré más en detalle sobre cómo uso Org y compartiré con vosotros mi configuración completa para este modo.

Tengo curiosidad, ¿cómo os organizáis vosotros? ¡Contadme, contadme!

Referencias

A Baby Steps Guide to Managing Your Tasks with Org


Suena mientras escribo esto:

-1:-- Mi entorno de trabajo en Emacs (Post Ondiz)--L0--C0--January 03, 2018 03:28 PM

Quijote Libre: La serie de Mike Zamansky sobre Emacs.

No hace mucho que descubrí a Mike Zamansky  y  sus videos y aunque sólo sea por lo ordenado, limpio y claro de sus explicaciones,  a  pesar de que no soy muy dado al Inglés, me parece una serie digna de recomendar y tener como referencia básica, sobre todo si sois programadores. En cualquier caso para […]
-1:-- La serie de Mike Zamansky sobre Emacs. (Post Quijote Libre)--L0--C0--December 29, 2017 09:56 AM

Onda Hostil: Lo que he aprendido: imágenes inline en Org

¡Hola, gentes! ¡He aprendido nuevas cosas de Org!

Resulta que si hemos instalado Emacs con soporte para imágenes, podemos decirle a Org mode que nos las muestre dentro de nuestro documento. Esto es maravilloso porque implica que no es necesario que exportemos a HTML o pdf para tener un documento legible sino que desde dentro del propio Org podemos editar y ver directamente todo. Veamos cómo.

Mostrar las imágenes

Como ya sabemos, se pueden insertar imágenes en Org con la siguiente línea:

[[file:RUTA_A_IMAGEN]]

Tenemos unas funciones, que invocamos con M-x seguido de su correspondiente nombre, que nos permiten decidir si Org nos muestra la imagen a la que hacemos referencia en lugar de la línea esa que tan bien conocemos:

  • org-display-inline-images: muestra las imágenes
  • org-redisplay-inline-images: vuelve a cargar las imágenes
  • org-toggle-inline-images (C-c C-x C-v): si las estaba mostrando las deja de mostrar y viceversa
  • org-remove-inline-images: deja de mostrar las imágenes

El lugar de usar estas funciones todo el rato, también se puede establecer el comportamiento para determinado documento mediante una variable de inicio:

#+STARTUP: inlineimages

Mostrará las imágenes que hemos enlazado. En cambio:

#+STARTUP:noinlineimages

No las mostrará. Para que nos recargue el documento y hagan efecto los cambios en estas variables es útil la combinación C-x C-v (buscar archivo alternativo), una de mis favoritas.

Redimensionar las imágenes

Lo que nos puede pasar ahora es que la imagen nos quede gigantesca o diminuta porque Org nos la inserta en su tamaño original. Nos falta, por tanto, redimensionarla para que de verdad sea útil.

Para ello primero tenemos que darle el valor nil a la variable org-image-actual-width, que es la que controla el tamaño de las imágenes y que por defecto vale t, es decir, que las imágenes sean siempre del tamaño original. Con el valor de nil busca primero en los atributos si le hemos dado nosotros un tamaño y, si no, la muestra del tamaño original.

Yo he decidido cambiar el valor de esta variable en el archivo de configuración, pero puede hacerse también mediante una variable local:

;; Redimensionar si hay atributo, si no dejar tamaño original
(setq org-image-actual-width nil)

Ahora controlamos el tamaño con los atributos de imagen, unas líneas similares a las que dan inicio al documento que se ponen delante de la imagen y que sirven para establecer el tamaño, el pie de imagen y otras cosas. Por ejemplo, si vamos a exportar a LaTeX establecemos las opciones de cada imagen con el atributo ATTR_LATEX:

#+ATTR_LATEX: :width 0.5\textwidth
[[file:RUTA_A_IMAGEN]]

O para cambiar el tamaño de la imagen que se muestra dentro de Emacs:

#+ATTR_ORG: :width 300
[[file:RUTA_A_IMAGEN]]

Creo que para esto último hace falta Imagemagick, en Linux me va fetén pero en Windows no hay manera de hacerlo carrular.

Mostrar imágenes generadas mediante código

Si estamos creando las imágenes dentro de un bloque de código (con Ditaa, por ejemplo), igual nos interesa que después de fabricar la imagen la muestre. Para ello podemos añadir un hook al archivo de configuración que ejecute org-display-inline-images tras activar el bloque:

;; Mostrar imágenes tras ejecutar bloque de código
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images 'append)

De esta manera, en lugar de crearnos solamente un enlace a la figura en la línea de resultados nos la pintará dentro de Emacs y podremos ver si está a nuestro gusto.

inline

¡Esto es todo por hoy, hermanas! Pronto más Org y más Emacs.

Referencias

4.4 Handling links en el manual de Org

12.7.5 LaTeX specific attributes en el manual de Org

15.6 Summary of in-buffer settings en el manual de Org

Emacs org-display-inline-images en StackOverflow

How to resize images in org-mode en StackOverflow

Org mode C-c C-c to display inline image en StackExchange

Scale inline images in orgmode

Image display size in Org


-1:-- Lo que he aprendido: imágenes inline en Org (Post Ondiz)--L0--C0--December 26, 2017 05:32 PM

Bad Daemons: Múltiples cursores en emacs

Este es un paquete al que cuesta cogerle el punto. Pisa un poco las funcionalidades de las macros, es un poco especialito y hay que tener un poco de imaginación al usarlo, pero una vez le pillas el truco es muy útil.

El paquete que muestra el siguiente gif es de multiple-cursors, y hace exactamente esto, abrir múltiples cursores en emacs. Lo he estado usando últimamente que he tenido que he estado usando Terraform en el trabajo, y se presta al uso de este paquete. Veamos un ejemplo:

multiple-cursors.gif

La primera función es mc/mark-next-like-this, que crea un cursor en el siguiente elemento que es igual al que se está seleccionando. Tiene su equivalente mc/mark-previous-like-this para lo mismo pero para atrás. La siguiente función es mc/mark-next-lines que marca la siguiente linea sin más. Igual que la anterior, tiene su equivalente inverso, mc/mark-previous-lines. Y por último, el más útil, como todos los dwim, Do What I Mean. Se comporta de forma distinta según desde dónde se ejecute. Si se selecciona una región, introduces una cadena de carácteres y inserta cursores en esas regiones. En otra región hará otra cosa.

En la fabulosa página de Emacs Rocks hay un screencast sobre este paquete. Son solo tres minutos y muestra otro ejemplo de como usar este modo.

-1:-- Múltiples cursores en emacs (Post drymer)--L0--C0--December 11, 2017 07:30 AM

Maxxcan's Site: Mitos sobre GNU Emacs

Pre-Introducción Este artículo posiblemente es con el que debería haber empezado la serie de post…
-1:-- Mitos sobre GNU Emacs (Post admin)--L0--C0--December 07, 2017 05:34 PM

Maxxcan's Site: Como configurar Emacs

Introducción Como ya debemos saber Emacs es más que un editor por lo que algo…
-1:-- Como configurar Emacs (Post admin)--L0--C0--December 03, 2017 06:37 PM

Quijote Libre: Video introducción a GNU Emacs de Derek Banas

Gracias al gran sitio que es  Irreal, una de las mejores fuentes de información sobre Emacs que conozco, he podido ver este video de Derek Banas (@NewThinkTank). Probablemente sea un poco escaso para usuarios con experiencia, pero es indudable que es una buena aproximación a nuestro querido Emac y por eso la dejo aqui. No […]
-1:-- Video introducción a GNU Emacs de Derek Banas (Post Quijote Libre)--L0--C0--November 21, 2017 11:00 AM

Maxxcan's Site: Qué es spacemacs

la web de spacemacs
1 Introducción Mi idea era seguir haciendo artículos básicos sobre Emacs, pero viendo que ya…
-1:-- Qué es spacemacs (Post admin)--L0--C0--October 17, 2017 03:52 PM

nba - GNU's Rock: Emacs, configuracion de verano

todo empezo una tarde calida cuando cambie de distro a manjaro, abri el emacs para ponerme a programar “el morg” (que esta en go) y aparecia un mensaje de error muuu largo, informando que el flycheck (un modo para verificar el codigo mientras se va escribiendo) no localizaba la ruta al ejecutable del flycheck-go. Como no encontraba el origen del problema y queria tunear el emacs, me propuse abandonar el sistema que tenia para agregar extensiones al emacs, el cual consistia basicamente en buscar un paquete, clonar el repositorio del codigo y probar hasta se cargara a lo bestia sin tirar del sistema de paquetes del que dispone emacs… je, como decir que no me gustan las cosas automagicas que hacen las cosas sin que me entere, pero bueno, siendo emacs me dare el lujo de ser un poco mas permisivo

asi pues la nueva configuracion, es de esas sencillitas en las que colocas el paquete que quieres instalar/usar en una orden y luego al abrir emacs se descarga, instala y puede que hasta configure los paquetes que hagan falta, asi a la brava y sin tener ni idea de como

por lo tanto si quieres replicar mi configuracion

por ejemplo para programar en go, c, tener un lector de rss, o iniciar en emacs con el tema nascii, primero instala emacs, y luego crea una carpeta en tu home con

wget https://nasciiboy.github.io/data/init-dot-el.zip
unzip init-dot-el.zip -d ~/.emacs.d
rm init-dot-el.zip
emacs

el comprimido con forma de zip, almacena dos ficheros: init.el, que es donde se coloca toda configuracion de emacs y pondre a continuacion casi tal cual y nascii-theme.el mi tema de colores personal, baraje el subirlo a melpa para que tambien forme parte de la instalacion magica, pero me da peresa y creo que el tema visual es cosa de cada quien, unque desde luego mi tema es el unico que es correcto y valido…

las extenciones para programar en go requieren que instales las siguientes herramientas

go get -u github.com/nsf/gocode
go get -u github.com/rogpeppe/godef
go get -u golang.org/x/tools/cmd/goimports
go get -u github.com/jstemmer/gotags

por lo demas, solo haria falta substituir todos los /home/nasciiboy por tus rutas correspondientes

init.el

;;; nascii-config: --- another day in Emacs
;; Substituir /home/nasciiboy (y otras rutas) segun corresponda.

;; el thema nascii
(load-file "~/.emacs.d/nascii-theme.el")

;; fullscreen
(toggle-frame-fullscreen)

;; desactivar barra de (menu|herramientas|desplazamiento)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)

;; tamaño de la fuente
(set-face-attribute 'default nil :height 140)

;; inhibir mensajes y pantalla de inicio
(setq inhibit-startup-buffer-menu t)
(setq inhibit-startup-screen t)
(setq inhibit-startup-message t)
(setq inhibit-startup-echo-area-message "usuario")

;; mensaje en el buffer scratch
(setq initial-scratch-message "

  ;;     _____ __  __    _    ____ ____
  ;;    | ____|  \\/  |  / \\  / ___/ ___|
  ;;    |  _| | |\\/| | / _ \\| |   \\___ \\
  ;;    | |___| |  | |/ ___ \\ |___ ___) |
  ;;    |_____|_|  |_/_/   \\_\\____|____/


  ;;      ____   ___  _  ______    _
  ;;     |  _ \\ / _ \\| |/ / ___|  | |
  ;;     | |_) | | | | ' /\\___ \\  | |
  ;;     |  _ <| |_| | . \\ ___) | |_|
  ;;     |_| \\_\\\\___/|_|\\_\\____/  (_)

")

;; hora en formato 24 horas:
(setq display-time-day t display-time-24hr-format t)
(display-time)

;; reemplazar "yes" por "y" en el prompt
(fset 'yes-or-no-p 'y-or-n-p)

;; habilitar narrow & wide
(put 'narrow-to-region 'disabled nil)

;; habilitar upcase-region y downcase-region
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)

;; resaltar apertura y cierre de paréntesis
(setq show-paren-delay 0
      show-paren-style 'parenthesis)
(show-paren-mode)

;; visualizar lineas sin truncar ⏎
(set-default 'truncate-lines t)

;; Al borrar cosas moverlas a la papelera.
;; el directorio corresponde a la papelera en gnome3
(setq delete-by-moving-to-trash t
      trash-directory "~/.local/share/Trash/files")

;; al escribir en modo texto cortar lineas automaticamente
(add-hook 'text-mode-hook 'turn-on-auto-fill)
;; longitud de lineas
(setq-default fill-column 80)

;; Core settings
;; UTF-8 please
(set-charset-priority 'unicode)
(setq locale-coding-system   'utf-8)   ; pretty
(set-terminal-coding-system  'utf-8)   ; pretty
(set-keyboard-coding-system  'utf-8)   ; pretty
(set-selection-coding-system 'utf-8)   ; please
(prefer-coding-system        'utf-8)   ; with sugar on top
(setq default-process-coding-system '(utf-8-unix . utf-8-unix))

;; (setq make-backup-files nil) ; detener creacion de ficheros respaldo~ (descomentar)
(setq auto-save-default nil)    ; detener creacion de ficheros #autoguardado#
;; colocar todos los ficheros de respaldo en el directorio ~/.emacs.d/backups/
(setq backup-directory-alist `(("." . ,(concat user-emacs-directory "backups"))))

;; espacios en lugar de tabulaciones
(setq-default indent-tabs-mode nil)

;; eliminar espacios en blanco
(add-hook 'before-save-hook 'delete-trailing-whitespace)

;; c++-mode para headers y ficheros C
(add-to-list 'auto-mode-alist '("\\.h$" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.c$" . c++-mode))

;; xml-mode para ficheros xml
(add-to-list 'auto-mode-alist '("\\.xml$" . sgml-mode))

;; dar permisos de ejecución a scripts luego de guardar
(setq after-save-hook
      (quote (executable-make-buffer-file-executable-if-script-p)))

;; historial de ficheros abiertos
(require 'recentf)
(recentf-mode t)
(setq recentf-max-saved-items 200)
(global-set-key (kbd "C-c o") 'recentf-open-files)

;; atajos
;; Wind Move <> movimiento entre ventanas
(global-set-key [s-left]  'windmove-left)
(global-set-key [s-right] 'windmove-right)
(global-set-key [s-up]    'windmove-up)
(global-set-key [s-down]  'windmove-down)
;; atajos para emacs cli
(global-set-key (kbd "C-c <left>")  'windmove-left)
(global-set-key (kbd "C-c <right>") 'windmove-right)
(global-set-key (kbd "C-c <up>")    'windmove-up)
(global-set-key (kbd "C-c <down>")  'windmove-down)

;; parrafos
(global-set-key (kbd "C-.") 'forward-paragraph)
(global-set-key (kbd "C-,") 'backward-paragraph)
(global-set-key (kbd "C-q") 'fill-paragraph)
(global-set-key (kbd "C-;") 'delete-indentation)

;; ibuffer en lugar de list-buffers
(global-set-key (kbd "C-x C-b") 'ibuffer)

(global-set-key [f12] 'eval-buffer) ;; evaluar buffer (elips) actual
(global-set-key [f9] 'compile)      ;; compilar buffer (por ejemplo en C)
(global-set-key [f7] 'eww)          ;; abrir una direccion con eww

;; atajos de eww el navegador incorporado de emacs
(global-set-key (kbd "C-x w o") 'eww)
(global-set-key (kbd "C-x w b") 'eww-add-bookmark)
(global-set-key (kbd "C-x w l") 'eww-list-bookmarks)
(global-set-key (kbd "C-x w f") 'eww-open-file)

;; esto esta muuuuy chulo, cuando abres eshell te permite ejecutar los
;; comandos en la lista como si estubieras dentro de un terminal "real"
(setq eshell-visual-commands '("htop" "vi" "vim" "mocp" "top" "less" "more" "elinks" "elinks" "git" "sr" "surfraw"))

;; en direct coloca el tamaño de los ficheros con formato para humanos
(setq dired-listing-switches "-alh")

;; interpretes
(setq scheme-program-name "racket")        ; instalar previamente racket
(setq inferior-lisp-program "clisp")       ; instalar previamente clisp
(setq python-shell-interpreter "python3")  ; instalar previamente python3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                    ;;
;;         ""#                    "                   ;;
;;  mmmm     #    m   m   mmmm  mmm    m mm    mmm    ;;
;;  #" "#    #    #   #  #" "#    #    #"  #  #   "   ;;
;;  #   #    #    #   #  #   #    #    #   #   """m   ;;
;;  ##m#"    "mm  "mm"#  "#m"#  mm#mm  #   #  "mmm"   ;;
;;  #                     m  #                        ;;
;;  "                      ""                         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; con esta seccion te permite instalar las extenciones automagicamente
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(require 'use-package)
(setq use-package-always-ensure t)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: company-mode         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package company)
(add-hook 'after-init-hook 'global-company-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: flycheck             ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package flycheck)
(flycheck-mode t)
(add-hook 'python-mode-hook 'flycheck-mode)
(add-hook 'emacs-lisp-mode-hook 'flycheck-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: magit-mode           ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package magit)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: morg-mode            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'auto-mode-alist '("\\.morg\\'" . org-mode))
(add-to-list 'auto-mode-alist '("\\.porg\\'" . org-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: markdown-mode        ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package markdown-mode)
(add-to-list 'auto-mode-alist '("\\.text\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: go-mode              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; go get -u github.com/nsf/gocode
;; go get -u github.com/rogpeppe/godef
;; go get -u golang.org/x/tools/cmd/goimports
;; go get -u github.com/jstemmer/gotags

(setenv "GOPATH" "/home/nasciiboy/go")
(setenv "PATH" (concat (getenv "PATH") ":" "/home/nasciiboy/go/bin"))
(setq exec-path (append exec-path (list (expand-file-name "/home/nasciiboy/go/bin") (expand-file-name "/home/nasciiboy/.go/bin"))))
;; con la `list` de arriba  =======^^^^
;; solucione el problema de agregar
;; nuevos paths donde emacs buscara los ejecutables de go


(use-package go-mode)
(use-package go-gopath)
(use-package company-go)
(use-package go-stacktracer)
(use-package go-add-tags)
(use-package go-eldoc)
(use-package go-direx)
(use-package flymake-go)

(add-to-list 'company-backends 'company-go)
(add-hook 'go-mode-hook (lambda ()
                          (setq indent-tabs-mode nil)
                          (setq tab-width 2)))
(add-hook 'go-mode-hook 'go-eldoc-setup)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: haskell-mode         ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package haskell-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: rust-mode            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package rust-mode)
(add-hook 'rust-mode-hook (lambda ()
                            (setq rust-indent-offset 2)
                            (setq rust-format-on-save nil)))

(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: lua-mode             ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package lua-mode)
(add-to-list 'interpreter-mode-alist '("lua" . lua-mode))
(setq lua-indent-level 2)

(use-package love-minor-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: fish-mode            ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package fish-mode)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: multiple-cursors     ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package multiple-cursors)

(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "s-c C->") 'mc/mark-all-like-this)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: lorem-ipsum          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package lorem-ipsum)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PACKAGE: elfeed               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package elfeed)
(setq elfeed-feeds
      '(
        "http://blog.chuidiang.com/feed/"
        "http://blog.desdelinux.net/feed/"
        "http://blogubuntu.com/feed"
        "http://carlini.es/feed/"
        "http://cucarachasracing.blogspot.com/feeds/posts/default?alt=rss"
        "http://ea4bns.blogspot.com/feeds/posts/default"
        "http://elarmarioinformatico.blogspot.com/feeds/posts/default"
        "http://elblogdeliher.com/feed/"
        "http://enavas.blogspot.com/feeds/posts/default?alt=rss"
        "http://es.xkcd.com/rss/"
        "http://feeds.feedburner.com/blogspot/bytelearning"
        "http://feeds.feedburner.com/btroot?format=xml"
        "http://feeds.feedburner.com/diegocg?format=xml"
        "http://feeds.feedburner.com/Esbuntucom?format=xml"
        "http://feeds.feedburner.com/GabuntuBlog"
        "http://feeds.feedburner.com/Gambas2MisProgramas?format=xml"
        "http://feeds.feedburner.com/geeklandlinux"
        "http://feeds.feedburner.com/SYSADMIT?format=xml"
        "http://feeds.feedburner.com/teknoplof/muQI?format=xml"
        "http://feeds.feedburner.com/Ubunlog?format=xml"
        "http://feeds.feedburner.com/ugeek"
        "http://feeds.feedburner.com/ugeekblog"
        "http://feeds.feedburner.com/UnBrutoConDebian?format=xml"
        "http://feeds.weblogssl.com/genbetadev"
        "http://fernand0.github.io/feed.xml"
        "http://hackingthesystem4fun.blogspot.com/feeds/posts/default"
        "http://hispalinux.es/node/feed"
        "http://humanos.uci.cu/feed/"
        "http://lamiradadelreplicante.com/feed/"
        "http://linuxmanr4.com/feed/"
        "http://maslinux.es/feed/"
        "http://mhyst.es/blogs/index.php?tempskin=_rss2"
        "http://misnotaslinux.blogspot.com/feeds/posts/default"
        "http://nasciiboy.github.io/index.xml"
        "http://nosturi.es/feed/"
        "http://papermint-designs.com/roor/rss.xml"
        "http://parceladigital.com/feed/"
        "http://planet.emacsen.org/atom.xml"
        "http://quijotelibre.com/feed/"
        "http://radioela.org/spip.php?page=backend"
        "http://ranchoelectronico.org/feed/"
        "http://red-orbita.com/?feed=rss2"
        "http://rufianenlared.com/feed/"
        "http://softwarelibre.deusto.es/feed/"
        "http://www.blackhats.es/wordpress/?feed=rss2"
        "http://www.decrecimiento.info/feeds/posts/default"
        "http://www.dmdcosillas.org/feed/"
        "http://www.eldiario.es/rss/hojaderouter/"
        "http://www.hackplayers.com/feeds/posts/default?alt=rss"
        "http://www.jgimenez.info/feed/"
        "http://www.kdeblog.com/feed/"
        "http://www.lapipaplena.net/feed/"
        "http://www.linuxadictos.com/feed"
        "http://www.linuxhispano.net/feed/"
        "http://www.maxxcan.com/feed/"
        "http://www.muylinux.com/feed/"
        "http://www.portallinux.es/feed"
        "http://www.radioela.org/spip.php?page=backend-auteur&id_auteur=115"
        "http://www.rafaelrojas.net/feed/"
        "http://www.rootzilopochtli.com/feed/"
        "http://www.tomatesasesinos.com/feed/"
        "http://www.tomatuordenador.net/feed/"
        "http://www.ubuntizando.com/feed/"

        "https://andalinux.wordpress.com/feed/"
        "https://aprendizdesysadmin.com/feed/"
        "https://asm86.wordpress.com/feed/"
        "https://autodefensainformatica.radioalmaina.org/feed/"
        "https://birrasybits.wordpress.com/feed/"
        "https://blog.adrianistan.eu/feed/"
        "https://blog.gvsig.org/feed/"
        "https://cartaslinux.wordpress.com/feed/"
        "https://ciberlatino.wordpress.com/feed/"
        "https://codingornot.com/feed"
        "https://colaboratorio.net/feed/"
        "https://compilando.audio/index.php/feed/podcast/"
        "https://comunicatelibremente.wordpress.com/feed/"
        "https://daemons.cf/rss.xml"
        "https://diariodeunalinuxera.com/feed/"
        "https://duglasm.wordpress.com/feed/"
        "https://elbinario.net/feed/"
        "https://elblogdecarlosvelasco.wordpress.com/feed/"
        "https://eliasbrasa.wordpress.com/feed/"
        "https://eliotreyna.blogspot.com/feeds/posts/default"
        "https://elpinguinotolkiano.wordpress.com/feed/"
        "https://elzorrolibre.noblogs.org/feed/"
        "https://enekoamieva.com/blog/feed/"
        "https://feedpress.me/podcastlinux"
        "https://gutl.jovenclub.cu/feed/"
        "https://h4ckseed.wordpress.com/feed/"
        "https://infostatex.blogspot.com/feeds/posts/default"
        "https://jummp.wordpress.com/feed/"
        "https://jvare.com/feed/"
        "https://kernelpanicblog.wordpress.com/feed/"
        "https://laenredadera.net/feed/"
        "https://lapastillaroja.net/feed/"
        "https://lasindias.net/feed"
        "https://leninmhs.wordpress.com/feed/"
        "https://lignux.com/feed/"
        "https://linuxgnublog.org/es/feed"
        "https://mierda.tv/feed/"
        "https://miguelpinia.wordpress.com/feed/"
        "https://milagrosrp.wordpress.com/feed/"

        "https://mx.ivoox.com/es/podcast-podcast-el-precipicio_fg_f176717_1.xml"
        "https://mx.ivoox.com/es/podcast-podcast-kde-espana_fg_f1249423_1.xml"
        "https://mx.ivoox.com/es/reality-cracking_fg_f159955_filtro_1.xml"
        "https://www.ivoox.com/podcast-fran-casas_fg_f1449982_1.xml"
        "https://www.ivoox.com/podcast-podcast-verne-wells-ciencia-ficcion_fg_f1100419_1.xml"

        "https://neoranger.github.io/feed.xml"
        "https://noelonassis.wordpress.com/blog/feed/"
        "https://notxor.nueva-actitud.org/feed/all.rss.xml"
        "https://ondahostil.wordpress.com/feed/"
        "https://otroespacioblog.wordpress.com/feed/"
        "https://pfctelepathy.wordpress.com/feed/"
        "https://picodotdev.github.io/blog-bitix/index.xml"
        "https://poesiabinaria.net/feed/"
        "https://radioliberadaelpodcast.wordpress.com/feed/"
        "https://radioslibres.net/rss/"
        "https://thelinuxalchemist.wordpress.com/feed/"
        "https://victorhckinthefreeworld.com/feed/"
        "https://vidaembebida.wordpress.com/feed/"
        "https://www.atareao.es/blog/feed/"
        "https://www.cambiadeso.es/feed/"
        "https://www.linuxito.com/?format=feed&type=rss"
        "https://www.ochobitshacenunbyte.com/feed/"
        "https://xkcd.com/rss.xml"
        "https://xnet-x.net/blog/feed/"
        ))

(global-set-key [f6] 'elfeed)
(global-set-key [f5] 'elfeed-update)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                               ;;
;;   ___  ___ _ __(_)_ __ | |_   ;;
;;  / __|/ __| '__| | '_ \| __|  ;;
;;  \__ \ (__| |  | | |_) | |_   ;;
;;  |___/\___|_|  |_| .__/ \__|  ;;
;;                  |_|          ;;
;;                               ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Mostrar/ocultar archivos ocultos en direc
(defun dired-dotfiles-toggle ()
  "Mostrar/ocultar archivos ocultos"
  (interactive)
  (when (equal major-mode 'dired-mode)
    (if (or (not (boundp 'dired-dotfiles-show-p)) dired-dotfiles-show-p)
        (progn
          (set (make-local-variable 'dired-dotfiles-show-p) nil)
          (message "h")
          (dired-mark-files-regexp "^\\\.")
          (dired-do-kill-lines))
      (progn (revert-buffer)
             (set (make-local-variable 'dired-dotfiles-show-p) t)))))

(global-set-key (kbd "C-c h") 'dired-dotfiles-toggle)

(defun increment-number-at-point ()
  (interactive)
  (skip-chars-backward "0-9")
  (or (looking-at "[0-9]+")
      (error "No number at point"))
  (replace-match (number-to-string (1+ (string-to-number (match-string 0))))))

(defun decrement-number-at-point ()
  (interactive)
  (skip-chars-backward "0-9")
  (or (looking-at "[0-9]+")
      (error "No number at point"))
  (replace-match (number-to-string (- (string-to-number (match-string 0)) 1))))

(global-set-key (kbd "C-c +") 'increment-number-at-point)
(global-set-key (kbd "C-c -") 'decrement-number-at-point)

fuentes

https://github.com/melpa/melpa

https://github.com/abrochard/emacs-config/blob/master/configuration.org

https://www.reddit.com/r/emacs/comments/4fqu0a/automatically_install_packages_on_startup/

-1:-- Emacs, configuracion de verano (Post )--L0--C0--September 29, 2017 12:47 AM

nba - GNU's Rock: Run Scheme

En el anterior post (cronologico del blog) comente algunos interpretes de Scheme. Ya que en Emacs tenemos un interprete de elisp nativo, supuse que habria un metodo sencillo, para correr Scheme, pero, por que correr todo un interprete cuando se puede echar mano del interprete del sistema de turno y powerizarlo con el incomparable Emacs, o si, hasta Gulie que en terminal era insipido, se vuelve Sexi! Todos los interpretes adquieren historial, hasta los que no lo tenian!

… o eso es lo que aprendi en este post, que me limito a traducir y alterar parcialmente (pues supongo al estar en una wiki es permitido)

(nota: el post original, hablan de un modo “quack”, pero viendo que mensionan emacs-goodies, asumo que es algo “antiguo”, viniendo de ejecutar los interpretes en consola salvajemente, con lo que ofrece emacs por defecto tengo suficiente! (por ahora…))

Configuracion Basica

Coloque el codigo a continuacion en su fichero init.el, para configurar su uso con Scheme

;;; Siempre con resaltado de sintaxis
(global-font-lock-mode 1)

;;; tambien con resaltado de parentesis
(setq show-paren-delay 0
      show-paren-style 'parenthesis)
(show-paren-mode 1)

;;; Este es el nombre binario de mi implementacion de Scheme
(setq scheme-program-name "scm")

Asegurese de remplazar "scm" con el nombre de la implementacion de Scheme que este utilizando en su sistema

(resaltar que ya tenia activo show-parent-mode, la instruccion setq show-paren-delay 0 hace que no halla retraso al momento del resaltado, que por el uso que le daba, presuponia estaba asignado en 1 segundo… correccion segun C-h v show-parent-delay era de 0.125 segundos, maravilloso!)

Trabajando con Scheme

Cuando abre un archivo, los nombres de los archivos que terminan en .scm o .ss seran asumidos como archivos de Scheme, y se abriran con el modo scheme de Emacs, que proporciona resaltado de sitaxis e indentacion automatica cuando pulse TAB, y por spuesto resaltado de parentesis coincidentes.

Ejecutar Scheme en Emacs

Puede ejecutar un interprete de Scheme en Emacs. Esto le permite controlar el envio de los datos de entrada a su interprete desde emacs.

En primer lugar, crearemos una ventana para correr el proceso de Scheme presionando C-x 2, seguido por C-x o para ir a esta. Ahora podemos ejecutar un proceso de Scheme ingresando M-x run-scheme. Esto ejecutara el proceso que configuro anteriormente en su .init.el

Si esta realizando una prueba temporal, escriba en un buffer cualquiera (setq scheme-program-name "scm") (remplazar scm), coloque el cursor en el parentesis de cierre y pulse C-x C-e, de esta forma puede probar un interprete distinto, luego de cerrar la secion previa escribiendo (exit)

Para volver a la ventana inicial, presione C-x o.

Puede utilizar C-x C-e para enviar una expresion. Tambien puede enviar una region, un comando previo o incluso el buffer entero, para consultar el resto de atajos activos y disponibles (no vinculados con ninguna combinacion de teclado) presione C-h m

Comandos basicos

Algunos comandos basicos de movimiento del cursor:

  • C-a: Inicio de linea.
  • C-e: Fin de linea.
  • C-p: Linea previa.
  • C-n: Linea suguiente.
  • C-f: Avarzar un caracter.
  • C-b: Retroceder un caracter.
  • C-x delback: Matar hasta el inicio de linea
  • M-p: Retroceder por el historial.
  • M-n: Avanzar por el historial.
-1:-- Run Scheme (Post )--L0--C0--August 20, 2017 11:42 PM

Maxxcan's Site: Programación literaria para Devops con Emacs (1 parte)

programación literaria
  Aquí os dejo mi conferencia sobre Programación Literaria para Devops. Posteriormente subiré el material…
-1:-- Programación literaria para Devops con Emacs (1 parte) (Post admin)--L0--C0--June 13, 2017 10:17 AM

Bad Daemons: Ansible en emacs

Ultimamente he estado toqueteando bastante Ansible. Para quien no lo conozca, Ansible es un gestor de configuraciones. Permite instalar y configurar programas y configuraciones en un ordenador o en 1.000. Por eso se usa en el ámbito de la Integración Contínua. Pero bueno, ya hablaré más en profundidad de ello en otro articulo.

Por ahora hablaré de lo que uso para editar playbooks. Uso yaml-mode, ansible-doc y ansible-vault-mode. Por suerte los playbooks de Ansible se escriben en el maravilloso formato Yaml, muy cómodo para editarlo. El modo no ofrece mucho más que la indentación y los colores, pero tampoco hace falta mucho más:

(use-package yaml-mode
  :ensure t)

ansible-doc lo que hace es ofrecer el comando de línea ansible-doc pero desde emacs, con helm o ivy si se usa alguno. La primera linea de la sección config enlaza el ansible-doc-mode al yaml-mode, por lo que cuando se edite yaml, solo hay que ejecutar C-? y se accederá a los docs. Por defecto la primera vez que se lo llama tarda bastante en responder, por que guarda la respuesta para que las siguientes veces sea más rápido. Yo lo que he hecho es añadir la segunda línea, que hace que este cacheo se produzca al iniciar emacs. Tarda más en arrancar semacs, pero dado que solo lo arranco una vez cada muchas semanas, no me resulta un problema.

(use-package ansible-doc
  :ensure t
  :config
  (add-hook 'yaml-mode-hook '(lambda () (ansible-doc-mode)))
  (progn
    (save-window-excursion (ansible-doc "a10_server"))
    (kill-buffer "*ansible-doc a10_server*")))

Y por último, ansible-vault. Este paquete es otro wrapper de su equivalente de terminal. Para quién no lo sepa, vault es la forma de gestionar variables sensibles en ansible. Se puede usar de dos formas, con una contraseña genérica o una por proyecto. Para lo primero, solo hay que crear un fichero ~/.vaut_pass. Para lo segundo, hay que hacer uso del fichero .dir-locals.el. Este fichero permite concretar variables por directorio, como su nombre indica. Es algo propio de emacs, no de ansible-vault. Por lo tanto, en ese fichero habria que poner algo como esto:

((yaml-mode
  (ansible-vault-pass-file . "~/.ansible-vault/custom_vault_pass")))

La configuración del modo en si es la siguiente:

(use-package ansible-vault
  :ensure t
  :config
  (defun ansible-vault-mode-maybe ()
    (when (ansible-vault--is-vault-file)
      (ansible-vault-mode 1)))
  (add-hook 'yaml-mode-hook 'ansible-vault-mode-maybe))

Con esto, se hace mucho más facil y cómodo editar playbooks de Ansible. Y si además queremos visitar la página de la documentación oficial, siempre se puede usar counsel-dash.

-1:-- Ansible en emacs (Post drymer)--L0--C0--June 06, 2017 06:16 PM

Bad Daemons: Ejecución asíncrona de bloques babel en org-mode

En el articulo sobre la programación literaria para sysadmins se pudo ver que los bloques de babel en org-mode son muy útiles. Lo malo que tiene ejecutar estos bloques es que se bloquea emacs. El dichoso tema de la concurrencia de nueva. Pero como siempre, se puede trampear.

Se puede abrir un proceso paralelo de emacs para que ejecute el bloque sin que bloquee el proceso de emacs principal. Me estaba pegando con ello justo cuando descubrí que alguien ya lo habia hecho mejor. Veamos un ejemplo. Primero un ejemplo síncrono, que no tiene mucho sentido pero es gratis:

no-async-babel.gif

async-babel.gif

Muy fácil de usar, como se puede ver. Lo único malo que tiene es que no se puede usar la variable :session, por lo tanto se pierde la idempotencia. Se puede usar :noweb, pero cada bloque ejecutará todo lo anterior, lógicamente. Pero bueno, no me suele afectar demasiado para lo que uso. Para instalar el paquete que habilita este parámetro hay que añadir esto al archivo de configuración de emacs:

(add-to-list 'el-get-sources '(:name ob-async
                                     :type github
                                     :pkgname "astahlman/ob-async"))

(if (not (el-get-package-installed-p 'ob-async))
    (el-get 'sync 'ob-async))

(use-package ob-async
  :load-path "el-get/ob-async/"
  :config
  (add-to-list 'org-ctrl-c-ctrl-c-hook 'ob-async-org-babel-execute-src-block))

Una vez instalado y configurado, se puede usar como cualquier otro parámetro de bloque. Se puede establecer en el propio bloque, como se puede ver en el segundo gif, o se puede establecer como una propiedad en un árbol.

-1:-- Ejecución asíncrona de bloques babel en org-mode (Post drymer)--L0--C0--May 28, 2017 09:23 AM

uGeek: Metodo mas completo para recopilar notas, org Mode

Publicado por Angel

Suscribete al Blog : RSS del Blog

Suscribete al Podcast : RSS , ITunes , ivoox



Aplicación para Android: http://www.orgzly.com/
Aplicación multiplataforma de PC: https://www.gnu.org/software/emacs/

Este es el método definitivo, hasta ahora, para tomar mis notas con un sistema jerárquico de  notas y todas dentro en un único txt, renombrado como .org.
Os recomiendo que le deis una oportunidad, porque estoy seguro que os gustará.

Tags: , emacs , podcast ,

<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
-1:-- Metodo mas completo para recopilar notas, org Mode (Post )--L0--C0--March 08, 2017 12:00 AM

Maxxcan's Site: Qué hacer después de instalar Emacs (3ª parte)

Qué hacer después de instalar Emacs (3ª parte) Seguimos con la última parte de nuestra introducción…
-1:-- Qué hacer después de instalar Emacs (3ª parte) (Post admin)--L0--C0--January 24, 2017 01:35 PM