在Emacs Ruby模式下使用制表符而不是空格缩进

vcudknz3  于 2023-01-12  发布在  Ruby
关注(0)|答案(2)|浏览(141)

我一直在尝试配置Emacs,使其在缩进Ruby代码时插入一个"制表符",而不是一系列"空格"。
到目前为止,我已经尝试过将变量ruby-indent-tabs-mode设置为t,这样,根据文档,它将"在ruby模式下插入制表符,如果这是非nil"。
我也尝试过通过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.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

通过C-h v检查变量后,它报告变量设置为t,但按TAB键会继续插入空格。
我甚至试着编辑ruby模式的.el文件,然后重新编译它,但没有效果。
我们会很感激的。

  • ----编辑-----*

以下是通过C-h m报告的激活次要模式:
启用的次要模式:缩写自动完成自动组合
自动压缩自动加密文件名阴影字体锁定
全局自动完成全局字体锁定信息拼音行号菜单栏
显示-智能括号显示-智能括号-全局智能括号
智能括号-全局 transient 标记
init.el文件当前具有:

(require 'cask "/Users/snowingheart/.cask/cask.el")
(cask-initialize)
(require 'pallet)

(add-to-list 'load-path "~/elisp")
(load "php-mode")
(add-to-list 'auto-mode-alist
             '("\\.php[34]?\\'\\|\\.phtml\\'" . php-mode))

(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)

(require 'package)
(add-to-list 'package-archives
    '("marmalade" .
      "http://marmalade-repo.org/packages/"))
(package-initialize)

(global-set-key (kbd "C-x >") 'mc/mark-next-like-this)
(global-set-key (kbd "C-x <") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this)
(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines)

(require 'smartparens-config)
(require 'smartparens-ruby)
(require 'smartparens-erb)
(smartparens-global-mode)
(show-smartparens-global-mode t)

(sp-with-modes '(rhtml-mode)
               (sp-local-pair "<%=" "%>")
               (sp-local-pair "<%-" "%>"))
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories
             "~/.emacs.d/.cask/24.3.50.1/elpa/auto-complete-20130724.1750/dict")
(ac-config-default)
(setq ac-ignore-case nil)
(add-to-list 'ac-modes 'enh-ruby-mode)
(add-to-list 'ac-modes 'web-mode)

(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.
 '(indent-tabs-mode t)
 '(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.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

(setq-default indent-tabs-mode t)
(setq enh-ruby-indent-tabs-mode t)

(smart-tabs-insinuate 'ruby)
(smart-tabs-advice ruby-indent-line ruby-indent-level)
(setq ruby-indent-tabs-mode t)
juud5qan

juud5qan1#

尝试将以下内容添加到您的init.el(在您已有的自定义项下面):

(setq-default indent-tabs-mode t)

来自indent-tabs-mode的文档:
如果非空,缩进可以插入制表符。
我不使用ruby-mode,所以我不知道indent-tabs-moderuby-indent-tabs-mode之间可能的交互。将indent-tabs-mode设置为t可能就足够了(并删除您对ruby-indent-tabs-mode所做的自定义)。但是当您将上面的代码片段添加到您的配置中时,Emacs的默认行为将是插入制表符进行缩进。

编辑

如图所示,enh-ruby-mode定义了一个名为enh-ruby-indent-tabs-mode的自定义变量,默认值为nil。稍后,此变量的值将用于覆盖indent-tabs-mode的值,这就是将indent-tabs-mode设置为t对启用enh-ruby-mode的缓冲区没有影响的原因。
因此,除非您启用除ruby-modeenh-ruby-mode之外的任何其他模式,否则这些模式可能会修改indent-tabs-mode变量,添加

(setq enh-ruby-indent-tabs-mode t)

到您的init.el应该可以解决您的问题。

另一个EDIT(工作溶液)

(致谢:This answer让我走上了正确的道路。)
使用

  • Emacs24.3.1版本
  • ruby-mode版本1.2(内置)
  • enh-ruby-mode版本20140406.252(通过M-x package-install...安装)

我可以通过将以下代码添加到一个**(否则完全为空)**init.el文件中来使其工作:

(package-initialize)

(setq-default tab-width 2)
(setq enh-ruby-indent-tabs-mode t)
(defvaralias 'enh-ruby-indent-level 'tab-width)
(defvaralias 'enh-ruby-hanging-indent-level 'tab-width)

这个解决方案适用于Emacs的GUI和控制台版本,它可能会很好地与您的其他定制集成,但您 * 将 * 需要从您上面发布的init.el版本中删除custom-set-variables部分及其以下的所有内容。
还要注意,如果您确实遇到Emacs插入空格而不是制表符的情况,您总是可以删除它,并通过C-qTAB强制quoting it插入制表符。

正在收尾

原来enh-ruby-mode中有一个bug,当enh-ruby-indent-tabs-mode设置为t时,它会导致 * 从第二级开始的块 * 的缩进失败。enh-ruby-mode的作者/维护者没有修复它的计划,但错误报告中包含了一个据说可以修复这个问题的补丁。

xdyibdwo

xdyibdwo2#

更新的答案Au(Emacs 28.2):
indent-tabs-moderuby-indent-tabs-mode设置为t
在全球范围内,在您的~/.emacs.el中:

(setq indent-tabs-mode t)
(setq ruby-indent-tabs-mode t)
(setq tab-width 2)
(setq ruby-indent-level 2)

或者更好的方法是,限制在特定的项目中,例如在~/src/your-project/.dir-locals.el文件中:

((ruby-mode . ((indent-tabs-mode . t)
               (ruby-indent-tabs-mode . t)
               (tab-width . 2)
               (ruby-indent-level . 2))))

相关问题