Wie kann ich mit Syntax hervorgehobenen Code als RTF oder HTML kopieren?

7

Ich verwende Emacs, um Codebeispiele zu schreiben, die ich später in ein MS-Word-Dokument einfügen möchte, wobei die Syntaxhervorhebung beibehalten wird. Ich verstehe, dass ich dazu den Text entweder im RTF- oder im HTML-Format kopieren muss.

Momentan töte ich nur von Emacs in http://www.tohtml.com und kopiere dann von dort und füge es in Word ein. Es fällt mir auf, dass irgendwo jemand Lisp geschrieben hat, um diesen Vorgang um mindestens ein paar Tastenanschläge zu verkürzen, aber ich kann anscheinend keine vorhandene Lösung oder irgendetwas in den Dokumenten finden, das darauf hindeutet, dass dies überhaupt möglich ist.

Ich bin gespannt, ob es eine fertige Lösung gibt, die ich in meine Konfiguration aufnehmen kann, oder ob jemand Hinweise darauf hat, wie ich etwas schreiben könnte, um dies zu erreichen.

Ich bin ziemlich neu bei Emacs und liebe es, aber mein E-Lisp ist derzeit sehr einfach.

xlbloke
quelle

Antworten:

6

Das Paket https://github.com/Lindydancer/highlight2clipboard macht genau das, wonach Sie gefragt haben. Es wird verwendet htmlize, um eine HTML-Version des Texts zu erstellen, die als alternativer Einfügetext hinzugefügt wird. ( Hinweis: Dies ist ein nicht trivialer Vorgang, für den eine Schnittstelle zur Zwischenablage erforderlich ist. Dies ist betriebssystemspezifisch. Derzeit werden OS X und MS-Windows unterstützt.)

Beim Einfügen in Anwendungen wie MS-Word bleibt die Syntaxhervorhebung erhalten.

Lindydancer
quelle
5

Das htmlizePaket kann dies tun. Installieren Sie es mit M-x package-install htmlizeund Sie erhalten Zugriff auf die Befehlehtmlize-region

(htmlize-region BEG END)

Konvertieren Sie die Region in HTML, wobei Farben und Dekorationen erhalten bleiben.

und htmlize-region-for-paste

(htmlize-region-for-paste BEG END)

HTML die Region und geben Sie nur den HTML-Code als Zeichenfolge zurück. Dies erzwingt den 'Inline-CSS'-Stil und gibt nur den HTML-Body zurück, jedoch ohne das BODY-Tag. Dies sollte es nützlich machen, den Text in einen anderen HTML-Puffer einzufügen.

erikstokes
quelle
2
Wenn Sie in MS-Word einfügen, erhalten Sie höchstwahrscheinlich den RAW-HTML-Code, wenn Sie diese Methode verwenden.
Lindydancer
2

Ich habe diese benutzerdefinierte Elisp-Funktion, mit der ich einen ausgewählten Bereich oder den gesamten Puffer in syntaktisches HTML konvertiere.

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

Hier einige Punkte zur modi/htmlize-region-to-fileFunktion:

  • Wenn die Region ausgewählt ist, wird nur diese Region in eine HTML-Datei im modi/htmlize-output-directoryVerzeichnis exportiert .
  • Wenn keine Region ausgewählt ist, wird der gesamte Puffer exportiert.
  • Es erfordert ox-html( org-modeHTML-Exporter), da es eine org-html-htmlize-region-for-pasteFunktion verwendet, die das htmlizePaket hinter den Kulissen verwendet und das Anpassen der Zuordnung von CSS zum HTML-Code zur Schriftartanpassung ermöglicht.
  • Es ist in der Lage, Code basierend auf der durch modi/htmlize-css-fileVariable angegebenen CSS-Datei zu fontifizieren . Um diese Funktion sofort zu verwenden, können Sie diese benutzerdefinierte CSU- Datei auf Basis des Leuven-Themas irgendwo speichern und diese Variable auf diesen Dateipfad setzen. Wenn Sie diese CSS-Datei verwenden, hat der exportierte Code unabhängig von Ihrem Emacs-Thema immer das Leuven- Thema (was mein einziger Zweck beim Schreiben dieser Funktion war).
  • Ich würde empfehlen, das region-bindings-modePaket zu installieren . Wenn dies installiert ist, wählen Sie einfach die Region aus, die Sie exportieren möchten, und Hklicken auf ... Voila! Ihr Code wird in einer HTML-Datei in gespeichert modi/htmlize-output-directory.

    (with-eval-after-load 'region-bindings-mode
        (define-key region-bindings-mode-map (kbd "H") #'modi/htmlize-region-to-file))
    
  • In C-u Hdiesem Fall wird der Code exportiert und der Name der Ausgabedatei in den Kill-Ring kopiert.

  • Wenn Sie dies C-u C-u Hstattdessen tun , wird das oben Genannte ausgeführt und die HTML-Datei in Ihrem Standardbrowser mithilfe der browse-url-of-fileFunktion geöffnet .

Folgendes habe ich in meinem Webbrowser erhalten, als ich einen C-u C-u HTeil des obigen Codes ausgeführt habe:

Geben Sie hier die Bildbeschreibung ein

HINWEIS: Ich muss den HTML-Code in einer Datei speichern. Das Speichern des mit HTML-Anmerkungen versehenen Codes nur in der Zwischenablage funktioniert bei mir nicht, da ich nicht weiß, wie HTML-Code in der Zwischenablage beim Einfügen in Outlook / Word direkt in gerenderten HTML-Code konvertiert wird.

Kaushal Modi
quelle
0

ESH kann dies tun:

  • Klonen Sie das ESH-Repository und fügen Sie (add-to-list 'load-path "/path/to/the/repo")es Ihrem hinzu .emacs.
  • Verwenden Sie M-x load-library RET esh RETzu Last ESH
  • Öffnen Sie Ihre Codedatei und führen Sie sie aus M-x esh-htmlfontify-display(dies öffnet einen Browser, der eine von ESH (lokal) generierte Webseite anzeigt).
  • Kopieren Sie aus dem Browser in Ihre Anwendung.
Clément
quelle