Ampliar el modo org con más marcas


26

Quiero agregar un marcado y formato para dicho marcado, es decir, <kbd>...</kbd>con un cuadro que rodea dicho marcado. También quiero que la marca sea compatible con (setq org-hide-emphasis-markers t). Es decir, cuando la variable se establece en t, las etiquetas <kbd>y </kbd>deberían desaparecer, dejando el texto entre ellas con el formato especificado anteriormente.

La respuesta publicada en esta pregunta: cómo resaltar el texto permanentemente en modo org no resuelve este problema, ya que solo es aplicable para las marcas existentes, no se extiende Org con nuevas marcas.



1
@kaushalmodi Pregunté cómo agregar una marca que, cuando Org la ve, agrega las propiedades de texto en consecuencia y de tal manera que se pueda ocultar la marca org-hide-emphasis-markers, no cómo insertar rápidamente una kbdetiqueta.
Tu Do

1
Estoy de acuerdo. Puse esto como un comentario ya que estaba relacionado con las etiquetas kbd.
Kaushal Modi


1
@erikstokes esa solución solo es aplicable para las marcas existentes, no para las nuevas.
Tu Do

Respuestas:


25

He hecho algo parecido . Está en francés, pero el código debería hablar por sí mismo. Lo uso para el marcador (uso un diseño bepo ), y cuando lo hago, el texto marcado como un estilo de botón presionado.

No hablo con fluidez, por lo que puede haber margen de mejora.

Lo que he hecho es que, cuando se usa para marcador, el texto marcado tiene un estilo de botón presionado, y cuando se exporta se traduce a<kbd>

Primero, tuve que definir una nueva cara:

(defface my-face-org-keystroke
  '((t (:inherit shadow 
        :box (:line-width -2 ;neg. in order to keep the same size of lines
              :color "grey75"
              :style pressed-button)))) "Face for keystrokes"
        :group 'org-faces)

Luego personaliza org-emphasis-alist:

(("*" bold)
 ("/" italic)
 ("_" underline)
 ("=" org-code verbatim)
 ("~" org-verbatim verbatim)
 ("+"
  (:strike-through t))
 ("‰" my-face-org-keystroke verbatim));This line is what you want to add

Para la exportación, es posible que deba cargar ox.elcon (require 'ox).

Luego, cada vez boldo codeaparece en una función (en ox-org.el), he creado una función similar (o modifiqué las existentes):

;creation
(defun org-html-keystroke (keystroke contents info)
  "Transcode KEYSTROKE from Org to HTML.
CONTENTS is nil.  INFO is a plist holding contextual
information."
  (format (or (cdr (assq 'my-object-keystroke org-html-text-markup-alist)) "%s")
          (org-html-encode-plain-text (org-element-property :value keystroke))))


;creation
(defun org-element-my-object-keystroke-parser ()
  "Parse code object at point.

Return a list whose CAR is `my-object-keystroke' and CDR is a plist with
`:value', `:begin', `:end' and `:post-blank' keywords.

Assume point is at the first tilde marker."
  (interactive)
  (save-excursion
    (unless (bolp) (backward-char 1))
    (looking-at org-emph-re)
    (let ((begin (match-beginning 2))
          (value (org-match-string-no-properties 4))
          (post-blank (progn (goto-char (match-end 2))
                             (skip-chars-forward " \t")))
          (end (point)))
      (list 'my-object-keystroke
            (list :value value
                  :begin begin
                  :end end
                  :post-blank post-blank)))))

;creation
(defun org-element-my-object-keystroke-interpreter (keystroke contents)
  "Interpret KEYSTROKE object as Org syntax.
CONTENTS is nil."
  (format "‰%s‰" (org-element-property :value keystroke)))


;modification
(defconst org-element-object-successor-alist
  '((subscript . sub/superscript) (superscript . sub/superscript)
    (bold . text-markup) (code . text-markup) (italic . text-markup)
    (strike-through . text-markup) (underline . text-markup)
    (verbatim . text-markup) (entity . latex-or-entity)
    (latex-fragment . latex-or-entity) (my-object-keystroke . text-markup))
  "Alist of translations between object type and successor name.
Sharing the same successor comes handy when, for example, the
regexp matching one object can also match the other object.")

;modification
(defconst org-element-all-objects
  '(bold code entity export-snippet footnote-reference inline-babel-call
         inline-src-block italic line-break latex-fragment link macro
         radio-target statistics-cookie strike-through subscript superscript
         table-cell target timestamp underline verbatim my-object-keystroke)
  "Complete list of object types.")


;modification
(defun org-element-text-markup-successor ()
  "Search for the next text-markup object.

Return value is a cons cell whose CAR is a symbol among `bold',
`italic', `underline', `strike-through', `code' and `verbatim'
and CDR is beginning position."
  (save-excursion
    (unless (bolp) (backward-char))
    (when (re-search-forward org-emph-re nil t)
      (let ((marker (match-string 3)))
        (cons (cond
               ((equal marker "*") 'bold)
               ((equal marker "/") 'italic)
               ((equal marker "_") 'underline)
               ((equal marker "+") 'strike-through)
               ((equal marker "~") 'code)
               ((equal marker "=") 'verbatim)
               ((equal marker "‰") 'my-object-keystroke) 
               (t (error "Unknown marker at %d" (match-beginning 3))))
              (match-beginning 2))))))

A continuación, he definido un my-htmlback-end para la exportación:

(org-export-define-derived-backend 'my-html 'html
  :translate-alist '((my-object-keystroke . org-html-keystroke))
  :menu-entry ' (?h 1
                    ((?r "my-html"  org-html-export-to-my-html))))

(defun org-html-export-to-my-html
  (&optional async subtreep visible-only body-only ext-plist)
  "Export current buffer to a HTML file.

Return output file's name."
  (interactive)
  (let* ((extension (concat "." org-html-extension))
         (file (org-export-output-file-name extension subtreep))
         (org-export-coding-system org-html-coding-system))
    (org-export-to-file 'my-html file
      async subtreep visible-only body-only ext-plist)))


(defun org-html-publish-to-my-html (plist filename pub-dir)
  "Publish an org file to my-html.
Return output file name."
  (org-publish-org-to 'my-html filename
                      (concat "." (or (plist-get plist :html-extension)
                                      org-html-extension "html"))
                      plist pub-dir))

(defun org-html-convert-region-to-my-html ()
  "Assume the current region has org-mode syntax, and convert it to HTML.
This can be used in any buffer.  For example, you can write an
itemized list in org-mode syntax in an HTML buffer and use this
command to convert it."
  (interactive)
  (org-export-replace-region-by 'my-html))

Entonces, cuando lo uso, C-c C-e h rse exporta correctamente:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Según lo sugerido por OP en los comentarios, es posible que deba usar org-mode-restart(o org-reload) o matar / recargar su búfer.


Editar: Esto funciona para el modo org con versiones anteriores a la 8.3 (es decir, hasta la 8.2.10)

Con versiones ≥8.3.1, tengo que modificar

  • elemento-org-todos-objetos
  • posiblemente org-element-object-restrictions
  • org-element - set-regexps
  • elemento-org - objeto-lex

y por supuesto aún agrego las funciones

  • org-element-my-object-keystroke-parser
  • org-element-my-object-keystroke-interpreter

pero

  • org-element-object-successor-alist
  • org-element-text-markup-successor

ahora están eliminados

Gracias a Charles C. Berry por su ayuda.


¿El %marcador es uno incorporado? No puedo hacer que funcione con la última Org. En cuanto a otros marcadores, funciona bien si cambio sus caras. Pero, ¿hay alguna manera de agregar realmente nuestros propios marcadores? Sin embargo, su respuesta es útil.
Tu Do

%Actualmente no se utiliza como marcador. Puedes usarlo de la misma manera que yo . Sin embargo, no entiendo su segunda pregunta, es un nuevo marcador.
fredtantini

Ok, pude hacer que el %marcador funcionara, pero tuve que correr org-reload. Debería actualizar la respuesta con ese comando.
Tu Do

En realidad, no necesitamos org-reloadpero org-mode-restart. La cuestión es que debemos eliminar el búfer Org anterior y crear uno nuevo para que el cambio surta efecto.
Tu Do

Gracias por los consejos. He actualizado mi respuesta. Me alegro de poder ayudar
fredtantini

0

No creo que sea posible agregar marcadores para las nuevas opciones de marcado del modo org.

Según esta publicación de 2012 , parece que los "marcadores de énfasis de org-mode estarán codificados". Haciendo una búsqueda rápida para org-emph-reen org.elno revela ningún código que realmente generan org-emph-rea partir org-emphasis-alist. Según eso, parece org-emph-reque no buscará nada a lo que agregue org-emphasis-alist.

Esto es coherente con mi experiencia (que puede redefinir los marcadores existentes énfasis, pero no pudo conseguir org-mode para reconocer |o &o H).

Sin embargo, no soy un experto aquí, y me encantaría saber que estoy equivocado :)


1
Simplemente editar org-emphasis-alistno agregará un nuevo marcador. Tienes que trabajar adicionalmenteorg-font-lock-extra-keywords también. Esta respuesta da una solución de trabajo.
Dean Seo

Oye, eso funciona! ¡Al menos, eso logra el mismo efecto! :) Cuando uno usa el org-font-lock-extra-keywordsentonces no necesita cambiar org-emphasis-alistnada, evidentemente (agregué el org-font-lock...código pero no org-emphasis-alist
cambié
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.