邪恶的Emacs模式:句子移动和其他问题

4

我喜欢使用vim。它让我感觉就像直接进入文本并按照我的意愿进行操控一样。

话虽如此,我也喜欢Clojure、Clojurescript、Lisp和Org-mode。我真的很努力地想喜欢Emacs,尝试了Evil模式,但最后在沮丧中放弃了,用了6-8周。

考虑再次尝试,因为我看到了一些很好的Literate Programming例子,使用ractive.js和org-mode。但这次我想提前计划。在贸然冲入之前,我有一个要知道如何做的事情的短列表(如果我真的够勇敢再次尝试):

  • 句子和段落动作。 我写一些代码,但写更多的是普通文本。当我编辑时,通常会更改/删除一两个句子的末尾。我无法在evil模式下使它起作用,如果我没记错的话,甚至有一个标志来设置,似乎表明这是可能的,但我无法使其工作。evil模式解决了这个问题吗?如果没有,我该如何告诉它这种动作?
  • Leader映射和元效率映射。 直到我发现leader映射和制作映射的方法,我才真正开始在vim中变得高效。没有太过疯狂--我只是创建了一个打开我的.vimrc的映射,并在.vim文件中设置了一些缩写,这样我可以在意识到需要它的几秒钟内建立一个永久映射。emacs中可能具有等效技术吗?我如何以类似于vim的方式(即最小化弦按键)进行映射?对我来说只有ilisp吗?
  • 缓冲区命令。 我没有完全理解为什么要使用2-4个弦来更改你正在处理的文件。我愿意学习--不像我真的使用vim缓冲区,我只是不高效地不断打开文件--但找到一个教程将对我有所帮助,而不是让我以vim方式输入当我将使用evil模式。

编辑器之争很傻,emacs有许多优点,但我喜欢home row(指Vim快捷键使用Home Row)。是否有一种方法可以在保持我学到的好用的编辑器的同时获得emacs操作系统的强大功能?


1
为什么被标记为 Vim? - user2987828
4个回答

7
  • sentence and paragraph motion: I suggest you give some example commands that didn't suit your needs. I'm happy with evil's motion keys.
  • leader maps: http://wikemacs.org/index.php/Evil that doc should show you how to do things with emacs. Defining keys look like the following:

    (define-key evil-normal-state-map "q" 'ido-kill-buffer) ; was previously record macro
    

    Also be sure to read the official pdf doc. Also look at the examples of key-chord mode.

  • buffer commands: true, managing buffers should be quicker. Do you know ido-mode ? Here's how I use a combination of key-chord and ido:

    (key-chord-define-global "'b" 'ido-switch-buffer)
    

    and I have similar keys for next-buffer and previous-buffer. I think it's much quicker than finding the file path on a terminal to launch vim. Also I can't do without projectile to find new files: https://github.com/bbatsov/projectile

现在你有更精确的问题吗?

编辑: 关于到句子结尾的位置:

所以,evil使用evil-forward-sentence,但是它的行为与vim不同(见评论)。Emacs有forward-sentence,但它的行为相同。我找不到一个具有期望效果的函数。

forward-sentence基于sentence-end变量(使用M-x ielm查看),该变量是定义行尾的正则表达式。因此可以重新定义它。这里有一个简单的例子,需要扩展:

    (setq sentence-end "[\\.\\?\\!] +") ;; . or ? or ! followed by spaces.

现在,forward-sentence 命令将停在下一个句子结尾。我们可以重新映射 evil 的 ) 键:

    (define-key evil-normal-state-map ")" 'forward-sentence)

我会尽量表达得更清楚一些。在使用 vim 时,当我按下 ')' 键时,它会将光标移动到当前句子的末尾,无论这个句子以 '.'、'?' 还是 '!' 结尾。但是,在使用 evil-emacs 时,按下 ')' 键会将光标移动到行末。对于编辑代码来说可能还好,但我更经常编辑纯文本,因此我更需要“更改到句子末尾”的语义而不是行末。 - tom

1
来晚了,但答案是Evil使用了emacs的句子定义方式,与vim的不同。要接近vim的版本,请将设置为:
(setf sentence-end-double-space nil)

Emacs手册警告

如果您想在句子之间使用一个空格,可以将变量sentence-end-double-space设置为nil,使句子命令停止单个空格。但是,这有一个缺点:无法区分结束句子和表示缩写的句点。为了方便和可靠的编辑,我们建议您遵循两个空格的约定。


1

如果你有两个孩子,你会要求其中一个像另一个一样优秀吗?

关于Emacs,忘记按键,忘记vi模仿,从命令开始。如果一个命令绑定到一个键上,Emacs会告诉你,不需要显式地学习它。

Emacs的关键在于其可扩展性。尝试M-x kill-sentence RET。不起作用?回到这里提出更改请求,你将在一两分钟内得到答复 :-)


3
Emacs 的可扩展性最好的一点可能是你能够像 vi 一样模仿操作。 - Pandu

1

当我编辑散文时,我使用的解决方案是使用:

f.

"and"。
F.

它不像Vim的句子运动那样优雅,但是它可以达到效果。如果您不想将光标停在句号上,您也可以使用“t”命令。与其他运动命令一样,它可以与其他按键组合以进行删除或其他任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接