我现在试图从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();
^
在这种情况下,我会删除那个'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-d
和C-u
移动光标。在emacs中,我只知道C-v
和M-v
移动屏幕并将光标放在开头。如何将光标向下移动半个屏幕?或者如何将光标放在屏幕的中间/顶部/底部,就像vim中的H
,M
,L
那样?