【问题标题】:Emacs: how to toggle between two tab widths via hotkeyEmacs:如何通过热键在两个选项卡宽度之间切换
【发布时间】:2013-04-27 05:04:34
【问题描述】:

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

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

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

【问题讨论】:

标签: emacs keyboard-shortcuts


【解决方案1】:

要将某些东西绑定到一个键,它必须是一个命令,它是用于交互使用的函数的 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 oM-8 C-c oc-basic-offset 分别设置为 2 或 8。尝试阅读 interactive 函数的文档,它提供了更多功能。

【讨论】:

  • 请注意,直接绑定到M-2 会影响其原始绑定digit-argument,因此请确保在尝试第二个示例之前恢复它。
  • 是的,您绝对想要破坏默认的M-2M-8 绑定。 更好地 使用它们来提供数值,正如 immerrr 所展示的那样。仅供参考,C-c LETTER(适用于任何大写或小写字母)和功能键 <f5><f9> 是为最终用户保留的,因此绑定完全安全。
  • 破坏默认的M-2M-8 绑定有什么问题?您仍然可以使用 C-2C-8 以及 C-M-2C-M-8 访问相同的功能,因此为同一操作使用三个不同的键盘快捷键似乎有点多余...
  • @immerrr:感谢您的建议,但不幸的是它不起作用。按键盘快捷键在我的 init.el 文件或 .c 文件中无效。将 c-basic-offset 更改为 tab-width 会使键更改我的 init.el 中 单行 的选项卡宽度,但在 .c 文件中仍然无效。
  • Malvineous:这种冗余很方便,因为它经常使您能够在键入数字参数和命令绑定时按住一个修饰符。例如C-5 C-f vs M-5 M-f -- 在每种情况下,您只需在按住修饰符的同时键入 5 f。破坏其中一个,你就会失去执行一系列命令的效率。
【解决方案2】:

我知道这不是准确您要求的,但这是我在 .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)

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-09
      • 2020-11-24
      • 1970-01-01
      • 2011-01-20
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多