Tabelas organizacionais: agrupar todos os campos da coluna em um determinado tamanho

7

Na organização, é possível definir uma largura de coluna da seguinte maneira:

|---+------------------------------|               |---+----------------| 
|   |                              |               |   | <14>           | 
| 1 | one                          |               | 1 | one            | 
| 2 | two                          |     ----\     | 2 | two            | 
| 3 | This is a long chunk of text |     ----/     | 3 | This is a lo=> | 
| 4 | four                         |               | 4 | four           | 
|---+------------------------------|               |---+----------------| 

Gostaria de obter esse layout:

|---+----------------|
|   | <14>           |
| 1 | one            |
| 2 | two            |
| 3 | This is a long |
|   | chunk of text  |
| 4 | four           |
|---+----------------|

Claro que posso usar M-S-<down> e M-<ret>inserir uma nova linha e quebrar o campo longo.
No entanto, para muitos campos, isso é inconveniente. Existe algum hack ou pacote para acelerar esse processo?

antonio
fonte
AFAIK Não é possível. Você pode tentar solicitá-lo na lista de discussão da organização. Não tenho certeza se org-tableseria facilmente alterado, no entanto.
Rasmus

Respostas:

6

Eu sou novo na API da organização e ficaria feliz em poder dar uma olhada no código e compartilhar alguns comentários.

Quanto à solução proposta, considere a seguinte tabela:

|---+--------------------------------+---|
| 1 | one                            | a |
| 2 | two                            | b |
| 3 | This is a long chunk of text   | c |
| 4 | four                           | d |
| 5 | Yet another long chunk of text | e |
|---+--------------------------------+---|

Coloque o cursor em qualquer lugar da segunda coluna e digite:

M-x org-table-wrap-to-width

Digite a largura da coluna, conforme solicitado. Por exemplo, ao entrar 15, você obtém:

|---+----------------+---|
| 1 | one            | a |
| 2 | two            | b |
| 3 | This is a long | c |
|   | chunk of text  |   |
| 4 | four           | d |
| 5 | Yet another    | e |
|   | long chunk of  |   |
|   | text           |   |
|---+----------------+---|

Se você estiver insatisfeito com essa largura e quiser tentar um valor diferente, use o desfazer padrão do Emacs, que restaurará o layout anterior, para que você possa executar novamente a função de quebra automática.

Aqui está o código. Se você conhece Org, por favor, dê seu feedback.

(defun org-table-wrap-to-width (width)
  "Wrap current column to WIDTH."
  (interactive (list (read-number "Enter column width: ")))
  (org-table-check-inside-data-field)
  (org-table-align)

  (let (cline (ccol (org-table-current-column)) new-row-count (more t))
    (org-table-goto-line 1)
    (org-table-goto-column ccol)

    (while more
      (setq cline (org-table-current-line))

      ;; Cut current field
      (org-table-copy-region (point) (point) 'cut)

      ;; Justify for width
      (setq org-table-clip 
            (mapcar 'list (org-wrap (caar org-table-clip) width nil)))

      ;; Add new lines and fill
      (setq new-row-count (1- (length org-table-clip)))
      (if (> new-row-count 0)
          (org-table-insert-n-row-below new-row-count)) 
      (org-table-goto-line cline)
      (org-table-goto-column ccol)
      (org-table-paste-rectangle)
      (org-table-goto-line (+ cline new-row-count))

      ;; Move to next line
      (setq more (org-table-goto-line (+ cline new-row-count 1)))
      (org-table-goto-column ccol))

    (org-table-goto-line 1)
    (org-table-goto-column ccol)))

(defun org-table-insert-n-row-below (n)
  "Insert N new lines below the current."
  (let* ((line (buffer-substring (point-at-bol) (point-at-eol)))
         (new (org-table-clean-line line)))
    ;; Fix the first field if necessary
    (if (string-match "^[ \t]*| *[#$] *|" line)
        (setq new (replace-match (match-string 0 line) t t new)))
    (beginning-of-line 2)
    (setq new
      (apply 'concat (make-list n (concat new "\n"))))
    (let (org-table-may-need-update) (insert-before-markers new))  ;;; remove? 
    (beginning-of-line 0)
    (re-search-forward "| ?" (point-at-eol) t)
    (and (or org-table-may-need-update org-table-overlay-coordinates) ;;; remove? 
         (org-table-align))
    (org-table-fix-formulas "@" nil (1- (org-table-current-dline)) n)))
antonio
fonte
11
Interessante. Eu acho que deve-se notar, porém, que o modo organizacional não sabe que as linhas foram agrupadas; portanto, por exemplo, a classificação provavelmente estragará tudo. Ainda parece útil, por exemplo, para usar antes de exportar.
Rolazaro Azeveires 15/03/19
11
@RolazaroAzeveires: Seria relativamente fácil adicionar um símbolo "para marcar o início / fim de um campo que abrange várias linhas, para voltar à versão não empacotada, manipular e re-empacotar. Não tenho certeza se esse deve ser um símbolo visível (que tornaria o layout menos polido) ou invisível (que tornaria a estrutura da tabela ofuscada).
antonio
Sim, isso pode ser interessante. Emacs, e outros, usar algum visível "encaracolado seta" símbolos para mostrar que não há quebra de linha (provavelmente há alguns caracteres Unicode para isso, mas a ninguém achei em uma busca rápida)
Rolazaro Azeveires
Que tal usar a barra quebrada no lugar da barra vertical |, para indicar quando uma linha é quebrada ?
Melioratus 25/10