首页 > 解决方案 > 从 Vim 切换到 Emacs - 如何高效地编辑代码

问题描述

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

  1. h, j, k,lC-b, C-n, C-p,C-f
  2. w,bM-f,M-b
  3. I,AC-a,C-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 h、和. 当我按下或新窗口时,它会打开并重新布局所有窗口。C-w jC-w kC-w lC-w sC-w v

到目前为止,我已经看到C-x 2C-x 3在 emacs 中打开新窗口,但它们的大小每次都会变小,因为新创建的窗口和焦点窗口现在共享焦点窗口曾经拥有的空间。为了导航,我只发现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-d和移动光标C-u。在emacs中,我只知道C-v上下M-v移动屏幕并将光标放在开头。如何将光标向下移动半个屏幕?或者,我如何将光标放在屏幕的中间/顶部/底部,如vim 中的H,M​​ , do ?L

标签: vimemacs

解决方案


与 f 一起跳跃

我会做C-r a RET DEL这不是一个好的vim。Vim 在这方面确实大放异彩。

导航窗口

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

我做了更多的缓冲区切换而不是太多的窗口导航。我不会尝试在特定窗口中获取缓冲区。

我通过任务切换来完成任务,而不是同时查看多个窗口,您可能会有所不同。我使用 helm 并使用符号标签非视觉方法。事情是这样的,我感觉我需要别的东西,我认为与之相关的单词,我点击C-x b,我输入单词,这个东西在 helm-minibuffer 的顶部。

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

复制粘贴,移动线条等。

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

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

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

移动光标

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

祝你好运。


推荐阅读