从Vim转换到Emacs - 如何高效地编辑代码

4

我现在试图从vim切换到emacs,但在编辑代码时遇到了一些困难。对于大多数非常简单的vim按键,我找到了一个类似的emacs版本,比如:

  1. h, j, k, l 对应的是 C-b, C-n, C-p, C-f
  2. w, b 对应的是 M-f, M-b
  3. I, A 对应的是 C-a, C-e
  4. ...

但对于一些我习惯的“更高级”的功能,我不确定emacs该怎么做。

以下是我使用emacs时存在的一些问题。
请告诉我emacs用户如何处理这些问题(显然不能使用vim仿真),或者提供替代的emacs友好型工作流程。

使用f进行跳转

当我在vim中编写某些内容时,如果发现需要更改该行中的某些内容,可以使用f快速跳转到它。

int foo = caallFoo();
                     ^

在这种情况下,我会删除那个'a'。在emacs中,我目前使用'M-b'和'C-f'直到找到要编辑的字符。我尝试使用Ace Jump(一个不错的插件),但是对于在当前行跳跃,仍然感觉很糟糕。
那么,在不发疯的情况下,快速定位一行的emacs方式是什么呢?
浏览窗口
我的工作流通常包括在vim中打开多个窗口(比如一个文件浏览器、4个代码窗口和一个标签栏),导航使用'C-w h'、'C-w j'、'C-w k'和'C-w l'。当我按下'C-w s'或'C-w v'时,一个新窗口会打开并重新布局所有窗口。
到目前为止,我已经了解到在emacs中使用'C-x 2'和'C-x 3'打开新窗口,但它们的大小会变小,因为新创建的窗口和焦点窗口现在共享焦点窗口曾经拥有的空间。要导航,我只发现了'C-x o',它只是循环遍历窗口,不允许我选择要去的特定窗口。
我看到有些人使用插件获得更加合理的多窗口工作流程。
在emacs中是否已经构建了一些良好的窗口导航工具,或者我应该找到一个可以完成这项工作的插件?或者说,我的工作流程中有大约4-6个窗口,这在emacs中应该不做吗?
复制、粘贴、移动行等
我喜欢在代码文件中创建注释来视觉标记某些部分。
////////////////////////////////////////////////////////////////////////////////
// SECTION
////////////////////////////////////////////////////////////////////////////////

在vim中,我可以用类似于80a/<ESC>yyppklC的方式创建它(追加80次'/',复制该行并将其粘贴两次,在第二行中更改第二个'/'之后的所有内容),然后输入名称。

在emacs中,第一行的创建同样容易C-u 80/(写入80个'/'),但是复制粘贴需要类似于C-a C-SPC C-e M-w <ENTER> C-y <ENTER> C-y(跳到该行开始位置,设置一个标记,跳到该行结束位置,复制全部内容,新建两个行并粘贴)。然后,要编写章节标题,使用C-a C-p C-f C-f C-k(跳到上一行,跳到开头,向右移动两个字符,删除直到结尾)。

我的emacs变体使用了很多按键,并且在概念上更加复杂。如果我能像vim一样重复最后一个操作,我就不会遇到复制粘贴的问题(在vim中80a/<ESC>j.j.),但是在emacs中,重复最后一个命令将导致导航到下一行,而不是“连续插入'/'80次"。

  • 如何更好地复制/剪切/粘贴整行?还有什么替代方法吗?
  • 如何重复不是运动的最后一个操作?

移动光标

在查看代码时,我喜欢使用C-dC-u移动光标。在emacs中,我只知道C-vM-v移动屏幕并将光标放在开头。如何将光标向下移动半个屏幕?或者如何将光标放在屏幕的中间/顶部/底部,就像vim中的HML那样?


答案:切换到VIM。(抱歉,我忍不住了) - AndreasT
3个回答


0

我同时使用vim和emacs,如果你能够掌握emacs,它真的可以做得很好。

  1. avy-goto-char avy-goto-char-2 avy-goto-line
  2. (setq avy-all-windows)将允许上述命令在任何地方导航,甚至导航窗口。
  3. 看看doom emacs如何处理窗口和其他所有事情。如果你忽略邪恶部分,它基本上是一个配置优秀的emacs。通过观察他人如何使用emacs来学习如何最好地使用它,而doom是一个很好的参考。
  4. 随着学习的深入,你可以自己回答其他问题。

0

首先,你应该忘记Vi(m)。它们有不同的设计哲学

编辑代码vim比emacs(hjklC-n/p/b/f更快),但是emacs倡导有效的编辑,例如:

移动光标/跳转

ace-jump-mode非常好用。我将跳转模式绑定到F9

(define-key global-map (kbd "<f9>") 'ace-jump-mode)
  1. 按下 F9
  2. 跳转到任何以单词开头的屏幕 char
  3. 输入字符索引

导航窗口

  • C-x 3 垂直分割框架
  • C-x 2 水平分割框架
  • C-x 1 关闭当前以外的其他框架(不关闭文件)
  • C-x 0 关闭当前框架

我认为 Emacs 的分割窗口比 Vim (:split) 更好,但切换窗口比 Vim (C-x o) 麻烦。您可以使用 emacs-winum

(setq winum-keymap
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "C-c `") 'winum-select-window-by-number)
      (define-key map (kbd "M-0") 'winum-select-window-0-or-10)
      (define-key map (kbd "M-1") 'winum-select-window-1)
      (define-key map (kbd "M-2") 'winum-select-window-2)
      (define-key map (kbd "M-3") 'winum-select-window-3)
      (define-key map (kbd "M-4") 'winum-select-window-4)
      (define-key map (kbd "M-5") 'winum-select-window-5)
      (define-key map (kbd "M-6") 'winum-select-window-6)
      (define-key map (kbd "M-7") 'winum-select-window-7)
      (define-key map (kbd "M-8") 'winum-select-window-8)
      map))

通过 Meta + 0/1/2/3 ... 切换框架,非常方便。

我还推荐 companyhelm/ivy


Emacs像集成开发环境一样沉重;Vim则像编辑器一样轻便。


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