Organisationstabellen: Alle Felder in der Spalte auf eine bestimmte Größe umbrechen


7

In org ist es möglich, eine Spaltenbreite wie folgt festzulegen:

|---+------------------------------|               |---+----------------| 
|   |                              |               |   | <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           | 
|---+------------------------------|               |---+----------------| 

Ich möchte stattdessen dieses Layout erhalten:

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

Natürlich kann ich eine neue Zeile verwenden M-S-<down> und M-<ret>einfügen und das lange Feld umbrechen.
Für viele Bereiche ist dies jedoch unpraktisch. Gibt es einen Hack oder ein Paket, um diesen Prozess zu beschleunigen?


AFAIK Das ist nicht möglich. Sie können versuchen, es auf der Organisations-Mailingliste anzufordern. Ich bin mir org-tablejedoch nicht sicher, ob dies leicht geändert werden kann.
Rasmus

Antworten:


6

Ich bin neu in der Org-API und würde mich freuen, wenn Sie sich den Code ansehen und einige Kommentare teilen könnten.

Beachten Sie für die vorgeschlagene Lösung die folgende Tabelle:

|---+--------------------------------+---|
| 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 |
|---+--------------------------------+---|

Setzen Sie den Cursor an eine beliebige Stelle in der zweiten Spalte und geben Sie Folgendes ein:

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

Geben Sie wie gewünscht eine Spaltenbreite ein. ZB beim Betreten erhalten 15Sie:

|---+----------------+---|
| 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           |   |
|---+----------------+---|

Wenn Sie mit dieser Breite nicht zufrieden sind und einen anderen Wert ausprobieren möchten, verwenden Sie den Emacs-Standard rückgängig machen, wodurch das vorherige Layout wiederhergestellt wird, sodass Sie die Umbruchfunktion erneut ausführen können.

Hier ist der Code. Wenn Sie Org kennen, geben Sie bitte 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)))

1
Interessant. Ich denke, es sollte jedoch beachtet werden, dass der Organisationsmodus nicht weiß, dass die Zeilen umbrochen wurden, so dass beispielsweise das Sortieren höchstwahrscheinlich alles durcheinander bringt. Es sieht immer noch nützlich aus, z. B. vor dem Export zu verwenden.
Rolazaro Azeveires

1
@RolazaroAzeveires: Es wäre relativ einfach, ein Symbol hinzuzufügen ", das den Anfang / das Ende eines Feldes markiert, das sich über mehrere Zeilen erstreckt, um zur nicht umschlossenen Version zurückzukehren, sie zu bearbeiten und erneut umzubrechen. Ich bin mir nicht sicher, ob dies ein sichtbares Symbol (das das Layout weniger polieren würde) oder ein unsichtbares Symbol (das die Tabellenstruktur verschleiern würde) sein sollte.
Antonio

Ja, das könnte interessant sein. Emacs und andere verwenden einige sichtbare "lockige Pfeilsymbole", um zu zeigen, dass es einen Zeilenumbruch gibt (es gibt wahrscheinlich ein Unicode-Zeichen dafür, aber ich habe keines in einer Schnellsuche gefunden)
Rolazaro Azeveires

Was ist mit der Verwendung der unterbrochenen Leiste anstelle der vertikalen Leiste |, um anzuzeigen, wann eine Reihe umbrochen wird?
Melioratus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.