Org mode 表格像素对齐

是的,这个只是让Emacs在显示上对齐,不会修改实际的文字内容。

重启大法管用

必须重启啊,否则没法用。但是复制不了表格,因为会继续卡死。 只能让@casouri 自己根据我的截图做个小表格试试了。 或者后面我再看到小一点的表格再发出来。

:expressionless:你光描述我复现不了啊

那就等等,我再找合适的例子,你看看下面的这个表格,复制到你的emacs org文件中看看

没法复现,你是不是没有在buffer本地开启valign-mode?现在改成local minor mode了。

.spacemacs中,我这样设置的,在user-config ()函数里面

  (load-file "~/work/github/valign/valign.el")
  (valign-mode t)

要这样设置:

(add-hook 'org-mode-hook #'valign-mode)

我修改好了,问题解决了。赞一个。

还有卡死的问题吗?

有,那可能是因为我的表格太大了,别看行数不多,但是限定宽度的某列里面的数据非常多。 org table本身性能就不好。再对齐一下,可能就问题比较大了。 凑合用吧。

可能会泄漏信息,前面的图片我删除了。哈哈。

你的表格大概有多少格子?我这里400+格子对齐一次大概0.4秒。再多一点应该也不至于卡死。

好,我本地文件也删了。

我一个格子(cell)里面是很长很长的数据

厉害了,好用。不用强行调整字体等宽了。

等宽字体不好看,变宽字体更美。所以有了这个,我再也不用等宽字体了。

用了valign后,发现table不能用了。原来的table在org mode中是可以使用的。

在edit buffer里面还能够看到原来的样子

这种是合法table吗?要支持这种table的话,valign需要大改,我有时间想想。

这是emacs内置的table, 和org table不是一个东西 可以参考: http://table.sourceforge.net/

emacs table mode的好处是可以创建合并,拆分的单元格。缺点是没有org table的统计功能。 org table支持和table的双向转换。

请注意我上面的第二张图,通过C-’ 进入的编辑buffer,这里面是对齐的。你可以看看是什么原因?

1 个赞

遇到这样的内容报错的:

* vertical line in example block

#+begin_example
1 + 2|
#+end_example

Error:

Debugger entered--Lisp error: (valign-not-on-table)
  signal(valign-not-on-table nil)
  (if (not (valign--at-table-p)) (signal 'valign-not-on-table nil))
  (let (end column-width-list column-idx pos ssw bar-width separator-row-point-list rev-list column-alignment-list info at-sep-row right-bar-pos) (if (not (valign--at-table-p)) (signal 'valign-not-on-table nil)) (valign--end-of-table) (setq end (point)) (valign--beginning-of-table) (valign--clean-text-property (point) end) (setq info (valign--calculate-table-info end)) (setq column-width-list (progn (or (and (memq (type-of info) cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list 'valign-table-info info))) (aref info 1)) column-alignment-list (progn (or (and (memq (type-of info) cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list 'valign-table-info info))) (aref info 2))) (progn (setq column-idx -1) (while (and (setq column-idx (1+ column-idx)) (search-forward "|" nil t) (< (point) end)) (if (looking-at "[^|]*\n") (setq column-idx -1) (progn (save-excursion (if (save-excursion ... ...) (progn ... ...))))))) (let ((--dolist-tail-- separator-row-point-list)) (while --dolist-tail-- (let ((row-point (car --dolist-tail--))) (goto-char row-point) (valign--align-separator-row (valign--guess-table-type) valign-separator-row-style (reverse rev-list)) (setq --dolist-tail-- (cdr --dolist-tail--))))))
  (save-excursion (let (end column-width-list column-idx pos ssw bar-width separator-row-point-list rev-list column-alignment-list info at-sep-row right-bar-pos) (if (not (valign--at-table-p)) (signal 'valign-not-on-table nil)) (valign--end-of-table) (setq end (point)) (valign--beginning-of-table) (valign--clean-text-property (point) end) (setq info (valign--calculate-table-info end)) (setq column-width-list (progn (or (and (memq (type-of info) cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list 'valign-table-info info))) (aref info 1)) column-alignment-list (progn (or (and (memq (type-of info) cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list 'valign-table-info info))) (aref info 2))) (progn (setq column-idx -1) (while (and (setq column-idx (1+ column-idx)) (search-forward "|" nil t) (< (point) end)) (if (looking-at "[^|]*\n") (setq column-idx -1) (progn (save-excursion (if ... ...)))))) (let ((--dolist-tail-- separator-row-point-list)) (while --dolist-tail-- (let ((row-point (car --dolist-tail--))) (goto-char row-point) (valign--align-separator-row (valign--guess-table-type) valign-separator-row-style (reverse rev-list)) (setq --dolist-tail-- (cdr --dolist-tail--)))))))
  (condition-case nil (save-excursion (let (end column-width-list column-idx pos ssw bar-width separator-row-point-list rev-list column-alignment-list info at-sep-row right-bar-pos) (if (not (valign--at-table-p)) (signal 'valign-not-on-table nil)) (valign--end-of-table) (setq end (point)) (valign--beginning-of-table) (valign--clean-text-property (point) end) (setq info (valign--calculate-table-info end)) (setq column-width-list (progn (or (and (memq ... cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list ... info))) (aref info 1)) column-alignment-list (progn (or (and (memq ... cl-struct-valign-table-info-tags) t) (signal 'wrong-type-argument (list ... info))) (aref info 2))) (progn (setq column-idx -1) (while (and (setq column-idx (1+ column-idx)) (search-forward "|" nil t) (< (point) end)) (if (looking-at "[^|]*\n") (setq column-idx -1) (progn (save-excursion ...))))) (let ((--dolist-tail-- separator-row-point-list)) (while --dolist-tail-- (let ((row-point ...)) (goto-char row-point) (valign--align-separator-row (valign--guess-table-type) valign-separator-row-style (reverse rev-list)) (setq --dolist-tail-- (cdr --dolist-tail--))))))) ((debug valign-bad-cell valign-not-gui valign-not-on-table) nil))
  valign-table()
  (condition-case err (valign-table) ((debug error) (message "Valign error when aligning table: %s" (error-message-string err))))
  valign-table-quiet()
  (while (and (search-forward "|" nil t) (< (point) end)) (valign-table-quiet) (valign--end-of-table))
  (save-excursion (goto-char beg) (while (and (search-forward "|" nil t) (< (point) end)) (valign-table-quiet) (valign--end-of-table)) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (put-text-property beg (point) 'valign-init t)) (if modified nil (restore-buffer-modified-p nil)))))
  (progn (save-excursion (goto-char beg) (while (and (search-forward "|" nil t) (< (point) end)) (valign-table-quiet) (valign--end-of-table)) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (put-text-property beg (point) 'valign-init t)) (if modified nil (restore-buffer-modified-p nil))))))
  (if (window-live-p (get-buffer-window nil (selected-frame))) (progn (save-excursion (goto-char beg) (while (and (search-forward "|" nil t) (< (point) end)) (valign-table-quiet) (valign--end-of-table)) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (put-text-property beg (point) 'valign-init t)) (if modified nil (restore-buffer-modified-p nil)))))))
  (let ((beg (or beg (point-min))) (end (or end (point-max)))) (if (window-live-p (get-buffer-window nil (selected-frame))) (progn (save-excursion (goto-char beg) (while (and (search-forward "|" nil t) (< (point) end)) (valign-table-quiet) (valign--end-of-table)) (let* ((modified (buffer-modified-p)) (buffer-undo-list t) (inhibit-read-only t) (inhibit-modification-hooks t)) (unwind-protect (progn (put-text-property beg ... ... t)) (if modified nil (restore-buffer-modified-p nil))))))))
  valign-region(1 745)
  #f(compiled-function (fun) #<bytecode 0x58bafd1ee49bf35>)(valign-region)
  run-hook-wrapped(#f(compiled-function (fun) #<bytecode 0x58bafd1ee49bf35>) valign-region)
  jit-lock--run-functions(1 745)
  jit-lock-fontify-now(1 1001)
  jit-lock-function(1)
  redisplay_internal\ \(C\ function\)()

在这里的 | 也会报错。如下内容:

Your point is at ~|~. Then press =[C-Enter]= or some keybinding to pass to a
calculator function to get result *in minibuffer* or *write result to buffer*.