我有一个区域:
Items Quantity Amount
"Item A" 423 63
"Item B and C" 27 169
"Item D " 6 199
我想创建上述区域的org-table:
|Items | Quantity| Amount|
----------------|------------------
|"Item A" | 423 | 63 |
|"Item A and C" | 27 | 169 |
|"Item D" | 6 | 199 |
当前的建议是选择区域并使用C-c |
创建表,但这是基于元素之间空间的表创建表。它无法对项目列进行分组。有什么方法可以分组
您可以编写自己的EMACS LISP功能,该功能将在两个SEXP之间转换所有白色CHAR(不仅是空格(,并在当前活动区域中用,
替换它们。
(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,则只需添加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模式将其引号删除。
(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 |
如果有人有兴趣,我可以解释代码的工作原理。这个答案已经很长时间了,所以当不确定是否对任何人有用时,我现在都不会这样做。
希望会有所帮助。
在这些情况下,我通常会创建一个emacs宏:
将光标放在第二行(由于您的第一行不包含引号,它将在那里无法使用(。按F3,然后:
- C-A
- 然后按管道:" |"
- 按"删除"删除第一个双引号
- 搜索下一个双引号c-s"
- 删除双引号并添加另一个管牌
- 用c-right进一步移动一个单词
- 添加另一个管道
- c-e
- 添加另一个管道
- 用光标向下移动一行
- 按F4关闭Marco
现在按F4时,它应该再次执行相同的操作。如果一切都很好,那么您可以通过C-的C-轻松执行数百次命令,而您想要的任何数字和" F4"。
完成之后,您也可以简单地将管道添加到第一行中。现在按Org-table内部的" Tab"将对齐所有内容。
希望会有所帮助。