从 Vim 切换到 Emacs - 如何高效地编辑代码
Switching from Vim to Emacs - How to efficiently edit code
目前我尝试从 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
- ...
但是对于我习惯的一些 "more advanced" 功能,我不确定 emacs 的处理方式是什么。
以下是我在使用 emacs 时在当前工作流程中遇到的一些问题。
请告诉我 emacs 的人是如何做这些事情的(显然 不使用 vim 仿真 )或者替代的 emacs 友好的工作流程是什么。
跳f
当我在 vim 中写了一些东西并注意到,我需要更改那行中的一些东西我可以使用 f
简单地跳转到它
int foo = caallFoo();
^
在这种情况下,我会 Fad
删除那个 'a'。在 emacs 中,我目前 M-b
和 C-f
直到找到我要编辑的字符。我尝试使用 Ace Jump(这是一个不错的插件),但是对于我目前所处的队列,我仍然感觉很糟糕。
那么在不发疯的情况下快速在一行中导航的 emacs 方法是什么?
导航windows
我的工作流程通常包括在 vim 中打开多个 windows(比如一个文件浏览器、4 个代码 windows 和一个标签栏)并使用 [=34= 进行导航]、C-w j
、C-w k
和 C-w l
。当我按 C-w s
或 C-w v
一个新的 window 时,它会打开并重新布局所有 windows.
到目前为止,我已经在emacs中看到C-x 2
和C-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 次插入‘/’”)
- 如何更好地 copy/cut/paste 整行?或者有什么选择?
- 如何重复上一个不是动作的动作?
移动光标
我在查看代码时喜欢做的更简单的移动是使用 C-d
和 C-u
移动光标。在 emacs 中,我只知道 C-v
和 M-v
上下移动屏幕并将光标放在开头。如何将光标向下移动半屏?或者我如何将光标放在屏幕的 middle/top/bottom 中,如 H
、M
、L
在 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快(hjkl
比C-n/p/b/f
快),但emacs提倡有效编辑。例如:
移动cursor/Jump
ace-jump-mode 很不错。我将跳跃模式绑定到 F9
.
(define-key global-map (kbd "<f9>") 'ace-jump-mode)
- 按
F9
- 以单词开头跳转到屏幕的任何地方
char
- 输入字符索引
导航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 ...
切换框架,非常方便。
Emacs 像 IDE 一样工作,很重; Vim喜欢编辑器,轻量级
我同时使用 vim 和 emacs,如果您能够理解 emacs,它确实可以做得很好。
- avy-goto-char avy-goto-char-2 avy-goto-line
- (setq avy-all-windows) 将允许上述命令导航到任何地方,甚至导航 windows.
- 查看 doom emacs 如何处理 windows 和其他一切。如果您忽略邪恶的部分,它基本上是一个配置出色的 emacs。通过其他人如何使用它来学习如何最好地使用 emacs,doom 是一个很好的参考。
- 您可以边学习边回答的其他问题
目前我尝试从 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
- ...
但是对于我习惯的一些 "more advanced" 功能,我不确定 emacs 的处理方式是什么。
以下是我在使用 emacs 时在当前工作流程中遇到的一些问题。
请告诉我 emacs 的人是如何做这些事情的(显然 不使用 vim 仿真 )或者替代的 emacs 友好的工作流程是什么。
跳f
当我在 vim 中写了一些东西并注意到,我需要更改那行中的一些东西我可以使用 f
简单地跳转到它
int foo = caallFoo();
^
在这种情况下,我会 Fad
删除那个 'a'。在 emacs 中,我目前 M-b
和 C-f
直到找到我要编辑的字符。我尝试使用 Ace Jump(这是一个不错的插件),但是对于我目前所处的队列,我仍然感觉很糟糕。
那么在不发疯的情况下快速在一行中导航的 emacs 方法是什么?
导航windows
我的工作流程通常包括在 vim 中打开多个 windows(比如一个文件浏览器、4 个代码 windows 和一个标签栏)并使用 [=34= 进行导航]、C-w j
、C-w k
和 C-w l
。当我按 C-w s
或 C-w v
一个新的 window 时,它会打开并重新布局所有 windows.
到目前为止,我已经在emacs中看到C-x 2
和C-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 次插入‘/’”)
- 如何更好地 copy/cut/paste 整行?或者有什么选择?
- 如何重复上一个不是动作的动作?
移动光标
我在查看代码时喜欢做的更简单的移动是使用 C-d
和 C-u
移动光标。在 emacs 中,我只知道 C-v
和 M-v
上下移动屏幕并将光标放在开头。如何将光标向下移动半屏?或者我如何将光标放在屏幕的 middle/top/bottom 中,如 H
、M
、L
在 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快(hjkl
比C-n/p/b/f
快),但emacs提倡有效编辑。例如:
移动cursor/Jump
ace-jump-mode 很不错。我将跳跃模式绑定到 F9
.
(define-key global-map (kbd "<f9>") 'ace-jump-mode)
- 按
F9
- 以单词开头跳转到屏幕的任何地方
char
- 输入字符索引
导航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 ...
切换框架,非常方便。
Emacs 像 IDE 一样工作,很重; Vim喜欢编辑器,轻量级
我同时使用 vim 和 emacs,如果您能够理解 emacs,它确实可以做得很好。
- avy-goto-char avy-goto-char-2 avy-goto-line
- (setq avy-all-windows) 将允许上述命令导航到任何地方,甚至导航 windows.
- 查看 doom emacs 如何处理 windows 和其他一切。如果您忽略邪恶的部分,它基本上是一个配置出色的 emacs。通过其他人如何使用它来学习如何最好地使用 emacs,doom 是一个很好的参考。
- 您可以边学习边回答的其他问题