如何在emacs org mode中计算子树的字符数?

3
我想在org mode中计算子树(标题)中的字符数。目前我已经知道如何计算单个段落中的字符数,但是不知道如何计算多个段落的字符数。我首先定义一个源代码块:
#+NAME: countChars
#+BEGIN_SRC sh :var X="" :results output
echo "$X" | wc --chars
#+END_SRC

然后我在指定的段落上使用它:
#+NAME: paragraph
This is the paragraph

#+CALL: countChars(paragraph)

这个功能很好,但是 #+NAME: 只覆盖了一个段落。我尝试使用标题作为参数,但是我无法使其正常工作。
编辑:根据评论,我想到了以下解决方案:
#+NAME: countChars
#+BEGIN_SRC emacs-lisp :results output :eval no-export :exports results
(interactive)
(save-excursion
  (org-mark-subtree)
  (setq a (- (mark) (point)))
  (deactivate-mark)
  (prin1 'Count= )
  (prin1 a))
#+END_SRC

它作为调用时几乎实现了我想要的功能。
#+CALL: countChars()

但是它存在一个问题,即将源代码块(包括其本身)以及文本一起计算。我想要仅计算文本(不包括标题)。

1
(org-mark-subtree)之后加上(forward-line 1)。此外,您可以省略(interactive)。这只是将defuns转换为M-x命令的方式。另外,如果子树内容包含其他子树,我不知道您想要发生什么。 - scbagley
太好了!我只需要在最深的子树级别上进行计数,所以我不担心更深层次的子树。但是,我正在尝试在导出时包括字符计数。我可以将所有内容缩减为单个call_*行,但这会被函数计算。我假设有一个像forward-line这样的命令,可以跳过子树中的最后一行文本吗? - Stefano
1
我已经根据要求更新了我的答案,跳过了最后一行。 - scbagley
1个回答

3

您只能在源代码块前面使用#+NAME,而不是子树。

最好用Emacs Lisp编写此代码。

此代码块将计算当前子树中字符的数量(不包括标题或内容的最后一行): 如果您想要使用Emacs Lisp计算当前子树中字符的数量,请尝试以下内容:

(save-excursion
  (org-mark-subtree) ;mark the whole subtre
  (forward-line 1)   ;move past header
  (exchange-point-and-mark) ;swap point and mark (ends of region)
  (forward-line -1)  ;move backwards past the last line
  (let ((nchars (- (point) (mark))))
    (deactivate-mark) ;clear the region
    (message "%d" nchars))))

非常感谢,这个很好用!现在我的elisp真的接近于0了。修改一下让函数在缓冲区中打印而不是在迷你缓冲区中显示会很难吗?就像我在问题中的源代码块那样... - Stefano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接