在Emacs组织模式下,是否有办法使内联脚注定义显示为折叠?
例如,像这样的一行:
This effect is due to the strength of weak ties[fn:: Newman, Mark, Albert-László Barabási, and Duncan J. Watts. 2006. The Structure and Dynamics of Networks. Princeton, NJ: Princeton University Press].
可以简单地像这样出现:
This effect is due to the strength of weak ties[✭].
我还需要一个命令在必要时显示脚注。因此,可能需要两个命令:org-hide-footnotes
和org-show-footnotes
。
目前我不相信这是可能的。同时使用TAB
作为扩展键,因为它可能会导致更多的键过载。
另一方面,是否有什么特别的理由不使用脚注部分作为脚注?
C-c C-x f
将创建/与您拥有的任何脚注交互。
(org-footnote-action &optional SPECIAL)
为脚注做正确的事。
在脚注引用处,跳转到定义。
在定义处,如果存在引用,则跳转到引用
当没有定义或引用时,创建一个新的脚注,交互式地。
使用SPECIAL前缀,在菜单中提供额外的命令。
附加命令为:
s Sort the footnote definitions by reference sequence. During editing,
Org makes no effort to sort footnote definitions into a particular
sequence. If you want them sorted, use this command, which will
also move entries according to org-footnote-section. Automatic
sorting after each insertion/deletion can be configured using the
variable org-footnote-auto-adjust.
r Renumber the simple fn:N footnotes. Automatic renumbering
after each insertion/deletion can be configured using the variable
org-footnote-auto-adjust.
S Short for first r, then s action.
n Normalize the footnotes by collecting all definitions (including
inline definitions) into a special section, and then numbering them
in sequence. The references will then also be numbers. This is
meant to be the final step before finishing a document (e.g., sending
off an email). The exporters do this automatically, and so could
something like message-send-hook.
d Delete the footnote at point, and all definitions of and references
to it.
INITIAL(2014年2月6日):第一次工作草案。
EDIT 2014年2月18日:修改了函数lawlist-toggle-block-visibility
,使其包含适当的if/then/else语句——即,如果行包含必要的开始区域regexp,则块可见性将被切换,否则消息说对不起. . . .为代码折叠的相关线程添加了引用。修改了错误信息,使其指向一个点而不是一条线。
下面答案的源代码也存储在Github上:https://github.com/lawlist/lawlist-org-block-toggle/blob/master/lawlist-org-block-toggle.el
在一个相关的问题上(即,完全隐藏属性抽屉,包括单词:PROPERTIES:
),请参考以下线程:
关于半相关的问题(即,创建一个自定义块来进行代码折叠),参见:https://tex.stackexchange.com/a/161196/26911
这个解决方案在最近的Emacs Trunk版本(构建于2014年1月19日)中进行了测试,该版本包含org模式的8.2.5c版本。由于:PROPERTIES:
抽屉通过其:END:
从脚注和html块分开折叠,该解决方案考虑到脚注和/或html代码块将不在属性抽屉内的任何地方。脚注可以出现在文本段落的任何地方,但不能在脚注中再加上一对方括号——因为这段代码会查找第一个结束方括号,以标记折叠区域的结束。这段代码考虑到#+BEGIN_HTML
和#+END_HTML
都是左对齐,并且左对齐。启动视图仍然以同样的方式工作——例如,变量org-startup-folded
和org-hide-block-startup
。
org-cycle-internal-local
的修改允许在org模式下对所有形式的折叠进行制表符循环。我们所做的只是修复了函数的分页,使其更具可读性,并添加了以下条件:((eq org-cycle-subtree-status 'subtree) (org-show-subtree) (message "ALL") (setq org-cycle-subtree-status 'all))
。交互函数org-cycle
仍然用于在所有不同的折叠/展开视图之间进行tab循环。lawlist-block-org-cycle-internal-local
函数是org-cycle
使用的非交互式支持函数。这个解决方案中需要两个defalias
部分的代码才能正常工作。除了使用tab循环,用户还可以在标题或副标题的开头直接调用交互函数:M-x org-cycle RET
lawlist-toggle-block-visibility
。将光标放置在包含脚注开头或html块开头的行上的任何位置,键入:M-x lawlist-toggle-block-visibility RET
(require 'org)
(defalias 'org-cycle-hide-drawers 'lawlist-block-org-cycle-hide-drawers)
(defun lawlist-block-org-cycle-hide-drawers (state)
"Re-hide all drawers, footnotes or html blocks after a visibility state change."
(when
(and
(derived-mode-p 'org-mode)
(not (memq state '(overview folded contents))))
(save-excursion
(let* (
(globalp (memq state '(contents all)))
(beg (if globalp (point-min) (point)))
(end
(cond
(globalp
(point-max))
((eq state 'children)
(save-excursion (outline-next-heading) (point)))
(t (org-end-of-subtree t)) )))
(goto-char beg)
(while
(re-search-forward
".*\[fn\|^\#\+BEGIN_HTML.*$\|^[ t]*:PROPERTIES:[ t]*$" end t)
(lawlist-org-flag t))))))
(defalias 'org-cycle-internal-local 'lawlist-block-org-cycle-internal-local)
(defun lawlist-block-org-cycle-internal-local ()
"Do the local cycling action."
(let ((goal-column 0) eoh eol eos has-children children-skipped struct)
(save-excursion
(if (org-at-item-p)
(progn
(beginning-of-line)
(setq struct (org-list-struct))
(setq eoh (point-at-eol))
(setq eos (org-list-get-item-end-before-blank (point) struct))
(setq has-children (org-list-has-child-p (point) struct)))
(org-back-to-heading)
(setq eoh (save-excursion (outline-end-of-heading) (point)))
(setq eos (save-excursion (1- (org-end-of-subtree t t))))
(setq has-children
(or
(save-excursion
(let ((level (funcall outline-level)))
(outline-next-heading)
(and
(org-at-heading-p t)
(> (funcall outline-level) level))))
(save-excursion
(org-list-search-forward (org-item-beginning-re) eos t)))))
(beginning-of-line 2)
(if (featurep 'xemacs)
(while
(and
(not (eobp))
(get-char-property (1- (point)) 'invisible))
(beginning-of-line 2))
(while
(and
(not (eobp))
(get-char-property (1- (point)) 'invisible))
(goto-char (next-single-char-property-change (point) 'invisible))
(and
(eolp)
(beginning-of-line 2))))
(setq eol (point)))
(cond
((= eos eoh)
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-pre-cycle-hook 'empty))
(org-unlogged-message "EMPTY ENTRY")
(setq org-cycle-subtree-status nil)
(save-excursion
(goto-char eos)
(outline-next-heading)
(if (outline-invisible-p)
(org-flag-heading nil))))
((and
(or
(>= eol eos)
(not (string-match "\S-" (buffer-substring eol eos))))
(or
has-children
(not (setq children-skipped
org-cycle-skip-children-state-if-no-children))))
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-pre-cycle-hook 'children))
(if (org-at-item-p)
;; then
(org-list-set-item-visibility (point-at-bol) struct 'children)
;; else
(org-show-entry)
(org-with-limited-levels (show-children))
(when (eq org-cycle-include-plain-lists 'integrate)
(save-excursion
(org-back-to-heading)
(while (org-list-search-forward (org-item-beginning-re) eos t)
(beginning-of-line 1)
(let* (
(struct (org-list-struct))
(prevs (org-list-prevs-alist struct))
(end (org-list-get-bottom-point struct)))
(mapc (lambda (e) (org-list-set-item-visibility e struct 'folded))
(org-list-get-all-items (point) struct prevs))
(goto-char (if (< end eos) end eos)))))))
(org-unlogged-message "CHILDREN")
(save-excursion
(goto-char eos)
(outline-next-heading)
(if (outline-invisible-p)
(org-flag-heading nil)))
(setq org-cycle-subtree-status 'children)
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-cycle-hook 'children)))
((or
children-skipped
(and
(eq last-command this-command)
(eq org-cycle-subtree-status 'children)))
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-pre-cycle-hook 'subtree))
(outline-flag-region eoh eos nil)
(org-unlogged-message
(if children-skipped
"SUBTREE (NO CHILDREN)"
"SUBTREE"))
(setq org-cycle-subtree-status 'subtree)
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-cycle-hook 'subtree)))
((eq org-cycle-subtree-status 'subtree)
(org-show-subtree)
(message "ALL")
(setq org-cycle-subtree-status 'all))
(t
(run-hook-with-args 'org-pre-cycle-hook 'folded)
(outline-flag-region eoh eos t)
(org-unlogged-message "FOLDED")
(setq org-cycle-subtree-status 'folded)
(unless (org-before-first-heading-p)
(run-hook-with-args 'org-cycle-hook 'folded))))))
(defun lawlist-org-flag (flag)
"When FLAG is non-nil, hide any of the following: html code block;
footnote; or, the properties drawer. Otherwise make it visible."
(save-excursion
(beginning-of-line 1)
(cond
((looking-at ".*\[fn")
(let* (
(begin (match-end 0))
end-footnote)
(if (re-search-forward "\]"
(save-excursion (outline-next-heading) (point)) t)
(progn
(setq end-footnote (point))
(outline-flag-region begin end-footnote flag))
(user-error "Error beginning at point %s." begin))))
((looking-at "^\#\+BEGIN_HTML.*$\|^[ t]*:PROPERTIES:[ t]*$")
(let* ((begin (match-end 0)))
(if (re-search-forward "^\#\+END_HTML.*$\|^[ t]*:END:"
(save-excursion (outline-next-heading) (point)) t)
(outline-flag-region begin (point-at-eol) flag)
(user-error "Error beginning at point %s." begin)))))))
(defun lawlist-toggle-block-visibility ()
"For this function to work, the cursor must be on the same line as the regexp."
(interactive)
(if
(save-excursion
(beginning-of-line 1)
(looking-at
".*\[fn\|^\#\+BEGIN_HTML.*$\|^[ t]*:PROPERTIES:[ t]*$"))
(lawlist-org-flag (not (get-char-property (match-end 0) 'invisible)))
(message "Sorry, you are not on a line containing the beginning regexp.")))