天道酬勤,学无止境

Emacs 全局配置选项卡(Emacs global configuration of tabs)

问题

我正在尝试从 Vim 切换到 Emacs,但我正在努力配置它以按照我的意愿处理选项卡。 我要求:

  • 插入“制表符”以展开成两个空格。 无论我做什么,Emacs 都坚持使用 8。
  • 制表符(即真正的\t字符)在屏幕上由两个空格表示。
  • 按 T​​AB 应该在光标处插入一个制表符,而不是缩进整行。 目前,我在任何地方按 TAB,Emacs 会破坏行首的所有空格; 这是迄今为止最令人愤怒的事情。

我当前的~/.emacs读取

(setq standard-indent 2)
(setq-default indent-tabs-mode nil)

但是我已经尝试过网络上建议的配置,但没有一个能做到他们所说的那样。 (API 是否不断变化?显然,我正在使用GNU Emacs 23.1.1 。)

回答1

Emacs 对处理缩进具有极其灵活的支持。 通常,您所处的模式决定了它们的工作方式 - 因此,如果您正在处理 C 文件,那么按 Tab 的工作方式将不同于您正在处理 Python 文件。

因此,它确实取决于您使用的模式,这将限制您获得的答案。 在大多数情况下,我建议您不要反对它——对我来说,缩进行为是 emacs 的最佳特性之一。 但是,您确实需要花时间为自己定制它。

要更改选项卡的显示方式,您需要将 tab-width 设置为 2。如果您正在编辑 Java 或 C 样式代码,那么听起来您想将这些漂亮的缩进功能关闭为 NIL:

  • c-tab-总是缩进
  • c-句法缩进
  • 缩进标签模式

我建议你通过自定义界面设置这些。 如果您使用“Mx customize-group RET C”,那么您可以看到 C 模式的各种设置。

如果您正在编辑不同类型的文件,那么说明会有所不同。

也许 emacs 对您的文件处于错误的模式。 您可以尝试执行“Mx basic-mode”来查看您是否更喜欢那里的行为。

回答2
;; * Inserted "tabs" to be expanded into two spaces. Emacs stubbornly
;;   sticks to eight, no matter what I do.

;; * Tabs (i.e. real \t characters) to be represented on screen by two
;;   spaces.

(setq-default tab-width 2)


;; * Pressing TAB should insert a tab at the cursor rather than indent
;;   the entire line. Currently, I press TAB anywhere and Emacs
;;   destroys all whitespace at the start of the line; this is the
;;   most infuriating thing so far.

(setq-default indent-tabs-mode t)

(mapcar (lambda (hooksym)
          (add-hook hooksym
                    (lambda ()
                      (kill-local-variable 'indent-tabs-mode)
                      (kill-local-variable 'tab-width)
                      (local-set-key (kbd "TAB") 'self-insert-command))))

        '(
          c-mode-common-hook

          ;; add other hook functions here, one for each mode you use :-(
          ))

;; How to know the name of the hook function?  Well ... visit a file
;; in that mode, and then type C-h v major-mode RET.  You'll see the
;; mode's name in the *Help* buffer (probably on the second line).

;; Then type (e.g.) C-h f python-mode; you'll see blather about the
;; mode, and (hopefully) somewhere in there you'll see (again e.g.)
;; "This mode runs the hook `python-mode-hook', as the final step
;; during initialization."
回答3

这应该可以得到你想要的大部分。 您可能必须自定义一些您常用的其他编程模式。

(defun insert-tab ()
  "self-insert-command doesn't seem to work for tab"
  (interactive)
  (insert "\t"))
(setq indent-line-function 'insert-tab)  ;# for many modes
(define-key c-mode-base-map [tab] 'insert-tab) ;# for c/c++/java/etc.
(setq-default tab-width 2)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 你使用 Emacs 标签栏吗?(Do you use Emacs tabbar?)
    问题 emacs tabbar.el 包向每个窗口添加(缓冲区)选项卡,并且是 aquamacs 的标准配置,可以使用 emacs-goodies-el 包添加到 emacs23。 你们中的铁杆 emacs 用户是否真的在使用 tabbar? 我有点习惯使用选项卡,但我想知道没有它们的工作是否会更有效率,以及除了检查您的缓冲区列表 (Cx Cb) 之外是否还有其他方法可以了解您当前的项目文件。 作为旁注,我真的很喜欢 textmate 的项目抽屉(和选项卡),但是 emacs 中的任何类似内容看起来都非常可怕。 回答1 我试过使用它,但我觉得它限制了我的工作流程而不是改进它。 有很多优秀的 Emacs 模式可以帮助组织许多缓冲区,我只是不觉得将缓冲区映射到选项卡是其中一种方式。 想想最基本的场景——很多选项卡。 不同的程序如何处理 - 限制最大选项卡(IntelliJ IDEA); 启用标签栏滚动(Firefox); 无限缩小标签大小(谷歌浏览器); 创建选项卡行(IntelliJ IDEA)...这些解决方案都不是那么好,而且由于在 Emacs 中没有选项卡,我们可以少担心一个问题。 至少这是我的主观意见 - 其他人肯定会不同意......我个人只需要ido和iswitchb 。 ido 在行动的视频:http://www.youtube.com/watch?v
  • Emacs 上的选项卡式窗口(Tabbed windows on Emacs)
    问题 我正在尝试像 vim 那样在 Windows 中获取多个选项卡。 在 vim 中,选项卡不绑定到缓冲区,您可以有多个选项卡,每个选项卡中都有多个拆分和缓冲区。 到目前为止我发现的是: tabbar:显示所有标签。 winring:不在窗口中显示选项卡并且使用起来很笨拙(必须首先命名每个选项卡)。 这是最接近我想要的。 如果可能的话,有人有任何想法吗? Tabs + emacs 很难搜索; 我发现的大部分内容都是关于空格与制表符的讨论:) 更新:这张照片显示了我想要的东西。 多个选项卡和每个选项卡上的一堆拆分缓冲区。 回答1 我使用一种叫做 ElScreen 的东西,它允许我做你正在寻找的东西。 实际上,当我决定开始使用 Emacs 时,我也希望从 VIM 获得此功能。 以下是我用于 ElScreen 的代码,我什至使用了与您在 VIM 中使用的相同类型的键绑定。 Control-C ,后跟 tabe 或 tabd 以模拟 VIM 中的:tabe或:tabd 。 要遍历下一个屏幕或在这种情况下的选项卡,我使用Control Meta _和Control Meta + 。 ;; --------------------------------------- ;; load elscreen ;; ---------------------------------------
  • 什么是最好的 Emacs 工作区插件? [关闭](What is the best Emacs workspaces plugin? [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 2 个月前关闭。 改进这个问题 通过工作区,我的意思是 - 我需要保存我打开的缓冲区的状态(可能在用户指定的工作区文件中)并快速切换到另一组打开的缓冲区,例如继续处理与另一个项目相关的文件。 是否有允许这样做的 Emacs 插件? 你会推荐哪一个? 回答1 我使用保存访问文件和工作组的组合。 事实上,工作组可能会自行完成您想要的大部分工作。 我的配置: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; workgroups for windows (setq wg-prefix-key (kbd "C-c z") wg-no-confirm t wg-file (concat emacs-persistence-directory "workgroups") wg-use-faces nil wg-switch-on-load nil) (defun wg-load-default () "Run `wg-load' on `wg-file'." (interactive) (wg-load wg-file)) (defun wg-save
  • 像 Emacs 一样更改 Eclipse 选项卡以正确缩进行(Change Eclipse tab to correctly indent line as Emacs does)
    问题 在 Emacs 中,当我在一行中的任意位置点击 tab 时,该行将正确缩进(或至少缩进到模式设置)。 当我再次点击 Tab 时,它将移回下一个块。 在编程 Python 时,这真的很有帮助,因为关闭块是通过降低缩进级别来完成的。 有没有办法配置 Eclipse 来做同样的事情? 目前,我必须擦除前导空白,然后点击 Tab。 这个问题是超级用户问题的重新发布。 回答1 尝试 ctrl-i(osx 上的 Cmd-i)来缩进当前行或 eclipse 中的选择(如果您使用的是默认键绑定而不是 emacs)。 或者,如果您想要不同的键绑定,请转到外观 > 常规 > 键并将Correct Indentation的绑定更改为您选择的键 回答2 在 Eclipse 中,转到 Windows -> Preference -> Java -> Formatter。 在“活动配置文件”下拉框中,选择任何配置文件,单击其右侧的“编辑”。 在打开的配置文件对话框中,您可以更改很多内容,例如缩进、换行、大括号、空格等。 或者,如果您的配置文件与标准配置文件完全不同,请创建一个新的活动配置文件,然后进行相应的编辑。
  • 建议的初始 Emacs 配置?(Suggested initial Emacs config?)
    问题 我想尝试 Emacs,并想给它最好的机会。 为此,拥有一个好的.emacs文件似乎很重要。 我主要使用 Mac OS X(所以我看过 Aquamacs),我主要做 Python 编程,所以任何专门用于它的东西都会很棒。 回答1 我建议从一个空白的 .emacs 文件开始。 然后浏览教程和相关的博客文章,并在学习中成长。 使用从其他人那里借来的 .emacs 文件似乎有点像错过了重点。 回答2 这是一个很难回答的问题。 我对 Emacs 的理论是你必须真正诚实地尝试它。 这意味着使用它几个月,而不是几天。 它不适合胆小的人! 理想情况下,emacs 将成为您唯一的文本编辑器,并且您以 emacs 的方式做事。 真的,为了给自己和 emacs 最好的机会,你应该学习足够的 elisp 来做你自己的基本定制。 事实上,我认为你的 .emacs 可能是关于给 emacs 最好机会的阅读鲱鱼。 相反,尝试一些 groovier 的特性,比如带 pylint 的 flymake、劣质的 python 进程、用 emacs 调试 python 都是值得的。 特别是劣质工艺是炸弹。 EmacsWiki 有一些关于 python 和 emacs 的好信息。 回答3 我发现的最重要的配置更改不是针对您的 .emacs,而是针对您的操作系统。 在“键盘和鼠标”系统首选项的“键盘”选项卡中
  • Emacs 全局设置键到 C-TAB(Emacs global-set-key to C-TAB)
    问题 我正在尝试在 Emacs 中将键绑定设置为 Ctrl+TAB。 我使用了以下电话: (global-set-key (read-kbd-macro "C-TAB") 'my-func) 但是,每当我使用它时,我都会得到一个 <C-tab> is undefined 错误信息。 尝试将绑定设置为“C-tab”会导致错误消息。 如何将绑定设置为 C-TAB? 回答1 与其他人建议的不同,如果您想在其他版本的 Emacs 中使用相同的配置文件,最好使用kbd (或read-kbd-macro ,这基本上是相同的); kbd适用于 Emacs 和 XEmacs 的多个版本,其中键序列的内部表示不同。 (global-set-key (kbd "<C-tab>") 'my-func) read-kbd-macro使用的输入格式记录在edmacro-mode的文档字符串中: 特殊字 RET、SPC、TAB、DEL、LFD、ESC 和 NUL 表示特殊控制字符。 单词必须大写。 尖括号中的单词,例如 <return>、<down> 或 <f1>,代表一个功能键。 (请注意,在标准配置中,功能键 <return> 和控制键 RET 是同义词。)您可以在 RET、SPC 等词上使用尖括号,但它们不是必需的。 写的有点遗憾; 第一个要点中提到的 TAB 是 TAB 的 ASCII 字符,添加
  • Emacs密钥绑定回退(Emacs key binding fallback)
    问题 我有一个次要模式。 如果该模式处于活动状态,并且用户按下了DEL,则仅在某些条件成立的情况下,我才想执行一些操作。 如果条件成立并且执行了动作,那之后我什么也不想做。 但是,如果条件失败,我将不执行任何操作,而是让默认的DEL操作执行。 不知道如何解决这个问题。 但是我想我可以通过两种方式做到这一点: 1)我可以在次要模式下将DEL键重新绑定到某个功能,然后检查条件是否不成立。 但是,我怎么知道DEL的默认命令是什么? 2)我可以像这样添加一个预命令钩子。 执行命令,然后中断链条。 但是,我该如何打破束缚? (add-hook 'pre-command-hook (lambda() (when (equal last-input-event 'backspace) ;; Do something and then stop (do not execute the ;; command that backspace is bound to) ))) 您将以什么方式解决它? 谢谢! 回答1 这样做的方法是暂时禁用次要模式,然后查找按键绑定。 假设您已将'do-thingy绑定到DEL 。 然后,这将达到目的(假设您要触发的条件是(equal last-input-event 'backspace) : (defun do-thingy () "Do something
  • 在 Emacs ruby​​ 模式中用制表符而不是空格缩进(Indent with tab instead of spaces in Emacs ruby-mode)
    问题 我一直在尝试配置 Emacs,以便在缩进 Ruby 代码时插入一个“制表符”而不是一系列“空格”。 到目前为止,我已经尝试将 var ruby-indent-tabs-mode为t以便根据文档,它会“如果这是非零,则在 ruby​​ 模式下插入选项卡。”。 但到目前为止,还没有骰子。 我还尝试通过init.el对其进行Easy customisation ,它将以下内容插入到我的init.el : (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(ruby-indent-tabs-mode t)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful.
  • 如何在不更改TAB的情况下将命令绑定到Ci?(How do I bind a command to C-i without changing TAB?)
    问题 在emacs中,我想将命令绑定到Ci。 所以我把(global-set-key "\Ci" 'forward-word) 在我的.emacs文件中。 这是可行的,除了现在TAB键也绑定到'forward-word'。 如何在不更改TAB的情况下将命令绑定到Ci? 回答1 简而言之,这应该为您解决问题: (setq local-function-key-map (delq '(kp-tab . [9]) local-function-key-map)) (global-set-key (kbd "C-i") 'forward-word) 较长的版本: 从功能键的emacs lisp文档中: 在ASCII中,Ci和<TAB>是相同的字符。 如果终端可以区分它们,则Emacs通过将前者表示为整数9,将后者表示为符号选项卡,将区分传达给Lisp程序。 在大多数情况下,将两者区分开是没有用的。 因此,通常会设置local-function-key-map(请参见翻译Keymaps)以将tab映射到9。因此,字符代码9(字符Ci)的键绑定也适用于tab。 对于该组中的其他符号也是如此。 函数read-char同样将这些事件转换为字符。 因此,一旦执行以下操作,就可以看到按键绑定的不同之处: (setq local-function-key-map (delq '(kp-tab . [9]
  • Emacs org-mode python 块有 5 个空格制表符,但我想要 4 个空格制表符(Emacs org-mode python blocks have 5 space tabs, but I want 4 space tabs)
    问题 我正在组织模式文件中的源代码块内编写 python 代码; 我正在使用 emacs 命令Cc '在 python 模式下编辑子缓冲区中的代码块 例子: #+begin_src python def function(x): hitting_tab_inserts_5_spaces=x*2 if x<0: hitting_tab_inserts_5_spaces=-x return x 我到处都有 5 个空格选项卡,而不是我想要的 4 个空格选项卡。 注意:我打开了 viper(vim 仿真)。 配置中哪些参数会影响组织模式文件中代码块内的制表符? 如果我使用 emacs 编辑.py文件,我会得到 4 个空格的制表符; 这个 5-space tab 的事情只发生在 org-mode 中。 回答1 (defun my-tab-related-stuff () (setq indent-tabs-mode t) (setq tab-stop-list (number-sequence 4 200 4)) (setq tab-width 4) (setq indent-line-function 'insert-tab)) (add-hook 'org-mode-hook 'my-tab-related-stuff)
  • 用于 Linux 的与语言无关的正确标签代码编辑器?(Language-agnostic properly-tabbing code editors for Linux?)
    问题 我需要一个 Linux 文本编辑器来替换 Textpad 4.7.3(一个 Windows nagware 应用程序),但我尝试过的所有替代方案要么臃肿要么不完整。 以下是我认为最重要的功能,按降序排列: 正则表达式搜索、标记和替换(跨所有打开的文件,甚至),在目录树中进行正则表达式搜索带有适当键盘快捷键的选项卡式编辑器([ctrl]+[tab] 应该在与 [alt]+[tab]完全相同的模型上工作) 自动缩进、缩进保留和缩进操作(制表符、移位制表符) 智能导航键:[home] 在行首和非空格开始之间切换,[F2] 寻找下一个书签,按向上和向下箭头键会将您带到上次导航的列,而不是上次键入的位置(我认为 Textpad 是我唯一见过的地方) 语法突出显示(奖励:混合语言突出显示,TextPad 缺乏) 块选择模式从程序(例如编译器)运行用户定义的命令,获得交互式命令结果(Textpad 可以让您定义正则表达式以匹配文件名和行号,这样您就可以双击错误并转到该文件中的那一行。) 工作区(同时打开的文件集合) 以下是我在尝试过的编辑器中发现的令人反感的内容: Vim 和 emacs没有充分利用我的屏幕、鼠标和键盘。 此外,还有相当长的学习曲线——您必须学习一种全新的与键盘交互的方式。 (当然,如果他们拥有我想要的一切,我会学习他们。) Gedit 几乎是完美的,但它(像大多数一样
  • 使iTerm以与其他操作系统相同的方式翻译“元密钥”(Making iTerm to translate 'meta-key' in the same way as in other OSes)
    问题 在带有emacs键绑定的bash shell中,可以使用Mf,Mb之类的组合键在shell提示符下分别向前或向后移动一个单词。 通常,在Windows和Linux上,元键映射到Alt键。 但是,在iTerm中,我找不到将此元密钥映射到MacBook Pro上的Option或Command键的方法。 似乎在OS X中,默认情况下,元键已映射到ESC键。 因此,您可以在iTerm上使用ESC-f,ESC-b。 但是,ESC键显然不实用。 另外,iTerm确实具有允许您修改元键的映射的选项(“书签”>“配置文件”>“键盘配置文件”>“全局”>“选项键为...”),此设置似乎根本不起作用。 因此,如果有人知道该问题的解决方案,请告诉我。 我已升级到最新版本0.9.6.1012,并且此行为仍然存在。 编辑:我的问题的一些澄清。 我正在谈论的键绑定是针对bash shell的,而不是emacs中的。 碰巧,默认情况下,bash shell也使用与emacs相同的键绑定。 回答1 Cmd +。 , Profiles , Keys然后选择“ Left option Key acts as: +Esc 。 在emacs中对我有用,尽管我不确定它是否还会有其他不良影响。 回答2 转到书签>管理个人资料。 然后选择“键盘配置文件”>“全局”,然后选择“选项键”作为“元” 。 这适用于我0.9.6
  • GNU Emacs 24.1:强制 TAB 键插入 ESS模式下的字符(GNU Emacs 24.1: forcing the TAB key to insert a <tab> character in ESS mode)
    问题 除了插入<tab> ( \t ) 字符外,我几乎从不使用TAB键。 继续键入Cq TAB来执行此操作是不可接受的,因为我主要使用选项卡进行注释。 我的大部分代码缩进是由 Emacs 自动匹配我的第一行手动缩进,并通过将indent-region绑定到C-TAB来完成的。 我主要使用 tab 键来缩进我的评论。 我更喜欢将制表符宽度设置为 8 个字符,并将每个注释缩进两个制表符字符,总共 16 个字符的空白。 如果 ESS 不容易出现此处所述的故障,我可以使用现有的缩进管理系统。 我目前正在处理的文件有断行,这正是所描述的问题。 目前,在该文件中,按tab键会产生 NO 结果。 如何在 ESS[S] 和 ESS[SAS] 模式下强制制表键插入制表符? 我试过添加 (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-mode 、 ess-s-mode 、 ESS
  • 是否为自定义命令保留了任何 emacs 组合键?(Are there any emacs key combinations reserved for custom commands?)
    问题 如果我想创建自定义组合键来运行命令,是否有为此保留的键盘快捷键? 我总是发现很难决定要覆盖哪个快捷方式,因为我不确定我不应该覆盖哪些命令以及我将来可能安装的哪些命令插件会尝试设置。 回答1 我建议使用未绑定。 它专为这种类型的场景而设计。 一旦您在 emacs 配置中需要它,输入以下内容将列出您自定义的可能未绑定密钥: M-x describe-unbound-keys 它要求组合键的复杂性级别(我通常只使用 5),具体取决于您感兴趣的键绑定的方便程度(较少选项)或深奥(更多选项)。 回答2 您可以重新定义任何内容,但约定是使用 Cc l(其中l是任何字母)。 作为用户,您可以重新定义任何键; 但通常最好坚持使用由Cc后跟一个字母(大写或小写)组成的键序列。 这些密钥是“为用户保留的”,因此它们不会与任何设计合理的 Emacs 扩展冲突。 功能键F5到F9也为用户保留。 如果您重新定义某个其他键,您的定义可能会被某些重新定义相同键的扩展或主要模式覆盖。 就个人而言,我试图在键绑定中找到一个洞来滑动我的自定义 - 通常有足够的东西让我找到一些合理的东西。 此外,我通常将我的自定义键绑定本地化到次要模式或主要模式键映射,并尽可能避免使用global-set-key 。 这有助于保持键映射中的漏洞。 例如,我覆盖了minibuffer-local
  • 如何让 Emacs 显示空格?(How do I make Emacs show blank spaces?)
    问题 如何让 Emacs 显示空格(如空格、制表符、换行符等)。 许多其他编辑器,如 Kate 和 Eclipse 都具有此功能,我发现查看代码何时因空格和制表符(尤其是 Python)混合而缩进中断非常有用。 回答1 WhiteSpace 模式是一种 Emacs 次要模式,用于可视化当前缓冲区中的所有空白字符。 它可以用Mx whitespace-mode激活。 这是直接从 Emacs wiki 中截取的 WhiteSpace 的截图, 注意:WhiteSpaceMode 现在已经取代了 BlankMode 回答2 缩进损坏? - 永远不要在你的代码中使用标签 - 现在磁盘空间很便宜。 将(setq-default indent-tabs-mode nil)放入您的 .emacs 文件中。 习惯于输入Cx h Mx untabify来取消整个缓冲区的标签化。 要搜索选项卡,请键入Cs Ci 。 如果您的缓冲区中有模糊的控制字符,您可以使用Mx hexl-mode看到它们。 此外Cx h Mx indent-region将缩进整个缓冲区。 某些模式(如 vhdl-mode)具有美化区域命令。 回答3 所有可能的设置似乎都总结在这里(空白模式)和这里和这里(ShowWhiteSpace) 还: (if (>= emacs-major-version 22) (progn
  • 如何在所有模式下在emacs中获得自动缩进(不是智能缩进)(How to get auto indent (not smart indent) in emacs in all modes)
    问题 我是emacs的新手,它的缩进使我无所适从。 为了自己的利益,它太聪明了。 它(错误地)认为它知道我想如何格式化源代码,但是我没有时间去追逐我为之编写代码的每种不同语言的每种模式的每种设置; 而且其中许多语言根本没有启用任何模式。 这是我想要的行为: TAB插入缩进 RET插入新行,然后将空白字符从前一行的开头复制到第一个非空白字符或行尾,以较早者为准在行首与第一个非空白字符/行尾之间的空白文本中的DEL(退格键)在可能的情况下删除一个缩进,否则像通常一样删除单个字符 {不会自动缩进不会在}上自动取消缩进实际上,没有任何时间任何地方的智能资产缩进行为,只需将前一行的缩进复制到RET上即可。 每种源文件格式要配置的两个变量:显示选项卡的宽度和indent的内容。 最好将它们配置为适用于随机源代码格式,而不必为其编写主模式,除非编写主模式是.emacs中的单行代码,由两个setq组成。 这将使我在所有语言中保持逻辑一致的行为。 这将使我省去格式化代码的工作,但这没关系,我已经做了20年了,而且我知道如何使其他宏更有效。 更重要的是,它使我免于无休止地摆弄配置设置,以使自动行为适应我的喜好。 而且我的宏可以依赖一致的行为,因此它们可以在所有模式下正常工作。 以上可能吗? 肯定有人曾经这样做过吗? 是否有一些次要模式可以做到这一点? 回答1 这是代码: (setq tab-width
  • 如何在 emacs 中绑定 C-=?(How do I bind C-= in emacs?)
    问题 我的.emacs文件中的这个 s 表达式不会产生预期的结果: (define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop) 为什么我不能将命令绑定到Ctrl + = ? 编辑澄清: 我在 Debian 的urxvt-256colors标准版本上使用emacs23-nox ,除了我用--disable-iso405776 (或类似的东西)重新编译它以便Ctrl + Shift不会执行奇怪的“插入字符” ' 事物。 不知道有没有影响例如, CMi发送M-TAB ,我不明白。 编辑二: 我很抱歉没有说清楚。 函数djhaskin987-untab-to-tab-stop有一行(interactive) 。 这部分有效。 回答1 在终端中, TAB由与Ci相同的字节序列表示。 通常终端没有特殊的字节序列C-= ,所以它只会发送一个= 。 Emacs 对此无能为力。 但是你可以教你的终端模拟器发送一些你选择的特殊字节序列(检查你的终端模拟器的文档),之后你可以教 Emacs 将它识别为C-= (类似(define-key input-decode-map "...thebytes..." [?\C-=]) )。 回答2 接受的答案与第一条评论中的链接相结合,足以开始使用完整的解决方案。 步骤是:
  • Emacs的标签:etags,ebrowse,cscope,GNU Global和旺盛的ctags之间的关系(Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctags)
    问题 我从事C ++项目,并遍历了Alex Ott的CEDET指南以及有关StackOverflow中标签的其他主题,但是我仍然对Emacs如何与这些不同的标签系统交互以促进自动完成,查找定义,导航源感到困惑。代码库或文档字符串预览。 etags , ebrowse ,旺盛的ctags,cscope,GNU Global和GTags之间有什么区别(例如,在功能方面)? 我需要做什么才能在Emacs中使用它们? 如果要使用标签导航/自动完成符号,是否需要语义/参量(CEDET)? 在这些不同的标记实用程序之上,语义给表带来了什么? 它如何与这些工具交互? 回答1 正如我最近在这里阅读的那样,这是一个很好的问题,因此我将尝试更详细地说明不同之处: 第一点: etags和ctags都生成在源文件中找到的语言对象的索引文件(也称为标签/ TAGS),该文件允许文本编辑器或其他实用程序快速轻松地定位这些项目。 标签表示语言对象,该语言对象的索引条目可用(或可替代地,为该对象创建的索引条目)。 ctags生成的标签在元数据方面更丰富,但是Emacs仍然无法解释其他数据,因此您应该将它们视为大致相同( ctags的主要优点是它对更多语言的支持)。 标签文件的主要用途是查找类/方法/函数/常量/等声明/定义。 cscope是功能更强大的野兽(至少就C / C ++和Java而言)。
  • 无法更改 Emacs 在 HTML 标签之间的默认缩进(Can't change Emacs's default indentation between HTML tags)
    问题 我对 Emacs 缩进范式感到困惑。 我的.emacs文件中有这个: (setq-default tab-width 4) 如果我在以下情况下按 TAB <ul> (caret) </ul> 结果是这样 <ul> (caret) </ul> (在 HTML 标签之间有 2 个空格缩进。) 它应该像这样结束: <ul> (caret) </ul> 我尝试了一切: (setq-default tab-width 4) (setq-default indent-tabs-mode t) (setq tab-stop-list '(4 8 12 16)) 我已将有关缩进的所有可能的 Emacs 设置设置为 4,但 2 个空格缩进仍然存在。 有什么建议么? 回答1 设置选项卡宽度不适用于这种情况,但我理解您的困惑; Emacs 提供了几个与选项卡相关的变量,为特定场景确定正确的变量可能会令人困惑。 这篇 EmacsWiki 文章提供了有关设置 HTML 缩进级别的更多详细信息; 总的来说,EmacsWiki 是一个很好的 Emacs 技巧资源。 在这种特定情况下,由于您使用的是 Emacs 的标准 HTML 模式( html-mode ,由sgml-mode定义),因此您要设置的变量是sgml-basic-offset 。 该变量默认为 2,但您可以将其更改为 4,如下所示:
  • Emacs:将 writeroom 模式设置为默认(Emacs: Set writeroom mode as default)
    问题 我是 emacs 的新手,我想知道是否可以将 writeroom-mode 设置为始终打开。 我希望它在我启动 emacs 以及打开新缓冲区或在它们之间切换时打开。 非常感谢所有帮助! 回答1 因此,既然您已经提供了一个链接(尽管在您的另一个问题中),我可以看到该库提供了一个全局次要模式,该模式仅针对一组特定的可配置主要模式开启。 下面将重新定义做出该决定的函数,以便如果writeroom-major-modes nil (空列表),它将为任何主要模式打开。 我还更改了现有测试以检查派生模式匹配,而不是简单的精确匹配。 这样, '(text-mode)的默认值不仅匹配text-mode ,而且匹配从text-mode派生的每个text-mode 。 与您的问题并不严格相关,但如果您发现“所有模式”方法过大,则可能很有用。 (eval-after-load 'writeroom-mode '(defun turn-on-writeroom-mode () "Turn on `writeroom-mode'. This function activates `writeroom-mode' in a buffer if that buffer's major mode is a member of `writeroom-major-modes', or derived from