Copiar região do emacs sem novas linhas

7

Gostaria de poder selecionar facilmente uma região de texto do Emacs e colá-la em outro aplicativo ou navegador - com todas as novas linhas de parágrafos de preenchimento adicionais removidas para que a exibição de parágrafos no outro aplicativo possa funcionar corretamente.

A unfill-regionfunção no unfillpacote parece adequada para isso, mas é necessário mais trabalho para automatizar isso corretamente. Antes de fazer isso, isso já existe?

jmay
fonte

Respostas:

6

Eu uso o seguinte para isso:

(defun my-copy-simple (beg end)
  "Save the current region to the kill ring after stripping extra whitespace and new lines"
  (interactive "r")
  (copy-region-as-kill beg end)
  (with-temp-buffer 
    (yank)
    (goto-char 0)
    (while (looking-at "[ \t\n]")
      (delete-char 1))
    (compact-uncompact-block)
    (mark-whole-buffer)
    (kill-region (point-min) (point-max))))

Isso depende da seguinte função, que venho usando há algum tempo como substituto do padrão M-q fill-paragraph. Não notei de onde veio, acho que era do Xah Lee?

(defun compact-uncompact-block ()
  "Remove or add line ending chars on current paragraph.
This command is similar to a toggle of `fill-paragraph'.
When there is a text selection, act on the region."
  (interactive)

  ;; This command symbol has a property “'stateIsCompact-p”.
  (let (currentStateIsCompact (bigFillColumnVal 4333999) (deactivate-mark nil))

    (save-excursion
      ;; Determine whether the text is currently compact.
      (setq currentStateIsCompact
            (if (eq last-command this-command)
                (get this-command 'stateIsCompact-p)
              (if (> (- (line-end-position) (line-beginning-position)) fill-column) t nil) ) )

      (if (region-active-p)
          (if currentStateIsCompact
              (fill-region (region-beginning) (region-end))
            (let ((fill-column bigFillColumnVal))
              (fill-region (region-beginning) (region-end))) )
        (if currentStateIsCompact
            (fill-paragraph nil)
          (let ((fill-column bigFillColumnVal))
            (fill-paragraph nil)) ) )

      (put this-command 'stateIsCompact-p (if currentStateIsCompact nil t)) ) ) )
Tyler
fonte
2
Eu acho que partes podem ser melhoradas. consulte gist.github.com/xahlee/d364cbbff9b3abd12d29 realmente não precisa de um bloco compacto e não compacto, pois alterna.
Xah Lee 11/11
Obrigado por isso, Tyler e @XahLee. Parece exatamente o que eu preciso.
jmay
11
@ xahless, não precisa de um bloco compacto e compacto, mas se você já o possui, pode usá-lo. Quase nunca me lembro de usar minha cópia simples, mas o filhote é indispensável agora!
Tyler
3

Se você deseja remover apenas as novas linhas, use replace-regexp-in-stringo resultado de buffer-substringpara removê-las.

Se você deseja remover todo o espaço em branco extra (geralmente "insignificante"), tente a função ni-buffer-substring-collapsed-visibleda biblioteca narrow-indirect.el.

Ele retorna o conteúdo do buffer entre duas posições, mas com o espaço em branco recolhido (espaço em branco extra removido, incluindo novas linhas).

E se você também usa a biblioteca `subr + .el ' , o texto invisível também é removido.

Desenhou
fonte
0

Existe um pacote chamado "unfill.el" para esse fim: https://github.com/purcell/unfill

Ele vem com um comando unfill-togglee unfill-region.

Alguém também postou código para "preencher" um parágrafo no EmacsWiki: https://www.emacswiki.org/emacs/UnfillParagraph

;;; Stefan Monnier <foo at acm.org>. It is the opposite of fill-paragraph    
(defun unfill-paragraph (&optional region)
  "Takes a multi-line paragraph and makes it into a single line of text."
  (interactive (progn (barf-if-buffer-read-only) '(t)))
  (let ((fill-column (point-max))
        ;; This would override `fill-column' if it's an integer.
        (emacs-lisp-docstring-fill-column t))
    (fill-paragraph nil region)))
Conta antiga
fonte