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

Switching from Vim to Emacs - How to efficiently edit code

目前我尝试从 vim 切换到 emacs,但在编辑代码时遇到了一些困难。对于大多数非常简单的vim击键,我找到了一个像简单移动

的emacs版本
  1. hjkl分别是C-bC-nC-pC-f
  2. wbM-fM-b
  3. IAC-aC-e
  4. ...

但是对于我习惯的一些 "more advanced" 功能,我不确定 emacs 的处理方式是什么。

以下是我在使用 emacs 时在当前工作流程中遇到的一些问题。
请告诉我 emacs 的人是如何做这些事情的(显然 不使用 vim 仿真 )或者替代的 emacs 友好的工作流程是什么。

f

当我在 vim 中写了一些东西并注意到,我需要更改那行中的一些东西我可以使用 f 简单地跳转到它

int foo = caallFoo();
                     ^

在这种情况下,我会 Fad 删除那个 'a'。在 emacs 中,我目前 M-bC-f 直到找到我要编辑的字符。我尝试使用 Ace Jump(这是一个不错的插件),但是对于我目前所处的队列,我仍然感觉很糟糕。

那么在不发疯的情况下快速在一行中导航的 emacs 方法是什么?

导航windows

我的工作流程通常包括在 vim 中打开多个 windows(比如一个文件浏览器、4 个代码 windows 和一个标签栏)并使用 [=34= 进行导航]、C-w jC-w kC-w l。当我按 C-w sC-w v 一个新的 window 时,它会打开并重新布局所有 windows.

到目前为止,我已经在emacs中看到C-x 2C-x 3打开新的windows,但是它们的大小每次都变小,因为新创建的[=132] =] 和 focused window 现在共享 space focused window 曾经拥有的。为了导航,我只找到了 C-x o,它只是在 windows 中循环,并且不允许我选择要转到的特定 window。

我看到有些人使用插件来获得更健全的多 window 工作流程。
emacs 中已经内置了一些很好的 window-navigation 还是我应该找一个插件来完成这项工作?或者我的工作流程有大约 4-6 windows 我不应该在 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 上下移动屏幕并将光标放在开头。如何将光标向下移动半屏?或者我如何将光标放在屏幕的 middle/top/bottom 中,如 HML 在 vim?

中做

跟着f跳

我会 C-r a RET DEL 那不如 vim。 Vim在这方面真是大放异彩。

导航Windows

我的工作流程是有两个 windows,这让我 C-x o 总是做我想做的事。

我做了很多缓冲区切换而不是 window 导航。我不会尝试获取缓冲区,特别是 windows.

我是多任务切换任务,不是同时看多个windows,你可能不一样。我使用 helm 并使用符号标签非可视化方法。事情是这样的,我觉得我需要别的东西,我想和它相关的词,我打C-x b,我打字,那个东西在helm-minibuffer的顶部。

您或许可以找到适合您风格的多重 window 工作流程。

复制粘贴、移动行等

kill-whole-line 绑定到 C-S-backspace

c-u 80 / C-S-backspace // SECTION C-y

我不知道如何重复最后一个不是动作的动作。我经常录制一个宏,即使是我要使用两次的简短内容。

移动光标

C-l 会调用 recenter-top-bottom。这将循环通过这些位置。

祝你好运。

首先,你应该忘记 Vi(m)。他们有不同的设计理念

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

移动cursor/Jump

ace-jump-mode 很不错。我将跳跃模式绑定到 F9.

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

导航Window

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

我认为 emacs split window 比 vim(:split) 好,但是 switch window 比 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 ...切换框架,非常方便。

我也推荐company and helm/ivy


Emacs 像 IDE 一样工作,很重; Vim喜欢编辑器,轻量级

我同时使用 vim 和 emacs,如果您能够理解 emacs,它确实可以做得很好。

  1. avy-goto-char avy-goto-char-2 avy-goto-line
  2. (setq avy-all-windows) 将允许上述命令导航到任何地方,甚至导航 windows.
  3. 查看 doom emacs 如何处理 windows 和其他一切。如果您忽略邪恶的部分,它基本上是一个配置出色的 emacs。通过其他人如何使用它来学习如何最好地使用 emacs,doom 是一个很好的参考。
  4. 您可以边学习边回答的其他问题