【问题标题】:Force Emacs to use tabs in php mode强制 Emacs 在 php 模式下使用选项卡
【发布时间】:2013-04-22 03:08:29
【问题描述】:

我希望 Emacs 在 php 模式下使用制表符而不是空格。 我试着把下面的代码

;; Turn on tabs
(setq indent-tabs-mode t)
(setq-default indent-tabs-mode t)

;; Bind the TAB key
(global-set-key (kbd "TAB") 'self-insert-command)

;; Set the tab width
(setq default-tab-width 4)
(setq tab-width 4)
(setq c-basic-indent 4)

在我的 .emacs 中。然后我打开一个 php 模式缓冲区并按 <C-q><Tab> 但 Emacs 仍然插入 4 个空格而不是一个制表符。我花了很多时间寻找这个。上面的代码只是不起作用的解决方案之一。 我在这里想念什么?
(我知道很多人认为制表符是邪恶的,但在我工作的公司中,这是一种标准,所以在我工作时使用空格缩进不是我的选择)

【问题讨论】:

  • 如果C-q TAB 插入了 4 个空格,则说明某处有问题。你确定吗?您确定您没有被其他一些功能所愚弄,例如退格键可能会在删除之前将 TAB 转换回 4 个空格?

标签: php emacs indentation


【解决方案1】:

我会使用这样的东西:

(add-hook 'php-mode-hook 'my-php-mode-hook)
(defun my-php-mode-hook ()
  (setq indent-tabs-mode t)
  (let ((my-tab-width 4))
    (setq tab-width my-tab-width)
    (setq c-basic-indent my-tab-width)
    (set (make-local-variable 'tab-stop-list)
         (number-sequence my-tab-width 200 my-tab-width))))

在这里设置制表符停止列表可能是多余的,也可能不是多余的,因为我不知道它是否曾经在 php-mode 中使用过。但是,设置它并没有什么坏处。

请注意,indent-tabs-modetab-widthc-basic-indent 都是自动缓冲区局部变量。当你使用C-h v 向 Emacs 询问它们时,它会告诉你情况就是这样。因此,您在原始代码中使用setq 的方式不会对其他缓冲区产生任何影响。更改此类变量默认值的正确方法是使用setq-defaultdefault-tab-width 变量已过时;此类变量已被弃用,取而代之的是使用 setq-default 和普通变量名。

我的代码中的模式挂钩方法在您正在编辑的 php-mode 缓冲区的上下文中设置缓冲区本地值,因此如果您不希望使用这种方法,您不需要弄乱默认值到。

在您的情况下,您可能希望使用一些默认值,特别是如果您要编辑的不仅仅是 PHP 代码。

【讨论】:

  • 谢谢。你的回答很清楚。我得到了那个代码谷歌搜索,我不知道默认选项卡宽度已过时。但是您的代码似乎也不起作用。我让它在大多数其他模式下工作,但在 php 中,它似乎在 php-mode.el 中被硬编码
  • 我怀疑存在一些冲突的配置。如果你启动emacs -Q,然后将我的代码复制到*scratch*缓冲区和M-x eval-buffer,然后手动M-x load-file你的php-mode.el文件并打开一个php文件进行编辑,你还有同样的问题吗?您使用的是哪个版本的 Emacs 和哪个 php-mode?如果您还没有,我建议您尝试正在积极开发的github.com/ejmr/php-mode
  • 我已经删除了我所有的 emacs 配置并尝试按照你所说的使用 github 中的 php-mode 进行操作。但问题仍然存在。我使用的是 Emacs 24.3.1 版本,php-mode 是 nxhtml-2.08-100425
【解决方案2】:

我找到了一种更简单的方法来实现这一点。执行M-x > customize-variable > php-mode-coding-style 并将其更改为Wordpress

【讨论】:

  • 这是php-mode 的次要模式吗?如果是这样,您使用哪个版本?我在我的安装中找不到这个 php-mode-coding-style 变量...
  • 我自己回复:其实是php-mode from melpa的更新版本。
【解决方案3】:

换一种方法怎么样?保存时插入选项卡找到this SO 反向问题,您可以将其反向工程为tabify 而不是untabify

【讨论】:

  • 我快速浏览了一下,它似乎有效。我稍后会尝试实现它。现在我在工作。提前致谢
  • tabify 应该一定将空格转换为制表符(前提是tab-width 有连续的空格)。同样,我不得不怀疑您有一些其他配置与这些尝试的更改相冲突,并建议从 emacs -Q 开始并仅手动应用您希望测试的设置,以确定它们是否在正常情况下工作。
【解决方案4】:

FWIW,我认为您只是在浪费时间:不要再担心制表符与空格,继续前进。

这就是说,如果这真的是你想要的,你可以试试:

(add-hook 'php-mode-hook
          (lambda ()
            (local-set-key [?\t] 'self-insert-command)))

【讨论】:

  • 就像我在问题中所说的,我的公司有一个代码格式标准。我希望我可以使用空格,但是当我在工作时我需要制表符。这就是阻止我在工作中使用 Emacs 的原因。
  • 我试过你的解决方案,但它仍然输入 4 个空格而不是一个制表符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多