Sắp xếp bảng chế độ org với các đường ngang


7

Tôi có một bảng trong org-modeđó có định dạng sau:

| Name       | email           | number |
|------------+-----------------+--------|
| Doe, John  | jod@example.org |      7 |
| Doe, Jane  | jod@example.org |        |
|------------+-----------------+--------|
| Foo, Pete  | pf@example.com  |      5 |
|------------+-----------------+--------|
| Bar, Mary  | maba@127.0.0.1  |      3 |
| Quux, Mike | bz@192.168.12.1 |        |
|------------+-----------------+--------|

Nhưng tôi muốn bảng được định dạng như thế này:

| Name       | email           | number |
|------------+-----------------+--------|
| Bar, Mary  | maba@127.0.0.1  |      3 |
| Quux, Mike | bz@192.168.12.1 |        |
|------------+-----------------+--------|
| Doe, John  | jod@example.org |      7 |
| Doe, Jane  | jod@example.org |        |
|------------+-----------------+--------|
| Foo, Pete  | pf@example.com  |      5 |
|------------+-----------------+--------|

Bảng này nên được sắp xếp theo thứ tự abc. Vì vậy, hai hàng cuối cùng nên là đầu tiên. Sự tách biệt với các đường ngang nên ở lại. Nếu có các từ khác nhau trong các cột được nhóm, thì việc sắp xếp chúng không thành vấn đề. Vì vậy, nhóm cuối cùng trong bảng trên có thể được Bartheo sau Bazhoặc Baztheo sau Bar. Làm thế nào tôi có thể làm điều này với Emacs org-mode?


1
Bạn nên thêm một ví dụ về cách bạn muốn bảng trông như thế nào, như: "Tôi muốn cái này ... Để trông như thế này ...".
Luke Shimkus

2
Tôi không thực sự hiểu các quy tắc phân loại. Bạn chỉ muốn sắp xếp trên cột đầu tiên trong mỗi phần và sau đó sắp xếp các phần phụ thuộc vào cột "tên" của hàng đầu tiên của mỗi phần?
rekado

Câu trả lời:


4

Thật không may, org-modekhông giữ cấu trúc dữ liệu xung quanh có thể được sử dụng để thực hiện các sửa đổi được phản ánh trực tiếp trong bảng, vì vậy chúng tôi phải đưa các dòng vào danh sách, xử lý một số danh sách và sau đó chuyển đổi danh sách kết quả thành bản văn.

Nói chung, cách tiếp cận là thế này:

  • tính toán kích thước nhóm từ thông tin trong org-table-hlines; biến này giữ số hàng của các đường ngang
  • lưu trữ các dòng liên quan đến mỗi nhóm trong một danh sách và đặt từng nhóm vào danh sách

    '(("| Doe, John...|" "| Doe, Jane...|")
      ("| Foo, Pete...|")
      ("| Bar, Mary...|" "| Quux, Mike...|"))
    
  • sắp xếp danh sách này theo giá trị carcủa từng mặt hàng, nhận được một cái gì đó như thế này:

    '(("| Bar, Mary...|" "| Quux, Mike...|")
      ("| Doe, John...|" "| Doe, Jane...|")
      ("| Foo, Pete...|"))
    
  • sau đó xây dựng lại bảng từ danh sách này bằng cách lặp qua từng nhóm

BIÊN TẬP:

Đây là một cái gì đó để giúp bạn bắt đầu. Nó khá khó xử, nhưng nó chỉ để minh họa ý tưởng. ( rows-by-groupthực sự có chứa các bản sao, vì vậy điều này không hoàn toàn chính xác.)

(defun my-org-sort-lines ()
  (interactive)
  (org-table-recalculate 'iterate)
  (let* ((hlines org-table-hlines)
         (rows-by-group (let* ((xs (cdr (append hlines nil)))
                               (xs2 (mapcar #'1+ xs))
                               (ys (mapcar #'1- (cdr (copy-sequence xs)))))
                          (mapcar* #'list (setcdr (last xs2) xs2) ys)))
         ;; fetch rows and store as nested list
         (groups (mapcar (lambda (group)
                           (mapcar (lambda (row-id)
                                     (goto-line row-id)
                                     (beginning-of-line)
                                     (let ((beg (point)))
                                       (end-of-line)
                                       (buffer-substring beg (point))))
                                   group))
                           rows-by-group))
         ;; sort groups by first row
         (sorted (sort groups (lambda (a b)
                                (string-lessp (car a) (car b))))))

    ;; remove existing table rows and rebuild from group list
    (goto-char (org-table-begin))
    (next-line 1)
    (kill-region (point) (org-table-end))
    (mapcar (lambda (group)
              (insert "|---")(org-table-recalculate)(next-line)
              (mapcar (lambda (row)
                        (insert row)(newline)) group))
            sorted))
  (insert "|---")
  (org-table-recalculate))

Hấp dẫn. Đã suy nghĩ về cách sửa đổi các bảng theo chương trình và đây là một khởi đầu tốt đẹp.
hủy bỏ
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.