Emacs:如何通过热键在两个标签宽度之间切换

时间:2013-04-27 05:04:34

标签: emacs keyboard-shortcuts

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

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

我有点卡住,因为你在配置文件中使用“setq”但是这不是Mx的有效命令,并且尝试将函数分配给全局密钥M-2不会覆盖默认函数分配给这个键,似乎我可能不得不为我想要编辑的每种类型的文件使用一个钩子或东西,这很快就让我头脑发热!

3 个答案:

答案 0 :(得分:3)

要将某些内容绑定到某个键,它必须是一个命令,它是用于交互式使用的函数的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函数的文档,它还有很多东西要提供。

答案 1 :(得分: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)

它具有相当合理的助记符,并且不会破坏任何其他绑定。

答案 2 :(得分:0)

我最终结合使用了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,或者设置不同标签宽度的任何其他数字。