【问题标题】:GNU Emacs 24.1: forcing the TAB key to insert a <tab> character in ESS modeGNU Emacs 24.1:在 ESS 模式下强制 TAB 键插入 <tab> 字符
【发布时间】:2014-07-08 00:30:42
【问题描述】:

除了插入&lt;tab&gt; (\t) 字符外,我几乎从不使用 TAB 键。继续键入 C-q TAB 来执行此操作是不可接受的,因为我主要使用 cmets 的选项卡。我的大部分代码缩进是通过 Emacs 自动匹配我的第一行手动缩进,并通过将indent-region 绑定到 C-TAB 来完成的。我主要使用 tab 键来缩进我的 cmets。我更喜欢将制表符宽度设置为 8 个字符,并将每个 cmets 缩进两个制表符字符,总共 16 个空格字符。如果 ESS 不像here 所述那样容易出现故障,我可以使用现有的缩进管理系统。我目前正在处理的文件有断行,这正是所描述的问题。目前,在该文件中,按tab 键会产生 NO 结果。

在 ESS[S] 和 ESS[SAS] 模式下如何强制 tab 键插入 tab 字符?

我已经尝试添加

(global-set-key "\C-i" 'self-insert-command)

(setq-default tab-always-indent nil)

到我的.emacs 文件,但这并没有改变 ESS 中的行为。我无法弄清楚 Emacs 在内部调用 ESS[S] 模式是什么,即,

(define-key ess-mode-map "\C-i" 'self-insert-command)

产生错误

“变量 ess-mode-map 无效。”

我尝试了ess-S-modeess-s-modeESS-S-mode 和其他几个,结果相同。

我还确认ess-mode-hookess-mode-map 是预期的钩子和映射变量。然后我尝试了

(add-hook 'ess-mode-hook (lambda () (define-key "\t" ess-mode-map 'self-insert-command)))

这不起作用。

我尝试编辑 ess-mode.el 文件并将 "\t" 的键盘映射更改为 'self-insert-command,但没有任何效果。

【问题讨论】:

  • 应该作为stackoverflow.com/q/18970809/729907的副本关闭。
  • 我争辩说,问题不在于 Emacs 插入空格而不是制表符,而是 EMACS 在 ESS 模式下按 TAB 时从不插入 (\t) 字符。我想更改默认设置。
  • 哦,好的。在这种情况下,只需在模式映射中将"\t" 绑定到self-insert-command
  • 我一直在尝试这样做,但我不知道什么叫 ess-mode。 (global-set-key "\t" 'self-insert-command) 不起作用,(define-key ess-mode-map "\t" 'self-insert-command) 失败并出现错误:“符号作为变量的值是无效的:ess-mode-map”

标签: emacs ess


【解决方案1】:

实际的解决方案很简单,只需添加:

(add-hook 'ess-mode-hook (lambda () (local-set-key "\t" 'self-insert-command)))

.emacs 文件。

【讨论】:

    【解决方案2】:

    听起来像在定义模式的代码加载之前没有定义 map 变量,或者甚至在启用模式之前没有定义。

    • 如果是第一个,则在尝试绑定密钥之前require 库。或使用eval-after-load

    • 如果是第二个,则将绑定放在模式挂钩上:

      (add-hook 'THE-MODE-HOOK (lambda () (define-key "\t" THE-MODE-MAP 'self-insert-command)))
      

    您可能需要查看源代码才能了解 THE-MODE-HOOKTHE-MODE-MAP 是什么。或者您可以从 C-h f THE-MODE 获得所需的信息,其中 THE-MODE 是模式名称。

    【讨论】:

    • 我不知道这个库叫什么。它不是“ess-library”。 “ess”似乎也不是指模式。
    • 我想说要么等待这里使用 ESS 的人的来信,要么查看 ESS 手册......或者如果你有源代码,大概你可以寻找它(例如, define-keyglobal-set-keymap 等)。如果没有,希望有人为您提供完整的答案。
    • 我正在慢慢研究 ess-mode 手册及其一些 .el 文件,谢谢您的好建议。
    • map 变量好像是ess-mode-map, defined in ess-mode.el
    【解决方案3】:

    M-i 在 Emacs 中绑定到 tab-to-tab-stop,它会不断添加 8 个空格,但我确信这是可定制的。 Indentation Commands 上还有一些命令可能对您有所帮助。

    【讨论】:

      【解决方案4】:

      我不太了解您的问题,但以下是两个备选方案:

      1. 在本地重新绑定密钥:

        (define-key ess-mode-map "\C-i" 'self-insert-command)
        
      2. 更改 ess tab 的行为,这将使 TAB 仅在行首缩进,否则将始终插入纯 tab:

        (setq ess-tab-always-indent nil)
        

      【讨论】:

      • 您会在我的问题中注意到我尝试了您的第一个建议,但它确实导致了错误,因为“ess”并不指的是 ESS 模式。
      • 然后找出当前的keymap是什么,并把它绑定进去。
      • @user2127595,首先加载 ESS 然后绑定密钥,或者按照 Drew 的建议使用 ess-mode-hook。
      • 嗯,M-x local-set-key C-m TAB self-insert-command 工作。但是我的问题中列出的模式挂钩没有。如何告诉 emacs 在加载 ESS 时绑定这个键?
      • 哇,我是个傻瓜...(add-hook 'ess-mode-hook (lambda () (local-set-key "\t" 'self-insert-command))) 工作得很好。谢谢!
      猜你喜欢
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多