如何在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的命令,允许跳过子树中的最后一行文本?我已经更新了答案,根据请求跳过最后一行。