Bảng Org: Bọc tất cả các trường trong cột theo một kích thước nhất định


7

Trong org, có thể đặt chiều rộng cột như sau:

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

Tôi muốn có được bố cục này thay thế:

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

Tất nhiên tôi có thể sử dụng M-S-<down>M-<ret>chèn một hàng mới và bọc trường dài.
Tuy nhiên, đối với nhiều lĩnh vực, điều này là bất tiện. Có hack hay gói nào để tăng tốc quá trình này không?


AFAIK Không thể. Bạn có thể thử yêu cầu nó trong danh sách gửi thư org. Tôi không chắc chắn org-tablesẽ dễ dàng được sửa đổi, mặc dù.
rasmus

Câu trả lời:


6

Tôi chưa quen với API Org và tôi sẽ rất vui nếu bạn có thể xem mã và chia sẻ một số nhận xét.

Đối với giải pháp đề xuất, hãy xem xét bảng sau:

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

Đặt con trỏ ở bất cứ đâu trong cột thứ hai và gõ:

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

Nhập chiều rộng cột theo yêu cầu. Ví dụ: nhập 15, bạn nhận được:

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

Nếu bạn không hài lòng với chiều rộng này và muốn thử một giá trị khác, hãy sử dụng tiêu chuẩn Emacs hoàn tác, nó sẽ khôi phục bố cục trước đó, do đó bạn có thể chạy lại chức năng gói.

Đây là mã. Nếu bạn biết Org, xin vui lòng, cho ý kiến ​​phản hồi.

(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
Hấp dẫn. Tôi đoán rằng cần phải lưu ý rằng, chế độ org không biết các dòng được gói, vì vậy, ví dụ, sắp xếp rất có thể sẽ làm rối tung tất cả. Nó vẫn có vẻ hữu ích, ví dụ để sử dụng trước khi xuất khẩu.
Rolazaro Azeveires

1
@RolazaroAzeveires: Sẽ dễ dàng hơn khi thêm một biểu tượng như "đánh dấu điểm bắt đầu / kết thúc của một trường trải dài trên nhiều dòng, để quay lại phiên bản không được bao bọc, thao tác và bọc lại. Tôi không chắc liệu đây có phải là một biểu tượng có thể nhìn thấy (sẽ làm cho bố cục ít bị đánh bóng hơn) hoặc vô hình (sẽ làm cho cấu trúc bảng bị xáo trộn).
antonio

Vâng, đó có thể là thú vị. Emacs, và những người khác, sử dụng một số có thể nhìn thấy "xoăn mũi tên" biểu tượng để chứng minh rằng có sự ngắt dòng (có lẽ là một số ký tự unicode cho rằng nhưng tôi thấy không có gì trong một tìm kiếm nhanh)
Rolazaro Azeveires

Điều gì về việc sử dụng thanh bị hỏng thay cho thanh dọc |, để cho biết khi nào một hàng được bọc?
Melioratus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.