3.5.7 编辑和调试公式 :修正公式

你可以在minibuffer或者直接在域中编辑一个个的公式. Org也可以准备一个包含表格中所有公式的特殊缓存区. 当对公式进行编辑时,Org在可能的情况下会转换引用为标准格式(类似于B3或者D&这样的引用). 如果你想只使用引用内部格式(类似于@3$2或者$4),请配置变量'org-table-use-standard-references'

C-c = 或者 C-u C-c = (org-table-eval-formula)

在minibuffer中编辑当前列/域的公式. 参见列公式域与区间公式.

C-u C-u C-c = (org-table-eval-formula)

为当前域重新设定一个公式(可以使域公式也可以是列公式),使用这个命令你可以直接在域中编辑公式. 与在minibuffer中编辑公式相比,这种方法的优势在于你可以使用命令C-c ?查询域的信息.

C-c ? (org-table-field-info)

当在表格域中编辑公式时,高亮公式中鼠标所在位置的域引用所引用的域.

C-c }

切换显示行列编号,using overlays(org-table-toggle-coordinate-overlays). 这些信息在每次表格重排之后都会自动更新;你也可以使用C-c C-c来强制更新信息.

C-c }

切换开启或者关闭公式调试器(org-table-toggle-formula-debugger). 具体信息参见下面

C-c ' (org-table-edit-formulas)

打开一个特殊的缓冲区(公式编辑器),可以在里面编辑当前表格所有的公式,在这个缓冲区中,每个公式都显示一行. 如果当前域包含包含有一个激活的公式,公式编辑器中的光标会标示出它来. 当光标在这个特殊的缓冲区中时,Org会自动高亮任何光标位置的域引用所引用的域. 你可以在这个特殊缓冲区中使用下面这些命令来编辑,删除和新增公式

C-c C-c 或 C-x C-s (org-table-fedit-finish)

退出公式编辑器,并且保持修改后的公式. 如果加了C-u前缀,那么会对整个表格应用新修改的公式(表格中所有的公式都会被重新计算一遍,然后显示出来)

C-c C-q (org-table-fedit-abort)

退出公式编辑器,而不做任何修改

C-c C-r (org-table-fedit-toggle-ref-type)

对表格编辑器中的所有引用切换显示格式,在标准格式(类似于B3)和内部格式(类似于@3$2)间切换

<TAB> (org-table-fedit-lisp-indent)

美化并缩进当前光标所在的Lisp公式. 当光标所在行包含有Lisp公式时,使用Emacs Lisp的规则来格式化公式. Another <TAB> collapses the formula back again. 在open formula(开放式公式??)中,<TAB>跟在Emacs Lisp mode一样起着重新缩进的功能.

M-<TAB> (lisp-complete-symbol)

补完Lisp符号,就跟在Emacs Lisp mode中一样

S-<up>/<down>/<left>/<right>

切换光标所在的引用. 例如如果现在光标所在的引用是B3,你按下S-<right>之后,该引用变成了C3. 这对相对引用和hline引用也有效

M-S-<up> (org-table-fedit-line-up) 或 M-S-<down> (org-table-fedit-line-down)

上下移动Org buufer中行公式的test line

M-<up> (org-table-fedit-scroll-down> 或 M-<down> (org-table-fedit-scroll-up)

滚动表格所在的窗口

C-c }

显示/关闭表格中各个域的坐标

把一个域清空并不会删掉这个域的公式,因为公式实际上是保存在其他行(#TBLFM行)-这样在下一次重新计算时,该域又会有新的值初出现. 要删掉一个域中的公式,你需要在编辑公式要求输入新公式时输入一个空回复,或者直接编辑#+TBLFM行

你可以直接编辑'#+TBLFM'行,然后在该行运行C-c C-c来对改变后的公式进行重新计算.或者也可以在表格中执行普通的重计算命令.

调试公式

当公式的计算产生错误时,域中的内容变为字符串'#ERROR'. 如果你想知道在变量替换和计算时都发生了什么以便寻找bug,你可以在Tbl菜单上打开公式调试功能然后重新对改公式计算一次(在域中按下C-u C-u C-c = <RET>).随后就会显示详细信息出来.