【问题标题】:Disable all Emacs c-mode reformatting, insertion/refusal, cursor jumps禁用所有 Emacs c-mode 重新格式化、插入/拒绝、光标跳转
【发布时间】:2016-07-29 22:52:33
【问题描述】:

我想保留 Emacs c-mode 的所有语法高亮、自动完成、命令等(我将很快添加 company-mode 或类似内容)但我想禁用 c-mode 中的所有内容:

  1. 除我 C- 或 M- 要求之外的重新格式化。

  2. 在源周围移动我的光标,即使是暂时的,除非我要求它。例如,右括号/大括号突出显示匹配的括号。

  3. 曾经 i) 插入我没有输入的任何内容(1 个 Tab = 4 个空格除外)或 ii) 因为格式化而拒绝插入我输入的内容。

  4. 出于任何原因重新格式化、重新分页、重新对齐或以其他方式编辑源文件,包括粘贴、保存或因为月亮凸出。

我已经设置了(setq-default c-basic-offset 4)(setq-default indent-tabs-mode nil)

我试过了:

  • C-x C-l a.k.a. c-toggle-electric-state a.k.a. (setq-default c-electric-flag nil) 修复了 4 个中的一些,但 Tab 在感觉倾斜时仍会重新格式化代码,我猜并不孤单;并且不修复 2 或 3。

  • c-auto-align-backslashes 仅修复上述一种情况。

  • (setq c-syntactic-indentation nil) 部分修复了 4,但破坏了 1 和 3(例如,Tab 不插入光标处),并且不修复 2。

  • text-mode 显然删除了我想保留的所有 c 模式功能。

  • 各种搜索和深入了解https://www.gnu.org/software/emacs/manual/html_mono/ccmode.html,它仔细记录了 2^1024 设置,但没有显示我能找到的“所有格式关闭”开关。

  • 扫描https://sourceforge.net/p/cc-mode/cc-mode/ci/default/tree/ 寻找要禁用的明显标志 (*blork*?)

我已经在这工作了好几个小时了,任何帮助都非常感激。

更新: 更多麻烦:安装 emacs 源代码 (apt-get install emacs24-el) 并使用 C-h k <key combo> 查找按键时调用的函数。 M-x find-function 浏览该源以了解它实际在做什么并寻找钩子。 (setq-default indent-tabs-mode nil) 坚持使用空格,而不是制表符。 (setq-default blink-matching-paren nil) 防止光标在关闭括号/大括号时跳转。我仍然无法禁用格式化,或达到 1、2、3 和 4,但我在打地鼠方面做得更好。

【问题讨论】:

  • 这是一个非常复杂的过程,以确保一切正常。你真的需要一个非常熟悉 C 模式的 emacs 向导。您也许可以在emacs SE site 上获得更好的答案。
  • 键入M-x describe-mode,您将看到一个*Help* 缓冲区,其中包含(部分)所有活动的键绑定。我怀疑,您希望避免的大部分行为是当您只想在键盘上插入特定字符时激活特定功能。如果您不喜欢这种行为,您可以禁用分配给特定键的每个功能。您也可以键入M-x describe-key 并按下某个键,看看它是否只是从键盘插入一个字符或调用包含不吸引您的行为的特殊函数。

标签: c emacs cursor-position autoformatting


【解决方案1】:

第一个观察:这是一个很难回答的问题,因为“禁用所做的一切......”有点不具体。不过……

第 2 项。(当您键入关闭括号时,将点暂时移动到匹配的打开括号)很容易:(setq blink-matching-paren nil)。这在“匹配括号”页面上的 Emacs 手册中。 (哎呀!你已经找到那个了)。

你不喜欢tab键的动作;你想让它做什么?它绑定到 c-indent-command,它将当前行向内或向外缩进到“正确”位置。我猜您只想插入空格以将点带到下一个 4*nth 位置。制表位到制表位怎么样?试试 (define-key c-mode-base-map "\t" 'tab-to-tab-stop)。请注意,在默认键映射中定义它是行不通的,因为主模式键映射优先于它。

完成 C-c C-l 以禁用键入时的自动缩进,例如,a ;,键入 a ;还做任何得罪的事吗?如果是这样,您可以使用 (define-key c-mode-base-map ";" 'self-insert-command) 完全禁用其“特殊”功能

再一次,你不喜欢的特定事物的列表,即使是很长的列表,也比“插入我没有输入的任何内容的所有内容”更容易处理。该模式的维护者只是不会在心里对事物进行这种分类。

不管怎样,我希望你能把事情搞定。

【讨论】:

  • “该模式的维护者只是不会在心理上那样对事物进行分类。”这是我的重点,谢谢。我使用 Emacs 的次数越多,我就越发现模式设置为“这里有 n 个具有默认设置的高度精细的功能,如果你不喜欢它们,至少可以调整 n 个‘设置’”。似乎很少有模式具有广泛的“我了解您可能不想要代码格式化,没问题”关闭开关。使用类似的点黑客攻击,我一直在禁用严重困扰我的功能,并且在发生其他事情时只需要玩捉迷藏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2016-08-07
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多