2017-06-08 11:47:56 +02:00
|
|
|
;;; lang/ruby/config.el -*- lexical-binding: t; -*-
|
2015-06-15 09:06:10 +02:00
|
|
|
|
2024-08-09 20:42:33 -04:00
|
|
|
;; DEPRECATED: Remove when projectile is replaced with project.el
|
2019-10-19 15:25:29 -04:00
|
|
|
(after! projectile
|
|
|
|
(add-to-list 'projectile-project-root-files "Gemfile"))
|
|
|
|
|
|
|
|
|
2018-07-06 22:38:01 +02:00
|
|
|
;;
|
2019-09-13 21:59:03 -04:00
|
|
|
;;; Packages
|
2018-07-06 22:38:01 +02:00
|
|
|
|
2020-03-11 22:05:27 -04:00
|
|
|
(use-package! ruby-mode ; built-in
|
|
|
|
;; Other extensions are already registered in `auto-mode-alist' by `ruby-mode'
|
|
|
|
:mode "\\.\\(?:a?rb\\|aslsx\\)\\'"
|
|
|
|
:mode "/\\(?:Brew\\|Fast\\)file\\'"
|
2020-03-13 12:08:25 -04:00
|
|
|
:interpreter "j?ruby\\(?:[0-9.]+\\)"
|
2020-03-11 22:05:27 -04:00
|
|
|
:config
|
2020-02-20 15:25:38 -05:00
|
|
|
(setq ruby-insert-encoding-magic-comment nil)
|
|
|
|
|
2020-03-11 23:20:06 -04:00
|
|
|
(set-electric! 'ruby-mode :words '("else" "end" "elsif"))
|
|
|
|
(set-repl-handler! 'ruby-mode #'inf-ruby)
|
2018-09-25 22:45:13 -04:00
|
|
|
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! +lsp)
|
2022-03-24 02:19:52 +01:00
|
|
|
(add-hook 'ruby-mode-local-vars-hook #'lsp! 'append))
|
2019-02-21 16:08:27 -05:00
|
|
|
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! +tree-sitter)
|
2022-07-25 17:34:44 +02:00
|
|
|
(add-hook 'ruby-mode-local-vars-hook #'tree-sitter! 'append))
|
|
|
|
|
2019-10-29 12:00:28 +00:00
|
|
|
(after! inf-ruby
|
2020-04-29 00:09:12 -04:00
|
|
|
(add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h)
|
2019-10-29 12:00:28 +00:00
|
|
|
;; switch to inf-ruby from compile if we detect a breakpoint has been hit
|
2020-02-19 23:04:21 -05:00
|
|
|
(add-hook 'compilation-filter-hook #'inf-ruby-auto-enter))
|
2019-10-29 12:00:28 +00:00
|
|
|
|
2018-07-06 22:38:01 +02:00
|
|
|
;; so class and module pairs work
|
2020-03-11 23:20:06 -04:00
|
|
|
(setq-hook! 'ruby-mode-hook sp-max-pair-length 6)
|
2020-03-11 22:05:27 -04:00
|
|
|
|
|
|
|
(map! :localleader
|
2020-03-11 23:20:06 -04:00
|
|
|
:map ruby-mode-map
|
|
|
|
"[" #'ruby-toggle-block
|
|
|
|
"{" #'ruby-toggle-block))
|
2017-02-19 18:57:16 -05:00
|
|
|
|
2018-07-06 22:38:01 +02:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! robe
|
2019-05-04 18:54:50 -04:00
|
|
|
:defer t
|
|
|
|
:init
|
2020-03-11 23:20:06 -04:00
|
|
|
(add-hook! 'ruby-mode-hook
|
2019-09-13 21:59:03 -04:00
|
|
|
(defun +ruby-init-robe-mode-maybe-h ()
|
|
|
|
"Start `robe-mode' if `lsp-mode' isn't active."
|
2020-03-13 12:08:25 -04:00
|
|
|
(or (bound-and-true-p lsp-mode)
|
|
|
|
(bound-and-true-p lsp--buffer-deferred)
|
|
|
|
(robe-mode +1))))
|
2018-09-25 22:45:13 -04:00
|
|
|
:config
|
2024-03-11 03:55:04 -04:00
|
|
|
(set-repl-handler! 'ruby-mode #'+ruby-robe-repl-handler)
|
2020-03-11 23:20:06 -04:00
|
|
|
(set-company-backend! 'ruby-mode 'company-robe 'company-dabbrev-code)
|
|
|
|
(set-lookup-handlers! 'ruby-mode
|
2018-09-25 22:45:13 -04:00
|
|
|
:definition #'robe-jump
|
|
|
|
:documentation #'robe-doc)
|
2020-05-11 00:16:17 -04:00
|
|
|
(when (boundp 'read-process-output-max)
|
|
|
|
;; Robe can over saturate IPC, making interacting with it slow/clobbering
|
|
|
|
;; the GC, so increase the amount of data Emacs reads from it at a time.
|
|
|
|
(setq-hook! '(robe-mode-hook inf-ruby-mode-hook)
|
|
|
|
read-process-output-max (* 1024 1024)))
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! :editor evil)
|
2020-03-13 12:08:25 -04:00
|
|
|
(add-hook 'robe-mode-hook #'evil-normalize-keymaps))
|
2018-09-25 22:45:13 -04:00
|
|
|
(map! :localleader
|
|
|
|
:map robe-mode-map
|
2018-12-23 23:54:27 -05:00
|
|
|
"'" #'robe-start
|
|
|
|
"h" #'robe-doc
|
2020-03-11 23:20:06 -04:00
|
|
|
"R" #'robe-rails-refresh
|
2018-09-25 22:45:13 -04:00
|
|
|
:prefix "s"
|
2019-10-04 17:49:28 -04:00
|
|
|
"d" #'ruby-send-definition
|
|
|
|
"D" #'ruby-send-definition-and-go
|
2018-12-23 23:54:27 -05:00
|
|
|
"r" #'ruby-send-region
|
|
|
|
"R" #'ruby-send-region-and-go
|
|
|
|
"i" #'ruby-switch-to-inf))
|
2018-09-25 22:45:13 -04:00
|
|
|
|
|
|
|
|
|
|
|
;; NOTE Must be loaded before `robe-mode'
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! yard-mode
|
2020-03-11 23:20:06 -04:00
|
|
|
:hook ruby-mode)
|
2017-02-19 18:57:16 -05:00
|
|
|
|
2018-07-06 22:38:01 +02:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! rubocop
|
2020-03-11 22:05:27 -04:00
|
|
|
:hook (ruby-mode . rubocop-mode)
|
2018-07-06 23:46:23 +10:00
|
|
|
:config
|
2020-03-11 23:20:06 -04:00
|
|
|
(set-popup-rule! "^\\*RuboCop" :select t)
|
2018-12-23 23:54:27 -05:00
|
|
|
(map! :localleader
|
|
|
|
:map rubocop-mode-map
|
|
|
|
"f" #'rubocop-check-current-file
|
|
|
|
"F" #'rubocop-autocorrect-current-file
|
|
|
|
"p" #'rubocop-check-project
|
|
|
|
"P" #'rubocop-autocorrect-project))
|
2015-12-04 15:44:06 -05:00
|
|
|
|
2018-07-06 22:38:01 +02:00
|
|
|
|
2024-09-11 04:33:36 -04:00
|
|
|
(use-package! ruby-json-to-hash
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(map! :after ruby-mode
|
|
|
|
:map ruby-mode-map
|
|
|
|
:localleader
|
|
|
|
"J" #'ruby-json-to-hash-parse-json
|
|
|
|
"j" #'ruby-json-to-hash-toggle-let))
|
|
|
|
|
|
|
|
|
2018-09-25 22:45:13 -04:00
|
|
|
;;
|
2019-09-13 21:59:03 -04:00
|
|
|
;;; Package & Ruby version management
|
2018-09-25 22:45:13 -04:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! rake
|
2018-09-25 22:45:13 -04:00
|
|
|
:defer t
|
2018-07-06 23:31:57 +10:00
|
|
|
:init
|
2018-09-25 22:45:13 -04:00
|
|
|
(setq rake-cache-file (concat doom-cache-dir "rake.cache"))
|
2020-05-19 22:27:23 -03:00
|
|
|
(setq rake-completion-system 'default)
|
2020-03-11 22:05:27 -04:00
|
|
|
(map! :after ruby-mode
|
2018-09-25 22:45:13 -04:00
|
|
|
:localleader
|
2020-11-12 21:55:15 -03:00
|
|
|
:map ruby-mode-map
|
2020-05-10 12:35:04 +01:00
|
|
|
:prefix ("k" . "rake")
|
2018-12-23 23:54:27 -05:00
|
|
|
"k" #'rake
|
|
|
|
"r" #'rake-rerun
|
|
|
|
"R" #'rake-regenerate-cache
|
|
|
|
"f" #'rake-find-task))
|
2018-09-25 22:45:13 -04:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! bundler
|
2018-09-25 22:45:13 -04:00
|
|
|
:defer t
|
|
|
|
:init
|
2020-03-11 22:05:27 -04:00
|
|
|
(map! :after ruby-mode
|
2018-09-25 22:45:13 -04:00
|
|
|
:localleader
|
2020-03-11 23:20:06 -04:00
|
|
|
:map ruby-mode-map
|
2020-05-10 12:35:04 +01:00
|
|
|
:prefix ("b" . "bundle")
|
2018-12-23 23:54:27 -05:00
|
|
|
"c" #'bundle-check
|
|
|
|
"C" #'bundle-console
|
|
|
|
"i" #'bundle-install
|
|
|
|
"u" #'bundle-update
|
|
|
|
"e" #'bundle-exec
|
|
|
|
"o" #'bundle-open))
|
2018-09-25 22:45:13 -04:00
|
|
|
|
2020-03-09 18:04:10 +00:00
|
|
|
(use-package! chruby
|
2022-08-12 20:29:19 +02:00
|
|
|
:when (modulep! +chruby)
|
2020-03-09 18:04:10 +00:00
|
|
|
:hook (ruby-mode . chruby-use-corresponding)
|
|
|
|
:config
|
|
|
|
(setq rspec-use-rvm nil
|
|
|
|
rspec-use-chruby t))
|
|
|
|
|
2018-09-25 22:45:13 -04:00
|
|
|
(after! rbenv
|
2019-05-04 19:00:09 -04:00
|
|
|
(setq rspec-use-rvm nil)
|
2018-09-25 22:45:13 -04:00
|
|
|
(add-to-list 'exec-path (expand-file-name "shims" rbenv-installation-dir)))
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
2019-09-13 21:59:03 -04:00
|
|
|
;;; Testing frameworks
|
2017-02-19 18:57:16 -05:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! rspec-mode
|
2018-05-25 00:46:11 +02:00
|
|
|
:mode ("/\\.rspec\\'" . text-mode)
|
2015-08-13 12:14:41 -04:00
|
|
|
:init
|
2020-03-02 20:28:08 +00:00
|
|
|
(setq rspec-use-spring-when-possible nil)
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! :editor evil)
|
2019-03-14 00:03:12 -04:00
|
|
|
(add-hook 'rspec-mode-hook #'evil-normalize-keymaps))
|
2015-08-13 12:14:41 -04:00
|
|
|
:config
|
2020-05-20 10:20:55 -03:00
|
|
|
(set-popup-rule! "^\\*\\(rspec-\\)?compilation" :size 0.3 :ttl nil :select t)
|
2019-05-04 19:00:09 -04:00
|
|
|
(setq rspec-use-rvm (executable-find "rvm"))
|
2018-12-23 23:54:27 -05:00
|
|
|
(map! :localleader
|
2017-02-28 12:11:18 -05:00
|
|
|
:prefix "t"
|
2019-03-15 10:01:43 +07:00
|
|
|
:map (rspec-verifiable-mode-map rspec-dired-mode-map rspec-mode-map)
|
2018-12-23 23:54:27 -05:00
|
|
|
"a" #'rspec-verify-all
|
2019-03-12 09:21:56 +07:00
|
|
|
"r" #'rspec-rerun
|
2019-03-15 10:01:43 +07:00
|
|
|
:map (rspec-verifiable-mode-map rspec-mode-map)
|
2018-12-23 23:54:27 -05:00
|
|
|
"v" #'rspec-verify
|
|
|
|
"c" #'rspec-verify-continue
|
|
|
|
"l" #'rspec-run-last-failed
|
2019-03-01 09:35:28 +07:00
|
|
|
"T" #'rspec-toggle-spec-and-target
|
2019-03-15 10:01:43 +07:00
|
|
|
"t" #'rspec-toggle-spec-and-target-find-example
|
|
|
|
:map rspec-verifiable-mode-map
|
|
|
|
"f" #'rspec-verify-method
|
|
|
|
"m" #'rspec-verify-matching
|
2019-03-12 09:21:56 +07:00
|
|
|
:map rspec-mode-map
|
2019-03-01 09:35:28 +07:00
|
|
|
"s" #'rspec-verify-single
|
2019-03-12 09:21:56 +07:00
|
|
|
"e" #'rspec-toggle-example-pendingness
|
|
|
|
:map rspec-dired-mode-map
|
|
|
|
"v" #'rspec-dired-verify
|
|
|
|
"s" #'rspec-dired-verify-single))
|
2018-09-25 22:45:13 -04:00
|
|
|
|
2019-03-14 00:03:12 -04:00
|
|
|
|
2019-07-23 12:44:03 +02:00
|
|
|
(use-package! minitest
|
2018-09-25 22:45:13 -04:00
|
|
|
:defer t
|
|
|
|
:config
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! :editor evil)
|
2018-09-25 22:45:13 -04:00
|
|
|
(add-hook 'minitest-mode-hook #'evil-normalize-keymaps))
|
2018-12-23 23:54:27 -05:00
|
|
|
(map! :localleader
|
|
|
|
:map minitest-mode-map
|
2018-09-25 22:45:13 -04:00
|
|
|
:prefix "t"
|
2018-12-23 23:54:27 -05:00
|
|
|
"r" #'minitest-rerun
|
|
|
|
"a" #'minitest-verify-all
|
|
|
|
"s" #'minitest-verify-single
|
|
|
|
"v" #'minitest-verify))
|
2020-02-01 13:34:37 +01:00
|
|
|
|
|
|
|
|
2024-09-11 04:33:36 -04:00
|
|
|
;;
|
|
|
|
;;; Rails integration
|
|
|
|
|
2020-02-01 13:34:37 +01:00
|
|
|
(use-package! projectile-rails
|
2022-08-12 20:29:19 +02:00
|
|
|
:when (modulep! +rails)
|
2020-04-29 00:09:12 -04:00
|
|
|
:hook ((ruby-mode inf-ruby-mode projectile-rails-server-mode) . projectile-rails-mode)
|
|
|
|
:hook (projectile-rails-server-mode . doom-mark-buffer-as-real-h)
|
2020-05-14 01:59:24 -03:00
|
|
|
:hook (projectile-rails-mode . auto-insert-mode)
|
2020-02-01 13:34:37 +01:00
|
|
|
:init
|
2020-05-14 01:59:24 -03:00
|
|
|
(setq auto-insert-query nil)
|
2020-03-09 21:38:46 +00:00
|
|
|
(setq inf-ruby-console-environment "development")
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! :lang web)
|
2020-02-01 13:34:37 +01:00
|
|
|
(add-hook 'web-mode-hook #'projectile-rails-mode))
|
|
|
|
:config
|
2020-04-13 22:36:34 -04:00
|
|
|
(set-popup-rule! "^\\*\\(projectile-\\)?rails" :ttl nil)
|
2022-08-12 20:29:19 +02:00
|
|
|
(when (modulep! :editor evil)
|
2020-02-01 13:34:37 +01:00
|
|
|
(add-hook 'projectile-rails-mode-hook #'evil-normalize-keymaps))
|
|
|
|
(map! :localleader
|
|
|
|
:map projectile-rails-mode-map
|
2020-04-13 22:36:34 -04:00
|
|
|
"r" #'projectile-rails-command-map))
|
2024-09-11 04:33:36 -04:00
|
|
|
|
|
|
|
(use-package! rails-routes
|
|
|
|
:when (featurep! +rails)
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(map! :after ruby-mode
|
|
|
|
:map ruby-mode-map
|
|
|
|
"C-c o" #'rails-routes-insert
|
|
|
|
"C-c C-o" #'rails-routes-insert-no-cache
|
|
|
|
"C-c ! o" #'rails-routes-jump)
|
|
|
|
(map! :after web-mode
|
|
|
|
:map web-mode-map
|
|
|
|
"C-c o" #'rails-routes-insert
|
|
|
|
"C-c C-o" #'rails-routes-insert-no-cache
|
|
|
|
"C-c ! o" #'rails-routes-jump))
|
|
|
|
|
|
|
|
(use-package! rails-i18n
|
|
|
|
:when (featurep! +rails)
|
|
|
|
:defer t
|
|
|
|
:init
|
|
|
|
(map! :after ruby-mode
|
|
|
|
:map ruby-mode-map
|
|
|
|
"C-c i" #'rails-i18n-insert-with-cache)
|
|
|
|
(map! :after web-mode
|
|
|
|
:map web-mode-map
|
|
|
|
"C-c i" #'rails-i18n-insert-with-cache))
|