Spacemacs Ruby layer 的两个坑

几个月之前 Spacemacs 把 Ruby layer 的 ruby 的 默认 major-mode 改成了 Emacs 自带的 ruby-mode,我也跟风换成了 ruby-mode,使用过程中遇到两个问题,分享一下解决方法:

  1. smartparens-ruby 补全 block 参数 do |arg1| 时,在右边的 pipe-line char 的后面会多出一个 trailing space:

这应该是 smartparens 的 sp-ruby-pre-pipe-handler 函数的问题:

(defun sp-ruby-pre-pipe-handler (id action context)
  (when (equal action 'insert)
    (save-excursion
      (just-one-space))
    (save-excursion
      (search-backward id)
      (just-one-space))))

修改为:

(defun sp-ruby-pre-pipe-handler (id action context)
    (when (equal action 'insert)
      (save-excursion
        (search-backward id)
        (just-one-space))))

可以放在 with-eval-after-load

  1. 在某种情况下缩进不正确:

    这个应该是因为 ruby-mode 默认使用 smie 来处理缩进,smie 对某个 Ruby 语法处理不正确导致的。

    处理方法是将 indent-line-function 改为 ruby-mode 自己的 ruby-indent-line 函数即可:

    (add-hook 'ruby-mode-hook #'(lambda () (setq-local indent-line-function 'ruby-indent-line)))

3 个赞

不是说 enhanced-ruby-mode 更好么?

之前 Spacemacs 默认是 enh-ruby-mode 所以我也用 enh-ruby-mode,Spacemacs 改成 ruby-mode,我也改用 ruby-mode了,纯跟风。

不过之前用 end-ruby-mode 的时候有一个问题也一致没有解决:enh-ruby-mode 没办法正确高亮这样的句法:

"key_of_#{var}": value

class DemoWorker
  include Sneakers::Worker
  from_queue "#{Rabbitmq::Config.demo_queue}",
             routing_key: "#{Rabbitmq::Config.demo_key}",
             ack: true,
             ... ...,
             arguments: {
               'x-dead-letter-exchange': "#{Rabbitmq::Config.demo_queue}-retry",
             }
1 个赞

哦,了解了,我平时写 ruby 的机会也不多,所以没太注意。。。

我也遇到了 trailing space 这个坑,搜到了你的帖子才找到的解决办法,非常感谢。

最后我用的这种方式修改的,把那个 |pre-handlers 置空了。

(sp-local-pair 'ruby-mode "|" "|"
                 :pre-handlers nil)

Thank you for the useful tips.

I made a patch for the enh-ruby-mode highlight bug.

2 个赞

的确 enh-ruby-mode 更好, 只不过原始版本的 enhanced-ruby-mode (注意 enh 和 enhanced 英文区别), 早就不维护了, 而 enh-ruyb-mode 的维护者, 是 Ruby 社区的大牛 zenspider(也是 minitest 的作者) 很长一段时间也很忙, 从地球上消失了, 不过, 很快他又回来了. Multi-line method chain (leading-dots) indentation · Issue #83 · zenspider/enhanced-ruby-mode · GitHub

现在, 如果你知道 enh-ruby-mode, 真没有任何理由还用 matz 版本的 ruby-mode(emacs内置)

1 个赞