在我使用gEdit满足大部分编码需求几年后,我决定尝试新的东西,并尝试学习使用Emacs.我知道这很难,因为我听说Emacs有多复杂,但我被它的力量所吸引.最困难的事情是习惯于在.emacs文件中编写ELisp来改变编辑器的内容.我现在无法自己做,但我在这里和那里找到了一些有用的片段来改变一些选项.
我遇到很多问题的一件事是让Emacs记住我在命令后选择的文本.例如,我通常会突出显示一段代码来批量缩进它.但是,如果我在Emacs中执行此操作,它将在取消选择所有文本之前仅移动所选文本一次.有没有人知道这方面的方法?
无论如何,我为在我看来是一个简单的问题道歉,但经过一个小时的谷歌搜索并在这里搜索SO,我认为这是值得问的.我还有一些关于Emacs的问题,但我会保存它们并在我理解之后单独询问.谢谢!
UPDATE
有几个人问过我正在使用什么模式以及我输入的文本类型.虽然我对Emacs模式知之甚少,但我现在正在编辑一个纯文本文件.像这样的东西:
Hello, I am a simple text file
that is made up of three separate
lines.
Run Code Online (Sandbox Code Playgroud)
如果我突出显示所有三行并点击TAB,我会得到:
Hello, I am a simple text file
that is made up of three separate
lines.
Run Code Online (Sandbox Code Playgroud)
这很好,但是,如果我像下面的一些建议使用Cx Cx重新选择文本并再次点击TAB,我得到这个:
Hello, I am a simple text file
that is made up of three separate
lines.
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!
FWIW,这是您新添加的示例的行为的原因.(我不是在这里'解决'这个问题,但是我发布它来揭开你所看到的神秘面纱.)
这已确定emacs -q禁用我的自定义,因此以下是emacs 23.2的默认行为.
您处于文本模式.您应该(Text)在屏幕底部的模式行中看到或类似,并C-h m告诉您(在次要模式列表下)"文本模式:编辑为人类阅读的文本的主要模式".auto-mode-alist如果您访问与某些扩展名匹配的文件名(例如),则Emacs决定(通过变量)它应切换到文本模式.txt.
在文本模式下,按下突出显示区域的TAB会导致indent-according-to-mode按顺序在区域的每一行上调用.找到这个的稍微复杂的路径开始于C-h k TAB,它告诉我们TAB绑定indent-for-tab-command,在这个实例中调用indent-region- 函数名称没有在帮助中明确声明,但可以在代码中看到 - 它检查缓冲区局部indent-region-function变量,它是nil,并且:"值为nil意味着真正indent-according-to-mode在每一行上运行."
indent-according-to-mode检查indent-line-function变量,该变量具有缓冲区本地值indent-relative.
使用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").
现在重复一遍 - 再次确保您在现有缩进前面的每一行的开头.
第一行(当前是制表符)的第一个字符再次缩进到第一个制表符,因为没有前一行要检查.
接下来,第二行的第一个字符缩进以匹配前一行的第一个非空白字符的位置.因为第二行的第一个字符也是制表符,所以第二行的实际文本被进一步按下一个制表符.
第三行也是如此.它的第一个制表符与第二行的第一个非空白字符对齐,具有与之前相同的相对效果,为您提供示例中的最终状态.
要强调,请注意如果您现在在现有行上方输入"ab c"行,然后返回到下一行的开头(之前的第一行)并按TAB键会发生什么.现在,第一个制表符字符将与'b'一致缩进.如果indent-tabs-mode变量为true(意味着你有实际的制表符),那么这对单词在行中的位置没有实际影响,因为'缩进'带空格的制表符在空格数之前不会有效超过标签的宽度(但这完全是另一个鱼!)
所有这一切的真正含义是,text-mode在Emacs不行为的方式你也想在这种情况下.当然,当你按TAB时,其他主要模式可以做完全不同的事情.
正如Emacs的情况一样,你不喜欢的东西可以用elisp改变或规避.一些搜索(特别是在Emacs Wiki上)会经常为您遇到的问题提供有用的解决方案.