【问题标题】:orgmode region to tableorgmode 区域到表
【发布时间】:2018-03-01 04:15:53
【问题描述】:

我有一个地区:

Items Quantity Amount
"Item A" 423 63
"Item B and C" 27 169
"Item D " 6 199

我想创建上述区域的组织表:

|Items          | Quantity| Amount|
----------------|------------------
|"Item A"       |  423    | 63    |
|"Item A and C" |  27     | 169   |
|"Item D"       |  6      | 199   |

目前的建议是选择区域并使用C-c | 创建表格,但这会根据元素之间的空格创建表格。它无法对项目列进行分组。有什么办法可以分组

【问题讨论】:

  • org-table-convert-region 支持 CSV、TSV、N 空格甚至正则表达式作为分隔符。即使是正则表达式,您的示例也很难匹配。
  • 我会将带引号的字符串中的空格更改为下划线,然后转换表格,然后将下划线更改回空格。对于像上面这样的小桌子,可以使用query-replace 轻松完成,交互式地跳过您不想更改的空间。对于较大的表,我会编写一个文本处理程序来仅更改带引号的字符串内的空格。
  • csv-align-columns from csv-mode 将正确匹配字段,csv-separators 设置为 (" ")。但是,您需要编写一个包装器来创建一个组织表。遗憾的是,它没有提供从空格分隔转换为 CSV 的功能。

标签: emacs org-mode org-table


【解决方案1】:

您可以编写自己的 Emacs Lisp 函数,该函数将转换两个 sexp 之间的所有白字符(不仅是空格),并在当前活动区域中将它们替换为 ,

(defun my/convert-region ()
  (interactive)
  (save-window-excursion
    (narrow-to-region (region-beginning) (region-end))
    (goto-char (point-min))
    (forward-sexp)
    (while (< (point) (buffer-end 1))
      (let ((beg (point)))
        (if (= (point) (line-end-position))
            (forward-char)
          (progn
            (forward-sexp)
            (backward-word)
            (delete-region beg (point)))
          (insert ",")))
      (forward-sexp))
    (goto-char (point-min))
    (widen)))

我在这样的活动区域上检查了这个:

Items        Quantity   Amount
"Item A" 423 63
"Item B and C" 27 169
"Item D " 6 199

运行M-x my/convert-region后改为:

Items,Quantity,Amount
"Item A",423,63
"Item B and C",27,169
"Item D ",6,199

您可以将此功能添加到您的配置文件中并将其绑定到一些键。

如果您希望此函数将此区域转换为同一函数中的组织表,只需添加 org-table-convert-region 调用即可。

(defun my/convert-region-to-org-table ()
  (interactive)
  (save-window-excursion
    (narrow-to-region (region-beginning) (region-end))
    (goto-char (point-min))
    (forward-sexp)
    (while (< (point) (buffer-end 1))
      (let ((beg (point)))
        (if (= (point) (line-end-position))
            (forward-char)
          (progn
            (forward-sexp)
            (backward-word)
            (delete-region beg (point)))
          (insert ",")))
      (forward-sexp))
    (org-table-convert-region (point-min) (point-max) '(4))
    (goto-char (point-min))
    (widen)))

对于相同的输入:

Items        Quantity   Amount
"Item A" 423 63
"Item B and C" 27 169
"Item D " 6 199

我得到了以下结果:

| Items        | Quantity | Amount |
| Item A       |      423 |     63 |
| Item B and C |       27 |    169 |
| Item D       |        6 |    199 |

不幸的是,在转换过程中,org-mode 正在删除引号。

(defun my/convert-region-to-org-table-with-header ()
  (interactive)
  (save-window-excursion
    (narrow-to-region (region-beginning) (region-end))
    (goto-char (point-min))
    (forward-sexp)
    (while (< (point) (buffer-end 1))
      (let ((beg (point)))
        (if (= (point) (line-end-position))
            (forward-char)
          (progn
            (forward-sexp)
            (backward-word)
            (delete-region beg (point)))
          (insert ",")))
      (forward-sexp))
    (org-table-convert-region (point-min) (point-max) '(4))
    (goto-char (point-min))
    (org-ctrl-c-minus)
    (widen)))

那么输出将如下所示:

| Items        | Quantity | Amount |
|--------------+----------+--------|
| Item A       |      423 |     63 |
| Item B and C |       27 |    169 |
| Item D       |        6 |    199 |

如果有人感兴趣,我可以解释代码的工作原理。这个答案已经很长了,所以当我不确定它是否对任何人有用时,我现在不会这样做。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    在这些情况下,我通常会创建一个 emacs 宏:

    将光标定位在表格的第二行(因为您的第一行不包含引号,所以它不会在那里工作)。 按 f3 然后:

    • C-a
    • 然后按管道:“|”
    • 按“delete”删除第一个双引号
    • 搜索下一个双引号 C-s "
    • 删除双引号并添加另一个管道符号
    • 用 C-right 进一步移动一个单词
    • 添加另一个管道
    • C-e
    • 添加另一个管道
    • 用光标向下移动一行
    • 按 f4 关闭宏

    当您现在按 f4 时,它应该再次执行相同的操作。 如果一切顺利,那么您可以通过 C- 任何您想要的数字和“f4”轻松执行该命令数百次。

    完成后,您也可以简单地在第一行添加管道一次。 现在按 org-table 中的“tab”将对齐所有内容。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 2012-07-25
      • 2015-03-24
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多