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

时间:2019-03-22 07:23:50

标签: vim emacs

当前,我尝试从vim切换到emacs,并且在编辑代码时遇到一些困难。对于大多数非常简单的vim击键,我发现了emacs版本,例如简单的移动方式

  1. hjklC-bC-nC-pC-f
  2. wbM-fM-b
  3. IAC-aC-e
  4. ...

但是对于我习惯的一些“更高级”功能,我不确定emacs做事的方式是什么。

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

使用f

当我在vim中写一些东西并注意时,我需要在那一行进行更改,我可以使用f来跳转

int foo = caallFoo();
                     ^

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

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

导航窗口

我的工作流程通常包括在vim中打开多个窗口(例如,一个文件浏览器,4个代码窗口和一个标签栏),并使用C-w hC-w jC-w kC-w l。当我按下C-w sC-w v一个新窗口时,它将打开并重新布局所有窗口。

到目前为止,我已经在emacs中看到C-x 2C-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会上下移动屏幕并将光标放在开头。如何将光标向下移动半个屏幕?或者或者如何将光标放置在屏幕的中间/顶部/底部,如HML在vim中所做的那样?

3 个答案:

答案 0 :(得分:2)

使用f跳转

我会C-r a RET DEL来做,那不是vim。 Vim确实在这一领域大放异彩。

导航Windows

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

我做了很多缓冲区切换,没有太多的窗口导航。我不会尝试在特定的窗口中获取缓冲区。

我通过任务切换来多任务,而不是同时查看多个窗口,您可能会有所不同。我使用头盔,并使用符号标签的非可视方法。就像这样,我觉得我还需要其他东西,我认为与之相关的单词,我击中C-x b,键入这些单词,该单词位于掌舵小缓冲区的顶部。

您可能会找到适合您风格的多窗口工作流程。

复制粘贴,移动线等

C-S-backspace上有一条全杀线。

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

我不知道该如何重复上一个不是动作的动作。我经常会录制一个宏,即使我打算使用两次,也可以录制简短的内容。

移动光标

C-l将称为“ laster-top-bottom”。这将循环这些位置。

祝你好运。

答案 1 :(得分: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就像IDE一样沉重; Vim就像编辑器一样,轻巧。

答案 2 :(得分:0)

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

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