我也遇到了这个确切的问题(我是最近的 emacs 转换),我编写了一个小 AWK 脚本,可以将您提到的“网格表”(即不使用 org-mode 表)转换为 GFM 表。
有几种方法可以使用这个脚本。您所要做的就是标记表格,然后输入C-u M-| name-of-awk-script RET
(我从这个 Stackoverflow 线程中学到了这个技巧)。这将使用该区域作为 AWK 脚本的标准输入,并用输出替换该区域。我非常不擅长编写 ELisp,但我也编写了几个辅助函数。该table-gfm-export
函数当前不会以与交互方式替换文本相同的方式替换文本C-u M-|
,因为它仍将原始表留在缓冲区中。
(defun table-gfm-capture (start end)
"convert Markdown table to Emacs table
there should be no pipes beginning or ending the line,
although this is valid syntax. Loses justification."
(interactive "r")
;; should prompt user for justification
(table-capture start end "|"
"[\n][:|-]*" 'center))
(defun table-gfm-export (start end)
"uses AWK script to convert Emacs table to
GFM Markdown table"
(interactive "r")
;; replace gfm_table_format if necessary
(shell-command-on-region start end "gfm_table_format" t t)
(table-unrecognize))
这个脚本的一个优点是它还可以使用一些简单的正则表达式来识别列的对齐方式。其他功能table-gfm-capture
,无法保持对齐,所以不能自由来回切换。该系统非常适合在表格模式下进行所有编辑,然后在最后导出到 GFM。你会认为 Emacs 已经能够使用 生成 Markdown 表table-generate-source
,但是,唉。
#!/usr/bin/env awk -f
# -*- mode: awk -*-
BEGIN {
FS="|";
first=1;
}
function detect_justification(f) {
if (match(f, /^ .* $/)) {
return 0; # center-justified
} else if (match(f, / $/)) {
return -1; # left-justified
} else { return 1; } # right-justified
}
function gen_field(len, just) {
str = sprintf("%*s", len, "");
gsub(/ /, "-", str);
if (just <= 0) {
# left or center, start with :
sub(/-/, ":", str);
}
if (just >= 0) {
# right or center, end with :
sub(/-$/, ":", str);
}
return str;
}
function gen_rule() {
str = "";
# ignore first and last empty fields
for (i=1; i < NF; i++) {
len = length($i);
just = detect_justification($i);
str = sprintf("%s%s|", str, gen_field(len, just));
}
return str;
}
function sanitize_line(line) {
# strip outer pipes and trailing whitespace
if (index(line, "|") == 1) {
line = substr(line, 2);
}
sub(/[ |]*$/, "", line);
return line;
}
! /^\+/ {
print(sanitize_line($0));
if (first) {
print(sanitize_line(gen_rule()));
first = 0;
}
}