如何在emacs组织模式下计算子树的字符数?

如何在emacs组织模式下计算子树的字符数?,emacs,org-mode,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: countChars
#+BEGIN_SRC sh :var X="" :results output
echo "$X" | wc --chars
#+END_SRC
然后我在命名段落中使用它:

#+NAME: paragraph
This is the paragraph

#+CALL: countChars(paragraph)
这很有效,但是#+名称:只包含一段。我曾尝试使用标题作为论据,但我无法使其起作用

编辑:根据评论,我提出:

#+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()
但是存在计算源代码块(包括其本身)和文本的问题。我只想计算文本(不包括标题)。

您只能在源代码块前面使用
#+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。是否很难修改,使函数在缓冲区中打印,而不是在迷你缓冲区中显示?就像我在问题中的源代码块一样…将
(前进行1)
放在
(组织标记子树)
之后。此外,您还可以省略
(交互式)
。这只是为了将defuns转换为M-x命令。另外,如果子树内容包含其他子树,我不知道您希望发生什么。太好了!我只需要在最深的子树级别进行计数,所以我不担心进一步的子树。但是,我正在尝试在导出时包含字符计数。我可以将所有内容简化为一个调用行,但这是由函数计算的。我假设有一个类似于forwardline的命令,允许跳过子树中的最后一行文本?我已经更新了答案,根据请求跳过最后一行。