如何在emacs org模式下计算子树的字符?

时间:2018-06-20 19:47:18

标签: emacs 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 个答案:

答案 0 :(得分: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))))