0

我正在 Emacs 中编辑两个不同的代码库,一个使用设置为两个空格的制表符,一个使用设置为八个空格的制表符(Linux 内核)。由于内核使用制表符进行对齐,因此我想在处理内核文件时即时调整制表符大小。

我希望能够按 M-2 将标签宽度设置为 2,按 M-8 将标签宽度设置为 8。我希望这些键能够在所有模式下工作,无论我是在处理 C 代码、在 Makefile 中还是在普通文本文件中。我希望其余的活动 Emacs 编码风格保持不变。

我有点卡住了,因为您在配置文件中使用了“setq”,但这不是 Mx 的有效命令,并且尝试将功能分配给全局键 M-2 不会覆盖分配给此的默认功能关键,似乎我可能不得不为我想要编辑的每种类型的文件使用钩子或其他东西,这很快就让我头疼了!

4

3 回答 3

4

要将某些内容绑定到键,它必须是command,这是 Emacs 函数的名称,用于交互使用,所以这是一个函数:

(defun set-c-basic-offset-2 ()
  (setq c-basic-offset 2))

这是一个命令:

(defun set-c-basic-offset-2-command ()
  (interactive)
  (setq c-basic-offset 2))

现在你可以做

(global-set-key (kbd "M-2") 'set-c-basic-offset-2-command)

或者,或者,你可以做

(defun set-c-basic-offset-command (offset)
  (interactive "p")
  (setq c-basic-offset offset))
(global-set-key (kbd "C-c o") 'set-c-basic-offset-command)

您可以使用M-2 C-c o和分别M-8 C-c o设置c-basic-offset为 2 或 8。尝试阅读有关interactive功能的文档,它可以提供更多功能。

于 2013-04-27T11:23:04.007 回答
1

我知道这不正是您所要求的,但这是我在 .emacs 中实际使用的东西来完成相同的任务:

(defun camdez/toggle-tab-width ()
  "Toggles `tab-width' between 8 and 2."
  (interactive)
  (setq tab-width
        (if (= tab-width 2)
            8
          2))
  (message "Tab width set to %d." tab-width))

(global-set-key (kbd "C-c TAB") 'camdez/toggle-tab-width)

它有一个相当合乎逻辑的助记符,并且不会破坏任何其他绑定。

于 2013-04-30T03:23:30.280 回答
1

我最终结合使用 immerrr 和 camdez 的答案来实现我所追求的:

(defun set-tab-width (len)
    (interactive "p")
    (setq tab-width len)
    (force-window-update)  ; Required or tabs are only updated line-by-line during editing
    (message "Tab width set to %d." len)
)
(global-set-key (kbd "C-c t") 'set-tab-width)

这允许我按下C-8 C-c t将选项卡宽度设置为 8,或C-2 C-c t将选项卡宽度设置为 2,或设置任何其他数字以设置不同的选项卡宽度。

于 2014-03-16T03:12:11.647 回答