¿Cómo puedo copiar el código resaltado de sintaxis como RTF o HTML?

7

Estoy usando Emacs para escribir ejemplos de código que luego deseo poder pegar en un documento de MS-Word, preservando el resaltado de sintaxis. Entiendo que para hacer esto necesito copiar el texto en formato RTF o HTML.

Actualmente solo estoy matando de Emacs en http://www.tohtml.com y luego copiando desde allí y pegando en Word. Me sorprende que alguien, en algún lugar, haya escrito algo de Lisp para hacer que este proceso sea al menos un par de pulsaciones más cortas, pero parece que no puedo encontrar ninguna solución existente ni nada en los documentos que sugiera que esto sea posible.

Entonces, estoy ansioso por saber si hay una solución preparada que pueda incluir en mi configuración o si alguien tiene algún indicador sobre cómo podría escribir algo para lograr esto.

Soy bastante nuevo en Emacs, me encanta, pero mi e-Lisp es actualmente muy básica.

xlbloke
fuente

Respuestas:

6

El paquete https://github.com/Lindydancer/highlight2clipboard hace exactamente lo que solicitó. Se utiliza htmlizepara crear una versión HTML del texto que agrega como un texto alternativo para pegar. ( Nota: Esta es una operación no trivial que requiere una interfaz con el portapapeles. Esto es específico del sistema operativo, actualmente OS X y MS-Windows son compatibles).

Al pegar en aplicaciones como MS-Word, se conserva el resaltado de sintaxis.

Lindydancer
fuente
5

El htmlizepaquete puede hacer esto. Instálelo M-x package-install htmlizey obtendrá acceso a los comandoshtmlize-region

(htmlize-region BEG END)

Convierta la región a HTML, conservando colores y decoraciones.

y htmlize-region-for-paste

(htmlize-region-for-paste BEG END)

Htmlize la región y devuelve solo el HTML como una cadena. Esto fuerza el estilo 'inline-css' y solo devuelve el cuerpo HTML, pero sin la etiqueta BODY. Esto debería ser útil para insertar el texto en otro búfer HTML.

erikstokes
fuente
2
Lo más probable es que cuando pegue en MS-Word, obtendrá el código RAW HTML cuando utilice este método.
Lindydancer
2

Tengo esta función de elisp personalizada que utilizo para convertir una región seleccionada o todo el búfer a HTML con fuente de sintaxis.

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

Aquí hay algunos puntos sobre la modi/htmlize-region-to-filefunción:

  • Si se selecciona la región, solo esa región se exportará a un archivo HTML en el modi/htmlize-output-directorydirectorio.
  • Si no se selecciona ninguna región, se exportará todo el búfer.
  • Requiere ox-html( org-modeexportador de HTML) ya que usa la org-html-htmlize-region-for-pastefunción que usa el htmlizepaquete detrás de escena y también permite personalizar cómo asociar CSS con el código HTML para la fuente.
  • Es capaz de fuente de código basado en el archivo CSS especificado por modi/htmlize-css-filevariable. Para usar esta función de inmediato, puede guardar este archivo css personalizado basado en temas leuven en algún lugar y establecer esta variable en esa ruta de archivo. Si usa ese archivo CSS, el código exportado siempre tendrá el tema Lovaina, independientemente de su tema emacs (que era mi único propósito para escribir esta función).
  • Yo recomendaría instalar el region-bindings-modepaquete. Con eso instalado, simplemente seleccione la región que desea exportar y Hpresione ... ¡Voila! Su código se guardará en un archivo HTML en modi/htmlize-output-directory.

    (with-eval-after-load 'region-bindings-mode
        (define-key region-bindings-mode-map (kbd "H") #'modi/htmlize-region-to-file))
    
  • Si lo hace C-u H, exportará el código y copiará el nombre del archivo de salida al kill-ring.

  • Si lo hace C-u C-u H, hará lo anterior y también abrirá el archivo HTML en su navegador predeterminado utilizando la browse-url-of-filefunción.

A continuación se muestra lo que obtuve en mi navegador web cuando hice C-u C-u Hparte del código anterior:

ingrese la descripción de la imagen aquí

NOTA: Necesito guardar el HTML en un archivo. Guardar el código HTML anotado solo en el portapapeles no funcionará para mí porque no sé cómo convertir el código html en el portapapeles directamente en html renderizado cuando pego en Outlook / Word.

Kaushal Modi
fuente
0

ESH puede hacer esto:

  • Clone el repositorio de ESH y agréguelo (add-to-list 'load-path "/path/to/the/repo")a su .emacs.
  • Use M-x load-library RET esh RETpara cargar ESH
  • Abra su archivo de código, ejecute M-x esh-htmlfontify-display(esto abre un navegador que muestra una página web generada (localmente) por ESH).
  • Copie desde el navegador a su aplicación.
Clemente
fuente