2

假设你有一棵如下形式的树:

* Top
** Item A
*** Lower
** Item B
** Item C

我想做的是能够创建一个包含项目 A 和项目 B 的区域,并运行命令将其更改为:

* Top
** 
*** Item A
**** Lower
*** Item B
** Item C

将光标放在空白项上。我想知道是否已经将类似的东西写入 org-mode。如果没有,我可以自己写,但在这种情况下,我想知道我应该如何遍历我所在区域的行来移动它们,避免比我的起始层低的项目。

4

2 回答 2

1

天真的第一次尝试

从大纲开始

* Top
** Item A
*** Lower
** Item B
** Item C

如果我将光标放在后面Top并按Alt+ Return( org-insert-heading) 然后按Alt+ Shift+ right( org-demote-subtree) 我得到结构

* Top
** 
*** Item A
**** Lower
*** Item B
*** Item C

不幸的是,这会降级Item C,您似乎并不想要。但是,您可以导航到该项目并按Alt+ Shift+ left。但是,我想这是一个简化的示例,并且想要一个更强大的方法,它不涉及在文件中移动太多。我们能做得更好吗?

瞬态标记模式

通读Org mode 手册中的结构编辑我发现了注释

当存在活动区域​​时(瞬态标记模式),该区域内的所有标题都会进行升级和降级。要选择标题区域,最好将点和标记都放在一行的开头,标记在第一个标题的开头,然后指向最后一个要更改的标题之后的行。

所以也许这给了我们前进的道路。但是,我无法对这些信息做任何明智的事情。希望其他人可以站出来向我们展示它是如何完成的。

缩小到一个区域

我们可以移动更多的另一种方法是将缓冲区“缩小”到仅我们想要处理的区域。

选择完整的线条* Top以及介于两者之间的所有内容(使用鼠标或通过,例如,使用+和+ + + ( ) 几次)。我们现在可以通过将缓冲区“缩小”到仅此区域来仅将注意力集中在这个突出显示(或标记)的区域上,排除缓冲区中的所有其他文本(我们不会删除文本,即使它看起来这样,我们就将它隐藏一点。我们使用+ + + ( ) 缩小到该区域(请注意,如果您没有明确启用此功能,则会出现有用的消息)。我们总是可以回到使用+ + + (** Item B CtrlSpaceCtrlcCtrlnoutline-next-visible-headingCtrlxnnnarrow-to-regionCtrlxnwwiden)。

在我们缩小的缓冲区中,我们现在只能看到:

* Top
** Item A
*** Lower
** Item B

如果我们现在重复我们幼稚尝试的步骤(见上文),然后返回到完整(加宽)缓冲区,我们会看到我们有轮廓:

* Top
** 
*** Item A
**** Lower
*** Item B
** Item C

这是我们追求的最终结果!如果这是一个不必要的冗长答案,我深表歉意。我在研究它时学到了很多东西,并想在这里记录下来。

于 2013-06-07T21:23:50.763 回答
1

根据克里斯的回答,我想出了以下代码:

(defun org-file-region (start end)
  "Moves the lines in region to be underneath a new header"
  (interactive "r")
  (extend-region-to-lines start end)
  (narrow-to-region (save-excursion (goto-char start)
                                    (line-beginning-position))
                    (save-excursion (goto-char end)
                                    (line-end-position)))
  (org-do-demote)
  (org-insert-heading)
  (setq mark-active nil)
  (org-do-promote)
  (setq mark-active t)
  (widen))

请注意,仅org-do-demote将在该区域上运行;其他降级功能没有。

于 2013-06-08T17:11:50.650 回答