使 Emacs 选项卡的行为与 vim 完全相同
Posted
技术标签:
【中文标题】使 Emacs 选项卡的行为与 vim 完全相同【英文标题】:Making Emacs tabs behave exactly like vim's 【发布时间】:2011-09-22 05:50:03 【问题描述】:我目前正在学习 Emacs,并且正在尝试设置我的初始化文件。 目前它看起来像这样(在网络的某个地方找到它):
(setq indent-tabs-mode t)
(setq-default indent-tabs-mode t)
(global-set-key (kbd "TAB") 'self-insert-command)
(setq default-tab-width 4)
(setq tab-width 4)
(setq c-basic-indent 4)
但它的行为不像 Vim 的标签样式。
我只是希望它在使用制表符时表现得像 Vim。 这意味着不要用空格替换制表符(我认为 Emacs 默认会这样做)。
这样每个人都可以在他们喜欢的标签宽度中编辑文件。我通常使用 4 作为标签宽度。而且当我按 Backspace 时,它会向后移动相同的数字,这意味着如果我将 tab 设置为 4 并按 Tab,它会在按 Backspace 后返回 4 个字符。 它还应该始终使用 4 个空格作为制表符。因为有时在 emacs 中它不会那样做。
【问题讨论】:
Emacs 中的缩进是一个有点复杂的主题,但我认为值得花一些时间来了解一些细节。有关大量信息,请参阅 emacswiki.org/emacs/CategoryIndentation。 【参考方案1】:Vim 的选项卡处理是可以配置的,所以它不能很好地描述你想要做什么,但你的描述的其余部分有足够的信息,大部分情况下。
处理标签的最简单方法是永远不要使用它们。因此,如果以您喜欢的方式设置选项卡需要一些工作,请不要感到惊讶。
您已设置 Tab 键来插入制表符。这不是 Emacs 中的习惯:通常 Tab 键用于缩进当前行。您所做的对于默认值来说已经足够了,但是特定于语言的模式仍可能使 Tab 缩进。我从您的c-basic-indent
中推测您正在编写 C 代码;所以你需要告诉 C 模式你不希望 Tab 缩进。应该这样做:
(eval-after-load "cc-mode"
'(define-key c-mode-map (kbd "TAB") 'self-insert-command))
您遇到的另一件事是,默认情况下,Backspace 键会尝试向后移动一列而不是一个字符。以下内容应使其删除一个字符:
(global-set-key (kbd "DEL") 'backward-delete-char)
(setq c-backspace-function 'backward-delete-char)
【讨论】:
我使用 vim 默认设置,除了我使用 4 的制表位。现在这很好用,谢谢。 设置分号后,emacs 将该行向左移动两个字符。你知道怎么关掉它吗?我的初始化文件目前看起来像这样(setq indent-tabs-mode t) (global-set-key (kbd "DEL") 'backward-delete-char) (setq c-backspace-function 'backward-delete-char) ( setq-default indent-tabs-mode t) (global-set-key (kbd "TAB") 'self-insert-command) (setq default-tab-width 4) (setq tab-width 4) (setq c-basic -indent 4) (setq backup-inhibited t) (eval-after-load "cc-mode" '(define-key c-mode-map (kbd "TAB") 'self-insert-command)) (delete-selection -mode t) (setq auto-save-default nil) @rob 如果您不希望 Emacs 在您按下;
(和一些其他字符)时自动重新缩进,请在 c-mode-map
中将它们与 (eval-after-load "cc-mode" '(define-key c-mode-map ";" nil))
解除绑定。如果你的抱怨是 Emacs 没有缩进你想要的列数,告诉它你最喜欢的缩进样式是什么;见the C mode manual。以上是关于使 Emacs 选项卡的行为与 vim 完全相同的主要内容,如果未能解决你的问题,请参考以下文章