ModoDerivado

En vez de escribir un nuevo modo desde cero, se podría derivar el modo nuevo de otro existente. Derivar los modos nuevos a partir del Fundamental (que basicamente no hace nada) es mejor que escribirlo desde cero. (A menos que se tenga una clara idea de lo que se está haciendo, por supuesto.)

Este es un ejemplo de cómo traducir una muestra de código muy simple de ModoGenérico en una muestra de código en un ModoDerivado. Esta sería una vía si se piensa que el ModoGenérico es demasiado limitado para las necesidades que se tienen.

Código original en ModoGenérico:

 (define-generic-mode `kk-mode
   ()
   ()
   '(("\\(--.*\\)" 1 'font-lock-comment-face))
   ()
   (list (lambda () (set (make-local-variable 'comment-start) "--")))
   "Modo mayor para editar ficheros KK.")

Nuevo código para el ModoDerivado:

 (defvar kk-mode-font-lock-keywords
   '(("\\(--.*\\)" 1 'font-lock-comment-face)))
  
 (define-derived-mode kk-mode fundamental-mode "KK"
   "Modo mayor para editar ficheros KK."
   (set (make-local-variable 'font-lock-keywords)
        '(kk-mode-font-lock-keywords))
   (set (make-local-variable 'comment-start) "--"))

Si se busca un ejemplo de uso de un ModoDerivado en software real y al lector le gusta cocinar (no sólo código, sino también comida), véase el RicetteMode.

Otro ejemplo de un sencillo modo definido mediante derivación es este simple modo procmail [1]. Se recuerda que, además, existe otro ProcmailMode disponible en las TinyTools.

  (define-derived-mode procmail-mode fundamental-mode "Procmail"
    "Major mode for editing procmail recipes."
    (setq comment-start "#")
    (setq comment-start-skip "#\\W*")
    ;;register keywords
    (setq procmail-font-lock-keywords
          (list '("#.*"
                  . font-lock-comment-face)
                '("^[\t ]*:.*"
                  . font-lock-type-face)
                '("[A-Za-z_]+=.*"
                  . font-lock-keyword-face)
                '("^[\t ]*\\*.*"
                  . font-lock-doc-string-face)
                '("\$[A-Za-z0-9_]+"
                  . font-lock-function-name-face)))
    (font-lock-mode))
  (add-to-list 'auto-mode-alist '(".procmailrc\\'" . procmail-mode))

Otro ejemplo es el SimpleWikiMode.

Si se deriva el modo nuevo de otro que no sea el ModoFundamental, se querría añadirle el conjunto de palabras clave existentes en el modo.

    (defface c3-face-1 
      '((t (:foreground "#FF0000")))
      "red")
     ;;; c3-mode 
    (define-derived-mode c3-mode sgml-mode 
     "c3-mode" 
     "Variante del modo SGML.  Los números aparecen en rojo."
     (font-lock-add-keywords nil '(("[0-9]" . 'c3-face-1)))
    )

CategoryCode