Estendendo o modo organizacional com mais marcações

26

Quero adicionar uma marcação e formatação para essa marcação, ou seja, <kbd>...</kbd>com uma caixa em torno dessa marcação. Eu também quero que a marca seja compatível (setq org-hide-emphasis-markers t). Ou seja, quando a variável é definida como t, as tags <kbd>e </kbd>devem desaparecer, deixando o texto entre elas com a formatação especificada acima.

A resposta postada nesta pergunta: Como destacar texto permanentemente no modo organizacional não resolve esse problema, pois é aplicável apenas às marcações existentes, não estendendo a Org com novas marcações.

Tu Do
fonte
11
@kaushalmodi Perguntei como adicionar uma marcação que, quando a Org a vê, ela adiciona propriedades de texto de maneira adequada e de maneira que a marcação possa ser ocultada org-hide-emphasis-markers, e não como inserir rapidamente uma kbdtag.
Tu Do
11
Concordo. Coloquei isso como um comentário, pois estava relacionado às tags kbd.
Kaushal Modi
2
possível duplicata Como realçar o texto permanentemente em org-mode
erikstokes
11
@erikstokes que a solução é aplicável apenas a marcações existentes, não a novas.
Tu Do

Respostas:

25

Eu fiz algo semelhante . Está em francês, mas o código deve falar por si. Uso para o marcador (uso um layout bepo ) e, quando uso, o texto marcado como um estilo de botão pressionado.

Eu não sou fluente em língua estrangeira, então pode haver espaço para melhorias.

O que fiz foi que, ao usar para marcador, o texto marcado possui um estilo de botão pressionado e, quando exportado, é traduzido para<kbd>

Primeiro, tive que definir um novo rosto:

(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)

Em seguida, personalize 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 a exportação, você pode precisar de carregar ox.elcom (require 'ox).

Em seguida, cada vez que boldou codeaparece em uma função (em ox-org.el), eu criei uma função semelhante (ou modificados os já 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))))))

Em seguida, defini um my-htmlback - end para a exportação:

(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))

Então, quando eu uso C-c C-e h r, é exportado corretamente:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Conforme sugerido pelo OP nos comentários, pode ser necessário usar org-mode-restart(ou org-reload) ou matar / recarregar seu buffer.


Edit: Isso funciona para o modo organizacional com versões anteriores à 8.3 (que é até 8.2.10)

Nas versões ≥8.3.1, tenho que modificar

  • org-elemento-todos-objetos
  • possivelmente restrições de objeto-elemento-org
  • elemento-org - conjunto-regexps
  • elemento-org - objeto-lex

e, claro, ainda adicionar as funções

  • elemento-org-meu-objeto-analisador de teclas
  • org-elemento-meu-objeto-teclado-interpretador

mas

  • org-elemento-objeto-sucessor-alista
  • org-elemento-texto-marcação-sucessor

agora são excluídos.

Obrigado a Charles C. Berry por sua ajuda.

fredtantini
fonte
O %marcador é um embutido? Não consigo fazê-lo funcionar com a organização mais recente. Quanto aos outros marcadores, funciona bem se eu mudar o rosto deles. Mas existe uma maneira de realmente adicionar nossos próprios marcadores? No entanto, sua resposta é útil.
Tu Do
%atualmente não é usado como marcador. Você pode usá-lo da mesma maneira que eu usei . Não entendo sua segunda pergunta, é um novo marcador.
Fredtantini
Ok, consegui fazer o %marcador funcionar, mas tive que correr org-reload. Você deve atualizar a resposta com esse comando.
Tu Do
Na verdade, não precisamos org-reloadmas org-mode-restart. O problema é que precisamos matar o buffer da organização anterior e criar um novo para que a alteração entre em vigor.
Tu Do
Obrigado pelas dicas. Eu atualizei minha resposta. Ainda bem que pude ajudar
fredtantini
0

Não acho possível adicionar marcadores para novas opções de marcação no modo organizacional.

De acordo com este post de 2012 , parece que os "marcadores de ênfase do org-mode serão codificados". Fazendo uma busca rápida para org-emph-reem org.elnão revela qualquer código que seria realmente gerar org-emph-rea partir org-emphasis-alist. Com base nisso, parece que org-emph-renão procurará nada que você adicionar org-emphasis-alist.

Isso é consistente com minha experiência (posso redefinir os marcadores de ênfase existentes, mas não consegui que o modo organizacional reconhecesse |ou &ou H).

Eu não sou um especialista aqui e gostaria de descobrir que estou errado :)

MikeTheTall
fonte
11
Simplesmente editar org-emphasis-alistnão adicionará um novo marcador. Você tem que , adicionalmente, trabalhar com org-font-lock-extra-keywordstambém. Esta resposta fornece uma solução funcional.
Dean Seo
Ei, isso funciona! Pelo menos, isso alcança o mesmo efeito! :) Quando alguém usa o org-font-lock-extra-keywordsentão não precisa mudar org-emphasis-alistnada, evidentemente (adicionei o org-font-lock...código, mas não mudei o meu org-emphasis-aliste agora as coisas estão sendo formatadas)
MikeTheTall