組織テーブル:列のすべてのフィールドを特定のサイズにラップします


7

組織では、次のように列幅を設定できます。

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

代わりにこのレイアウトを取得したいと思います。

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

もちろんM-S-<down> 、およびM-<ret>を使用して、新しい行を挿入し、長いフィールドをラップすることができます。
ただし、多くの分野でこれは不便です。このプロセスを高速化するためのハックまたはパッケージはありますか?


AFAIKそれは不可能です。組織のメーリングリストでリクエストしてみてください。org-tableしかし、簡単に修正できるかどうかはわかりません。
rasmus 2017年

回答:


6

私はOrg APIを初めて使用するので、コードを見てコメントを共有していただければ幸いです。

提案されたソリューションについては、次の表を検討してください。

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

カーソルを2列目の任意の場所に置き、次のように入力します。

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

必要に応じて列幅を入力します。たとえば、と入力すると 15、次のようになります。

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

この幅に不満があり、別の値を試したい場合は、Emacsの標準の取り消しを使用して、以前のレイアウトを復元し、wrap関数を再実行できるようにします。

これがコードです。Orgをご存知の場合は、フィードバックをお寄せください。

(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
面白い。ただし、org-modeは行が折り返されていることを認識していないため、たとえば、並べ替えを行うと、すべてが混乱する可能性が高いことに注意してください。エクスポート前に使用するなど、まだ便利に見えます。
Rolazaro Azeveires 2017年

1
@RolazaroAzeveires:"ラップされていないバージョンに戻り、操作して再ラップするために、複数行にわたるフィールドの開始/終了をマークするような記号を追加するのは比較的簡単です。これが表示されるシンボル(レイアウトが洗練されなくなる)か、非表示のシンボル(テーブル構造が不明瞭になる)のどちらであるかはわかりません。
antonio 2017年

はい、面白いかもしれません。Emacsなどは、目に見える「カーリーアロー」記号を使用して、行の折り返しがあることを示しています(おそらく、Unicode文字がいくつかありますが、クイック検索では見つかりませんでした)
Rolazaro Azeveires

垂直バーの代わりに壊れたバーを使用して|、行が折り返されたことを示しますか?
Melioratus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.