vim - 从 Vim 切换到 Emacs - 如何高效地编辑代码
问题描述
目前我尝试从 vim 切换到 emacs,并且在编辑代码时遇到了一些困难。对于大多数非常简单的 vim 击键,我找到了一个 emacs 版本,如简单移动
h
,j
,k
,l
是C-b
,C-n
,C-p
,C-f
w
,b
是M-f
,M-b
I
,A
是C-a
,C-e
- ...
但是对于我习惯的一些“更高级”的功能,我不确定 emacs 的做事方式是什么。
以下是我在使用 emacs 时在当前工作流程中遇到的一些问题。
请告诉我 emacs 人是如何做这些事情的(显然没有使用 vim 仿真)或替代 emacs 友好的工作流程是什么。
跳着f
当我在 vim 中写一些东西并注意到时,我需要在该行中更改一些东西,我可以用f
它来简单地跳转到它
int foo = caallFoo();
^
在这种情况下,我会Fad
删除那个'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
到目前为止,我已经看到C-x 2
并C-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
解决方案
与 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。这将循环通过这些位置。
祝你好运。
推荐阅读
- c++ - 将另一个函数作为参数的函数,“无匹配函数错误”C++
- visual-studio-code - VSCode/Cmake Tools:添加外部头库
- maven - Azure DevOps 手动将外部库发布到 Azure Artifacts?
- javascript - 用于将子级附加到函数调用者/调用者的 ES6 Javascript
- javascript - 表单中超过 1 个文件输入功能无效
- sql - 想要组合三个单独的追加查询并将最终结果显示在单行上
- node.js - 无法访问 docker 内的 Web 应用程序
- amazon-web-services - `amplify push` 失败 - 属性:找不到资源的 StreamArn
- c# - 对话框的 ViewModel 必须实现 IDialogAware 接口
- python - 如果匹配,比较两个字典提取键