더 많은 마크 업으로 조직 모드 확장


26

해당 마크 업에 대한 마크 업 및 서식을 추가하고 싶습니다. 즉 <kbd>...</kbd>, 해당 마크 업을 둘러싸는 상자가 있습니다. 또한 마크가와 호환되기를 원합니다 (setq org-hide-emphasis-markers t). 즉, 변수가로 설정 t되면 <kbd></kbd>태그가 사라지고 위에 지정된 형식으로 텍스트 사이에 텍스트가 남습니다.

이 질문에 게시 된 답변 : 조직 모드에서 텍스트를 영구적으로 강조 표시하는 방법 은 기존 마크 업에만 적용 할 수 있고 새 마크 업으로 조직을 확장 하지 않기 때문에이 문제를 해결 하지 못합니다 .



1
@kaushalmodi 나는 조직이 그것을 볼 때 태그 org-hide-emphasis-markers를 빠르게 삽입하는 방법이 아니라 마크 업을 숨길 수있는 방식으로 텍스트 속성을 추가하도록 마크 업을 추가하는 방법을 물었다 kbd.
Tu Do

1
동의한다. kbd 태그와 관련이 있기 때문에 이것을 주석으로 넣었습니다.
Kaushal Modi


1
@erikstokes 솔루션은 새로운 마크 업이 아닌 기존 마크 업에만 적용 할 수 있습니다.
Tu Do

답변:


25

나는 비슷한 일을했습니다 . 프랑스어로되어 있지만 코드 자체를 말해야합니다. 내가 사용하는 마커 (내가 사용에 대한 bepo의 레이아웃을), 그리고 내가 할 때, 눌러 진 버튼 스타일로 표시된 텍스트입니다.

나는 lisp에 유창하지 않기 때문에 개선의 여지가있을 수 있습니다.

내가 한 것은 마커에 사용할 때 표시된 텍스트에 버튼 스타일이 있으며 내 보내면 텍스트가<kbd>

먼저 새 얼굴을 정의해야했습니다.

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

그런 다음 사용자 정의하십시오 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

수출의 경우,로드해야 할 수 있습니다 ox.el(require 'ox).

그런 다음 매번 bold또는 code함수 ()에 나타날 ox-org.el때 비슷한 함수를 만들거나 기존 함수를 수정했습니다.

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

다음으로 my-html내보내기에 대한 백엔드를 정의했습니다 .

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

따라서 사용 C-c C-e h r하면 올바르게 내보내집니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

의견에서 OP가 제안한 것처럼 버퍼 를 사용 org-mode-restart(또는 org-reload)하거나 킬 / 다시로드 해야 할 수도 있습니다 .


편집 : 8.3 이전 버전 (8.10.10까지)의 org-mode에서 작동합니다.

≥8.3.1 버전에서는 수정해야합니다

  • org-element-all-objects
  • 아마도 org-element-object-restrictions
  • org-element--set-regexps
  • org-element--object-lex

물론 여전히 기능을 추가하십시오

  • org-element-my-object-keystroke 파서
  • org-element-my-object-keystroke-interpreter

그러나

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

이제 삭제되었습니다.

도움을 주신 Charles C. Berry 에게 감사합니다 .


되어 %마커가 내장 된 하나? 최신 조직에서는 작동하지 않습니다. 다른 마커는 얼굴을 바꾸면 잘 작동합니다. 그러나 우리 자신의 마커를 실제로 추가하는 방법이 있습니까? 그럼에도 불구하고 당신의 대답은 유용합니다.
Tu Do

%현재 마커로 사용되지 않습니다. 내가 사용한 것과 같은 방법으로 사용할 수 있습니다 . ,하지만 난 당신의 두 번째 질문을 이해하지 못하는 것입니다 새로운 마커.
fredtantini

좋아, 나는 %마커를 작동 시킬 수 있었지만 실행해야했다 org-reload. 해당 명령으로 답변을 업데이트해야합니다.
Tu Do

사실, 우리는 필요하지 않습니다 org-reloadorg-mode-restart. 문제는 이전 조직 버퍼를 종료하고 변경 사항을 적용하기 위해 새 조직 버퍼를 만들어야한다는 것입니다.
Tu Do

팁 주셔서 감사합니다. 내 답변을 업데이트했습니다. 다행 내가 도울 수
fredtantini

0

새로운 조직 모드 마크 업 옵션에 마커를 추가 할 수 없다고 생각합니다.

이 2012 게시물에 따르면 org-mode의 "강조 표시가 하드 코딩됩니다"와 같습니다. 에 대한 빠른 검색 수행 org-emph-reorg.el실제로 발생하는 어떤 코드를 공개하지 않습니다 org-emph-re에서를 org-emphasis-alist. 이를 기반으로 org-emph-re추가 한 항목을 검색하지 않는 것 같습니다 org-emphasis-alist.

이것은 나의 경험 (I은 기존 강조 마커를 다시 정의 할 수 있지만, 조직 모드 인식 가져올 수 없습니다 일치 |하거나 &또는 H).

나는 여기에 전문가가 아니며 내가 틀렸다는 것을 알고 싶습니다. :)


1
단순히 편집 org-emphasis-alist해도 새로운 마커가 추가되지 않습니다. 추가로 작업 해야합니다 org-font-lock-extra-keywords. 이 답변 은 효과적인 해결책을 제시합니다.
딘 서

이봐, 작동한다! 적어도 같은 효과를 얻습니다! :) 하나를 사용하면 org-font-lock-extra-keywords다음 코드 org-emphasis-alist를 전혀 변경할 필요가 없습니다 . 분명히 ( org-font-lock...코드를 추가 했지만 변경하지 않았 org-emphasis-alist으며 이제는 형식이 지정됩니다)
MikeTheTall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.