2010-07-19 36 views
4

我决定准备尝试一些新的东西,在使用gEdit几年来满足大部分编码需求,并尝试使用Emacs进行学习。我知道这很难,因为我听说Emacs有多复杂,但我被它的力量所吸引。最难的事情是已经习惯在.emacs文件中编写ELisp来改变关于编辑器的东西。我目前无法自己做,但我在这里和那里找到了一些有用的代码片段来更改某些选项。Emacs记得文本选择

我一直遇到很多问题,让Emacs记住我在命令后选择的文本。例如,我通常会突出显示一段代码来批量缩进它。但是,如果我在Emacs中这样做,它将只移动选定文本一次,然后取消选择所有文本。有没有人知道解决这个问题的方法?

无论如何,我很抱歉在我看来是一个简单的问题,但经过一个小时的谷歌搜索,并在这里环顾这里,我认为这值得提问。我还有一些关于Emacs的问题,但是我将它们保存并在分开后询问。谢谢!

UPDATE

有几个人问我在用的MOD,我进入什么类型的文本。虽然我对Emacs模式了解不多,但我现在正在编辑纯文本文件。事情是这样的:

Hello, I am a simple text file 
that is made up of three separate 
lines. 

如果我想强调三个线路和击中TAB,我得到这个:

Hello, I am a simple text file 
    that is made up of three separate 
    lines. 

这是伟大的,但是,如果我使用CX CX像一些建议下面重新选择文本并再次打TAB,我得到这个:

 Hello, I am a simple text file 
      that is made up of three separate 
       lines. 

我希望这有助于!

+0

查看http://stackoverflow.com/questions/815540/emacs-keep-region-selected-after-operation – Yktula 2010-07-19 02:31:56

回答

2

尝试在Emacs取消选择之后键入C-x C-x。

然后,而不是击中tab(我从来不知道tab做你说的!这是完全重击。),做M-8 C-x C-i。可惜它是如此之多的关键,但它应该做你想做的事 - 即推动一切超过8列。如果你想要其他数量的列,很明显用其他东西替换M-8

+1

我试过这个,它有点作品。 Emacs会重新选择我的文本,然后我可以再次点击选项卡,但是,它通过其上方的一行额外的选项卡空间来增加每行选择内容。例如,如果我突出显示三行并选中选项卡,则会将所有第1行选项卡空间隐藏起来。接下来,我击中重新选择文本的C-x C-x。然后我再次选中标签,第1行缩进1个额外的标签空间,第2行缩进2个额外的标签空间,第3行缩进3个标签空格。现在我的文档看起来像一个阶梯!任何其他的想法! – 2010-07-19 03:14:31

+1

虽然碰到这么多按键比较困难,但这确实有效,而且正是我所拍摄的。我从来不知道Emacs会如此困难,但我想随着时间的推移它会变得更容易。谢谢! – 2010-07-19 15:32:41

1

你是如何缩进,以及在哪种模式下?

任何编程模式下的缩进规则通常都应该正确。 (如果他们不这样做,那可能更像是说明你希望以不同的方式配置该模式的规则,但我怀疑这是另一个已经被问到的问题)。

如果您使用的是文本模式或类似方式,只使用TAB,则可以看到问题所在。

请注意,如果你使用indent-rigidlyC-x C-i,或C-x TAB这是同样的事情),那么你可以反复缩进同一区域简单地通过重复的命令,即使高亮从视野中消失。

您也可以使用前缀arg到indent-rigidly使其缩进多次。例如C-u C-u C-x C-i(比看上去更容易输入)会缩进16个空格(4 x 4,因为前缀arg默认为4,并且它在每次重复时都会相乘)。同样,M-8 C-x C-i缩进8个空格。在某些情况下这很好,而且在其他情况下太麻烦。

我个人建议将(cua-selection-mode 1)放入您的.emacs中,并使用它作为刚性缩进。 Trey Jackson made a handy blog about it。有了这个,你可以C-RET开始矩形选择,down尽可能多的行,你需要重复TAB缩进行,C-RET退出该模式。

当矩形处于活动状态时,RET在角落中循环。对于左侧角落,在前面输入插入。对于右侧角落,在后面输入插入。对于单列矩形,为此,底部计数为“左”,最高计数为“右”。

Trey的博客中列出了所有可用的功能(或查找在源文件中:CUA-base.el)

被警告在Emacs是缩进一般是an unexpectedly complicated topic

+1

哇,这看起来似乎比我想象的要复杂。我会尝试一下你的建议,但我可以肯定地说,在gEdit中只需突出显示文本并按Tab键所需的次数后,就很难习惯了。 恐怕我不确定你是用哪种模式表示的?对不起,我对Emacs语言学还很陌生。我目前正在编辑一个直接的文本文件,尽管我也会使用Emacs编辑Java文件。我希望这有助于!感谢您的建议! – 2010-07-19 02:56:46

+0

模式对于Emacs来说非常重要;它们使得它对不同类型的内容表现出不同/适当的行为。每个缓冲区都有一个“主要模式”,并且可能有许多“次要模式”在任何给定的缓冲区中有效。模式线表示主要模式(至少)。您也可以键入'C-h m'来查看您键入该命令的缓冲区的所有活动模式的信息。 – phils 2010-07-19 07:52:45

+1

鉴于这对你来说有多新颖,我建议你遵循一些教程和其他帮助设施。他们将在最初的学习曲线上取得重大进展。 Emacs有一个内置的教程('C-h t')。这并不短,但后来Emacs不小:) 这里有几个其他的出发点:http://stackoverflow.com/questions/210791/good-resources-for-emacs http://stackoverflow.com/questions/502399/how-do-you-learn-proper-emacs – phils 2010-07-19 07:58:08

1

我通常所做的只是在禁用该区域的命令之后键入C-x C-xexchange-point-and-mark)。

+1

我试过你的命令(与offby1给出的命令相同),并在我的评论中列出了offby1的结果。任何想法为什么? – 2010-07-19 03:15:39

+0

当时你在做什么主要模式?你正在编辑什么样的文字?你能缩小到显示行为的最小的一段文字并将其添加到原始问题中吗? – Sean 2010-07-19 03:41:33

8

FWIW,这是您新添加示例行为的原因。 (我不是在'解决'这个问题,但我发布它来揭秘你看到的。)

这是用emacs -q确定的,它禁用了我的自定义,所以以下是emacs 23.2的默认行为。

  1. 您处于文本模式。您应该在屏幕底部的模式行中看到(Text)或类似的文字,并且C-h m会告诉您(在次要模式列表下)“文本模式:编辑供人类阅读的文本的主要模式。” Emacs决定(通过auto-mode-alist变量),如果您访问匹配特定扩展名的文件名(例如.txt),它应该切换到文本模式。

  2. 在文本模式下按TAB并突出显示区域会导致在该区域的每一行上依次调用indent-according-to-mode。稍微复杂一点的路径是从C-h k TAB开始,它告诉我们TAB绑定到indent-for-tab-command,在这种情况下,它调用indent-region - 在帮助中没有明确说明函数名称,但可以在代码中看到 - 它检查本地缓冲区indent-region-function变量(无),以及:“值为零意味着每行真正运行indent-according-to-mode”。

  3. indent-according-to-mode检查indent-line-function变量,该变量具有缓冲区本地值indent-relative

  4. 使用C-h f indent-relative RET查看此功能的帮助。 (读这个)。

虽然你可能还没有过这样的经历知道如何检查所有的(或必然甚至想!),并充分了解它会告诉你一切,这是一个如何自我为例 - Emacs的记录方面使用户能够弄清楚发生了什么(这可以改变事情)。我基本上只是使用C-h k(describe-key),C-h f(describe-function)和C-h v(describe-variable)来跟踪文档。查看indent-for-tab-command的源代码非常简单,只需单击显示为其帮助页面一部分的文件名即可。

我建议做以下帮忙看看发生了什么事时,indent-relative上的每行:

M-x set-variable x-stretch-cursor t
M-x set-variable ruler-mode-show-tab-stops t
M-x ruler-mode

现在对于反过来每一行,将光标置于非常开始行并按Tab键。最后,所有三行缩进第一个制表符(标尺中的'T')。

现在重复此操作 - 再次确保您位于现有缩进前面的每一行的起始位置。

第一行(当前是制表符)的第一个字符再一次缩进到第一个制表位,因为它没有前面的行来检查。

接下来,第二行的第一个字符缩进以匹配前一行的第一个非空白字符的位置。由于第二行的第一个字符也是一个制表符,因此第二行的实际文本会沿着一个制表符进一步推进。

第三行如下。它的第一个制表符与第二行的第一个非空格字符排列在一起,具有与之前相同的相对效果,在您的示例中给出了最终状态。

为了强调,请注意如果您现在放置在现有线路上方输入“a b c”行,然后移回到下一行(以前是第一行)的开始处,然后按Tab键。现在第一个制表符将按照'b'缩进。假设indent-tabs-mode变量为真(意味着您有实际的制表符),那么这对行中单词的位置没有实际影响,因为用空格“缩进”制表符将不会产生效果,直到空格超出了选项卡的宽度(但这完全是另一个鱼的水壶!)

所有这一切的真正含义是Emacs中的text-mode在这种情况下的表现并不像你想要的那样。当然,其他主要模式在按TAB时可以完全不同。

与Emacs一样,您不喜欢的东西可以通过elisp进行更改或规避。一些搜索(特别是在Emacs Wiki中)会经常为您遇到的问题找到有用的解决方案。

+0

杰出的“教人鱼”答案。 – 2014-03-30 14:49:25

1

你可以像下面这样做:


(add-hook 'text-mode-hook (lambda() 
          (set (make-local-variable 'indent-region-function) 
           (lambda (s e) 
            (indent-rigidly s e tab-width))))) 
 

然后选择一个区域,打TAB。将通过制表符宽度缩进区域。然后您可以与C-x C-x交换点和标记,并再次点击TAB重复。

但是,我同意以前的答案,建议直接使用indent-rigidly