Como posso copiar o código destacado da sintaxe como RTF ou HTML?

7

Estou usando o Emacs para escrever exemplos de código que mais tarde desejo colar em um documento do MS-Word, preservando o realce da sintaxe. Entendo que, para fazer isso, preciso copiar o texto no formato RTF ou HTML.

Atualmente, estou apenas matando do Emacs no http://www.tohtml.com e depois copiando de lá e colando no Word. Parece-me que alguém, em algum lugar, provavelmente escreveu algum Lisp para tornar esse processo pelo menos um par de pressionamentos de tecla, mas não consigo encontrar nenhuma solução existente ou algo nos documentos que sugira que isso seja possível.

Então, eu estou ansioso para saber se existe uma solução pronta que eu possa incluir na minha configuração ou se alguém tem alguma dica sobre como eu poderia escrever algo para conseguir isso.

Sou bastante novo no Emacs, adorando, mas meu e-Lisp é atualmente muito básico.

xlbloke
fonte

Respostas:

6

O pacote https://github.com/Lindydancer/highlight2clipboard faz exatamente o que você pediu. Ele é usado htmlizepara criar uma versão HTML do texto que ele adiciona como um texto de colagem alternativo. ( Nota: Esta é uma operação não trivial que requer interface com a área de transferência. É específica do sistema operacional, atualmente o OS X e o MS-Windows são suportados.)

Ao colar em aplicativos como o MS-Word, o realce da sintaxe é mantido.

Lindydancer
fonte
5

O htmlizepacote pode fazer isso. Instale-o M-x package-install htmlizee você terá acesso aos comandoshtmlize-region

(região de htmlize BEG END)

Converta a região em HTML, preservando cores e decorações.

e htmlize-region-for-paste

(htmlize-region-for-paste BEG END)

Htmlize a região e retorne apenas o HTML como uma string. Isso força o estilo 'inline-css' e retorna apenas o corpo HTML, mas sem a tag BODY. Isso deve ser útil para inserir o texto em outro buffer HTML.

erikstokes
fonte
2
Provavelmente, ao colar no MS-Word, você obterá o código HTML RAW ao usar esse método.
Lindydancer 02/08/2015
2

Eu tenho essa função elisp personalizada que eu uso para converter uma região selecionada ou todo o buffer em HTML com fonte de sintaxe.

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

Aqui estão alguns pontos sobre a modi/htmlize-region-to-filefunção:

  • Se a região for selecionada, somente essa região será exportada para um arquivo HTML no modi/htmlize-output-directorydiretório
  • Se nenhuma região for selecionada, todo o buffer será exportado.
  • Ele requer ox-html( org-modeexportador de HTML), pois usa a org-html-htmlize-region-for-pastefunção que usa o htmlizepacote nos bastidores e também permite personalizar como associar CSS ao código HTML para fonte.
  • É capaz de tipificar o código com base no arquivo css especificado pela modi/htmlize-css-filevariável. Para usar essa função imediatamente, você pode salvar esse arquivo css baseado em tema de Lovaina personalizado em algum lugar e definir essa variável para o caminho desse arquivo. Se você usar esse arquivo css, o código exportado sempre terá o tema Leuven, independentemente do seu tema emacs (que era meu único objetivo para escrever esta função).
  • Eu recomendaria instalar o region-bindings-modepacote. Com isso instalado, basta selecionar a região que deseja exportar e clicar H... Voila! Seu código será salvo em um arquivo HTML em modi/htmlize-output-directory.

    (with-eval-after-load 'region-bindings-mode
        (define-key region-bindings-mode-map (kbd "H") #'modi/htmlize-region-to-file))
    
  • Se você fizer C-u Hisso, ele exportará o código e copiará o nome do arquivo de saída para o kill-ring.

  • Se você fizer C-u C-u Hisso, ele fará o que foi descrito acima e também abrirá o arquivo HTML no navegador padrão usando a browse-url-of-filefunção

Abaixo está o que eu obtive no meu navegador quando fiz C-u C-u Hparte do código acima:

insira a descrição da imagem aqui

NOTA: Preciso salvar o HTML em um arquivo. Salvar o código anotado em HTML apenas na área de transferência não funcionará para mim, porque não sei como converter o código html na área de transferência diretamente em html renderizado ao colar no Outlook / Word.

Kaushal Modi
fonte
0

O ESH pode fazer isso:

  • Clone o repositório ESH e adicione (add-to-list 'load-path "/path/to/the/repo")ao seu .emacs.
  • Use M-x load-library RET esh RETpara carregar o ESH
  • Abra seu arquivo de código, execute M-x esh-htmlfontify-display(isso abre um navegador que exibe uma página da web gerada (localmente) pelo ESH).
  • Copie do navegador para o seu aplicativo.
Clemente
fonte