Desde que me convertí a la Iglesia de Emacs, he estado tratando de hacer todo desde adentro, y me preguntaba cómo hacer algo de procesamiento de texto de manera rápida y eficiente con él.Procesando texto con elisp
Como ejemplo, tomemos esta lista que estaba editando hace unos minutos en org-mode.
** Diego: b QI ** bruno-gil: b QI ** Koma: jo ** um: rsrs pr0n ** FelipeAugusto: esp ** GustavoPupo: pinto tr etc ** GP: lit gtk ** Alan: jo mil pc ** Jost: b hq jo 1997 ** Herbert: b rsrs pr0n ** Andre: maia mil pseudo ** Rodrigo: c ** caue: b rsrs 7arte pseudo ** kenny: cri gif ** daniel: gtk mu pr0n rsrs b ** tony: an 1997 esp ** Vitor: b jo mimimi ** raphael: b rpg 7arte ** Luca: b lit gnu pc prog mmu 7arte 1997 ** LZZ: an qt ** William: b an jo pc 1997 ** Epic: gtk ** Aldo: b pseudo pol mil fur ** GustavoKyon: an gtk ** CarlosIsaksen : an hq jo 7arte gtk 1997 ** Peter: pseudo pol mil est 1997 gtk lit lang ** leandro: b jo cb ** frederico: 7arte lit gtk ** rol: b an pseudo mimimi 7arte ** mathias: jo lit ** henrique: 1997 h gtk qt ** eumané: an qt ** walrus: cri de ** FilipePinheiro: lit pseudo ** Igor: pseudo b ** Erick: b jo rpg q 1997 gtk ** Gabriel: pr0n rsrs qt ** george: clo mimimi ** anão: hq jo 1997 rsrs clô b ** jeff: 7arte gtk ** davidatenas: an 7arte 1997 esp qt ** HHahaah: b ** Eduardo: b
Es una lista de nombres asociados con etiquetas, y quiero obtener una lista de etiquetas asociadas con nombres.
En bash, primero echo con comillas simples todo pegado y luego lo pipeteo a awk, haciendo un bucle sobre cada línea y agregando cada una de sus partes a la variable temporal correcta y luego metiéndola hasta que sea como yo quiero .
echo '** Diego: b QI ** bruno-gil: b QI ** Koma: jo ** um: rsrs pr0n ** FelipeAugusto: esp ** GustavoPupo: pinto, tr etc ** GP: lit gtk ** Alan: jo mil pc ** Jost: b hq jo 1997 ** Herbert: b rsrs pr0n ** Andre: maia mil pseudo ** Rodrigo: c ** caue: b rsrs 7arte pseudo ** kenny: cri gif ** daniel: gtk mu pr0n rsrs b ** tony: an 1997 esp ** Vitor: b jo mimimi ** raphael: b rpg 7arte ** Luca: b lit gnu pc prog mmu 7arte 1997 ** LZZ: an qt ** William: b an jo pc 1997 ** Epic: gtk ** Aldo: b pseudo pol mil fur ** GustavoKyon: an gtk ** CarlosIsaksen : an hq jo 7arte gtk 1997 ** Peter: pseudo pol mil est 1997 gtk lit lang ** leandro: b jo cb ** frederico: 7arte lit gtk ** rol: b an pseudo mimimi 7arte ** mathias: jo lit ** henrique: 1997 h gtk qt ** eumané: an qt ** walrus: cri de ** FilipePinheiro: lit pseudo ** Igor: pseudo b ** Erick: b jo rpg q 1997 gtk ** Gabriel: pr0n rsrs qt ** george: clo mimimi ** anão: hq jo 1997 rsrs clô b ** jeff: 7arte gtk ** davidatenas: an 7arte 1997 esp qt ** HHahaah: b ** Eduardo: b ' | awk '{sub(":","");for (i=3;i<=NF;i++) members[$i] = members[$i] " " $2}; END{for (j in members) print j ": " members[j]}' | sort
... y TA-DA! El resultado esperado en menos de 2 minutos, hecho de una manera intuitiva e incremental. ¿Puedes mostrarme cómo hacer algo como esto en elisp, preferiblemente en un buffer de emacs, con elegancia y simplicidad?
Gracias!
Esto puede ser solo un detalle, pero me parece que ayuda al aprender un nuevo idioma aprender el tipo de sangría de código que es idiomática para ese idioma - el tipo de sangría y paréntesis esperado con el lenguaje me ayuda a mantenerme en el flujo de ese lenguaje Y también, como alguien que usa lisp bastante, verlo parantizado de esa manera es discordante, como ver código en mayúsculas en un idioma que no sea BASIC o FORTRAN. –
¿Te refieres a la macro o la función hash-to-list? Si es el macro, ¿podría mostrarme cómo sangrarlo correctamente? La función simplemente fue copiada de la página de Xah Lee – konr