yeet
This commit is contained in:
91
.config/emacs/modules/lang/ruby/README.org
Normal file
91
.config/emacs/modules/lang/ruby/README.org
Normal file
@@ -0,0 +1,91 @@
|
||||
#+TITLE: lang/ruby
|
||||
#+DATE: January 16, 2007
|
||||
#+SINCE: v1.3
|
||||
#+STARTUP: inlineimages
|
||||
|
||||
* Table of contents :TOC:
|
||||
- [[#description][Description]]
|
||||
- [[#module-flags][Module Flags]]
|
||||
- [[#packages][Packages]]
|
||||
- [[#prerequisites][Prerequisites]]
|
||||
- [[#ubuntu][Ubuntu]]
|
||||
- [[#macos][MacOS]]
|
||||
- [[#windows][Windows]]
|
||||
- [[#appendix][Appendix]]
|
||||
- [[#commands][Commands]]
|
||||
|
||||
* Description
|
||||
This module add Ruby and optional Ruby on Rails support to Emacs.
|
||||
|
||||
+ Code completion (robe)
|
||||
+ Syntax checking (flycheck)
|
||||
+ Jump-to-definitions (robe)
|
||||
+ Bundler
|
||||
+ Rubocop integration (flycheck)
|
||||
|
||||
** Module Flags
|
||||
+ =+lsp= Enables LangServer support for ruby. You must have =:tools lsp= enabled
|
||||
for this to work, as well as the langserver (solargraph) installed on your
|
||||
system.
|
||||
+ =+rvm= Enables RVM (Ruby Version Manager) integration.
|
||||
+ =+rbenv= Enables rbenv integration.
|
||||
+ =+chruby= Enables chruby integration.
|
||||
+ =+rails= Enables rails navigational commands, plus server+console integration.
|
||||
|
||||
** Packages
|
||||
+ [[https://github.com/endofunky/bundler.el][bundler]]
|
||||
+ [[https://github.com/plexus/chruby.el][chruby]] (=+chruby=)
|
||||
+ [[https://github.com/company-mode/company-inf-ruby][company-inf-ruby]]
|
||||
+ [[https://github.com/eschulte/jump.el][inflections]]
|
||||
+ [[https://github.com/nonsequitur/inf-ruby][inf-ruby]]
|
||||
+ [[https://github.com/arthurnn/minitest-emacs][minitest]]
|
||||
+ [[https://github.com/asok/projectile-rails][projectile-rails]] (=+rails=)
|
||||
+ [[https://github.com/asok/rake][rake]]
|
||||
+ [[https://github.com/senny/rbenv.el][rbenv]] (=+rbenv=)
|
||||
+ [[https://github.com/dgutov/robe][robe]]
|
||||
+ [[https://github.com/pezra/rspec-mode][rspec-mode]]
|
||||
+ [[https://github.com/rubocop-hq/rubocop-emacs][rubocop]]
|
||||
+ [[https://github.com/senny/rvm.el][rvm]] (=+rvm=)
|
||||
|
||||
* Prerequisites
|
||||
Many of this modules plugins require ruby with some version manager (RVM or
|
||||
Rbenv) and the rubocop gem.
|
||||
|
||||
** Ubuntu
|
||||
You can follow [[https://gorails.com/setup/ubuntu/18.04][this guide]]. After ruby installation, run ~gem install rubocop~.
|
||||
** MacOS
|
||||
You can follow [[https://gorails.com/setup/osx/10.15-catalina][this guide]]. After ruby installation, run ~gem install rubocop~.
|
||||
** Windows
|
||||
You can follow [[https://gorails.com/setup/windows/10][this guide]]. After ruby installation, run ~gem install rubocop~.
|
||||
|
||||
* Appendix
|
||||
** Commands
|
||||
*** robe
|
||||
| command | key / ex command | description |
|
||||
|----------------------+------------------+--------------------------------------------------------------------|
|
||||
| ~robe-start~ | =SPC m \'= | Open ruby lang server for auto-completions and jump to definitions |
|
||||
| ~robe-rails-refresh~ | =SPC m R= | Refresh the lang server. |
|
||||
|
||||
*** projectile-rails
|
||||
The projectile-rails prefix is =SPC m r=. Here is some examples:
|
||||
|
||||
| command | key / ex command | description |
|
||||
|-------------------------------+------------------+---------------------------------------------------|
|
||||
| ~projectile-rails-console~ | =SPC m r r= | Open Rails console |
|
||||
| ~projectile-rails-server~ | =SPC m r R= | Open Rails server |
|
||||
| ~projectile-rails-find-model~ | =SPC m r m= | Find any model of the project |
|
||||
| ~projectile-rails-find-model~ | =SPC m r M= | Find the model related of currently open resource |
|
||||
*** bundler
|
||||
The bundler prefix is =SPC m b=. Here is some examples:
|
||||
|
||||
| command | key / ex command | description |
|
||||
|------------------+------------------+---------------------|
|
||||
| ~bundle-install~ | =SPC m b i= | Runs bundle install |
|
||||
| ~bundle-update~ | =SPC m b u= | Runs bundle update |
|
||||
*** rspec-mode
|
||||
The rspec-mode prefix is =SPC m t=. Here is some examples:
|
||||
| | | |
|
||||
| command | key / ex command | description |
|
||||
|-----------------------+------------------+-----------------------------------|
|
||||
| ~rspec-verify~ | =SPC m t v= | Runs rspec on current file |
|
||||
| ~rspec-verify-method~ | =SPC m t s= | Runs rspec for the item on cursor |
|
||||
15
.config/emacs/modules/lang/ruby/autoload.el
Normal file
15
.config/emacs/modules/lang/ruby/autoload.el
Normal file
@@ -0,0 +1,15 @@
|
||||
;;; lang/ruby/autoload.el -*- lexical-binding: t; -*-
|
||||
|
||||
;;;###autoload
|
||||
(defun +ruby-cleanup-robe-servers-h () ; TODO Use me
|
||||
"Clean up dangling inf robe processes if there are no more `ruby-mode' buffers
|
||||
open."
|
||||
;; FIXME This should wait X seconds before cleaning up
|
||||
(unless (or (not robe-mode) (doom-buffers-in-mode 'ruby-mode))
|
||||
(let (inf-buffer kill-buffer-query-functions)
|
||||
(while (setq inf-buffer (robe-inf-buffer))
|
||||
(let ((process (get-buffer-process inf-buffer))
|
||||
confirm-kill-processes)
|
||||
(when (processp process)
|
||||
(kill-process (get-buffer-process inf-buffer))
|
||||
(kill-buffer inf-buffer)))))))
|
||||
197
.config/emacs/modules/lang/ruby/config.el
Normal file
197
.config/emacs/modules/lang/ruby/config.el
Normal file
@@ -0,0 +1,197 @@
|
||||
;;; lang/ruby/config.el -*- lexical-binding: t; -*-
|
||||
|
||||
(after! projectile
|
||||
(add-to-list 'projectile-project-root-files "Gemfile"))
|
||||
|
||||
|
||||
;;
|
||||
;;; Packages
|
||||
|
||||
(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\\'"
|
||||
:interpreter "j?ruby\\(?:[0-9.]+\\)"
|
||||
:config
|
||||
(setq ruby-insert-encoding-magic-comment nil)
|
||||
|
||||
(set-electric! 'ruby-mode :words '("else" "end" "elsif"))
|
||||
(set-repl-handler! 'ruby-mode #'inf-ruby)
|
||||
|
||||
(when (featurep! +lsp)
|
||||
(add-hook 'ruby-mode-local-vars-hook #'lsp!))
|
||||
|
||||
(after! inf-ruby
|
||||
(add-hook 'inf-ruby-mode-hook #'doom-mark-buffer-as-real-h)
|
||||
;; switch to inf-ruby from compile if we detect a breakpoint has been hit
|
||||
(add-hook 'compilation-filter-hook #'inf-ruby-auto-enter))
|
||||
|
||||
;; so class and module pairs work
|
||||
(setq-hook! 'ruby-mode-hook sp-max-pair-length 6)
|
||||
|
||||
(map! :localleader
|
||||
:map ruby-mode-map
|
||||
"[" #'ruby-toggle-block
|
||||
"{" #'ruby-toggle-block))
|
||||
|
||||
|
||||
(use-package! robe
|
||||
:defer t
|
||||
:init
|
||||
(add-hook! 'ruby-mode-hook
|
||||
(defun +ruby-init-robe-mode-maybe-h ()
|
||||
"Start `robe-mode' if `lsp-mode' isn't active."
|
||||
(or (bound-and-true-p lsp-mode)
|
||||
(bound-and-true-p lsp--buffer-deferred)
|
||||
(robe-mode +1))))
|
||||
:config
|
||||
(set-repl-handler! 'ruby-mode #'robe-start)
|
||||
(set-company-backend! 'ruby-mode 'company-robe 'company-dabbrev-code)
|
||||
(set-lookup-handlers! 'ruby-mode
|
||||
:definition #'robe-jump
|
||||
:documentation #'robe-doc)
|
||||
(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)))
|
||||
(when (featurep! :editor evil)
|
||||
(add-hook 'robe-mode-hook #'evil-normalize-keymaps))
|
||||
(map! :localleader
|
||||
:map robe-mode-map
|
||||
"'" #'robe-start
|
||||
"h" #'robe-doc
|
||||
"R" #'robe-rails-refresh
|
||||
:prefix "s"
|
||||
"d" #'ruby-send-definition
|
||||
"D" #'ruby-send-definition-and-go
|
||||
"r" #'ruby-send-region
|
||||
"R" #'ruby-send-region-and-go
|
||||
"i" #'ruby-switch-to-inf))
|
||||
|
||||
|
||||
;; NOTE Must be loaded before `robe-mode'
|
||||
(use-package! yard-mode
|
||||
:hook ruby-mode)
|
||||
|
||||
|
||||
(use-package! rubocop
|
||||
:hook (ruby-mode . rubocop-mode)
|
||||
:config
|
||||
(set-popup-rule! "^\\*RuboCop" :select t)
|
||||
(map! :localleader
|
||||
:map rubocop-mode-map
|
||||
"f" #'rubocop-check-current-file
|
||||
"F" #'rubocop-autocorrect-current-file
|
||||
"p" #'rubocop-check-project
|
||||
"P" #'rubocop-autocorrect-project))
|
||||
|
||||
|
||||
;;
|
||||
;;; Package & Ruby version management
|
||||
|
||||
(use-package! rake
|
||||
:defer t
|
||||
:init
|
||||
(setq rake-cache-file (concat doom-cache-dir "rake.cache"))
|
||||
(setq rake-completion-system 'default)
|
||||
(map! :after ruby-mode
|
||||
:localleader
|
||||
:map ruby-mode-map
|
||||
:prefix ("k" . "rake")
|
||||
"k" #'rake
|
||||
"r" #'rake-rerun
|
||||
"R" #'rake-regenerate-cache
|
||||
"f" #'rake-find-task))
|
||||
|
||||
(use-package! bundler
|
||||
:defer t
|
||||
:init
|
||||
(map! :after ruby-mode
|
||||
:localleader
|
||||
:map ruby-mode-map
|
||||
:prefix ("b" . "bundle")
|
||||
"c" #'bundle-check
|
||||
"C" #'bundle-console
|
||||
"i" #'bundle-install
|
||||
"u" #'bundle-update
|
||||
"e" #'bundle-exec
|
||||
"o" #'bundle-open))
|
||||
|
||||
(use-package! chruby
|
||||
:when (featurep! +chruby)
|
||||
:hook (ruby-mode . chruby-use-corresponding)
|
||||
:config
|
||||
(setq rspec-use-rvm nil
|
||||
rspec-use-chruby t))
|
||||
|
||||
(after! rbenv
|
||||
(setq rspec-use-rvm nil)
|
||||
(add-to-list 'exec-path (expand-file-name "shims" rbenv-installation-dir)))
|
||||
|
||||
|
||||
;;
|
||||
;;; Testing frameworks
|
||||
|
||||
(use-package! rspec-mode
|
||||
:mode ("/\\.rspec\\'" . text-mode)
|
||||
:init
|
||||
(setq rspec-use-spring-when-possible nil)
|
||||
(when (featurep! :editor evil)
|
||||
(add-hook 'rspec-mode-hook #'evil-normalize-keymaps))
|
||||
:config
|
||||
(set-popup-rule! "^\\*\\(rspec-\\)?compilation" :size 0.3 :ttl nil :select t)
|
||||
(setq rspec-use-rvm (executable-find "rvm"))
|
||||
(map! :localleader
|
||||
:prefix "t"
|
||||
:map (rspec-verifiable-mode-map rspec-dired-mode-map rspec-mode-map)
|
||||
"a" #'rspec-verify-all
|
||||
"r" #'rspec-rerun
|
||||
:map (rspec-verifiable-mode-map rspec-mode-map)
|
||||
"v" #'rspec-verify
|
||||
"c" #'rspec-verify-continue
|
||||
"l" #'rspec-run-last-failed
|
||||
"T" #'rspec-toggle-spec-and-target
|
||||
"t" #'rspec-toggle-spec-and-target-find-example
|
||||
:map rspec-verifiable-mode-map
|
||||
"f" #'rspec-verify-method
|
||||
"m" #'rspec-verify-matching
|
||||
:map rspec-mode-map
|
||||
"s" #'rspec-verify-single
|
||||
"e" #'rspec-toggle-example-pendingness
|
||||
:map rspec-dired-mode-map
|
||||
"v" #'rspec-dired-verify
|
||||
"s" #'rspec-dired-verify-single))
|
||||
|
||||
|
||||
(use-package! minitest
|
||||
:defer t
|
||||
:config
|
||||
(when (featurep! :editor evil)
|
||||
(add-hook 'minitest-mode-hook #'evil-normalize-keymaps))
|
||||
(map! :localleader
|
||||
:map minitest-mode-map
|
||||
:prefix "t"
|
||||
"r" #'minitest-rerun
|
||||
"a" #'minitest-verify-all
|
||||
"s" #'minitest-verify-single
|
||||
"v" #'minitest-verify))
|
||||
|
||||
|
||||
(use-package! projectile-rails
|
||||
:when (featurep! +rails)
|
||||
:hook ((ruby-mode inf-ruby-mode projectile-rails-server-mode) . projectile-rails-mode)
|
||||
:hook (projectile-rails-server-mode . doom-mark-buffer-as-real-h)
|
||||
:hook (projectile-rails-mode . auto-insert-mode)
|
||||
:init
|
||||
(setq auto-insert-query nil)
|
||||
(setq inf-ruby-console-environment "development")
|
||||
(when (featurep! :lang web)
|
||||
(add-hook 'web-mode-hook #'projectile-rails-mode))
|
||||
:config
|
||||
(set-popup-rule! "^\\*\\(projectile-\\)?rails" :ttl nil)
|
||||
(when (featurep! :editor evil)
|
||||
(add-hook 'projectile-rails-mode-hook #'evil-normalize-keymaps))
|
||||
(map! :localleader
|
||||
:map projectile-rails-mode-map
|
||||
"r" #'projectile-rails-command-map))
|
||||
16
.config/emacs/modules/lang/ruby/doctor.el
Normal file
16
.config/emacs/modules/lang/ruby/doctor.el
Normal file
@@ -0,0 +1,16 @@
|
||||
;;; lang/ruby/doctor.el -*- lexical-binding: t; -*-
|
||||
|
||||
(assert! (or (not (featurep! +lsp))
|
||||
(featurep! :tools lsp))
|
||||
"This module requires (:tools lsp)")
|
||||
|
||||
(unless (executable-find "ruby")
|
||||
(warn! "Ruby isn't installed."))
|
||||
|
||||
(when (and (executable-find "rbenv") (featurep! +rbenv))
|
||||
(unless (split-string (shell-command-to-string "rbenv versions --bare") "\n" t)
|
||||
(warn! "No versions of ruby are available via rbenv, did you forget to install one?")))
|
||||
|
||||
(when (and (executable-find "chruby") (featurep! +chruby))
|
||||
(unless (split-string (shell-command-to-string "chruby") "\n" t)
|
||||
(warn! "No versions of ruby are available via chruby, did you forget to install one?")))
|
||||
36
.config/emacs/modules/lang/ruby/packages.el
Normal file
36
.config/emacs/modules/lang/ruby/packages.el
Normal file
@@ -0,0 +1,36 @@
|
||||
;; -*- no-byte-compile: t; -*-
|
||||
;;; lang/ruby/packages.el
|
||||
|
||||
;; Major modes
|
||||
(package! ruby-mode :built-in t)
|
||||
(package! yard-mode :pin "ba74a47463b0320ae152bd42a7dd7aeecd7b5748")
|
||||
|
||||
;; REPL
|
||||
(package! inf-ruby :pin "03dd9c9d4e3f94f5519a786804d3ef9d3a09ef9f")
|
||||
(when (featurep! :completion company)
|
||||
(package! company-inf-ruby :pin "fe3e4863bc971fbb81edad447efad5795ead1b17"))
|
||||
|
||||
;; Programming environment
|
||||
(package! rubocop :pin "f5fd18aa810c3d3269188cbbd731ddc09006f8f5")
|
||||
(package! robe :pin "11207bd549a5a78e3a4d70265c3715990dcdab71")
|
||||
|
||||
;; Project tools
|
||||
(package! bundler :pin "43efb6be4ed118b06d787ce7fbcffd68a31732a7")
|
||||
(package! rake :pin "9c204334b03b4e899fadae6e59c20cf105404128")
|
||||
|
||||
;; Environment management
|
||||
(when (featurep! +rbenv)
|
||||
(package! rbenv :pin "2ea1a5bdc1266caef1dd77700f2c8f42429b03f1"))
|
||||
(when (featurep! +rvm)
|
||||
(package! rvm :pin "c1f2642434b0f68d9baa0687127079ecd884ba12"))
|
||||
(when (featurep! +chruby)
|
||||
(package! chruby :pin "42bc6d521f832eca8e2ba210f30d03ad5529788f"))
|
||||
|
||||
;; Testing frameworks
|
||||
(package! rspec-mode :pin "92ef785010f6a68cbf73861e75ac6cf4e1832291")
|
||||
(package! minitest :pin "ddd152c990a528ad09a696bfad23afa4330ea4d7")
|
||||
|
||||
;; Rails
|
||||
(when (featurep! +rails)
|
||||
(package! projectile-rails :pin "30828afbfa7b0e07970e3e668e975e7916b824c4")
|
||||
(package! inflections :pin "55caa66a7cc6e0b1a76143fd40eff38416928941"))
|
||||
Reference in New Issue
Block a user