functions – ¿Cómo puedo crear una función para construir una tabla de contenido en un marcador?

Pregunta:

Estoy planeando mover StackMode a un programa alfabetizado una vez que madure, pero hasta entonces estoy usando los marcadores de sección ^L convencionales.

Mis archivos se ven así:

;;; Code:

^L
;;; Section 1 Title

(defun code () things)

^L
;;; Section 2 Title

(defun bleh () bergh)

Me gustaría poder agregar un gancho que cree una tabla de contenido en algún marcador, digamos ^;;; Contents:$ :

;;; Contents:

;;;  1. Section 1 Title
;;;  2. Section 2 Title

;;; Code:

^L
;;; Section 1 Title

(defun code () things)

^L
;;; Section 2 Title

(defun bleh () bergh)

Para mayor diversión, las subsecciones podrían ser caracteres de salto de línea repetidos:

^L^L
;;; Subsection

Respuesta:

Esta función encontrará todos los encabezados de sección y los recopilará en una lista, luego imprimirá la lista en orden inverso:

(defun my-table-of-contents ()
  (interactive)
  (goto-char (point-min))
  (let ((results nil))
    (while (re-search-forward "^^L\n;;; \\(.+\\)" nil t)
      (setq results (cons (match-string 1) results)))

    ;; print table of contents
    (goto-char (point-min))
    (insert ";;; Contents:\n\n")
    (let ((n 1))
      (dolist (heading (reverse results))
        (insert (format ";;; %d. %s\n" n heading))
        (setq n (1+ n))))))

La ^L en la cadena de expresión regular debe ingresarse como un carácter de control real ( Cq Cl ).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım