Mở rộng chế độ org với nhiều đánh dấu hơn


26

Tôi muốn thêm một đánh dấu và định dạng cho đánh dấu như vậy, tức là <kbd>...</kbd>với một hộp bao quanh đánh dấu như vậy. Tôi cũng muốn đánh dấu là tương thích với (setq org-hide-emphasis-markers t). Đó là, khi biến được đặt thành t, các thẻ <kbd></kbd>sẽ biến mất, để lại văn bản giữa nó với định dạng được chỉ định ở trên.

Câu trả lời được đăng trong câu hỏi này: Cách làm nổi bật văn bản vĩnh viễn trong chế độ org không giải quyết được vấn đề này, vì nó chỉ áp dụng cho các đánh dấu hiện có, không mở rộng Org với các đánh dấu mới.



1
@kaushalmodi Tôi đã hỏi làm thế nào để thêm một đánh dấu rằng khi Org nhìn thấy nó, nó sẽ thêm các thuộc tính văn bản phù hợp và theo cách mà đánh dấu có thể được ẩn đi org-hide-emphasis-markers, chứ không phải cách nhanh chóng chèn kbdthẻ.
Từ Đô

1
Tôi đồng ý. Tôi đặt điều này như một nhận xét vì nó có liên quan đến các thẻ kbd.
Kaushal Modi


1
@erikstokes giải pháp đó chỉ áp dụng cho các đánh dấu hiện có, không phải là giải pháp mới.
Từ Đô

Câu trả lời:


25

Tôi đã làm một cái gì đó tương tự . Đó là tiếng Pháp, nhưng mã nên nói cho chính nó. Tôi sử dụng cho điểm đánh dấu (tôi sử dụng bố cục bepo ) và khi tôi thực hiện, văn bản được đánh dấu là kiểu nhấn nút.

Tôi không thông thạo lisp, vì vậy có thể có chỗ để cải thiện.

Những gì tôi đã làm là, khi sử dụng để đánh dấu, văn bản được đánh dấu có kiểu nhấn nút và khi xuất ra, nó được dịch thành<kbd>

Đầu tiên, tôi phải xác định một khuôn mặt mới:

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

Sau đó tùy chỉnh 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

Để xuất, bạn có thể cần tải ox.elvới (require 'ox).

Sau đó, mỗi lần boldhoặc codexuất hiện trong một hàm (in ox-org.el), tôi đã tạo một hàm tương tự (hoặc sửa đổi các hàm hiện có):

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

Tiếp theo, tôi đã xác định một my-htmlphụ trợ cho xuất khẩu:

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

Vì vậy, khi tôi sử dụng, C-c C-e h rnó được xuất chính xác:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Theo đề xuất của OP trong các bình luận, bạn có thể cần phải sử dụng org-mode-restart(hoặc org-reload) hoặc giết / tải lại bộ đệm của mình.


Chỉnh sửa: Điều này hoạt động cho chế độ org với các phiên bản trước 8.3 (tức là đến 8.2.10)

Với phiên bản ≥8.3.1, tôi phải sửa đổi

  • org-Element-all-object
  • có thể hạn chế org-yếu tố-đối tượng
  • phần tử org - set-regexps
  • phần tử org - object-lex

và tất nhiên vẫn thêm các chức năng

  • org-Element-my-object-keystroke-Parser
  • org-Element-my-object-keystroke-phiên dịch

nhưng

  • org-Element-object-kế-alist
  • org-yếu tố-văn bản-đánh dấu-kế

hiện đang bị xóa.

Cảm ơn Charles C. Berry đã giúp đỡ.


%điểm đánh dấu tích hợp? Tôi không thể làm cho nó hoạt động với Org mới nhất. Đối với các điểm đánh dấu khác, nó hoạt động tốt nếu tôi thay đổi khuôn mặt của họ. Nhưng có cách nào để thực sự thêm các dấu hiệu riêng của chúng tôi? Tuy nhiên, câu trả lời của bạn là hữu ích.
Từ Đô

%hiện không được sử dụng làm điểm đánh dấu. Bạn có thể sử dụng nó giống như cách tôi đã sử dụng . Tôi không hiểu câu hỏi thứ hai của bạn, một điểm đánh dấu mới.
fredtantini

Ok, tôi đã có thể làm cho %điểm đánh dấu hoạt động, nhưng tôi phải chạy org-reload. Bạn nên cập nhật câu trả lời với lệnh đó.
Từ Đô

Thật ra, chúng tôi không cần org-reloadnhưng org-mode-restart. Vấn đề là, chúng ta phải hủy bộ đệm Org trước đó và tạo một bộ đệm mới để thay đổi có hiệu lực.
Từ Đô

Cảm ơn vì những lời khuyên. Tôi đã cập nhật câu trả lời của tôi. Vui mừng tôi có thể giúp
fredtantini

0

Tôi không nghĩ có thể thêm các điểm đánh dấu cho các tùy chọn đánh dấu chế độ org mới.

Theo bài đăng năm 2012 này, có vẻ như "các điểm nhấn của chế độ org sẽ được mã hóa cứng". Làm một tìm kiếm nhanh cho org-emph-retrong org.elkhông tiết lộ bất kỳ mã mà thực sự sẽ tạo ra org-emph-retừ org-emphasis-alist. Dựa vào đó, có vẻ như org-emph-resẽ không tìm kiếm bất cứ thứ gì bạn thêm vào org-emphasis-alist.

Điều này phù hợp với trải nghiệm của tôi (tôi có thể xác định lại các điểm nhấn hiện có, nhưng không thể nhận chế độ org để nhận biết |hoặc &hoặc H).

Tuy nhiên, tôi không phải là một chuyên gia và rất muốn biết rằng tôi đã sai :)


1
Chỉ cần chỉnh sửa org-emphasis-alistsẽ không thêm một điểm đánh dấu mới. Bạn cần phải bổ sung làm việc với org-font-lock-extra-keywordsquá. Câu trả lời này đưa ra một giải pháp làm việc.
Trưởng khoa

Này, nó hoạt động! Ít nhất, điều đó đạt được hiệu quả tương tự! :) Khi một người sử dụng org-font-lock-extra-keywordsthì người ta không cần phải thay đổi org-emphasis-alistgì cả, rõ ràng (tôi đã thêm org-font-lock...mã nhưng không thay đổi org-emphasis-alistvà bây giờ mọi thứ đang được định dạng)
MikeTheTall
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.