Làm cách nào tôi có thể sao chép mã được tô sáng dưới dạng RTF hoặc HTML?


7

Tôi đang sử dụng Emacs để viết các mẫu mã mà sau này tôi muốn có thể dán vào tài liệu MS-Word, giữ nguyên cú pháp tô sáng. Tôi hiểu rằng để thực hiện việc này, tôi cần sao chép văn bản ở định dạng RTF hoặc HTML.

Hiện tại tôi chỉ giết từ Emacs vào http://www.tohtml.com và sau đó sao chép từ đó và dán vào Word. Tôi nhận ra rằng ai đó, ở đâu đó có lẽ đã viết một số Lisp để làm cho quá trình này ít nhất là một vài lần nhấn phím, nhưng tôi dường như không thể tìm thấy bất kỳ giải pháp hiện có hoặc bất cứ điều gì trong các tài liệu cho thấy điều này thậm chí có thể.

Vì vậy, tôi rất muốn biết nếu có một giải pháp đã sẵn sàng tôi có thể đưa vào cấu hình của mình hoặc nếu có ai có bất kỳ gợi ý nào về cách tôi có thể viết một cái gì đó để đạt được điều này.

Tôi khá mới với Emacs, yêu thích nó, nhưng e-Lisp của tôi hiện tại rất cơ bản.

Câu trả lời:


6

Gói https://github.com/Lindydancer/highlight2clipboard thực hiện chính xác những gì bạn yêu cầu. Nó sử dụng htmlizeđể tạo một phiên bản HTML của văn bản mà nó thêm dưới dạng văn bản dán thay thế. ( Lưu ý: Đây là một hoạt động không tầm thường đòi hỏi phải can thiệp vào bảng tạm. Đây là hệ điều hành cụ thể, hiện tại OS X và MS-Windows được hỗ trợ.)

Khi dán vào các ứng dụng như MS-Word, việc tô sáng cú pháp được giữ lại.


5

Các htmlizegói có thể làm điều này. Cài đặt nó với M-x package-install htmlizevà bạn có quyền truy cập vào các lệnhhtmlize-region

(BEG END vùng BEG END)

Chuyển đổi vùng thành HTML, bảo toàn màu sắc và trang trí.

htmlize-region-for-paste

(htmlize-area-for-paste BEG END)

Htmlize khu vực và chỉ trả lại HTML dưới dạng chuỗi. Điều này buộc kiểu 'inline-css' và chỉ trả về phần thân HTML, nhưng không có thẻ BODY. Điều này sẽ làm cho nó hữu ích để chèn văn bản vào bộ đệm HTML khác.


2
Nhiều khả năng, khi bạn dán vào MS-Word, bạn sẽ nhận được mã RAW HTML, khi sử dụng phương pháp này.
Lindydancer

2

Tôi có chức năng elisp tùy chỉnh này mà tôi sử dụng để chuyển đổi một vùng đã chọn hoặc toàn bộ bộ đệm sang HTML được cú pháp.

(defvar modi/htmlize-output-directory
  (let ((dir (concat temporary-file-directory
                     (getenv "USER") "/.htmlize/"))) ; must end with /
    (make-directory dir :parents)
    dir)
  "Output directory for files exported by `modi/htmlize-region-to-file'.")

(defvar modi/htmlize-css-file (concat user-emacs-directory
                                      "misc/css/leuven_theme.css")
  "CSS file to be embedded in the html file created using the
             `modi/htmlize-region-to-file' function.")

(defun modi/htmlize-region-to-file (option)
  "Export the selected region to an html file. If a region is not
selected, export the whole buffer.

The output file is saved to `modi/htmlize-output-directory' and its fontification
is done using `modi/htmlize-css-file'.

If OPTION is non-nil (for example, using `\\[universal-argument]' prefix), copy
the output file name to kill ring.
If OPTION is \\='(16) (using `\\[universal-argument] \\[universal-argument]' prefix),
do the above and also open the html file in the default browser."
  (interactive "P")
  (let ((org-html-htmlize-output-type 'css)
        (org-html-htmlize-font-prefix "org-")
        (fname (concat modi/htmlize-output-directory
                       (if (buffer-file-name)
                           (file-name-nondirectory (buffer-file-name))
                         "temp")
                       ".html"))
        start end html-string)
    (if (use-region-p)
        (progn
          (setq start (region-beginning))
          (setq end (region-end)))
      (progn
        (setq start (point-min))
        (setq end (point-max))))
    (setq html-string (org-html-htmlize-region-for-paste start end))
    (with-temp-buffer
      ;; Insert the `modi/htmlize-css-file' contents in the temp buffer
      (insert-file-contents modi/htmlize-css-file nil nil nil :replace)
      ;; Go to the beginning of the buffer and insert comments and
      ;; opening tags for `html', `head' and `style'. These are
      ;; inserted *above* the earlier inserted css code.
      (goto-char (point-min))
      (insert (concat "<!-- This file is generated using the "
                      "`modi/htmlize-region-to-file' function\n"
                      "from https://github.com/kaushalmodi/.emacs.d/"
                      "blob/master/setup-files/setup-org.el -->\n"))
      (insert "<html>\n<head>\n<style media=\"screen\" type=\"text/css\">\n")
      ;; Go to the end of the buffer (end of the css code) and
      ;; insert the closing tags for `style' and `head' and opening
      ;; tag for `body'.
      (goto-char (point-max))
      (insert "</style>\n</head>\n<body>\n")
      ;; Insert the HTML for fontified text in `html-string'.
      (insert html-string)
      ;; Close the `body' and `html' tags.
      (insert "</body>\n</html>\n")
      (write-file fname)
      (when option
        (kill-new fname)
        (when (= 16 (car option))
          (browse-url-of-file fname))))))

Dưới đây là một vài điểm về modi/htmlize-region-to-filechức năng:

  • Nếu khu vực được chọn, chỉ khu vực đó sẽ được xuất sang tệp HTML trong modi/htmlize-output-directorythư mục.
  • Nếu không có vùng nào được chọn, toàn bộ bộ đệm sẽ được xuất.
  • Nó yêu cầu ox-html( org-modetrình xuất HTML) vì nó sử dụng org-html-htmlize-region-for-pastechức năng sử dụng htmlizegói phía sau hậu trường và cũng cho phép tùy chỉnh cách liên kết CSS với mã HTML để tạo phông chữ.
  • Nó có thể phông chữ mã dựa trên tệp css được chỉ định bởi modi/htmlize-css-filebiến. Để sử dụng chức năng này ngay lập tức, bạn có thể lưu tệp css dựa trên chủ đề tùy chỉnh này ở đâu đó và đặt biến này thành đường dẫn tệp đó. Nếu bạn sử dụng tệp css đó, mã được xuất sẽ luôn có chủ đề Leuven bất kể chủ đề emacs của bạn (đó là mục đích duy nhất của tôi để viết chức năng này).
  • Tôi khuyên bạn nên cài đặt region-bindings-modegói. Với cài đặt đó, bạn chỉ cần chọn khu vực bạn muốn xuất và nhấn H... Voila! Mã của bạn sẽ được lưu vào một tệp HTML modi/htmlize-output-directory.

    (with-eval-after-load 'region-bindings-mode
        (define-key region-bindings-mode-map (kbd "H") #'modi/htmlize-region-to-file))
  • Nếu bạn làm như vậy C-u H, nó sẽ xuất mã và sao chép tên tệp đầu ra vào vòng khử.

  • Nếu bạn làm C-u C-u Hthay vào đó, nó sẽ làm như trên và cũng mở tệp HTML trong trình duyệt mặc định của bạn bằng cách sử dụng browse-url-of-filechức năng.

Dưới đây là những gì tôi nhận được trong trình duyệt web của mình khi tôi thực C-u C-u Hhiện một phần của đoạn mã trên:

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

LƯU Ý: Tôi cần lưu HTML vào một tệp. Việc lưu mã chú thích HTML chỉ vào bảng tạm sẽ không hiệu quả với tôi vì tôi không biết cách chuyển đổi mã html trong bảng tạm sang tệp html được kết xuất khi dán trong Outlook / Word.


0

ESH có thể làm điều này:

  • Sao chép kho ESH và thêm (add-to-list 'load-path "/path/to/the/repo")vào .emacs.
  • Sử dụng M-x load-library RET esh RETđể tải ESH
  • Mở tệp mã của bạn, chạy M-x esh-htmlfontify-display(điều này sẽ mở trình duyệt hiển thị trang web được tạo (cục bộ) bởi ESH).
  • Sao chép từ trình duyệt vào ứng dụng của bạn.
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.