ES-TEX Archivos

Usuarios hispanohablantes de TeX

ES-TEX@LISTSERV.REDIRIS.ES

Opciones: Vista Forum

Use Monospaced Font
Por defecto enseñar Text Part
Mostrar todas las cabeceras de correo

Mensaje: [<< Primero] [< Prev] [Siguiente >] [Último >>]
Tema: [<< Primero] [< Prev] [Siguiente >] [Último >>]
Autor: [<< Primero] [< Prev] [Siguiente >] [Último >>]

Print Responder
Subject:
Emisor:
Juan Manuel Macías <[log in para visualizar]>
Reply To:
Usuarios hispanohablantes de TeX <[log in para visualizar]>
Fecha:
Thu, 11 Aug 2022 16:09:48 +0000
Content-Type:
text/plain
Parts/Attachments:
text/plain (147 lines)
Versión corta: Una función en Elisp que he escrito para mostrar una
lista de todos los caracteres no latinos que incluye un documento
(incluyendo nombre de carácter y código), con la posibilidad de saltar a
las líneas donde aparece cada carácter.

Versión larga:

Hola:

Al hilo de lo que se comentaba en un anterior hilo, puede darse este
caso en un documento: estamos trabajando con un texto ajeno de
proporciones moderadas o grandes y queremos saber qué tipo de caracteres
no latinos tiene nuestro documento y dónde están. Yo ya compartí en el
mencionado hilo una función que escribí hace tiempo para ayudarme en
estos menesteres durante mi trabajo en composición tipográfica. Pero,
como me di cuenta de que la función estaba algo cruda, he aprovechado
entre ayer y hoy para mejorarla y hacerla más usable. Creo que da una
solución al "problema" bastante buena (por no decir que, para mí, es la
solución casi definitiva). Por supuesto, dentro de Emacs. Pero tampoco
creo que a nadie que no use Emacs le vaya a dar un síncope por cargar la
función allí y ejecutarla en modo interactivo, si llegase el caso de que
lo necesitase. Que todo esto se puede lograr fuera de Emacs usando
cualquier otro lenguaje de script, imagino que es posible. Pero dudo
mucho, muchísimo, que se pueda conseguir algo tan simple, práctico e
interactivo como lo que se consigue usando los propios recursos de Emacs
y su propio lenguaje de script sin salir de allí.

Bien, lo que hace la función es lo siguiente:

- El escenario: tenemos un documento abierto y queremos "auditar" la
  vida y milagros de todos los caracteres no latinos que contiene.

- Ejecutamos la función: 'M-x busca-caracteres-extendidos-occur RET"

- El resultado: Se abre una ventana contigua donde se despliega una
  lista de todos los caracteres no latinos que contiene el documento.
  Cada carácter viene seguido de su nombre canónico Unicode y de su
  código Unicode. Por ejemplo:

   ृ  DEVANAGARI VOWEL SIGN VOCALIC R  #943

  (Por defecto, la función listará todos los caracteres que no
  pertenezcan al bloque 'latino básico', pero eso se podría modificar
  con una variable de tipo 'defcustom', añadiendo más excepciones por
  rangos o por caracteres solos.

- Navegar por la lista de caracteres: por supuesto, la cosa no queda en
  simplemente mostrar una lista de caracteres. Cada miembro de esa lista
  es un "botón", o sea, un objeto "clickable" con el ratón o activable
  con la tecla intro si tenemos allí el cursor. ¿Qué ocurre, por
  ejemplo, cuando clickamos en alguno de esos caracteres listados? Pues
  que se nos abre otra ventana temporal desplegando todas las líneas del
  documento donde aparece ese carácter, con el conveniente resaltado y
  número de línea. Si vamos a esa lista de líneas y damos intro en
  cualquiera donde está el cursor, saltamos directamente al pasaje en
  cuestión del documento (para quien esté habituado a Emacs, esa última
  ventana con las líneas donde aparece el carácter es la típica ventana
  de "occur").

- Instrucciones de instalación:

  - Para usuarios de Emacs: si vais a copiar y pegar la función en
    vuestro archivo de inicio, es imprescindible que pongáis al
    principio de todo esta línea:

    ;;; -*- lexical-binding: t; -*-

   (esto no sólo para la función. En general es muy recomendable activar
   el enlazado léxico en el código propio o en el archivo de inicio).

- Para usuarios esporádicos de Emacs: bastaría con copiar y pegar la
  función en el búfer "scratch", situar el cursor justo al final del
  último paréntesis y ejecutar C-x C-e (o sea, la tecla control pulsada
  con una mano y con la otra pulsar x y después e). Y hacer lo mismo con
  la variable declarada antes de la función. Como el enlazado léxico
  está activado en el búfer "scratch", ya se puede usar sin problemas la
  función para esa sesión abierta de Emacs. No requiere más, ni cargar
  ninguna biblioteca extra.

Bueno, y aquí va la función. Pero como una imagen (o varias en
movimiento) valen más que mil palabras, aquí también podéis ver un vídeo
de prueba:

https://cloud.disroot.org/s/FwEgosjFA5AYYWK

(en el vídeo pruebo la función sobre un documento que contiene
caractéres griegos, árabes, devanagari, chinos, hebreos y cirílicos).

;; variable
(defvar lista-caracteres-extendidos)

;; función
(defun busca-caracteres-extendidos-occur ()
    (interactive)
    (setq lista-caracteres-extendidos nil)
    (let ((buf (buffer-name)))
      (save-excursion
	(goto-char (point-min))
	(while
	    (re-search-forward "\\([^\u0000-\u007F]\\)" nil t)
	  (add-to-list 'lista-caracteres-extendidos (format "%s" (match-string 1))))
	(setq lista-caracteres-chula
	      (mapcar (lambda (caracter)
			(let*
			    ((nombre-caracter (get-char-code-property (string-to-char caracter) 'name))
			     ;; pasamos el código a hexadecimal
			     (codigo (format "#%x" (string-to-char caracter))))
			  (setq caracter (format  "%s\s\s%s\s\s%s" caracter nombre-caracter codigo))))
		      lista-caracteres-extendidos))
	(let ((temp-buf (format "*caracteres extendidos en %s*" buf)))
	  (when (get-buffer temp-buf)
	    (kill-buffer temp-buf))
	  (get-buffer-create temp-buf)
	  (set-buffer temp-buf)
	  (setq bidi-display-reordering nil)
	  (mapc (lambda (el)
		  (let ((char (when (string-match "^\\(.\\)\s" el)
				(match-string 1 el))))
		    (insert-button (format "%s" el)
				   'action (lambda (x)
					     (with-current-buffer buf
					       (occur char))))
		    (insert "\n\n")))
		lista-caracteres-chula)
	  (pop-to-buffer temp-buf)
	  (goto-char (point-min))
	  (view-mode)))))


-- 
--
------------------------------------------------------
Juan Manuel Macías 

Org-Mode contributor

https://juanmanuelmacias.com

https://lunotipia.juanmanuelmacias.com

https://gnutas.juanmanuelmacias.com

----------------------------------------------------
Normas para el correcto uso del correo electrónico:
		http://www.rediris.es/mail/estilo.html
----------------------------------------------------

ATOM RSS1 RSS2