几个月之前 Spacemacs 把 Ruby layer 的 ruby 的 默认 major-mode 改成了 Emacs 自带的 ruby-mode,我也跟风换成了 ruby-mode,使用过程中遇到两个问题,分享一下解决方法:
- 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
里
-
在某种情况下缩进不正确:
这个应该是因为 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 的机会也不多,所以没太注意。。。
w11th
5
我也遇到了 trailing space 这个坑,搜到了你的帖子才找到的解决办法,非常感谢。
最后我用的这种方式修改的,把那个 |
的 pre-handlers
置空了。
(sp-local-pair 'ruby-mode "|" "|"
:pre-handlers nil)
ynilu
6
Thank you for the useful tips.
I made a patch for the enh-ruby-mode
highlight bug.
2 个赞
zw963
7
的确 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 个赞