diff --git a/Makefile b/Makefile index a87553e..bc27f73 100644 --- a/Makefile +++ b/Makefile @@ -11,17 +11,19 @@ backup-elpa: .PHONY: vendor vendor: \ - vendor/escreen.el \ vendor/dired+.el \ + vendor/escreen.el \ vendor/hideshowvis.el \ - vendor/linum+.el + vendor/linum+.el \ + vendor/rubocopfmt.el .PHONY: update_vendor update_vendor: \ - update_vendor/escreen.el \ update_vendor/dired+.el \ + update_vendor/escreen.el \ update_vendor/hideshowvis.el \ - update_vendor/linum+.el + update_vendor/linum+.el \ + update_vendor/rubocopfmt.el # # Internals @@ -44,7 +46,8 @@ endef # Specify vendor targets # -$(eval $(call vendored,vendor/escreen.el,"https://github.com/renard/escreen-el/raw/master/escreen.el")) $(eval $(call vendored,vendor/dired+.el,"https://www.emacswiki.org/emacs/download/dired%2b.el")) +$(eval $(call vendored,vendor/escreen.el,"https://github.com/renard/escreen-el/raw/master/escreen.el")) $(eval $(call vendored,vendor/hideshowvis.el,"https://www.emacswiki.org/emacs/download/hideshowvis.el")) $(eval $(call vendored,vendor/linum+.el,"http://www.emacswiki.org/emacs/download/linum%2b.el")) +$(eval $(call vendored,vendor/rubocopfmt.el,"https://github.com/jimeh/rubocopfmt.el/raw/master/rubocopfmt.el")) diff --git a/core/siren-core.el b/core/siren-core.el index edda98f..f030fe4 100644 --- a/core/siren-core.el +++ b/core/siren-core.el @@ -68,5 +68,13 @@ Borrowed from: http://emacsredux.com/blog/2013/05/04/rename-file-and-buffer/" (set-visited-file-name new-name) (set-buffer-modified-p nil))))))) +(defun siren-ignore-error-wrapper (fn) + "Funtion return new function that ignore errors. + The function wraps a function with `ignore-errors' macro." + (lexical-let ((fn fn)) + (lambda () + (interactive) + (ignore-errors (funcall fn))))) + (provide 'siren-core) ;;; siren-core.el ends here diff --git a/core/siren-modules.el b/core/siren-modules.el index 2d4ef92..9928a34 100644 --- a/core/siren-modules.el +++ b/core/siren-modules.el @@ -8,73 +8,87 @@ (setq siren-modules-dir (expand-file-name "modules" siren-dir)) (add-to-list 'load-path siren-modules-dir) +(siren-add-subfolders-to-load-path siren-modules-dir) -;; Modules +;; Core (require 'siren-aliases) +(require 'siren-global-keybindings) +(require 'siren-packages) + +;; Completion +(require 'siren-company) + +;; Editor +(require 'siren-browse-kill-ring) +(require 'siren-evil) +(require 'siren-ido) +(require 'siren-linum) +(require 'siren-linum-relative) +(require 'siren-rainbow) +(require 'siren-smex) +(require 'siren-undo-tree) +(require 'siren-which-key) + +;; Linting +(require 'siren-flycheck) + +;; Navigation (require 'siren-anzu) (require 'siren-avy) -(require 'siren-browse-kill-ring) -(require 'siren-company) -(require 'siren-diff-hl) (require 'siren-dired) (require 'siren-direx) (require 'siren-dumb-jump) -(require 'siren-editorconfig) -(require 'siren-evil) -(require 'siren-flyspell) (require 'siren-folding) (require 'siren-full-ack) (require 'siren-git-link) -(require 'siren-git-timemachine) -(require 'siren-github) -(require 'siren-global-keybindings) -(require 'siren-goto-chg) (require 'siren-goto-symbol) (require 'siren-helm) (require 'siren-helm-ag) (require 'siren-helm-gtags) (require 'siren-helm-open-github) -(require 'siren-helm-projectile) (require 'siren-helm-swoop) -(require 'siren-ido) -(require 'siren-linum) -(require 'siren-linum-relative) -(require 'siren-magit) (require 'siren-move-beginning-of-line) -(require 'siren-multiple-cursors) -(require 'siren-org-mode) -(require 'siren-package-lint) -(require 'siren-rainbow) (require 'siren-scroll-half-screen) -(require 'siren-smartparens) -(require 'siren-smex) -(require 'siren-string-inflection) -(require 'siren-text-manipulation) -(require 'siren-toggle-quotes) -(require 'siren-undo-tree) -(require 'siren-which-key) -(require 'siren-window-management) -(require 'siren-yasnippet) -(require 'siren-zoom-window) -;; (require 'siren-auto-complete) -;; (require 'siren-edit-server) -;; (require 'siren-swiper) -;; (require 'siren-volatile-highlights) -;; (require 'siren-zone) ;; Project management +(require 'siren-editorconfig) +(require 'siren-helm-projectile) (require 'siren-neotree) (require 'siren-projectile) -;; (require 'siren-ecb) -;; (require 'siren-project-explorer) -;; (require 'siren-treemacs) + +;; Spelling +(require 'siren-flyspell) + +;; Text editing +(require 'siren-expand-region) +(require 'siren-goto-chg) +(require 'siren-move-dup) +(require 'siren-multiple-cursors) +(require 'siren-randomize-region) +(require 'siren-smart-shift) +(require 'siren-smartparens) +(require 'siren-sort-symbols) +(require 'siren-sort-words) +(require 'siren-string-inflection) +(require 'siren-toggle-comments) +(require 'siren-toggle-quotes) +(require 'siren-yasnippet) + +;; Version control +(require 'siren-diff-hl) +(require 'siren-ediff) +(require 'siren-git-timemachine) +(require 'siren-github) +(require 'siren-magit) + +;; Window management +(require 'siren-buffer-move) +(require 'siren-resize-window) +(require 'siren-windmove) +(require 'siren-zoom-window) ;; Workspace management (require 'siren-escreen) -;; (require 'siren-elscreen) -;; (require 'siren-eyebrowse) -;; (require 'siren-perspective) -;; (require 'siren-workgroups2) ;; Languages (require 'siren-coffee) @@ -85,7 +99,7 @@ (require 'siren-emacs-lisp) (require 'siren-gitconfig) (require 'siren-gitignore) -(require 'siren-go) +(require 'siren-golang) (require 'siren-haml) (require 'siren-js) (require 'siren-json) @@ -93,16 +107,20 @@ (require 'siren-lua) (require 'siren-makefile) (require 'siren-markdown) +(require 'siren-org-mode) (require 'siren-php) (require 'siren-plantuml) +(require 'siren-prog-mode) (require 'siren-ruby) +(require 'siren-rust) (require 'siren-sass) (require 'siren-scss) (require 'siren-sh) +(require 'siren-slim) +(require 'siren-text-mode) (require 'siren-thrift) (require 'siren-web-mode) (require 'siren-yaml) -;; (require 'siren-slim) (provide 'siren-modules) ;;; siren-modules.el ends here diff --git a/custom.el b/custom.el index 016b639..0c20c1b 100644 --- a/custom.el +++ b/custom.el @@ -7,13 +7,12 @@ '(magit-commit-arguments (quote ("-S"))) '(package-selected-packages (quote - (ace-ack ag anti-anywhere anzu-avy bright-bright browse browse-buffer coffee-column company-company completing-cursors dash-descbinds describe-diff diminish-direx-dockerfile dumb-dup-ecb editorconfig-eldoc-eslintd-evil exec-expand feature file-fill fix-flycheck flycheck flycheck-from full-gh git-git gitconfig-github github-gitignore go-go go-go go-go gometalinter-gotest gtags-guides guru-haml helm-helm helm-helm helm-helm helm-helm highlight-highlight highlight-hl ido-ido-imenu indent-indentation indicator inf-inflection json jump-kill line link-lint linum-lua magit-magit markdown-mode mode-mode mode-mode mode-mode mode-mode mode mode-mode mode mode-mode mode mode-mode-mode mode-modes-move+ move-multiple open-package package-package-path phi-php plantuml-projectile-projectile pulls-quotes rainbow-read refactor region-relative rename-ring rspec-ruby-ruby ruby-sass scss-search shell shift smart-smart smartparens smex-string swoop-symbol-theme theme thrift-timemachine-toggle tools twilight-twilight use-vertical-web window-window-yaml-yari yasnippet zoom))) - '(plantuml-jar-path "/usr/local/Cellar/plantuml/8048/plantuml.8048.jar") - '(siren-rubocop-autocorrect-on-save nil)) + (zoom-window yasnippet-snippets yari yaml-mode which-key web-mode use-package toggle-quotes thrift string-inflection smex smartparens smart-shift smart-mode-line slim-mode seeing-is-believing scss-mode sass-mode rust-playground ruby-tools ruby-refactor ruby-compilation rspec-mode robe rjsx-mode resize-window rainbow-mode racer prettier-js plantuml-mode php-mode phi-search neotree multiple-cursors move-dup markdown-mode magit-gh-pulls lua-mode linum-relative json-mode imenu-anywhere ido-vertical-mode ido-completing-read+ highlight-symbol highlight-indentation highlight-indent-guides helm-swoop helm-projectile helm-open-github helm-gtags helm-describe-modes helm-descbinds helm-ag go-projectile go-playground gitignore-mode github-browse-file gitconfig-mode git-timemachine git-link full-ack flycheck-rust flycheck-gometalinter fill-column-indicator feature-mode expand-region exec-path-from-shell evil eslintd-fix editorconfig dumb-jump doom-themes dockerfile-mode direx diminish diff-hl company-go coffee-mode cargo buffer-move browse-kill-ring anzu ace-window)))) (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. + '(go-guru-hl-identifier-face ((t (:background "gray30")))) '(markdown-code-face ((t nil))) '(sp-pair-overlay-face ((t (:inherit nil))))) diff --git a/modules/siren-auto-complete.el b/modules/completion/siren-auto-complete.el similarity index 71% rename from modules/siren-auto-complete.el rename to modules/completion/siren-auto-complete.el index a1958f4..0448909 100644 --- a/modules/siren-auto-complete.el +++ b/modules/completion/siren-auto-complete.el @@ -9,6 +9,12 @@ (require 'siren-flyspell) (use-package auto-complete + :bind (:map ac-completing-map + ("RET" . ac-complete) + ("C-m" . ac-complete) + ("C-s" . ac-isearch) + ("C-n" . ac-next) + ("C-p" . ac-previous)) :config (ac-flyspell-workaround) @@ -17,13 +23,6 @@ ac-delay 0.05 ac-menu-height 15) - (let ((map ac-completing-map)) - (define-key map (kbd "RET") 'ac-complete) - (define-key map (kbd "C-m") 'ac-complete) - (define-key map (kbd "C-s") 'ac-isearch) - (define-key map (kbd "C-n") 'ac-next) - (define-key map (kbd "C-p") 'ac-previous)) - ;; Auto-complete when indenting. (defadvice indent-for-tab-command (around ac-before-indent activate) "Call `auto-complete' if text was recently entered." diff --git a/modules/siren-company.el b/modules/completion/siren-company.el similarity index 99% rename from modules/siren-company.el rename to modules/completion/siren-company.el index ba28b67..0689744 100644 --- a/modules/siren-company.el +++ b/modules/completion/siren-company.el @@ -9,11 +9,7 @@ (require 'siren-fci) (use-package company - :config - - ;; work-around for issues with fci-mode - (defvar-local company-fci-mode-on-p nil) - + :init (defun company-turn-off-fci (&rest ignore) (when (boundp 'fci-mode) (setq company-fci-mode-on-p fci-mode) @@ -22,6 +18,10 @@ (defun company-maybe-turn-on-fci (&rest ignore) (when company-fci-mode-on-p (fci-mode 1))) + :config + ;; work-around for issues with fci-mode + (defvar-local company-fci-mode-on-p nil) + (add-hook 'company-completion-started-hook 'company-turn-off-fci) (add-hook 'company-completion-finished-hook 'company-maybe-turn-on-fci) (add-hook 'company-completion-cancelled-hook 'company-maybe-turn-on-fci) diff --git a/modules/siren-aliases.el b/modules/core/siren-aliases.el similarity index 100% rename from modules/siren-aliases.el rename to modules/core/siren-aliases.el diff --git a/modules/siren-global-keybindings.el b/modules/core/siren-global-keybindings.el similarity index 100% rename from modules/siren-global-keybindings.el rename to modules/core/siren-global-keybindings.el diff --git a/modules/core/siren-packages.el b/modules/core/siren-packages.el new file mode 100644 index 0000000..ec693b9 --- /dev/null +++ b/modules/core/siren-packages.el @@ -0,0 +1,23 @@ +;;; siren-packages.el --- jimeh's Emacs Siren: avy configuration. + +;;; Commentary: + +;; Basic configuration for packages. + +;;; Code: + +(require 'siren-flycheck) + +(use-package package-lint + :defer t) + +(use-package package-build + :defer t) + +(use-package flycheck-package + :defer t + :config + (flycheck-package-setup)) + +(provide 'siren-packages) +;;; siren-packages.el ends here diff --git a/modules/siren-browse-kill-ring.el b/modules/editor/siren-browse-kill-ring.el similarity index 96% rename from modules/siren-browse-kill-ring.el rename to modules/editor/siren-browse-kill-ring.el index e78f386..bdf04f3 100644 --- a/modules/siren-browse-kill-ring.el +++ b/modules/editor/siren-browse-kill-ring.el @@ -7,7 +7,7 @@ ;;; Code: (use-package browse-kill-ring - :init + :config (browse-kill-ring-default-keybindings)) (provide 'siren-browse-kill-ring) diff --git a/modules/siren-edit-server.el b/modules/editor/siren-edit-server.el similarity index 84% rename from modules/siren-edit-server.el rename to modules/editor/siren-edit-server.el index b3409e2..712a9ef 100644 --- a/modules/siren-edit-server.el +++ b/modules/editor/siren-edit-server.el @@ -8,6 +8,8 @@ (use-package edit-server :if window-system + :hook (after-init . edit-server-start) + :init (setq edit-server-default-major-mode 'markdown-mode edit-server-new-frame-alist @@ -15,9 +17,7 @@ (width . 90) (height . 45) (minibuffer . t) - (menu-bar-lines . t))) - - (add-hook 'after-init-hook 'edit-server-start t)) + (menu-bar-lines . t)))) (provide 'siren-edit-server) ;;; siren-edit-server.el ends here diff --git a/modules/editor/siren-evil.el b/modules/editor/siren-evil.el new file mode 100644 index 0000000..5a928de --- /dev/null +++ b/modules/editor/siren-evil.el @@ -0,0 +1,27 @@ +;;; siren-evil.el --- jimeh's Emacs Siren: evil configuration. + +;;; Commentary: + +;; Basic configuration for evil. + +;;; Code: + +;; Various evil config options borrowed from: +;; http://www.lukeswart.net/2015/04/lightning-intro-to-emacs-using-evil-mode-and-org-mode/ +(use-package evil + :demand + :bind (:map evil-normal-state-map + ;; Treat wrapped line scrolling as single lines. + ("j" . evil-next-visual-line) + ("k" . evil-previous-visual-line) + ;; esc quits pretty much anything (like pending prompts in the minibuffer) + :map evil-normal-state-map ("" . keyboard-quit) + :map evil-visual-state-map ("" . keyboard-quit) + :map minibuffer-local-map ("" . minibuffer-keyboard-quit) + :map minibuffer-local-ns-map ("" . minibuffer-keyboard-quit) + :map minibuffer-local-completion-map ("" . minibuffer-keyboard-quit) + :map minibuffer-local-must-match-map ("" . minibuffer-keyboard-quit) + :map minibuffer-local-isearch-map ("" . minibuffer-keyboard-quit))) + +(provide 'siren-evil) +;;; siren-evil.el ends here diff --git a/modules/siren-fci.el b/modules/editor/siren-fci.el similarity index 91% rename from modules/siren-fci.el rename to modules/editor/siren-fci.el index d6cd4b2..14f3f4b 100644 --- a/modules/siren-fci.el +++ b/modules/editor/siren-fci.el @@ -7,6 +7,7 @@ ;;; Code: (use-package fill-column-indicator + :hook (prog-mode . fci-mode) :config (setq fci-rule-width 1 fci-handle-trucate-lines nil)) diff --git a/modules/editor/siren-highlight-indent-guides.el b/modules/editor/siren-highlight-indent-guides.el new file mode 100644 index 0000000..65e1dfc --- /dev/null +++ b/modules/editor/siren-highlight-indent-guides.el @@ -0,0 +1,15 @@ +;;; siren-highlight-indent-guides.el --- jimeh's Emacs Siren: highlight-indent-guides-mode configuration. + +;;; Commentary: + +;; Basic configuration for highlight-indent-guides-mode. + +;;; Code: + +(use-package highlight-indent-guides + :defer t + :commands highlight-indent-guides-mode + :diminish highlight-indent-guides-mode) + +(provide 'siren-highlight-indent-guides) +;;; siren-highlight-indent-guides.el ends here diff --git a/modules/siren-highlight-indentation.el b/modules/editor/siren-highlight-indentation.el similarity index 89% rename from modules/siren-highlight-indentation.el rename to modules/editor/siren-highlight-indentation.el index 31fd54a..9f72d06 100644 --- a/modules/siren-highlight-indentation.el +++ b/modules/editor/siren-highlight-indentation.el @@ -11,8 +11,5 @@ :diminish (highlight-indentation-mode highlight-indentation-current-column-mode)) -(use-package highlight-indent-guides - :defer t) - (provide 'siren-highlight-indentation) ;;; siren-highlight-indentation.el ends here diff --git a/modules/siren-ido.el b/modules/editor/siren-ido.el similarity index 100% rename from modules/siren-ido.el rename to modules/editor/siren-ido.el diff --git a/modules/siren-linum-relative.el b/modules/editor/siren-linum-relative.el similarity index 100% rename from modules/siren-linum-relative.el rename to modules/editor/siren-linum-relative.el diff --git a/modules/editor/siren-linum.el b/modules/editor/siren-linum.el new file mode 100644 index 0000000..56777f9 --- /dev/null +++ b/modules/editor/siren-linum.el @@ -0,0 +1,26 @@ +;;; siren-linum.el --- jimeh's Emacs Siren: linum configuration. + +;;; Commentary: + +;; Basic configuration for linum. + +;;; Code: + +(use-package linum + :ensure nil ;; loaded from emacs built-ins + :hook (prog-mode . linum-mode)) + +(use-package linum+ + :ensure nil ;; loaded from vendor + :after linum + :init + ;; Customize line numbers - In GUI mode the fringe is the spacer between line + ;; numbers and code, while in console mode we add an extra space for it. + (if window-system (setq linum+-dynamic-format " %%%dd") + (setq linum+-dynamic-format " %%%dd ")) + + :config + (setq linum-format 'dynamic)) + +(provide 'siren-linum) +;;; siren-linum.el ends here diff --git a/modules/siren-rainbow.el b/modules/editor/siren-rainbow.el similarity index 85% rename from modules/siren-rainbow.el rename to modules/editor/siren-rainbow.el index 210fd2c..f5bdefd 100644 --- a/modules/siren-rainbow.el +++ b/modules/editor/siren-rainbow.el @@ -7,7 +7,8 @@ ;;; Code: (use-package rainbow-mode - :defer t) + :defer t + :diminish raindbox-mode) (provide 'siren-rainbow) ;;; siren-rainbow.el ends here diff --git a/modules/siren-smex.el b/modules/editor/siren-smex.el similarity index 98% rename from modules/siren-smex.el rename to modules/editor/siren-smex.el index fdf924f..f67f4d5 100644 --- a/modules/siren-smex.el +++ b/modules/editor/siren-smex.el @@ -14,10 +14,8 @@ ("C-c C-m" . smex) ("C-c C-c M-x" . execute-extended-command) - :init - (setq smex-save-file (expand-file-name ".smex-items" siren-savefile-dir)) - :config + (setq smex-save-file (expand-file-name ".smex-items" siren-savefile-dir)) (smex-initialize)) (provide 'siren-smex) diff --git a/modules/siren-undo-tree.el b/modules/editor/siren-undo-tree.el similarity index 98% rename from modules/siren-undo-tree.el rename to modules/editor/siren-undo-tree.el index 9083bc2..d25d69c 100644 --- a/modules/siren-undo-tree.el +++ b/modules/editor/siren-undo-tree.el @@ -7,6 +7,7 @@ ;;; Code: (use-package undo-tree + :demand :bind ("C-x u" . undo-tree-visualize) ("M--" . undo-tree-undo) @@ -17,10 +18,8 @@ :diminish undo-tree-mode - :init - (global-undo-tree-mode) - :config + (global-undo-tree-mode) ;; autosave the undo-tree history (setq undo-tree-history-directory-alist `((".*" . ,temporary-file-directory)) undo-tree-auto-save-history t)) diff --git a/modules/siren-volatile-highlights.el b/modules/editor/siren-volatile-highlights.el similarity index 57% rename from modules/siren-volatile-highlights.el rename to modules/editor/siren-volatile-highlights.el index 9fef853..94089dd 100644 --- a/modules/siren-volatile-highlights.el +++ b/modules/editor/siren-volatile-highlights.el @@ -6,10 +6,15 @@ ;;; Code: -(use-package volatile-highlights-mode +(require 'siren-undo-tree) + +(use-package volatile-highlights + :demand :diminish volatile-highlights-mode - :init - (volatile-highlights-mode t)) + :config + (volatile-highlights-mode t) + (vhl/define-extension 'undo-tree 'undo-tree-yank 'undo-tree-move) + (vhl/install-extension 'undo-tree)) (provide 'siren-volatile-highlights) ;;; siren-volatile-highlights.el ends here diff --git a/modules/siren-which-key.el b/modules/editor/siren-which-key.el similarity index 100% rename from modules/siren-which-key.el rename to modules/editor/siren-which-key.el diff --git a/modules/siren-coffee.el b/modules/languages/siren-coffee.el similarity index 69% rename from modules/siren-coffee.el rename to modules/languages/siren-coffee.el index d9e832e..77af804 100644 --- a/modules/siren-coffee.el +++ b/modules/languages/siren-coffee.el @@ -6,18 +6,13 @@ ;;; Code: -(require 'siren-programming) - (use-package coffee-mode :mode "\\.coffee\\'" :interpreter "coffee" + :hook (coffee-mode . siren-coffee-mode-setup) - :config - (setq coffee-tab-width 2) - - (defun siren-coffee-mode-defaults () - (siren-prog-mode-defaults) - + :init + (defun siren-coffee-mode-setup () ;; remove the "Generated by CoffeeScript" header (add-to-list 'coffee-args-compile "--no-header") @@ -31,9 +26,8 @@ (highlight-indentation-current-column-mode) (subword-mode +1)) - (setq siren-coffee-mode-hook 'siren-coffee-mode-defaults) - (add-hook 'coffee-mode-hook (lambda () - (run-hooks 'siren-coffee-mode-hook)))) + :config + (setq coffee-tab-width 2)) (provide 'siren-coffee) ;;; siren-coffee.el ends here diff --git a/modules/languages/siren-conf.el b/modules/languages/siren-conf.el new file mode 100644 index 0000000..dcf60a7 --- /dev/null +++ b/modules/languages/siren-conf.el @@ -0,0 +1,37 @@ +;;; siren-conf.el --- jimeh's Emacs Siren: conf-mode configuration. + +;;; Commentary: + +;; Basic configuration for conf-mode. + +;;; Code: + +(require 'siren-fci) +(require 'siren-flyspell) +(require 'siren-linum) +(require 'siren-prog-mode) +(require 'siren-flycheck) +(require 'siren-highlight-indentation) +(require 'siren-highlight-symbol) +(require 'siren-smartparens) + +(use-package conf-mode + :mode "Procfile\\'" "\\.conf\\'" "\\.cfg\\'" + :hook (conf-mode . siren-conf-mode-setup) + + :init + (defun siren-conf-mode-setup () + (siren-prog-mode-setup) + (setq tab-width 2) + + (fci-mode) + (flycheck-mode) + (flyspell-prog-mode) + (highlight-indentation-current-column-mode) + (highlight-indentation-set-offset 2) + (highlight-symbol-mode) + (linum-mode) + (smartparens-mode))) + +(provide 'siren-conf) +;;; siren-conf.el ends here diff --git a/modules/languages/siren-css.el b/modules/languages/siren-css.el new file mode 100644 index 0000000..8a57a07 --- /dev/null +++ b/modules/languages/siren-css.el @@ -0,0 +1,26 @@ +;;; siren-css.el --- jimeh's Emacs Siren: css-mode configuration. + +;;; Commentary: + +;; Basic configuration for css-mode. + +;;; Code: + +(require 'siren-rainbow) + +(use-package css-mode + :mode "\\.css\\'" + :hook (css-mode-hook . siren-css-mode-setup) + + :config + (setq css-indent-offset 2) + + :init + (defun siren-css-mode-setup () + (setq tab-width 2) + + (highlight-indentation-current-column-mode +1) + (rainbow-mode +1))) + +(provide 'siren-css) +;;; siren-css.el ends here diff --git a/modules/languages/siren-cucumber.el b/modules/languages/siren-cucumber.el new file mode 100644 index 0000000..839a6e0 --- /dev/null +++ b/modules/languages/siren-cucumber.el @@ -0,0 +1,38 @@ +;;; siren-cucumber.el --- jimeh's Emacs Siren: feature-mode configuration. + +;;; Commentary: + +;; Basic configuration for feature-mode. + +;;; Code: + +(require 'siren-fci) +(require 'siren-flyspell) +(require 'siren-linum) +(require 'siren-prog-mode) +(require 'siren-flycheck) +(require 'siren-highlight-indentation) +(require 'siren-highlight-symbol) +(require 'siren-smartparens) + +(use-package feature-mode + :mode "\\.feature\\'" + :interpreter "cucumber" + :hook (feature-mode . siren-feature-mode-setup) + + :init + (defun siren-feature-mode-setup () + (siren-prog-mode-setup) + (setq tab-width 2) + + (fci-mode) + (flycheck-mode) + (flyspell-prog-mode) + (highlight-indentation-current-column-mode) + (highlight-indentation-set-offset 2) + (highlight-symbol-mode) + (linum-mode) + (smartparens-mode))) + +(provide 'siren-cucumber) +;;; siren-cucumber.el ends here diff --git a/modules/languages/siren-dockerfile.el b/modules/languages/siren-dockerfile.el new file mode 100644 index 0000000..d1a50c1 --- /dev/null +++ b/modules/languages/siren-dockerfile.el @@ -0,0 +1,18 @@ +;;; siren-dockerfile.el --- jimeh's Emacs Siren: dockerfile-mode configuration. + +;;; Commentary: + +;; Basic configuration for dockerfile-mode. + +;;; Code: + +(use-package dockerfile-mode + :mode "Dockerfile.*\\'" + :hook (dockerfile-mode . siren-dockerfile-mode-setup) + + :init + (defun siren-dockerfile-mode-setup () + (subword-mode +1))) + +(provide 'siren-dockerfile) +;;; siren-dockerfile.el ends here diff --git a/modules/siren-emacs-lisp.el b/modules/languages/siren-emacs-lisp.el similarity index 81% rename from modules/siren-emacs-lisp.el rename to modules/languages/siren-emacs-lisp.el index 86363ef..47dfc28 100644 --- a/modules/siren-emacs-lisp.el +++ b/modules/languages/siren-emacs-lisp.el @@ -24,7 +24,7 @@ (when (and file-name (string-match-p ".*-tests?\\.el\\'" file-name)) (setq-local flycheck-checkers '(emacs-lisp))))) -(defun siren-emacs-lisp-mode-defaults () +(defun siren-emacs-lisp-mode-setup () "Sensible defaults for `emacs-lisp-mode'." (highlight-indent-guides-mode) ;; (run-hooks 'siren-lisp-coding-hook) @@ -35,14 +35,8 @@ ;; (siren-conditional-emacs-lisp-checker) ) -(setq siren-emacs-lisp-mode-hook 'siren-emacs-lisp-mode-defaults) -(add-hook 'emacs-lisp-mode-hook (lambda () - (run-hooks 'siren-emacs-lisp-mode-hook))) - +(add-hook 'emacs-lisp-mode-hook #'siren-emacs-lisp-mode-setup) (add-to-list 'auto-mode-alist '("Cask\\'" . emacs-lisp-mode)) -(eval-after-load "rainbow-mode" - '(diminish 'rainbow-mode)) - (provide 'siren-emacs-lisp) ;;; siren-emacs-lisp.el ends here diff --git a/modules/languages/siren-gitconfig.el b/modules/languages/siren-gitconfig.el new file mode 100644 index 0000000..aafd9ea --- /dev/null +++ b/modules/languages/siren-gitconfig.el @@ -0,0 +1,17 @@ +;;; siren-gitconfig.el --- jimeh's Emacs Siren: gitconfig-mode configuration. + +;;; Commentary: + +;; Basic configuration for gitconfig-mode. + +;;; Code: + +(use-package gitconfig-mode + :mode "\\.gitconfig" "gitconfig\\'" "\\.git\\\/config" + :hook (gitconfig-mode . siren-gitconfig-mode-setup) + + :init + (defun siren-gitconfig-mode-setup ())) + +(provide 'siren-gitconfig) +;;; siren-gitconfig.el ends here diff --git a/modules/languages/siren-gitignore.el b/modules/languages/siren-gitignore.el new file mode 100644 index 0000000..ee8e3a2 --- /dev/null +++ b/modules/languages/siren-gitignore.el @@ -0,0 +1,17 @@ +;;; siren-gitignore.el --- jimeh's Emacs Siren: gitignore-mode configuration. + +;;; Commentary: + +;; Basic configuration for gitignore-mode. + +;;; Code: + +(use-package gitignore-mode + :mode "\\.gitignore" "gitignore\\'" + :hook (gitignore-mode . siren-gitignore-mode-setup) + + :init + (defun siren-gitignore-mode-setup ())) + +(provide 'siren-gitignore) +;;; siren-gitignore.el ends here diff --git a/modules/languages/siren-golang.el b/modules/languages/siren-golang.el new file mode 100644 index 0000000..b305658 --- /dev/null +++ b/modules/languages/siren-golang.el @@ -0,0 +1,125 @@ +;;; siren-golang.el --- jimeh's Emacs Siren: go-mode configuration. + +;;; Commentary: + +;; Basic configuration for go-mode. + +;;; Code: + +(require 'siren-company) +(require 'siren-flycheck) +(require 'siren-folding) +(require 'siren-projectile) + +(use-package go-mode + :mode "\\.go\\'" + :interpreter "go" + :commands go-mode + :bind (:map go-mode-map + ("RET" . newline-and-indent) + ("C-h f" . godoc-at-point)) + + :hook + (go-mode . siren-go-mode-setup) + + :init + (defun siren-go-mode-setup () + ;; Prefer goimports to gofmt if installed + (let ((goimports (executable-find "goimports"))) + (when goimports + (setq gofmt-command goimports))) + + ;; gofmt on save + (add-hook 'before-save-hook 'gofmt-before-save nil t) + + (highlight-symbol-mode -1) + (hs-minor-mode 1) + (hideshowvis-enable) + (whitespace-toggle-options '(tabs)) + (setq tab-width 4) + (subword-mode +1)) + + :config + (message "loading go-mode") + + (when (memq window-system '(mac ns)) + (exec-path-from-shell-copy-env "GOPATH")) + + (define-key 'help-command (kbd "G") 'godoc) + + ;; Ignore go test -c output files + (add-to-list 'completion-ignored-extensions ".test")) + +(use-package company-go + :defer t + :after go-mode + :hook (go-mode . siren-company-go-setup) + + :init + (defun siren-company-go-setup () + (set (make-local-variable 'company-backends) '(company-go)) + (company-mode +1))) + +(use-package go-eldoc + :defer t + :diminish eldoc-mode + :commands go-eldoc-setup + :hook (go-mode . go-eldoc-setup)) + +(use-package go-guru + :after go-mode + :bind (:map go-mode-map + ("C-c C-j" . go-guru-definition) + ("C-c b" . pop-tag-mark)) + :hook (go-mode . siren-go-guru-setup) + + :init + (defun siren-go-guru-setup () + (setq go-guru-hl-identifier-idle-time 0.1) + (go-guru-hl-identifier-mode 1)) + + :config + (custom-set-faces + '(go-guru-hl-identifier-face ((t (:background "gray30")))))) + +(use-package go-rename + :after go-mode + :bind (:map go-mode-map + ("C-c ." . go-rename))) + +(use-package gotest + :after go-mode + :bind (:map go-mode-map + ("C-c , a" . go-test-current-project) + ("C-c , v" . go-test-current-file) + ("C-c , s" . go-test-current-test) + ("C-c , c" . go-test-current-coverage) + ("C-c , b" . go-test-current-benchmark) + ("C-c , B" . go-test-current-project-benchmarks) + ("C-c , r" . go-run))) + +(use-package go-projectile + :after go-mode + :hook (go-mode . siren-go-projectile-setup) + + :init + (defun siren-go-projectile-setup () + ;; prevent go-projectile from screwing up GOPATH + (setq go-projectile-switch-gopath 'never))) + +(use-package flycheck-gometalinter + :defer t + :after go-mode + :commands flycheck-gometalinter-setup + :hook (flycheck-mode . flycheck-gometalinter-setup) + + :init + (setq flycheck-gometalinter-fast t + flycheck-gometalinter-tests t + flycheck-gometalinter-vendor t)) + +(use-package go-playground + :commands go-playground) + +(provide 'siren-golang) +;;; siren-golang.el ends here diff --git a/modules/siren-haml.el b/modules/languages/siren-haml.el similarity index 54% rename from modules/siren-haml.el rename to modules/languages/siren-haml.el index 68da340..e818ec3 100644 --- a/modules/siren-haml.el +++ b/modules/languages/siren-haml.el @@ -8,16 +8,13 @@ (use-package haml-mode :mode "\\.haml\\'" "\\.hamlc\\'" + :hook (haml-mode . siren-haml-mode-setup) - :config - (defun siren-haml-mode-defaults () - (siren-prog-mode-defaults) + :init + (defun siren-haml-mode-setup () (setq tab-width 2) (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode)) - - (setq siren-haml-mode-hook 'siren-haml-mode-defaults) - (add-hook 'haml-mode-hook (lambda () (run-hooks 'siren-haml-mode-hook)))) + (highlight-indentation-current-column-mode +1))) (provide 'siren-haml) ;;; siren-haml.el ends here diff --git a/modules/languages/siren-js.el b/modules/languages/siren-js.el new file mode 100644 index 0000000..1d7770c --- /dev/null +++ b/modules/languages/siren-js.el @@ -0,0 +1,42 @@ +;;; siren-js.el --- jimeh's Emacs Siren: js-mode configuration. + +;;; Commentary: + +;; Basic configuration for js-mode. + +;;; Code: + +(require 'siren-prettier-js) +(require 'siren-folding) + +(use-package js-mode + :ensure nil ;; loaded from emacs built-ins + :mode + "\\.js\\'" + "\\.pac\\'" + "node" + + :hook + (js-mode . siren-js-mode-setup) + + :init + (defun siren-js-mode-setup () + "Default tweaks for `js-mode'." + (let ((width 2)) + (setq js-indent-level width + indent-level width + tab-width width)) + + (prettier-js-mode) + (company-mode +1) + (subword-mode +1) + (hs-minor-mode 1) + (highlight-indentation-current-column-mode) + (hideshowvis-enable) + + (let ((map js-mode-map)) + (define-key map (kbd "C-j") 'newline-and-indent) + (define-key map (kbd "C-c C-h") 'siren-toggle-hiding)))) + +(provide 'siren-js) +;;; siren-js.el ends here diff --git a/modules/languages/siren-json.el b/modules/languages/siren-json.el new file mode 100644 index 0000000..923ae81 --- /dev/null +++ b/modules/languages/siren-json.el @@ -0,0 +1,36 @@ +;;; siren-json.el --- jimeh's Emacs Siren: json-mode configuration. + +;;; Commentary: + +;; Basic configuration for json-mode. + +;;; Code: + +(require 'siren-eslintd-fix) +(require 'siren-folding) + +(use-package json-mode + :mode "\\.json\\'" + :requires (flycheck highlight-indentation omnifmt hideshowvis) + + :bind (:map json-mode-map + ("C-j" . newline-and-indent) + ("C-c C-h" . siren-toggle-hiding)) + + :hook + (json-mode . siren-json-mode-setup) + + :init + (defun siren-json-mode-setup () + "Default tweaks for `json-mode'." + + (let ((width 2)) + (setq js-indent-level width) + (setq json-reformat:indent-width width) + (setq tab-width width) + (highlight-indentation-set-offset width)) + + (setq flycheck-checker 'json-jsonlint))) + +(provide 'siren-json) +;;; siren-js.el ends here diff --git a/modules/languages/siren-jsx.el b/modules/languages/siren-jsx.el new file mode 100644 index 0000000..e4840b5 --- /dev/null +++ b/modules/languages/siren-jsx.el @@ -0,0 +1,26 @@ +;;; siren-jsx.el --- jimeh's Emacs Siren: .jsx file configuration + +;;; Commentary: + +;; Basic configuration for dealing with .jsx files. + +;;; Code: + +(require 'siren-prettier-js) + +(use-package rjsx-mode + :mode "components\\/.*\\.js\\'" + + :hook (rjsx-mode . siren-rjsx-mode-setup) + + :init + (defun siren-rjsx-mode-setup () + (prettier-js-mode +1) + (company-mode +1) + (subword-mode +1) + (hs-minor-mode +1) + (highlight-indentation-current-column-mode +1) + (hideshowvis-enable))) + +(provide 'siren-jsx) +;;; siren-jsx.el ends here diff --git a/modules/siren-lisp.el b/modules/languages/siren-lisp.el similarity index 94% rename from modules/siren-lisp.el rename to modules/languages/siren-lisp.el index 823954f..efe9fe2 100644 --- a/modules/siren-lisp.el +++ b/modules/languages/siren-lisp.el @@ -6,6 +6,8 @@ ;;; Code: +(require 'siren-highlight-indent-guides) + ;; Lisp configuration (define-key read-expression-map (kbd "TAB") 'completion-at-point) diff --git a/modules/languages/siren-lua.el b/modules/languages/siren-lua.el new file mode 100644 index 0000000..2b0b258 --- /dev/null +++ b/modules/languages/siren-lua.el @@ -0,0 +1,22 @@ +;;; siren-lua.el --- jimeh's Emacs Siren: lua-mode configuration. + +;;; Commentary: + +;; Basic configuration for lua-mode. + +;;; Code: + +(use-package lua-mode + :hook + (lua-mode . siren-lua-mode-setup) + + :init + (defun siren-lua-mode-setup () + (setq lua-indent-level 2 + whitespace-action '(auto-cleanup)) + + (highlight-indentation-current-column-mode) + (subword-mode +1))) + +(provide 'siren-lua) +;;; siren-lua.el ends here diff --git a/modules/languages/siren-makefile.el b/modules/languages/siren-makefile.el new file mode 100644 index 0000000..55a5656 --- /dev/null +++ b/modules/languages/siren-makefile.el @@ -0,0 +1,23 @@ +;;; siren-makefile.el --- jimeh's Emacs Siren: makefile-mode configuration. + +;;; Commentary: + +;; Basic configuration for makefile-mode. + +;;; Code: + +(use-package make-mode + :ensure nil ;; loaded from emacs built-ins + :hook + (makefile-mode-hook . siren-makefile-mode-setup) + + :init + (add-to-list 'siren-indent-sensitive-modes 'makefile-mode) + (defun siren-makefile-mode-setup () + (subword-mode +1) + (setq tab-width 4) + (highlight-indentation-set-offset 4) + (highlight-indentation-current-column-mode))) + +(provide 'siren-makefile) +;;; siren-makefile.el ends here diff --git a/modules/siren-markdown.el b/modules/languages/siren-markdown.el similarity index 52% rename from modules/siren-markdown.el rename to modules/languages/siren-markdown.el index ceb3bff..1ab83e9 100644 --- a/modules/siren-markdown.el +++ b/modules/languages/siren-markdown.el @@ -6,7 +6,9 @@ ;;; Code: +(require 'siren-fci) (require 'siren-flyspell) +(require 'siren-linum) (require 'siren-smartparens) (use-package markdown-mode @@ -17,28 +19,27 @@ "\\.mdown" "\\.markdown" + :bind (:map markdown-mode-map + ("C-c p" . markdown-preview)) + + :hook + (markdown-mode . siren-markdown-mode-setup) + + :init + (defun siren-markdown-mode-setup () + (setq markdown-asymmetric-header t + whitespace-action nil) + + (auto-fill-mode) + (fci-mode) + (flyspell-mode) + (linum-mode t) + (smartparens-mode +1) + (subword-mode)) + :config (setq markdown-command "redcarpet") - - (defun siren-markdown-mode-defaults () - (setq whitespace-action nil - fill-column 80 - markdown-asymmetric-header t) - - (fci-mode) - (linum-mode t) - (flyspell-mode) - (auto-fill-mode) - (smartparens-mode +1) - (subword-mode) - (define-key markdown-mode-map (kbd "C-c p") 'markdown-preview)) - - (setq siren-markdown-mode-hook 'siren-markdown-mode-defaults) - (add-hook 'markdown-mode-hook (lambda () - (run-hooks 'siren-markdown-mode-hook)))) - -(custom-set-faces - '(markdown-code-face ((t nil)))) + (custom-set-faces '(markdown-code-face ((t nil))))) (provide 'siren-markdown) ;;; siren-markdown.el ends here diff --git a/modules/languages/siren-org-mode.el b/modules/languages/siren-org-mode.el new file mode 100644 index 0000000..91cb84b --- /dev/null +++ b/modules/languages/siren-org-mode.el @@ -0,0 +1,43 @@ +;;; siren-org-mode.el --- jimeh's Emacs Siren: org-mode configuration. + +;;; Commentary: + +;; Basic configuration for org-mode. + +;;; Code: + +(require 'siren-fci) +(require 'siren-flyspell) +(require 'siren-linum) +(require 'siren-smartparens) + +(use-package org-mode + :ensure nil ;; loaded from emacs built-ins + :hook (org-mode-hook . siren-org-mode-setup) + + :init + (defun siren-org-mode-setup () + (setq org-export-backends '(ascii html icalendar latex md confluence) + fill-column 80 + whitespace-action '(auto-cleanup)) + + (linum-mode t) + (flyspell-mode) + (fci-mode) + (smartparens-mode +1) + (visual-line-mode +1) + (whitespace-mode +1) + (let ((map org-mode-map)) + (define-key map (kbd "M-[") 'org-promote-subtree) + (define-key map (kbd "M-]") 'org-demote-subtree) + (define-key map (kbd "M-p") 'org-metaup) + (define-key map (kbd "M-n") 'org-metadown) + (define-key map (kbd "C-M-n") 'outline-next-visible-heading) + (define-key map (kbd "C-M-p") 'outline-previous-visible-heading)))) + +(use-package org-mouse + :ensure nil ;; loaded from emacs built-ins + :after org-mode) + +(provide 'siren-org-mode) +;;; siren-org-mode.el ends here diff --git a/modules/siren-php.el b/modules/languages/siren-php.el similarity index 55% rename from modules/siren-php.el rename to modules/languages/siren-php.el index 11dc69d..28dfd59 100644 --- a/modules/siren-php.el +++ b/modules/languages/siren-php.el @@ -6,23 +6,24 @@ ;;; Code: -(require 'siren-programming) +(require 'siren-folding) +(require 'siren-highlight-indentation) (require 'siren-rainbow) (use-package php-mode - :config - (defun siren-php-mode-defaults () - (siren-prog-mode-defaults) + :interpreter "php" + :mode "\\.php\\'" "\\.inc\\'" "\\.module\\'" + :hook + (php-mode . siren-php-mode-setup) + + :init + (defun siren-php-mode-setup () (rainbow-mode +1) (company-mode +1) (subword-mode +1) (highlight-indentation-current-column-mode) (hs-minor-mode 1) - (hideshowvis-enable)) - - (setq siren-php-mode-hook 'siren-php-mode-defaults) - (add-hook 'php-mode-hook (lambda () - (run-hooks 'siren-php-mode-hook)))) + (hideshowvis-enable))) (provide 'siren-php) ;;; siren-php.el ends here diff --git a/modules/languages/siren-plantuml.el b/modules/languages/siren-plantuml.el new file mode 100644 index 0000000..f7c601a --- /dev/null +++ b/modules/languages/siren-plantuml.el @@ -0,0 +1,25 @@ +;;; siren-plantuml.el --- jimeh's Emacs Siren: plantuml-mode configuration. + +;;; Commentary: + +;; Basic configuration for plantuml-mode. + +;;; Code: + +(require 'siren-highlight-indentation) + +(use-package plantuml-mode + :mode "\\.uml\\'" + :hook + (plantuml-mode . siren-plantuml-mode-setup) + + :init + (defun siren-plantuml-mode-setup () + (setq tab-width 2 + plantuml-jar-path "/usr/local/opt/plantuml/libexec/plantuml.jar") + + (highlight-indentation-set-offset 2) + (highlight-indentation-current-column-mode))) + +(provide 'siren-plantuml) +;;; siren-plantuml.el ends here diff --git a/modules/languages/siren-prog-mode.el b/modules/languages/siren-prog-mode.el new file mode 100644 index 0000000..464558e --- /dev/null +++ b/modules/languages/siren-prog-mode.el @@ -0,0 +1,24 @@ +;;; siren-prog-mode.el --- jimeh's Emacs Siren: defaults for programming modes + +;;; Commentary: + +;; Basic configuration shared across all programming languages. + +;;; Code: + +(use-package prog-mode + :ensure nil ;; loaded from emacs built-ins + :hook + (prog-mode . siren-prog-mode-setup) + + :init + (defun siren-prog-mode-setup () + "Default coding hook, useful with any programming language." + (setq fill-column 80 + whitespace-action '(auto-cleanup)) + + (visual-line-mode +1) + (whitespace-mode +1))) + +(provide 'siren-prog-mode) +;;; siren-prog-mode.el ends here diff --git a/modules/languages/siren-ruby.el b/modules/languages/siren-ruby.el new file mode 100644 index 0000000..12f855e --- /dev/null +++ b/modules/languages/siren-ruby.el @@ -0,0 +1,159 @@ +;;; siren-ruby.el --- jimeh's Emacs Siren: ruby-mode configuration. + +;;; Commentary: + +;; Basic configuration for ruby-mode. + +;;; Code: + +(require 'siren-company) +(require 'siren-folding) +(require 'siren-highlight-indentation) +(require 'siren-smartparens) +(require 'siren-toggle-quotes) + +(require 'smartparens-ruby) + +(use-package ruby-mode + :ensure nil ;; loaded from emacs built-ins + :interpreter "ruby" + :mode + "Appraisals\\'" + "Berksfile\\'" + "Capfile\\'" + "Gemfile\\'" + "Guardfile\\'" + "Podfile\\'" + "Puppetfile\\'" + "Rakefile\\'" + "Thorfile\\'" + "Vagrantfile\\'" + "\\.cap\\'" + "\\.gemspec\\'" + "\\.jbuilder\\'" + "\\.podspec\\'" + "\\.rabl\\'" + "\\.rake\\'" + "\\.ru\\'" + "\\.thor\\'" + "\\.rb\\'" + + :bind (:map ruby-mode-map + ("C-j" . newline-and-indent) + ("RET" . newline-and-indent) + ("C-c C-l" . goto-line) + ("C-M-f" . sp-ruby-forward-sexp) + ("C-M-b" . sp-ruby-backward-sexp)) + + :hook + (ruby-mode . siren-ruby-mode-setup) + + :init + (defun siren-ruby-mode-setup () + (setq c-tab-always-indent nil + ruby-align-chained-calls t + ruby-insert-encoding-magic-comment t + ruby-use-smie t + tab-width 2) + + (company-mode +1) + (hs-minor-mode 1) + (hideshowvis-enable) + (highlight-indentation-current-column-mode) + (subword-mode +1)) + + :config + ;; We never want to edit Rubinius bytecode + (add-to-list 'completion-ignored-extensions ".rbc") + + ;; Set up hs-mode (HideShow) for Ruby + (add-to-list 'hs-special-modes-alist + `(ruby-mode + ,(rx (or "def" "class" "module" "do" "if" "case")) ;; Block start + ,(rx (or "end")) ;; Block end + ,(rx (or "#" "=begin")) ;; Comment start + ruby-forward-sexp nil)) + + ;; Make company-mode play nice + (push 'ruby-mode company-dabbrev-code-modes)) + +(use-package inf-ruby + :defer t + :hook + (ruby-mode . inf-ruby-minor-mode) + (compilation-filter . inf-ruby-auto-enter) + :config + (unbind-key "C-c C-r" inf-ruby-minor-mode-map)) + +(use-package robe + :defer t + :bind (:map robe-mode-map + ("C-c C-j" . robe-jump) + ("C-c b". pop-tag-mark)) + :hook (ruby-mode . robe-mode) + + :init + (eval-after-load 'company + '(push 'company-robe company-backends)) + + :config + ;; Unbind keys used by siren-expand-region module. + (unbind-key "M-." robe-mode-map) + (unbind-key "M-," robe-mode-map)) + +(use-package rspec-mode + :defer t + :hook (rspec-mode . siren-rspec-mode-setup) + :init + (defun siren-rspec-mode-setup () + (setq compilation-scroll-output t + rspec-primary-source-dirs '("app") + rspec-use-spring-when-possible nil)) + + :config + (rspec-install-snippets)) + +(use-package rubocopfmt + :ensure nil ;; loaded from vendor + :commands (rubocopfmt rubocopfmt-mode) + :bind (:map ruby-mode-map + ("C-c C-f" . rubocopfmt)) + :hook (ruby-mode . rubocopfmt-mode)) + +(use-package ruby-compilation + :defer t) + +(use-package ruby-refactor + :defer t + :hook + (ruby-mode . ruby-refactor-mode) + (ruby-refactor . siren-ruby-refactor-setup) + + :init + (setq ruby-refactor-keymap-prefix (kbd "C-c C-=")) + (defun siren-ruby-refactor-setup () + (setq ruby-refactor-add-parens t))) + +(use-package ruby-tools + :defer t + :diminish ruby-tools-mode + :bind (:map ruby-tools-mode-map + ("C-'" . toggle-quotes)) + :hook + (ruby-mode . ruby-tools-mode) + + :config + ;; Unbind key used by siren-resize-window module. + (unbind-key "C-;" ruby-tools-mode-map)) + +(use-package seeing-is-believing + :defer t + :commands seeing-is-believing) + +(use-package yari + :defer t + :init + (define-key 'help-command (kbd "R") 'yari)) + +(provide 'siren-ruby) +;;; siren-ruby.el ends here diff --git a/modules/languages/siren-rust.el b/modules/languages/siren-rust.el new file mode 100644 index 0000000..bfbf3c0 --- /dev/null +++ b/modules/languages/siren-rust.el @@ -0,0 +1,56 @@ +;;; siren-rust.el --- jimeh's Emacs Siren: rust-mode configuration. + +;;; Commentary: + +;; Basic configuration for rust-mode. + +;;; Code: + +(require 'siren-folding) +(require 'siren-highlight-indentation) + +(use-package rust-mode + :mode "\\.rs\\'" + :interpreter "rust" + :commands rust-mode + :bind (:map rust-mode-map + ("RET" . newline-and-indent)) + + :hook + (rust-mode . siren-rust-mode-setup) + + :init + (defun siren-rust-mode-setup () + (setq rust-format-on-save t) + + (hs-minor-mode 1) + (hideshowvis-enable) + (highlight-indentation-current-column-mode) + (subword-mode +1))) + +(use-package cargo + :hook (rust-mode . cargo-minor-mode)) + +(use-package flycheck-rust + :after rust-mode + :hook (flycheck-mode . flycheck-rust-setup)) + +(use-package racer + :requires rust-mode company + :commands racer-mode + :bind (:map rust-mode-map + ("TAB" . company-indent-or-complete-common)) + + :hook + (rust-mode . racer-mode) + (racer-mode . eldoc-mode) + (racer-mode . siren-racer-mode-setup) + + :config + (defun siren-racer-mode-setup () + (setq company-tooltip-align-annotations t))) + +(use-package rust-playground) + +(provide 'siren-rust) +;;; siren-rust.el ends here diff --git a/modules/siren-sass.el b/modules/languages/siren-sass.el similarity index 56% rename from modules/siren-sass.el rename to modules/languages/siren-sass.el index 5351444..4b6ed14 100644 --- a/modules/siren-sass.el +++ b/modules/languages/siren-sass.el @@ -10,16 +10,15 @@ (use-package sass-mode :mode "\\.sass\\'" + :hook (sass-mode . siren-sass-mode-setup) + + :init + (defun siren-sass-mode-setup () + (siren-css-mode-css)) :config ;; turn off annoying auto-compile on save - (setq sass-compile-at-save nil) - - (defun siren-sass-mode-defaults () - (siren-css-mode-defaults)) - - (setq siren-sass-mode-hook 'siren-sass-mode-defaults) - (add-hook 'sass-mode-hook (lambda () (run-hooks 'siren-sass-mode-hook)))) + (setq sass-compile-at-save nil)) (provide 'siren-sass) ;;; siren-sass.el ends here diff --git a/modules/siren-scss.el b/modules/languages/siren-scss.el similarity index 56% rename from modules/siren-scss.el rename to modules/languages/siren-scss.el index 904f4ba..e40b6f2 100644 --- a/modules/siren-scss.el +++ b/modules/languages/siren-scss.el @@ -10,16 +10,15 @@ (use-package scss-mode :mode "\\.scss\\'" + :hook (scss-mode-hook . siren-scss-mode-setup) + + :init + (defun siren-scss-mode-setup () + (siren-css-mode-setup)) :config ;; turn off annoying auto-compile on save - (setq scss-compile-at-save nil) - - (defun siren-scss-mode-defaults () - (siren-css-mode-defaults)) - - (setq siren-scss-mode-hook 'siren-scss-mode-defaults) - (add-hook 'scss-mode-hook (lambda () (run-hooks 'siren-scss-mode-hook)))) + (setq scss-compile-at-save nil)) (provide 'siren-scss) ;;; siren-scss.el ends here diff --git a/modules/languages/siren-sh.el b/modules/languages/siren-sh.el new file mode 100644 index 0000000..e80b10d --- /dev/null +++ b/modules/languages/siren-sh.el @@ -0,0 +1,29 @@ +;;; siren-sh.el --- jimeh's Emacs Siren: sh-mode configuration. + +;;; Commentary: + +;; Basic configuration for sh-mode. + +;;; Code: + +(require 'siren-highlight-indentation) + +(use-package sh-script + :ensure nil ;; loaded from emacs built-ins + :hook + (sh-mode-hook . siren-sh-mode-setup) + + :init + (defun siren-sh-mode-setup () + (setq tab-width 2 + sh-basic-offset 2 + sh-indentation 2 + whitespace-action '(auto-cleanup)) + + (subword-mode +1) + (highlight-indentation-set-offset 2) + (highlight-indentation-current-column-mode) + (define-key sh-mode-map (kbd "RET") 'newline-and-indent))) + +(provide 'siren-sh) +;;; siren-sh.el ends here diff --git a/modules/languages/siren-slim.el b/modules/languages/siren-slim.el new file mode 100644 index 0000000..12ee148 --- /dev/null +++ b/modules/languages/siren-slim.el @@ -0,0 +1,20 @@ +;;; siren-slim.el --- jimeh's Emacs Siren: slim-mode configuration. + +;;; Commentary: + +;; Basic configuration for slim-mode. + +;;; Code: + +(require 'siren-highlight-indentation) + +(use-package slim-mode + :mode "\\.slim\\'" + :hook (slim-mode-hook . siren-slim-mode-hook) + + :init + (defun siren-slim-mode-setup () + (highlight-indentation-current-column-mode))) + +(provide 'siren-slim) +;;; siren-slim.el ends here diff --git a/modules/languages/siren-text-mode.el b/modules/languages/siren-text-mode.el new file mode 100644 index 0000000..c4b2a4f --- /dev/null +++ b/modules/languages/siren-text-mode.el @@ -0,0 +1,17 @@ +;;; siren-text-mode.el --- jimeh's Emacs Siren: text-mode configuration. + +;;; Commentary: + +;; Basic configuration for text-mode. + +;;; Code: + +(use-package text-mode + :ensure nil ;; loaded from emacs built-ins + :hook (text-mode . siren-text-mode-setup) + :init + (defun siren-text-mode-setup () + (setq fill-column 80))) + +(provide 'siren-text-mode) +;;; siren-text-mode.el ends here diff --git a/modules/languages/siren-thrift.el b/modules/languages/siren-thrift.el new file mode 100644 index 0000000..e7d3fac --- /dev/null +++ b/modules/languages/siren-thrift.el @@ -0,0 +1,38 @@ +;;; siren-thrift.el --- jimeh's Emacs Siren: thrift-mode configuration. + +;;; Commentary: + +;; Basic configuration for thrift-mode. + +;;; Code: + +(require 'siren-fci) +(require 'siren-flyspell) +(require 'siren-linum) +(require 'siren-prog-mode) +(require 'siren-flycheck) +(require 'siren-highlight-indentation) +(require 'siren-highlight-symbol) +(require 'siren-smartparens) + +(use-package thrift + :mode "\\.thrift\\'" + :hook (thrift-mode-hook . siren-thrift-mode-setup) + + :init + (defun siren-thrift-mode-setup () + (siren-prog-mode-setup) + (setq tab-width 2) + + (fci-mode) + (flycheck-mode) + (flyspell-prog-mode) + (highlight-indentation-current-column-mode) + (highlight-indentation-set-offset 2) + (highlight-symbol-mode) + (linum-mode) + (smartparens-mode) + (subword-mode +1))) + +(provide 'siren-thrift) +;;; siren-thrift.el ends here diff --git a/modules/siren-web-mode.el b/modules/languages/siren-web-mode.el similarity index 61% rename from modules/siren-web-mode.el rename to modules/languages/siren-web-mode.el index fcc5639..604cd03 100644 --- a/modules/siren-web-mode.el +++ b/modules/languages/siren-web-mode.el @@ -6,36 +6,41 @@ ;;; Code: -(require 'siren-programming) +(require 'siren-company) +(require 'siren-fci) +(require 'siren-folding) +(require 'siren-highlight-indentation) (use-package web-mode :mode "\\.html\\'" "\\.html.erb\\'" - :config - (setq web-mode-code-indent-offset 2 - web-mode-css-indent-offset 2 - web-mode-markup-indent-offset 2 - web-mode-sql-indent-offset 2) + :bind (:map web-mode-map + ("C-j" . newline-and-indent) + ("C-c C-h" . siren-toggle-hiding)) - (defun siren-web-mode-mode-hook () + :hook + (web-mode-hook . siren-web-mode-setup) + + :init + (defun siren-web-mode-mode-setup () "Default tweaks for `web-mode'." (setq tab-width 2) - (siren-prog-mode-defaults) (company-mode +1) (fci-mode -1) (hideshowvis-enable) (hs-minor-mode +1) (highlight-indentation-current-column-mode) (highlight-indentation-set-offset 2) - (subword-mode +1) - (let ((map web-mode-map)) - (define-key map (kbd "C-j") 'newline-and-indent) - (define-key map (kbd "C-c C-h") 'siren-toggle-hiding))) + (subword-mode +1)) - (add-hook 'web-mode-hook 'siren-web-mode-mode-hook)) + :config + (setq web-mode-code-indent-offset 2 + web-mode-css-indent-offset 2 + web-mode-markup-indent-offset 2 + web-mode-sql-indent-offset 2)) (provide 'siren-web-mode) ;;; siren-web-mode.el ends here diff --git a/modules/languages/siren-yaml.el b/modules/languages/siren-yaml.el new file mode 100644 index 0000000..7e31495 --- /dev/null +++ b/modules/languages/siren-yaml.el @@ -0,0 +1,39 @@ +;;; siren-yaml.el --- jimeh's Emacs Siren: yaml-mode configuration. + +;;; Commentary: + +;; Basic configuration for yaml-mode. + +;;; Code: + +(require 'siren-fci) +(require 'siren-flyspell) +(require 'siren-highlight-indentation) +(require 'siren-linum) +(require 'siren-prog-mode) +(require 'siren-smartparens) + +(use-package yaml-mode + :mode "\\.yml\\'" "\\.yaml\\'" + :bind (:map yaml-mode-map + ("RET" . newline-and-indent)) + + :hook + (yaml-mode . siren-yaml-mode-setup) + + :init + (defun siren-yaml-mode-setup () + (siren-prog-mode-setup) + (setq tab-width 2 + whitespace-action '(auto-cleanup)) + + (fci-mode) + (flyspell-mode) + (highlight-indentation-current-column-mode) + (highlight-indentation-set-offset 2) + (linum-mode t) + (smartparens-mode +1) + (subword-mode +1))) + +(provide 'siren-yaml) +;;; siren-yaml.el ends here diff --git a/modules/linting/siren-eslintd-fix.el b/modules/linting/siren-eslintd-fix.el new file mode 100644 index 0000000..9913a72 --- /dev/null +++ b/modules/linting/siren-eslintd-fix.el @@ -0,0 +1,13 @@ +;;; siren-eslintd-fix.el --- jimeh's Emacs Siren: eslintd-fix configuration. + +;;; Commentary: + +;; Basic configuration for eslintd-fix. + +;;; Code: + +(use-package eslintd-fix + :defer t) + +(provide 'siren-eslintd-fix) +;;; siren-eslintd-fix.el ends here diff --git a/modules/siren-flycheck.el b/modules/linting/siren-flycheck.el similarity index 93% rename from modules/siren-flycheck.el rename to modules/linting/siren-flycheck.el index 3f741c1..4b7d2f7 100644 --- a/modules/siren-flycheck.el +++ b/modules/linting/siren-flycheck.el @@ -7,6 +7,7 @@ ;;; Code: (use-package flycheck + :hook (prog-mode . flycheck-mode) :config (setq flycheck-completion-system 'ido flycheck-idle-change-delay 1.0 diff --git a/modules/linting/siren-prettier-js.el b/modules/linting/siren-prettier-js.el new file mode 100644 index 0000000..453062a --- /dev/null +++ b/modules/linting/siren-prettier-js.el @@ -0,0 +1,16 @@ +;;; siren-prettier-js.el --- jimeh's Emacs Siren: prettier-js configuration. + +;;; Commentary: + +;; Basic configuration for prettier-js package + +;;; Code: + +(use-package prettier-js + :hook (prettier-js-mode . siren-prettier-js-mode-setup) + + :init + (defun siren-prettier-js-mode-setup ())) + +(provide 'siren-prettier-js) +;;; siren-prettier-js.el ends here diff --git a/modules/siren-rubocop.el b/modules/linting/siren-rubocop.el similarity index 80% rename from modules/siren-rubocop.el rename to modules/linting/siren-rubocop.el index e6584ef..1985471 100644 --- a/modules/siren-rubocop.el +++ b/modules/linting/siren-rubocop.el @@ -8,6 +8,15 @@ (use-package rubocop :defer t + :bind (:map rubocop-mode-map + ("C-c C-f" . siren-rubocop-autocorrect)) + + :hook + (rubocop-mode . siren-rubocop-mode-setup) + (after-save . siren-rubocop-autocorrect-hook) + + :init + (defun siren-rubocop-mode-setup ()) :config (defgroup siren-rubocop nil @@ -56,17 +65,7 @@ auto-correction is triggered." (defun siren-rubocop-autocorrect-hook () "Siren's Rubocop auto-correct hook." (if siren-rubocop-autocorrect-on-save - (siren-rubocop-autocorrect-p nil))) - - (defun siren-rubocop-mode-defaults () - (add-hook 'after-save-hook 'siren-rubocop-autocorrect-hook nil t) - - (let ((map rubocop-mode-map)) - (define-key map (kbd "C-c C-f") 'siren-rubocop-autocorrect))) - - (setq siren-rubocop-mode-hook 'siren-rubocop-mode-defaults) - (add-hook 'rubocop-mode-hook (lambda () - (run-hooks 'siren-rubocop-mode-hook)))) + (siren-rubocop-autocorrect-p nil)))) (provide 'siren-rubocop) ;;; siren-rubocop.el ends here diff --git a/modules/siren-zone.el b/modules/misc/siren-zone.el similarity index 100% rename from modules/siren-zone.el rename to modules/misc/siren-zone.el diff --git a/modules/siren-anzu.el b/modules/navigation/siren-anzu.el similarity index 100% rename from modules/siren-anzu.el rename to modules/navigation/siren-anzu.el diff --git a/modules/siren-avy.el b/modules/navigation/siren-avy.el similarity index 90% rename from modules/siren-avy.el rename to modules/navigation/siren-avy.el index 049114b..e58c0ea 100644 --- a/modules/siren-avy.el +++ b/modules/navigation/siren-avy.el @@ -9,7 +9,7 @@ (use-package avy :bind - ("C-c C-j" . avy-goto-word-or-subword-1) + ("C-c j" . avy-goto-word-or-subword-1) ("C-c SPC" . avy-goto-char) ("M-o" . ace-window) diff --git a/modules/navigation/siren-dired.el b/modules/navigation/siren-dired.el new file mode 100644 index 0000000..4ca366f --- /dev/null +++ b/modules/navigation/siren-dired.el @@ -0,0 +1,27 @@ +;;; siren-dired.el --- jimeh's Emacs Siren: dired configuration. + +;;; Commentary: + +;; Basic configuration for dired. + +;;; Code: + +(require 'siren-linum) + +(use-package dired+ + :ensure nil ;; loaded from vendor + :demand + :hook (dired-mode . siren-dired-mode-setup) + + :init + (defun siren-dired-mode-setup () + (linum-mode t) + (define-key dired-mode-map (kbd "c") 'dired-create-directory) + (toggle-diredp-find-file-reuse-dir 1)) + + :config + (unbind-key "M-i" dired-mode-map) + (unbind-key "M-l" dired-mode-map)) + +(provide 'siren-dired) +;;; siren-dired.el ends here diff --git a/modules/navigation/siren-direx.el b/modules/navigation/siren-direx.el new file mode 100644 index 0000000..a9b4b4f --- /dev/null +++ b/modules/navigation/siren-direx.el @@ -0,0 +1,20 @@ +;;; siren-direx.el --- jimeh's Emacs Siren: direx configuration. + +;;; Commentary: + +;; Basic configuration for direx. + +;;; Code: + +(use-package direx + :bind ("C-x j" . direx-project:jump-to-project-root) + :hook (direx-mode . siren-direx-mode-setup) + + :config + (setq direx:closed-icon " + " + direx:open-icon " - ")) + +(defun siren-direx-mode-setup ()) + +(provide 'siren-direx) +;;; siren-direx.el ends here diff --git a/modules/siren-dumb-jump.el b/modules/navigation/siren-dumb-jump.el similarity index 89% rename from modules/siren-dumb-jump.el rename to modules/navigation/siren-dumb-jump.el index c04f24a..1ffdadc 100644 --- a/modules/siren-dumb-jump.el +++ b/modules/navigation/siren-dumb-jump.el @@ -8,6 +8,8 @@ (use-package dumb-jump :bind + ("C-c C-j" . dumb-jump-go) + ("C-c b" . dumb-jump-back) ("M-g o" . dumb-jump-go-other-window) ("M-g j" . dumb-jump-go) ("M-g b" . dumb-jump-back) diff --git a/modules/siren-folding.el b/modules/navigation/siren-folding.el similarity index 93% rename from modules/siren-folding.el rename to modules/navigation/siren-folding.el index d91fbc1..6b75f28 100644 --- a/modules/siren-folding.el +++ b/modules/navigation/siren-folding.el @@ -6,8 +6,9 @@ ;;; Code: -;; Loads from vendor. -(require 'hideshowvis) +(use-package hideshowvis + :ensure nil ;; loaded from vendor +) (defun siren-toggle-hiding (column) "Toggle hiding/showing blocks via hs-mode. diff --git a/modules/navigation/siren-full-ack.el b/modules/navigation/siren-full-ack.el new file mode 100644 index 0000000..3891b63 --- /dev/null +++ b/modules/navigation/siren-full-ack.el @@ -0,0 +1,43 @@ +;;; siren-full-ack.el --- jimeh's Emacs Siren: full-ack configuration. + +;;; Commentary: + +;; Basic configuration for full-ack. + +;;; Code: + +(use-package full-ack + :bind + ("C-c C-a" . ack) + + :config + (setq ack-arguments '("--sort-files" + "--ignore-dir=vendor/ruby" + "--ignore-dir=vendor/bundle" + "--ignore-dir=coverage" + "--ignore-dir=savefile" + "--ignore-dir=Godeps" + "--ignore-dir=elpa" + "--ignore-dir=docs" + "--ignore-dir=doc" + "--type-add=js=.js,.js.erb" + "--type-add=ruby=.jbuilder,.rabl" + "--type-add=html=.haml,.hamlc,.jade" + "--type-add=css=.sass,.scss,.styl" + "--type-set=coffee=.coffee" + "--type-set=cucumber=.feature") + ack-project-root-file-patterns '(".project\\'" + ".xcodeproj\\'" + ".sln\\'" + "\\`Project.ede\\'" + "\\`.git\\'" + "\\`.bzr\\'" + "\\`_darcs\\'" + "\\`.hg\\'" + "\\`Gemfile\\'" + "\\`Rakefile\\'" + "\\`Makefile\\'") + ack-prompt-for-directory 'unless-guessed)) + +(provide 'siren-full-ack) +;;; siren-full-ack.el ends here diff --git a/modules/siren-git-link.el b/modules/navigation/siren-git-link.el similarity index 100% rename from modules/siren-git-link.el rename to modules/navigation/siren-git-link.el diff --git a/modules/siren-goto-symbol.el b/modules/navigation/siren-goto-symbol.el similarity index 100% rename from modules/siren-goto-symbol.el rename to modules/navigation/siren-goto-symbol.el diff --git a/modules/siren-helm-ag.el b/modules/navigation/siren-helm-ag.el similarity index 100% rename from modules/siren-helm-ag.el rename to modules/navigation/siren-helm-ag.el diff --git a/modules/siren-helm-gtags.el b/modules/navigation/siren-helm-gtags.el similarity index 100% rename from modules/siren-helm-gtags.el rename to modules/navigation/siren-helm-gtags.el diff --git a/modules/siren-helm-open-github.el b/modules/navigation/siren-helm-open-github.el similarity index 100% rename from modules/siren-helm-open-github.el rename to modules/navigation/siren-helm-open-github.el diff --git a/modules/siren-helm-swoop.el b/modules/navigation/siren-helm-swoop.el similarity index 100% rename from modules/siren-helm-swoop.el rename to modules/navigation/siren-helm-swoop.el diff --git a/modules/siren-helm.el b/modules/navigation/siren-helm.el similarity index 81% rename from modules/siren-helm.el rename to modules/navigation/siren-helm.el index 9b56422..6d257f2 100644 --- a/modules/siren-helm.el +++ b/modules/navigation/siren-helm.el @@ -8,18 +8,13 @@ (use-package helm :defer t - :config - (setq helm-autoresize-mode t - helm-autoresize-max-height 30 - helm-autoresize-min-height 30 - helm-buffer-max-length 64 - helm-case-fold-search 'smart - helm-echo-input-in-header-line t - helm-file-name-case-fold-search 'smart - helm-split-window-default-side 'below) - - (setq siren-helm--did-hide-neotree nil) + :hook ((helm-minibuffer-set-up . siren-helm--hide-minibuffer-maybe) + (helm-before-initialize . siren-helm--toggle-header-line) + (helm-minibuffer-set-up . siren-helm--popwin-help-mode-off) + (helm-cleanup . siren-helm--popwin-help-mode-on) + (helm-cleanup . siren-helm--show-neotree-maybe)) + :init ;; From: https://www.reddit.com/r/emacs/comments/3asbyn/new_and_very_useful_helm_feature_enter_search/ (defun siren-helm--hide-minibuffer-maybe () (when (with-helm-buffer helm-echo-input-in-header-line) @@ -29,16 +24,12 @@ `(:background ,bg-color :foreground ,bg-color))) (setq-local cursor-type nil)))) - (add-hook 'helm-minibuffer-set-up-hook #'siren-helm--hide-minibuffer-maybe) - ;; From: https://github.com/emacs-helm/helm/issues/918#issuecomment-81555133 (defun siren-helm--toggle-header-line () (if (= (length helm-sources) 1) (set-face-attribute 'helm-source-header nil :height 0.1) (set-face-attribute 'helm-source-header nil :height 1.0))) - (add-hook 'helm-before-initialize-hook #'siren-helm--toggle-header-line) - ;; From: https://github.com/emacs-helm/helm/wiki/Popwin (defun siren-helm--popwin-help-mode-off () "Turn `popwin-mode' off for *Help* buffers." @@ -46,8 +37,6 @@ (customize-set-variable 'popwin:special-display-config (delq 'help-mode popwin:special-display-config)))) - (add-hook 'helm-minibuffer-set-up-hook #'siren-helm--popwin-help-mode-off) - ;; From: https://github.com/emacs-helm/helm/wiki/Popwin (defun siren-helm--popwin-help-mode-on () "Turn `popwin-mode' on for *Help* buffers." @@ -55,8 +44,6 @@ (customize-set-variable 'popwin:special-display-config (add-to-list 'popwin:special-display-config 'help-mode nil #'eq)))) - (add-hook 'helm-cleanup-hook #'siren-helm--popwin-help-mode-on) - (defun siren-helm--hide-neotree (&rest plist) (when (and (fboundp 'neotree-hide) (fboundp 'neo-global--window-exists-p) @@ -64,15 +51,24 @@ (setq siren-helm--did-hide-neotree t) (neotree-hide))) - (advice-add 'helm :before 'siren-helm--hide-neotree) - (defun siren-helm--show-neotree-maybe () (when (and (fboundp 'neotree-show) siren-helm--did-hide-neotree) (setq siren-helm--did-hide-neotree nil) (run-with-timer 0.01 nil #'neotree-show))) - (add-hook 'helm-cleanup-hook #'siren-helm--show-neotree-maybe)) + :config + (setq helm-autoresize-max-height 30 + helm-autoresize-min-height 30 + helm-autoresize-mode t + helm-buffer-max-length 64 + helm-case-fold-search 'smart + helm-echo-input-in-header-line t + helm-file-name-case-fold-search 'smart + helm-split-window-default-side 'below + siren-helm--did-hide-neotree nil) + + (advice-add 'helm :before 'siren-helm--hide-neotree)) (use-package helm-descbinds :defer t) diff --git a/modules/siren-highlight-symbol.el b/modules/navigation/siren-highlight-symbol.el similarity index 70% rename from modules/siren-highlight-symbol.el rename to modules/navigation/siren-highlight-symbol.el index beda145..edaa677 100644 --- a/modules/siren-highlight-symbol.el +++ b/modules/navigation/siren-highlight-symbol.el @@ -7,9 +7,14 @@ ;;; Code: (use-package highlight-symbol + :diminish highlight-symbol-mode :bind - (("C-c C-p" . highlight-symbol-prev) - ("C-c C-n" . highlight-symbol-next)) + ("C-c C-p" . highlight-symbol-prev) + ("C-c C-n" . highlight-symbol-next) + + :hook + (prog-mode . highlight-symbol-mode) + :config (setq highlight-symbol-highlight-single-occurrence 'nil highlight-symbol-idle-delay 0.5)) diff --git a/modules/siren-move-beginning-of-line.el b/modules/navigation/siren-move-beginning-of-line.el similarity index 95% rename from modules/siren-move-beginning-of-line.el rename to modules/navigation/siren-move-beginning-of-line.el index a1dbace..6f58d6b 100644 --- a/modules/siren-move-beginning-of-line.el +++ b/modules/navigation/siren-move-beginning-of-line.el @@ -7,7 +7,7 @@ ;;; Code: (defun siren-move-beginning-of-line (arg) - "Move point back to indentation of beginning of line. + "Move point back to indentation or beginning of line. Move point to the first non-whitespace character on this line. If point is already there, move to the beginning of the line. diff --git a/modules/siren-scroll-half-screen.el b/modules/navigation/siren-scroll-half-screen.el similarity index 100% rename from modules/siren-scroll-half-screen.el rename to modules/navigation/siren-scroll-half-screen.el diff --git a/modules/siren-swiper.el b/modules/navigation/siren-swiper.el similarity index 100% rename from modules/siren-swiper.el rename to modules/navigation/siren-swiper.el diff --git a/modules/siren-all-the-icons.el b/modules/projects/siren-all-the-icons.el similarity index 100% rename from modules/siren-all-the-icons.el rename to modules/projects/siren-all-the-icons.el diff --git a/modules/siren-ecb.el b/modules/projects/siren-ecb.el similarity index 100% rename from modules/siren-ecb.el rename to modules/projects/siren-ecb.el diff --git a/modules/siren-editorconfig.el b/modules/projects/siren-editorconfig.el similarity index 100% rename from modules/siren-editorconfig.el rename to modules/projects/siren-editorconfig.el diff --git a/modules/siren-helm-projectile.el b/modules/projects/siren-helm-projectile.el similarity index 100% rename from modules/siren-helm-projectile.el rename to modules/projects/siren-helm-projectile.el diff --git a/modules/siren-neotree.el b/modules/projects/siren-neotree.el similarity index 100% rename from modules/siren-neotree.el rename to modules/projects/siren-neotree.el diff --git a/modules/siren-project-explorer.el b/modules/projects/siren-project-explorer.el similarity index 100% rename from modules/siren-project-explorer.el rename to modules/projects/siren-project-explorer.el diff --git a/modules/siren-projectile.el b/modules/projects/siren-projectile.el similarity index 100% rename from modules/siren-projectile.el rename to modules/projects/siren-projectile.el diff --git a/modules/siren-treemacs.el b/modules/projects/siren-treemacs.el similarity index 64% rename from modules/siren-treemacs.el rename to modules/projects/siren-treemacs.el index 86f091b..cf293cd 100644 --- a/modules/siren-treemacs.el +++ b/modules/projects/siren-treemacs.el @@ -7,8 +7,18 @@ ;;; Code: (use-package treemacs - :ensure t :defer t + + :bind + ([f8] . treemacs-toggle) + ("M-0" . treemacs-select-window) + ("C-c 1" . treemacs-delete-other-windows) + ;; ("M-m ft" . treemacs-toggle) + ;; ("M-m fT" . treemacs) + ;; ("M-m fB" . treemacs-bookmark) + ;; ("M-m f C-t" . treemacs-find-file) + ;; ("M-m f M-t" . treemacs-find-tag) + :config (progn (use-package treemacs-evil @@ -28,28 +38,16 @@ treemacs-goto-tag-strategy 'refetch-index) (treemacs-follow-mode t) - (treemacs-filewatch-mode t)) - :bind - (:map global-map - ([f8] . treemacs-toggle) - ("M-0" . treemacs-select-window) - ("C-c 1" . treemacs-delete-other-windows) - ;; ("M-m ft" . treemacs-toggle) - ;; ("M-m fT" . treemacs) - ;; ("M-m fB" . treemacs-bookmark) - ;; ("M-m f C-t" . treemacs-find-file) - ;; ("M-m f M-t" . treemacs-find-tag) - ) - ) + (treemacs-filewatch-mode t))) (use-package treemacs-projectile :defer t - :ensure t + :bind + ("C-x C-p" . treemacs-projectile) + ("C-x C-p" . treemacs-projectile-toggle) + :config - (setq treemacs-header-function #'treemacs-projectile-create-header) - :bind (:map global-map - ("C-x C-p" . treemacs-projectile) - ("C-x C-p" . treemacs-projectile-toggle))) + (setq treemacs-header-function #'treemacs-projectile-create-header)) (provide 'siren-treemacs) ;;; siren-treemacs.el ends here diff --git a/modules/siren-conf.el b/modules/siren-conf.el deleted file mode 100644 index 327cf1c..0000000 --- a/modules/siren-conf.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; siren-conf.el --- jimeh's Emacs Siren: conf-mode configuration. - -;;; Commentary: - -;; Basic configuration for conf-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package conf-mode - :mode "Procfile\\'" - :config - (defun siren-conf-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2) - (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode)) - - (setq siren-conf-mode-hook 'siren-conf-mode-defaults) - (add-hook 'conf-mode-hook (lambda () (run-hooks 'siren-conf-mode-hook)))) - -(provide 'siren-conf) -;;; siren-conf.el ends here diff --git a/modules/siren-css.el b/modules/siren-css.el deleted file mode 100644 index 976dff9..0000000 --- a/modules/siren-css.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; siren-css.el --- jimeh's Emacs Siren: css-mode configuration. - -;;; Commentary: - -;; Basic configuration for css-mode. - -;;; Code: - -(require 'siren-programming) -(require 'siren-rainbow) - -(use-package css-mode - :mode "\\.css\\'" - :config - (setq css-indent-offset 2) - - (defun siren-css-mode-defaults () - (siren-prog-mode-defaults) - (rainbow-mode +1) - (setq tab-width 2) - (highlight-indentation-current-column-mode)) - - (setq siren-css-mode-hook 'siren-css-mode-defaults) - (add-hook 'css-mode-hook (lambda () - (run-hooks 'siren-css-mode-hook)))) - -(provide 'siren-css) -;;; siren-css.el ends here diff --git a/modules/siren-cucumber.el b/modules/siren-cucumber.el deleted file mode 100644 index 243fbea..0000000 --- a/modules/siren-cucumber.el +++ /dev/null @@ -1,27 +0,0 @@ -;;; siren-cucumber.el --- jimeh's Emacs Siren: feature-mode configuration. - -;;; Commentary: - -;; Basic configuration for feature-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package feature-mode - :mode "\\.feature\\'" - :interpreter "cucumber" - - :config - (defun siren-feature-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2) - (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode)) - - (setq siren-feature-mode-hook 'siren-feature-mode-defaults) - (add-hook 'feature-mode-hook (lambda () - (run-hooks 'siren-feature-mode-hook)))) - -(provide 'siren-cucumber) -;;; siren-cucumber.el ends here diff --git a/modules/siren-dired.el b/modules/siren-dired.el deleted file mode 100644 index 8609123..0000000 --- a/modules/siren-dired.el +++ /dev/null @@ -1,21 +0,0 @@ -;;; siren-dired.el --- jimeh's Emacs Siren: dired configuration. - -;;; Commentary: - -;; Basic configuration for dired. - -;;; Code: - -;; Loads from vendor. -(require 'dired+) - -(defun siren-dired-mode-defaults () - (linum-mode t) - (define-key dired-mode-map (kbd "c") 'dired-create-directory) - (toggle-diredp-find-file-reuse-dir 1)) - -(setq siren-dired-mode-hook 'siren-dired-mode-defaults) -(add-hook 'dired-mode-hook (lambda () (run-hooks 'siren-dired-mode-hook))) - -(provide 'siren-dired) -;;; siren-dired.el ends here diff --git a/modules/siren-direx.el b/modules/siren-direx.el deleted file mode 100644 index 3b55a0b..0000000 --- a/modules/siren-direx.el +++ /dev/null @@ -1,23 +0,0 @@ -;;; siren-direx.el --- jimeh's Emacs Siren: direx configuration. - -;;; Commentary: - -;; Basic configuration for direx. - -;;; Code: - -(use-package direx - :bind - ("C-x j" . direx-project:jump-to-project-root) - - :config - (setq direx:closed-icon " + " - direx:open-icon " - ") - - (defun siren-direx-mode-defaults ()) - - (setq siren-direx-mode-hook 'siren-direx-mode-defaults) - (add-hook 'direx-mode-hook (lambda () (run-hooks 'siren-direx-mode-hook)))) - -(provide 'siren-direx) -;;; siren-direx.el ends here diff --git a/modules/siren-dockerfile.el b/modules/siren-dockerfile.el deleted file mode 100644 index 08ffd58..0000000 --- a/modules/siren-dockerfile.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; siren-dockerfile.el --- jimeh's Emacs Siren: dockerfile-mode configuration. - -;;; Commentary: - -;; Basic configuration for dockerfile-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package dockerfile-mode - :mode "Dockerfile\\'" - - :config - (defun siren-dockerfile-mode-defaults () - (siren-prog-mode-defaults) - (subword-mode +1)) - - (setq siren-dockerfile-mode-hook 'siren-dockerfile-mode-defaults) - (add-hook 'dockerfile-mode-hook (lambda () - (run-hooks 'siren-dockerfile-mode-hook)))) - -(provide 'siren-dockerfile) -;;; siren-dockerfile.el ends here diff --git a/modules/siren-escreen.el b/modules/siren-escreen.el deleted file mode 100644 index fb1f83d..0000000 --- a/modules/siren-escreen.el +++ /dev/null @@ -1,69 +0,0 @@ -;;; siren-escreen.el --- jimeh's Emacs Siren: escreen configuration. - -;;; Commentary: - -;; Basic configuration for escreen. - -;;; Code: - -;; Loads from vendor. -(require 'escreen) - -;; Escreen Helper -;; - from http://blog.nguyenvq.com/2011/03/07/escreen-instead-of-elscreen-for-screen-like-features-in-emacs/ -(defun escreen-get-active-screen-numbers-with-emphasis () - "what the name says" - (interactive) - (let ((escreens (escreen-get-active-screen-numbers)) - (emphased "")) - (dolist (s escreens) - (setq emphased - (concat emphased (if (= escreen-current-screen-number s) - (propertize (number-to-string s) - ;;'face 'custom-variable-tag) " ") - ;;'face 'info-title-3) - 'face 'font-lock-warning-face) - ;;'face 'secondary-selection) - (number-to-string s)) - " "))) - (message "escreen: active screens: %s" emphased))) - -;; Initialize escreen -(escreen-install) - -;; Set prefix key to C-z. -(setq escreen-prefix-char (kbd "C-z")) -(global-set-key escreen-prefix-char 'escreen-prefix) -(define-key escreen-map escreen-prefix-char 'escreen-goto-last-screen) - -;; Toggle screens. -(define-key escreen-map (kbd "l") 'escreen-goto-last-screen) -(define-key escreen-map (kbd "C-l") 'escreen-goto-last-screen) - -;; List screens. -(define-key escreen-map (kbd "a") - 'escreen-get-active-screen-numbers-with-emphasis) -(define-key escreen-map (kbd "C-a") - 'escreen-get-active-screen-numbers-with-emphasis) -(define-key escreen-map (kbd ";") - 'escreen-get-active-screen-numbers-with-emphasis) -(define-key escreen-map (kbd "C-;") - 'escreen-get-active-screen-numbers-with-emphasis) - -;; Goto screens. -(global-set-key (kbd "s-}") 'escreen-goto-next-screen) -(global-set-key (kbd "s-{") 'escreen-goto-prev-screen) - -;; Ctrl versions of default commands. -(define-key escreen-map (kbd "C-c") 'escreen-create-screen) -(define-key escreen-map (kbd "C-g") 'escreen-goto-screen) -(define-key escreen-map (kbd "C-k") 'escreen-kill-screen) -(define-key escreen-map (kbd "C-n") 'escreen-goto-next-screen) -(define-key escreen-map (kbd "C-p") 'escreen-goto-prev-screen) - -;; Show list of screens when you switch/create/kill. -(add-hook 'escreen-goto-screen-hook - 'escreen-get-active-screen-numbers-with-emphasis) - -(provide 'siren-escreen) -;;; siren-escreen.el ends here diff --git a/modules/siren-evil.el b/modules/siren-evil.el deleted file mode 100644 index 0376fb4..0000000 --- a/modules/siren-evil.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; siren-evil.el --- jimeh's Emacs Siren: evil configuration. - -;;; Commentary: - -;; Basic configuration for evil. - -;;; Code: - -(use-package evil - :config - ;; Various evil config options borrowed from: - ;; http://www.lukeswart.net/2015/04/lightning-intro-to-emacs-using-evil-mode-and-org-mode/ - - ;; Treat wrapped line scrolling as single lines - (define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line) - (define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line) - - ;; esc quits pretty much anything (like pending prompts in the minibuffer) - (define-key evil-normal-state-map [escape] 'keyboard-quit) - (define-key evil-visual-state-map [escape] 'keyboard-quit) - (define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit) - (define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit) - (define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit) - (define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit) - (define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)) - -(provide 'siren-evil) -;;; siren-evil.el ends here diff --git a/modules/siren-flyspell.el b/modules/siren-flyspell.el deleted file mode 100644 index 2f45abf..0000000 --- a/modules/siren-flyspell.el +++ /dev/null @@ -1,17 +0,0 @@ -;;; siren-flyspell.el --- jimeh's Emacs Siren: flyspell configuration. - -;;; Commentary: - -;; Basic configuration for flyspell. - -;;; Code: - -(require 'flyspell) -(diminish 'flyspell-mode) -(setq ispell-program-name "aspell" ; use aspell instead of ispell - ispell-extra-args '("--lang=en" "--sug-mode=ultra")) - -(global-set-key (kbd "s-.") 'flyspell-correct-word-before-point) - -(provide 'siren-flyspell) -;;; siren-flyspell.el ends here diff --git a/modules/siren-full-ack.el b/modules/siren-full-ack.el deleted file mode 100644 index 149b8cf..0000000 --- a/modules/siren-full-ack.el +++ /dev/null @@ -1,45 +0,0 @@ -;;; siren-full-ack.el --- jimeh's Emacs Siren: full-ack configuration. - -;;; Commentary: - -;; Basic configuration for full-ack. - -;;; Code: - -(use-package full-ack - :bind - ("C-c C-a" . ack) - - :config - (setq ack-arguments - '("--sort-files" - "--ignore-dir=vendor/ruby" - "--ignore-dir=vendor/bundle" - "--ignore-dir=coverage" - "--ignore-dir=savefile" - "--ignore-dir=Godeps" - "--ignore-dir=elpa" - "--ignore-dir=docs" - "--ignore-dir=doc" - "--type-add=js=.js,.js.erb" - "--type-add=ruby=.jbuilder,.rabl" - "--type-add=html=.haml,.hamlc,.jade" - "--type-add=css=.sass,.scss,.styl" - "--type-set=coffee=.coffee" - "--type-set=cucumber=.feature")) - (setq ack-project-root-file-patterns - '(".project\\'" - ".xcodeproj\\'" - ".sln\\'" - "\\`Project.ede\\'" - "\\`.git\\'" - "\\`.bzr\\'" - "\\`_darcs\\'" - "\\`.hg\\'" - "\\`Gemfile\\'" - "\\`Rakefile\\'" - "\\`Makefile\\'")) - (setq ack-prompt-for-directory 'unless-guessed)) - -(provide 'siren-full-ack) -;;; siren-full-ack.el ends here diff --git a/modules/siren-gitconfig.el b/modules/siren-gitconfig.el deleted file mode 100644 index 80683fa..0000000 --- a/modules/siren-gitconfig.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; siren-gitconfig.el --- jimeh's Emacs Siren: gitconfig-mode configuration. - -;;; Commentary: - -;; Basic configuration for gitconfig-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package gitconfig-mode - :mode "\\.gitconfig" "gitconfig\\'" "\\.git\\\/config" - - :config - (defun siren-gitconfig-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2) - (highlight-indentation-current-column-mode) - (run-hooks 'siren-prog-mode-hook)) - - (setq siren-gitconfig-mode-hook 'siren-gitconfig-mode-defaults) - (add-hook 'gitconfig-mode-hook (lambda () - (run-hooks 'siren-gitconfig-mode-hook)))) - -(provide 'siren-gitconfig) -;;; siren-gitconfig.el ends here diff --git a/modules/siren-gitignore.el b/modules/siren-gitignore.el deleted file mode 100644 index 7a7d8ae..0000000 --- a/modules/siren-gitignore.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; siren-gitignore.el --- jimeh's Emacs Siren: gitignore-mode configuration. - -;;; Commentary: - -;; Basic configuration for gitignore-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package gitignore-mode - :mode "\\.gitignore" "gitignore\\'" - - :config - (defun siren-gitignore-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2) - (highlight-indentation-current-column-mode) - (run-hooks 'siren-prog-mode-hook)) - - (setq siren-gitignore-mode-hook 'siren-gitignore-mode-defaults) - (add-hook 'gitignore-mode-hook (lambda () - (run-hooks 'siren-gitignore-mode-hook)))) - -(provide 'siren-gitignore) -;;; siren-gitignore.el ends here diff --git a/modules/siren-go.el b/modules/siren-go.el deleted file mode 100644 index cd50c83..0000000 --- a/modules/siren-go.el +++ /dev/null @@ -1,99 +0,0 @@ -;;; siren-go.el --- jimeh's Emacs Siren: go-mode configuration. - -;;; Commentary: - -;; Basic configuration for go-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package go-mode - :mode "\\.go\\'" - :interpreter "go" - :commands go-mode - :bind (:map go-mode-map - ("RET" . newline-and-indent) - ("C-c a" . go-test-current-project) - ("C-c m" . go-test-current-file) - ("C-c ." . go-test-current-test) - ("C-c b" . go-run) - ("C-c d" . godef-jump) - ("C-c C-j" . avy-goto-word-or-subword-1) - ("C-h f" . godoc-at-point)) - - :config - (message "loading go-mode") - - (when (memq window-system '(mac ns)) - (exec-path-from-shell-copy-env "GOPATH")) - - ;; Ignore go test -c output files - (add-to-list 'completion-ignored-extensions ".test") - - (define-key 'help-command (kbd "G") 'godoc) - - (defun siren-go-mode-defaults () - (siren-prog-mode-defaults) - - ;; Prefer goimports to gofmt if installed - (let ((goimports (executable-find "goimports"))) - (when goimports - (setq gofmt-command goimports))) - - ;; gofmt on save - (add-hook 'before-save-hook 'gofmt-before-save nil t) - - ;; prevent go-projectile from screwing up GOPATH - (setq go-projectile-switch-gopath 'never) - - ;; enable company-mode - (set (make-local-variable 'company-backends) '(company-go)) - (company-mode +1) - - ;; enable hide/show - (hs-minor-mode 1) - - ;; go-guru - (go-guru-hl-identifier-mode 1) - (setq go-guru-hl-identifier-idle-time 0.1) - - ;; stop whitespace being highlighted - (whitespace-toggle-options '(tabs)) - - ;; make tabs 4 spaces wide - (setq tab-width 4) - - ;; El-doc for Go - ;; (go-eldoc-setup) - - ;; CamelCase aware editing operations - (subword-mode +1)) - - (setq siren-go-mode-hook 'siren-go-mode-defaults) - (add-hook 'go-mode-hook (lambda () - (run-hooks 'siren-go-mode-hook)))) - -(use-package company-go :defer t) -(use-package go-eldoc :defer t) -(use-package go-guru :defer t) -(use-package go-rename :defer t) -(use-package gotest :defer t) - -(use-package go-projectile - :defer t - :init - ;; prevent go-projectile from screwing up GOPATH - (setq go-projectile-switch-gopath 'never)) - -(use-package flycheck-gometalinter - :init - (setq flycheck-gometalinter-fast t - flycheck-gometalinter-tests t - flycheck-gometalinter-vendor t) - :config - (eval-after-load 'flycheck - '(add-hook 'flycheck-mode-hook #'flycheck-gometalinter-setup))) - -(provide 'siren-go) -;;; siren-go.el ends here diff --git a/modules/siren-goto-chg.el b/modules/siren-goto-chg.el deleted file mode 100644 index 9518727..0000000 --- a/modules/siren-goto-chg.el +++ /dev/null @@ -1,21 +0,0 @@ -;;; siren-goto-chg.el --- jimeh's Emacs Siren: goto-chg configuration. - -;;; Commentary: - -;; Basic configuration for goto-chg. - -;;; Code: - -(use-package goto-chg - :config - (global-set-key (kbd "C-.") 'goto-last-change) - (global-set-key (kbd "C-,") 'goto-last-change-reverse) - - ;; Flyspell uses C-. and C-, itself in a such a way that this is the only way - ;; to make goto-chg bind to those keys while flyspell-mode is enabled. - (let ((map flyspell-mode-map)) - (define-key map (kbd "C-.") 'goto-last-change) - (define-key map (kbd "C-,") 'goto-last-change-reverse))) - -(provide 'siren-goto-chg) -;;; siren-goto-chg.el ends here diff --git a/modules/siren-js.el b/modules/siren-js.el deleted file mode 100644 index 5fa7b71..0000000 --- a/modules/siren-js.el +++ /dev/null @@ -1,46 +0,0 @@ -;;; siren-js.el --- jimeh's Emacs Siren: js-mode configuration. - -;;; Commentary: - -;; Basic configuration for js-mode. - -;;; Code: - -(use-package eslintd-fix - :defer t) - -(require 'siren-programming) - -(add-to-list 'auto-mode-alist '("\\.js\\'" . js-mode)) -(add-to-list 'auto-mode-alist '("\\.pac\\'" . js-mode)) -(add-to-list 'interpreter-mode-alist '("node" . js-mode)) - -(defun siren-js-mode-defaults () - "Default tweaks for `js-mode'." - (let ((width 2)) - (setq js-indent-level width - indent-level width - tab-width width)) - - (setq flycheck-checker 'javascript-eslint - flycheck-javascript-eslint-executable "eslint_d") - - (siren-prog-mode-defaults) - (eslintd-fix-mode) - (company-mode +1) - (subword-mode +1) - (hs-minor-mode 1) - (highlight-indentation-current-column-mode) - (hideshowvis-enable) - - (let ((map js-mode-map)) - (define-key map (kbd "C-j") 'newline-and-indent) - (define-key map (kbd "C-c C-h") 'siren-toggle-hiding))) - -(setq siren-js-mode-hook 'siren-js-mode-defaults) - -(add-hook 'js-mode-hook (lambda () - (run-hooks 'siren-js-mode-hook))) - -(provide 'siren-js) -;;; siren-js.el ends here diff --git a/modules/siren-json.el b/modules/siren-json.el deleted file mode 100644 index d91af27..0000000 --- a/modules/siren-json.el +++ /dev/null @@ -1,44 +0,0 @@ -;;; siren-json.el --- jimeh's Emacs Siren: json-mode configuration. - -;;; Commentary: - -;; Basic configuration for json-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package json-mode - :mode "\\.json\\'" - :config - (require 'omnifmt) - - (defun siren-json-mode-defaults () - "Default tweaks for `json-mode'." - (siren-prog-mode-defaults) - - (let ((width 2)) - (setq js-indent-level width) - (setq json-reformat:indent-width width) - (setq tab-width width) - (highlight-indentation-set-offset width)) - - (setq flycheck-checker 'json-jsonlint) - - (eslintd-fix-mode -1) - (omnifmt-mode) - (company-mode +1) - (subword-mode +1) - (hs-minor-mode 1) - (highlight-indentation-current-column-mode) - (hideshowvis-enable) - (let ((map json-mode-map)) - (define-key map (kbd "C-j") 'newline-and-indent) - (define-key map (kbd "C-c C-h") 'siren-toggle-hiding))) - - (setq siren-json-mode-hook 'siren-json-mode-defaults) - (add-hook 'json-mode-hook (lambda () - (run-hooks 'siren-json-mode-hook)))) - -(provide 'siren-json) -;;; siren-js.el ends here diff --git a/modules/siren-jsx.el b/modules/siren-jsx.el deleted file mode 100644 index 26599ec..0000000 --- a/modules/siren-jsx.el +++ /dev/null @@ -1,13 +0,0 @@ -;;; siren-jsx.el --- jimeh's Emacs Siren: .jsx file configuration - -;;; Commentary: - -;; Basic configuration for dealing with .jsx files. - -;;; Code: - -(require 'siren-web-mode) -(add-to-list 'auto-mode-alist '("\\.jsx\\'" . web-mode)) - -(provide 'siren-jsx) -;;; siren-jsx.el ends here diff --git a/modules/siren-linum.el b/modules/siren-linum.el deleted file mode 100644 index 4436dc4..0000000 --- a/modules/siren-linum.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; siren-linum.el --- jimeh's Emacs Siren: linum configuration. - -;;; Commentary: - -;; Basic configuration for linum. - -;;; Code: - -;; Customize line numbers - In gui mode the fringe is the spacer between line -;; numbers and code, while in console mode we add an extra space for it. -(if window-system (setq linum+-dynamic-format " %%%dd") - (setq linum+-dynamic-format " %%%dd ")) - -(eval-after-load "linum+" '(progn (setq linum-format 'dynamic))) - -(require 'linum+) - -(provide 'siren-linum) -;;; siren-linum.el ends here diff --git a/modules/siren-lua.el b/modules/siren-lua.el deleted file mode 100644 index e1b2bb0..0000000 --- a/modules/siren-lua.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; siren-lua.el --- jimeh's Emacs Siren: lua-mode configuration. - -;;; Commentary: - -;; Basic configuration for lua-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package lua-mode - :config - (defun siren-lua-mode-defaults () - (siren-prog-mode-defaults) - - (highlight-indentation-current-column-mode) - (subword-mode +1) - (setq lua-indent-level 2 - whitespace-action (quote (auto-cleanup)))) - - (setq siren-lua-mode-hook 'siren-lua-mode-defaults) - (add-hook 'lua-mode-hook (lambda () - (run-hooks 'siren-lua-mode-hook)))) - -(provide 'siren-lua) -;;; siren-lua.el ends here diff --git a/modules/siren-makefile.el b/modules/siren-makefile.el deleted file mode 100644 index c55cc76..0000000 --- a/modules/siren-makefile.el +++ /dev/null @@ -1,26 +0,0 @@ -;;; siren-makefile.el --- jimeh's Emacs Siren: makefile-mode configuration. - -;;; Commentary: - -;; Basic configuration for makefile-mode. - -;;; Code: - -(require 'siren-programming) - -(add-to-list 'siren-yank-indent-modes 'makefile-mode) - -(defun siren-makefile-mode-defaults () - (siren-prog-mode-defaults) - (subword-mode) - (setq tab-width 4) - (highlight-indentation-set-offset 4) - (highlight-indentation-current-column-mode)) - -(setq siren-makefile-mode-hook 'siren-makefile-mode-defaults) - -(add-hook 'makefile-mode-hook (lambda () - (run-hooks 'siren-makefile-mode-hook))) - -(provide 'siren-makefile) -;;; siren-makefile.el ends here diff --git a/modules/siren-org-mode.el b/modules/siren-org-mode.el deleted file mode 100644 index 107a2b5..0000000 --- a/modules/siren-org-mode.el +++ /dev/null @@ -1,39 +0,0 @@ -;;; siren-org-mode.el --- jimeh's Emacs Siren: org-mode configuration. - -;;; Commentary: - -;; Basic configuration for org-mode. - -;;; Code: - -(require 'siren-fci) -(require 'siren-flyspell) -(require 'siren-smartparens) - -(defun siren-org-mode-defaults () - (setq org-export-backends '(ascii html icalendar latex md confluence) - fill-column 80 - whitespace-action '(auto-cleanup)) - - (require 'org-mouse) - - (linum-mode t) - (flyspell-mode) - (fci-mode) - (smartparens-mode +1) - (visual-line-mode +1) - (whitespace-mode +1) - (let ((map org-mode-map)) - (define-key map (kbd "M-[") 'org-promote-subtree) - (define-key map (kbd "M-]") 'org-demote-subtree) - (define-key map (kbd "M-p") 'org-metaup) - (define-key map (kbd "M-n") 'org-metadown) - (define-key map (kbd "C-M-n") 'outline-next-visible-heading) - (define-key map (kbd "C-M-p") 'outline-previous-visible-heading))) - -(setq siren-org-mode-hook 'siren-org-mode-defaults) -(add-hook 'org-mode-hook (lambda () - (run-hooks 'siren-org-mode-hook))) - -(provide 'siren-org-mode) -;;; siren-org-mode.el ends here diff --git a/modules/siren-package-lint.el b/modules/siren-package-lint.el deleted file mode 100644 index 8fb170c..0000000 --- a/modules/siren-package-lint.el +++ /dev/null @@ -1,18 +0,0 @@ -;;; siren-package-lint.el --- jimeh's Emacs Siren: avy configuration. - -;;; Commentary: - -;; Basic configuration for package-lint. - -;;; Code: - -(use-package package-lint - :defer t) - -(use-package flycheck-package - :defer t - :config - (flycheck-package-setup)) - -(provide 'siren-package-lint) -;;; siren-package-lint.el ends here diff --git a/modules/siren-perspective.el b/modules/siren-perspective.el deleted file mode 100644 index 09c7857..0000000 --- a/modules/siren-perspective.el +++ /dev/null @@ -1,55 +0,0 @@ -;;; siren-perspective.el --- jimeh's Emacs Siren: perspective configuration. - -;;; Commentary: - -;; Basic configuration for perspective. - -;;; Code: - -(use-package perspective - :config - (setq persp-mode-prefix-key "" - persp-initial-frame-name "0:main") - - (define-key persp-mode-map (kbd "C-z") perspective-map) - - (define-key persp-mode-map (kbd "C-z z") 'persp-switch) - (define-key persp-mode-map (kbd "C-z C-z") 'persp-switch) - (define-key persp-mode-map (kbd "C-z c") 'persp-switch) - (define-key persp-mode-map (kbd "C-z C-c") 'persp-switch) - (define-key persp-mode-map (kbd "C-z s") 'persp-switch) - (define-key persp-mode-map (kbd "C-z C-s") 'persp-switch) - (define-key persp-mode-map (kbd "C-z b") 'persp-switch) - (define-key persp-mode-map (kbd "C-z C-b") 'persp-switch) - - (define-key persp-mode-map (kbd "C-z l") 'persp-switch-last) - (define-key persp-mode-map (kbd "C-z C-l") 'persp-switch-last) - - (define-key persp-mode-map (kbd "C-z c") 'persp-remove-buffer) - (define-key persp-mode-map (kbd "C-z C-c") 'persp-remove-buffer) - - (define-key persp-mode-map (kbd "C-z k") 'persp-kill) - (define-key persp-mode-map (kbd "C-z C-k") 'persp-kill) - - (define-key persp-mode-map (kbd "C-z r") 'persp-rename) - (define-key persp-mode-map (kbd "C-z C-r") 'persp-rename) - - (define-key persp-mode-map (kbd "C-z a") 'persp-add-buffer) - (define-key persp-mode-map (kbd "C-z C-a") 'persp-add-buffer) - - (define-key persp-mode-map (kbd "C-z i") 'persp-import) - (define-key persp-mode-map (kbd "C-z C-i") 'persp-import) - - (define-key persp-mode-map (kbd "C-z n") 'persp-next) - (define-key persp-mode-map (kbd "C-z C-n") 'persp-next) - (define-key persp-mode-map (kbd "C-z p") 'persp-prev) - (define-key persp-mode-map (kbd "C-z C-p") 'persp-prev) - - (persp-mode) - - ;; (custom-set-faces - ;; '(persp-selected-face ((t (:foreground "#d97a35" :weight bold))))) - ) - -(provide 'siren-perspective) -;;; siren-perspective.el ends here diff --git a/modules/siren-phi-search.el b/modules/siren-phi-search.el deleted file mode 100644 index 2eef5a1..0000000 --- a/modules/siren-phi-search.el +++ /dev/null @@ -1,14 +0,0 @@ -;;; siren-phi-search.el --- jimeh's Emacs Siren: phi-search configuration. - -;;; Commentary: - -;; Basic configuration for phi-search. - -;;; Code: - -(use-package phi-search - :config - (setq phi-search-limit 3000)) - -(provide 'siren-phi-search) -;;; siren-phi-search.el ends here diff --git a/modules/siren-plantuml.el b/modules/siren-plantuml.el deleted file mode 100644 index 5be9100..0000000 --- a/modules/siren-plantuml.el +++ /dev/null @@ -1,27 +0,0 @@ -;;; siren-plantuml.el --- jimeh's Emacs Siren: plantuml-mode configuration. - -;;; Commentary: - -;; Basic configuration for plantuml-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package plantuml-mode - :mode "\\.uml\\'" - - :config - (defun siren-plantuml-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2) - (setq plantuml-jar-path "/usr/local/Cellar/plantuml/8048/plantuml.8048.jar") - (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode)) - - (setq siren-plantuml-mode-hook 'siren-plantuml-mode-defaults) - (add-hook 'plantuml-mode-hook (lambda () - (run-hooks 'siren-plantuml-mode-hook)))) - -(provide 'siren-plantuml) -;;; siren-plantuml.el ends here diff --git a/modules/siren-programming.el b/modules/siren-programming.el deleted file mode 100644 index 5bcfa1b..0000000 --- a/modules/siren-programming.el +++ /dev/null @@ -1,38 +0,0 @@ -;;; siren-programming.el --- jimeh's Emacs Siren: defaults for programming modes - -;;; Commentary: - -;; Basic configuration shared across all programming languages. - -;;; Code: - -(require 'siren-fci) -(require 'siren-flycheck) -(require 'siren-flyspell) -(require 'siren-smartparens) -(require 'siren-highlight-indentation) -(require 'siren-highlight-symbol) - -(defun siren-prog-mode-defaults () - "Default coding hook, useful with any programming language." - (setq fill-column 80) - (linum-mode t) - (flyspell-prog-mode) - (fci-mode) - (smartparens-mode +1) - (highlight-symbol-mode) - (setq whitespace-action (quote (auto-cleanup))) - (visual-line-mode +1) - (whitespace-mode +1)) - -(setq siren-prog-mode-hook 'siren-prog-mode-defaults) -(add-hook 'prog-mode-hook (lambda () - (run-hooks 'siren-prog-mode-hook))) - -;; enable on-the-fly syntax checking -(if (fboundp 'global-flycheck-mode) - (global-flycheck-mode +1) - (add-hook 'prog-mode-hook 'flycheck-mode)) - -(provide 'siren-programming) -;;; siren-programming.el ends here diff --git a/modules/siren-ruby.el b/modules/siren-ruby.el deleted file mode 100644 index 55774ef..0000000 --- a/modules/siren-ruby.el +++ /dev/null @@ -1,106 +0,0 @@ -;;; siren-ruby.el --- jimeh's Emacs Siren: ruby-mode configuration. - -;;; Commentary: - -;; Basic configuration for ruby-mode. - -;;; Code: - -(use-package inf-ruby - :defer t) - -(use-package rspec-mode - :defer t - :init - (eval-after-load 'rspec-mode '(rspec-install-snippets))) - -(use-package ruby-refactor - :defer t) - -(use-package ruby-tools - :defer t) - -(use-package yari - :defer t - :init - (define-key 'help-command (kbd "R") 'yari)) - -(require 'siren-programming) -(require 'siren-company) -(require 'siren-smartparens) -(require 'siren-toggle-quotes) - -(require 'smartparens-ruby) -(require 'rubocopfmt) -(require 'ruby-mode) - -;; Rake files are ruby, too, as are gemspecs, rackup files, and gemfiles. -(add-to-list 'auto-mode-alist '("\\.rake\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Rakefile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.gemspec\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.ru\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Gemfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Guardfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Capfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.cap\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.thor\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.rabl\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Thorfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Vagrantfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.jbuilder\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Podfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("\\.podspec\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Puppetfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Berksfile\\'" . ruby-mode)) -(add-to-list 'auto-mode-alist '("Appraisals\\'" . ruby-mode)) - -;; We never want to edit Rubinius bytecode -(add-to-list 'completion-ignored-extensions ".rbc") - -;; Set up hs-mode (HideShow) for Ruby -(add-to-list 'hs-special-modes-alist - `(ruby-mode - ,(rx (or "def" "class" "module" "do" "if" "case")) ;; Block start - ,(rx (or "end")) ;; Block end - ,(rx (or "#" "=begin")) ;; Comment start - ruby-forward-sexp nil)) - -;; Make company-mode play nice -(push 'ruby-mode company-dabbrev-code-modes) - -(defun siren-ruby-mode-defaults () - (siren-prog-mode-defaults) - - (setq c-tab-always-indent nil - rspec-primary-source-dirs '("app") - ruby-align-chained-calls t - ruby-insert-encoding-magic-comment t - ruby-refactor-add-parens t - ruby-use-smie t - tab-width 2) - - (rubocopfmt-mode) - (ruby-tools-mode +1) - (hs-minor-mode 1) - (company-mode +1) - (subword-mode +1) - (highlight-indentation-current-column-mode) - (hideshowvis-enable) - - (let ((map ruby-mode-map)) - (define-key map (kbd "C-j") 'newline-and-indent) - (define-key map (kbd "RET") 'newline-and-indent) - (define-key map (kbd "C-c C-h") 'siren-toggle-hiding) - (define-key map (kbd "C-c C-l") 'goto-line) - (define-key map (kbd "C-M-f") 'sp-ruby-forward-sexp) - (define-key map (kbd "C-M-b") 'sp-ruby-backward-sexp)) - - (let ((map ruby-tools-mode-map)) - (define-key map (kbd "C-'") 'toggle-quotes))) - -(setq siren-ruby-mode-hook 'siren-ruby-mode-defaults) -(add-hook 'ruby-mode-hook (lambda () - (run-hooks 'siren-ruby-mode-hook))) - -(provide 'siren-ruby) -;;; siren-ruby.el ends here diff --git a/modules/siren-sh.el b/modules/siren-sh.el deleted file mode 100644 index 66a9f09..0000000 --- a/modules/siren-sh.el +++ /dev/null @@ -1,29 +0,0 @@ -;;; siren-sh.el --- jimeh's Emacs Siren: sh-mode configuration. - -;;; Commentary: - -;; Basic configuration for sh-mode. - -;;; Code: - -(require 'siren-programming) - -(defun siren-sh-mode-defaults () - (siren-prog-mode-defaults) - - (setq tab-width 2 - sh-basic-offset 2 - sh-indentation 2 - whitespace-action '(auto-cleanup)) - - (subword-mode +1) - (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode) - (define-key sh-mode-map (kbd "RET") 'newline-and-indent)) - -(setq siren-sh-mode-hook 'siren-sh-mode-defaults) -(add-hook 'sh-mode-hook (lambda () - (run-hooks 'siren-sh-mode-hook))) - -(provide 'siren-sh) -;;; siren-sh.el ends here diff --git a/modules/siren-slim.el b/modules/siren-slim.el deleted file mode 100644 index 3d19dc5..0000000 --- a/modules/siren-slim.el +++ /dev/null @@ -1,21 +0,0 @@ -;;; siren-slim.el --- jimeh's Emacs Siren: slim-mode configuration. - -;;; Commentary: - -;; Basic configuration for slim-mode. - -;;; Code: - -(use-package slim-mode - :mode "\\.slim\\'" - - :config - (defun siren-slim-mode-defaults () - (siren-prog-mode-defaults) - (highlight-indentation-current-column-mode)) - - (setq siren-slim-mode-hook 'siren-slim-mode-defaults) - (add-hook 'slim-mode-hook (lambda () (run-hooks 'siren-slim-mode-hook)))) - -(provide 'siren-slim) -;;; siren-slim.el ends here diff --git a/modules/siren-smartparens.el b/modules/siren-smartparens.el deleted file mode 100644 index 7ef7eab..0000000 --- a/modules/siren-smartparens.el +++ /dev/null @@ -1,53 +0,0 @@ -;;; siren-smartparens.el --- jimeh's Emacs Siren: smartparens configuration. - -;;; Commentary: - -;; Basic configuration for smartparens. - -;;; Code: - -(use-package smartparens - :defer t - :diminish smartparens-mode - - :init - (defalias 'rw 'sp-rewrap-sexp) - (show-smartparens-global-mode +1) - - :config - ;; smart pairing for all - (require 'smartparens-config) - - (setq sp-base-key-bindings 'paredit - sp-autoskip-closing-pair 'always - sp-hybrid-kill-entire-symbol nil) - - (custom-set-faces - '(sp-pair-overlay-face ((t (:inherit nil))))) - - (sp-pair "{" nil :post-handlers - '(((lambda (&rest _ignored) - (siren-smart-open-line-above)) "RET"))) - - ;; Keybindings - (let ((map smartparens-mode-map)) - (define-key map (kbd "C-M-t") 'sp-transpose-sexp) - (define-key map (kbd "C-M-r") (lambda () - (interactive) (sp-transpose-sexp -1))) - (define-key map (kbd "C-M-f") 'sp-forward-sexp) - (define-key map (kbd "C-M-b") 'sp-backward-sexp) - (define-key map (kbd "C-M-a") 'sp-beginning-of-sexp) - (define-key map (kbd "C-M-e") 'sp-end-of-sexp) - (define-key map (kbd "C-M-]") 'sp-forward-slurp-sexp) - (define-key map (kbd "C-M-[") 'sp-forward-barf-sexp) - (define-key map (kbd "C-M-.") 'sp-forward-slurp-sexp) - (define-key map (kbd "C-M-,") 'sp-forward-barf-sexp) - (define-key map (kbd "s->") 'sp-forward-slurp-sexp) - (define-key map (kbd "s-<") 'sp-forward-barf-sexp) - (define-key map (kbd "M-|") 'sp-split-sexp) - ;; (define-key map (kbd "M-t") 'sp-backward-up-sexp) - (define-key map (kbd "C-") 'sp-backward-kill-sexp) - (define-key map (kbd "C-") 'sp-kill-sexp))) - -(provide 'siren-smartparens) -;;; siren-smartparens.el ends here diff --git a/modules/siren-text-manipulation.el b/modules/siren-text-manipulation.el deleted file mode 100644 index 18d1fcf..0000000 --- a/modules/siren-text-manipulation.el +++ /dev/null @@ -1,86 +0,0 @@ -;;; siren-text-manipulation.el --- jimeh's Emacs Siren: text-manipulation. - -;;; Commentary: - -;; Various text manipulation functions and keybindings. Some of them shamelessly -;; ripped from textmate.el: https://github.com/defunkt/textmate.el - -;;; Code: - -(use-package move-dup - :bind - ("M-p" . md/move-lines-up) - ("M-n" . md/move-lines-down) - ("C-x C-d" . md/duplicate-down)) - -(use-package expand-region - :bind - ("M-." . er/expand-region) - ("M-," . er/contract-region)) - -(use-package smart-shift - :bind - ("C-c [" . smart-shift-left) - ("C-c ]" . smart-shift-right) - ("M-[" . smart-shift-left) - ("M-]" . smart-shift-right)) - -(defmacro allow-line-as-region-for-function (orig-function) -`(defun ,(intern (concat (symbol-name orig-function) "-or-line")) - () - ,(format "Like `%s', but acts on the current line if mark is not active." - orig-function) - (interactive) - (if mark-active - (call-interactively (function ,orig-function)) - (save-excursion - ;; define a region (temporarily) -- so any C-u prefixes etc. are preserved. - (beginning-of-line) - (set-mark (point)) - (end-of-line) - (call-interactively (function ,orig-function)))))) - -(unless (fboundp 'comment-or-uncomment-region-or-line) - (allow-line-as-region-for-function comment-or-uncomment-region)) - -;; from: https://www.emacswiki.org/emacs/RandomizeBuffer -(defun randomize-region (beg end) - "Randomize lines in region from BEG to END." - (interactive "*r") - (let ((lines (split-string - (delete-and-extract-region beg end) "\n"))) - (when (string-equal "" (car (last lines 1))) - (setq lines (butlast lines 1))) - (apply 'insert - (mapcar 'cdr - (sort (mapcar - (lambda (x) (cons (random) (concat x "\n"))) lines) - (lambda (a b) (< (car a) (car b)))))))) - -;; from: https://www.emacswiki.org/emacs/SortWords -(defun sort-words (reverse beg end) - "Sort words in region alphabetically, in REVERSE if negative. -Prefixed with negative \\[universal-argument], sorts in reverse. - -The variable `sort-fold-case' determines whether alphabetic case -affects the sort order. - -See `sort-regexp-fields'." - (interactive "*P\nr") - (sort-regexp-fields reverse "\\w+" "\\&" beg end)) - -(global-set-key (kbd "C-c /") 'comment-or-uncomment-region-or-line) -(global-set-key (kbd "C-c C-/") 'comment-or-uncomment-region-or-line) - -;; from: https://www.emacswiki.org/emacs/SortWords -(defun sort-symbols (reverse beg end) - "Sort symbols in region alphabetically, in REVERSE if negative. -See `sort-words'." - (interactive "*P\nr") - (sort-regexp-fields reverse "\\(\\sw\\|\\s_\\)+" "\\&" beg end)) - -(defalias 'sw 'sort-words) -(defalias 'ss 'sort-symbols) - -(provide 'siren-text-manipulation) -;;; siren-text-manipulation.el ends here diff --git a/modules/siren-thrift.el b/modules/siren-thrift.el deleted file mode 100644 index 3e6944a..0000000 --- a/modules/siren-thrift.el +++ /dev/null @@ -1,27 +0,0 @@ -;;; siren-thrift.el --- jimeh's Emacs Siren: thrift-mode configuration. - -;;; Commentary: - -;; Basic configuration for thrift-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package thrift - :mode "\\.thrift\\'" - - :config - (defun siren-thrift-mode-defaults () - (siren-prog-mode-defaults) - - (setq tab-width 2) - (highlight-indentation-current-column-mode) - (subword-mode +1)) - - (setq siren-thrift-mode-hook 'siren-thrift-mode-defaults) - (add-hook 'thrift-mode-hook (lambda () - (run-hooks 'siren-thrift-mode-hook)))) - -(provide 'siren-thrift) -;;; siren-thrift.el ends here diff --git a/modules/siren-window-management.el b/modules/siren-window-management.el deleted file mode 100644 index 144d042..0000000 --- a/modules/siren-window-management.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; siren-window-management.el --- jimeh's Emacs Siren: window-management. - -;;; Commentary: - -;; Basic window management stuff. - -;;; Code: - -(use-package buffer-move - :bind - ("M-K" . buf-move-down) - ("M-I" . buf-move-up) - ("M-J" . buf-move-left) - ("M-L" . buf-move-right)) - -(require 'windmove) - -(defun ignore-error-wrapper (fn) - "Funtion return new function that ignore errors. - The function wraps a function with `ignore-errors' macro." - (lexical-let ((fn fn)) - (lambda () - (interactive) - (ignore-errors (funcall fn))))) - -;; Navigate to windows -(global-set-key (kbd "M-k") (ignore-error-wrapper 'windmove-down)) -(global-set-key (kbd "M-i") (ignore-error-wrapper 'windmove-up)) -(global-set-key (kbd "M-j") (ignore-error-wrapper 'windmove-left)) -(global-set-key (kbd "M-l") (ignore-error-wrapper 'windmove-right)) - -(provide 'siren-window-management) -;;; siren-window-management.el ends here diff --git a/modules/siren-yaml.el b/modules/siren-yaml.el deleted file mode 100644 index d5b16ed..0000000 --- a/modules/siren-yaml.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; siren-yaml.el --- jimeh's Emacs Siren: yaml-mode configuration. - -;;; Commentary: - -;; Basic configuration for yaml-mode. - -;;; Code: - -(require 'siren-programming) - -(use-package yaml-mode - :mode "\\.yml\\'" "\\.yaml\\'" - :config - (defun siren-yaml-mode-defaults () - (siren-prog-mode-defaults) - (setq tab-width 2 - whitespace-action '(auto-cleanup)) - - (highlight-indentation-set-offset 2) - (highlight-indentation-current-column-mode) - (subword-mode +1) - (define-key yaml-mode-map (kbd "RET") 'newline-and-indent)) - - (setq siren-yaml-mode-hook 'siren-yaml-mode-defaults) - (add-hook 'yaml-mode-hook (lambda () (run-hooks 'siren-yaml-mode-hook)))) - -(provide 'siren-yaml) -;;; siren-yaml.el ends here diff --git a/modules/spelling/siren-flyspell.el b/modules/spelling/siren-flyspell.el new file mode 100644 index 0000000..212e294 --- /dev/null +++ b/modules/spelling/siren-flyspell.el @@ -0,0 +1,30 @@ +;;; siren-flyspell.el --- jimeh's Emacs Siren: flyspell configuration. + +;;; Commentary: + +;; Basic configuration for flyspell. + +;;; Code: + +(use-package flyspell + :ensure nil ;; loaded from emacs built-ins + :demand + :diminish flyspell-mode + :bind + ("s-." . flyspell-correct-word-before-point) + + :hook + (prog-mode . flyspell-prog-mode) + + :config + ;; Unbind keys used by siren-goto-chg module. + (unbind-key "C-." flyspell-mode-map) + (unbind-key "C-," flyspell-mode-map) + ;; Unbind keys used by siren-resize-window module. + (unbind-key "C-;" flyspell-mode-map) + + (setq ispell-program-name "aspell" ; use aspell instead of ispell + ispell-extra-args '("--lang=en" "--sug-mode=ultra"))) + +(provide 'siren-flyspell) +;;; siren-flyspell.el ends here diff --git a/modules/text-editing/siren-expand-region.el b/modules/text-editing/siren-expand-region.el new file mode 100644 index 0000000..e21254d --- /dev/null +++ b/modules/text-editing/siren-expand-region.el @@ -0,0 +1,15 @@ +;;; siren-expand-region.el --- jimeh's Emacs Siren: expand-region + +;;; Commentary: + +;; Configuration for expand-region + +;;; Code: + +(use-package expand-region + :bind + ("M-." . er/expand-region) + ("M-," . er/contract-region)) + +(provide 'siren-expand-region) +;;; siren-expand-region.el ends here diff --git a/modules/text-editing/siren-goto-chg.el b/modules/text-editing/siren-goto-chg.el new file mode 100644 index 0000000..a52748d --- /dev/null +++ b/modules/text-editing/siren-goto-chg.el @@ -0,0 +1,14 @@ +;;; siren-goto-chg.el --- jimeh's Emacs Siren: goto-chg configuration. + +;;; Commentary: + +;; Basic configuration for goto-chg. + +;;; Code: + +(use-package goto-chg + :bind (("C-." . goto-last-change) + ("C-," . goto-last-change-reverse))) + +(provide 'siren-goto-chg) +;;; siren-goto-chg.el ends here diff --git a/modules/text-editing/siren-move-dup.el b/modules/text-editing/siren-move-dup.el new file mode 100644 index 0000000..7b7ede2 --- /dev/null +++ b/modules/text-editing/siren-move-dup.el @@ -0,0 +1,16 @@ +;;; siren-move-dup.el --- jimeh's Emacs Siren: move-dup + +;;; Commentary: + +;; Configuration for move-dup + +;;; Code: + +(use-package move-dup + :bind + ("M-p" . md/move-lines-up) + ("M-n" . md/move-lines-down) + ("C-x C-d" . md/duplicate-down)) + +(provide 'siren-move-dup) +;;; siren-move-dup.el ends here diff --git a/modules/siren-multiple-cursors.el b/modules/text-editing/siren-multiple-cursors.el similarity index 83% rename from modules/siren-multiple-cursors.el rename to modules/text-editing/siren-multiple-cursors.el index 787d0fa..17a1f13 100644 --- a/modules/siren-multiple-cursors.el +++ b/modules/text-editing/siren-multiple-cursors.el @@ -6,8 +6,6 @@ ;;; Code: -(require 'siren-phi-search) - (use-package multiple-cursors :bind ("C-x C-@" . mc/edit-lines) ;; Terminal @@ -23,5 +21,10 @@ (global-unset-key (kbd "M-")) ;; must unset key first (global-set-key (kbd "M-") 'mc/add-cursor-on-click)) +;; Allows searching forward/back (C-s/C-r) searching with multiple cursors. +(use-package phi-search + :config + (setq phi-search-limit 3000)) + (provide 'siren-multiple-cursors) ;;; siren-multiple-cursors.el ends here diff --git a/modules/text-editing/siren-randomize-region.el b/modules/text-editing/siren-randomize-region.el new file mode 100644 index 0000000..e92f934 --- /dev/null +++ b/modules/text-editing/siren-randomize-region.el @@ -0,0 +1,24 @@ +;;; siren-randomize-region.el --- jimeh's Emacs Siren: randomize-region + +;;; Commentary: + +;; Helper command to randomize the order of lines in region. Shamelessly ripped +;; from: https://www.emacswiki.org/emacs/RandomizeBuffer + +;;; Code: + +(defun randomize-region (beg end) + "Randomize lines in region from BEG to END." + (interactive "*r") + (let ((lines (split-string + (delete-and-extract-region beg end) "\n"))) + (when (string-equal "" (car (last lines 1))) + (setq lines (butlast lines 1))) + (apply 'insert + (mapcar 'cdr + (sort (mapcar + (lambda (x) (cons (random) (concat x "\n"))) lines) + (lambda (a b) (< (car a) (car b)))))))) + +(provide 'siren-randomize-region) +;;; siren-randomize-region.el ends here diff --git a/modules/text-editing/siren-smart-shift.el b/modules/text-editing/siren-smart-shift.el new file mode 100644 index 0000000..4586593 --- /dev/null +++ b/modules/text-editing/siren-smart-shift.el @@ -0,0 +1,17 @@ +;;; siren-smart-shift.el --- jimeh's Emacs Siren: smart-shift + +;;; Commentary: + +;; Configuration for smart-shift + +;;; Code: + +(use-package smart-shift + :bind + ("C-c [" . smart-shift-left) + ("C-c ]" . smart-shift-right) + ("M-[" . smart-shift-left) + ("M-]" . smart-shift-right)) + +(provide 'siren-smart-shift) +;;; siren-smart-shift.el ends here diff --git a/modules/text-editing/siren-smartparens.el b/modules/text-editing/siren-smartparens.el new file mode 100644 index 0000000..b22e168 --- /dev/null +++ b/modules/text-editing/siren-smartparens.el @@ -0,0 +1,56 @@ +;;; siren-smartparens.el --- jimeh's Emacs Siren: smartparens configuration. + +;;; Commentary: + +;; Basic configuration for smartparens. + +;;; Code: + +(use-package smartparens + :defer t + :diminish smartparens-mode + :bind (:map smartparens-mode-map + ("C-M-t" . sp-transpose-sexp) + ("C-M-r" . sp-transpose-sexp-reverse) + ("C-M-f" . sp-forward-sexp) + ("C-M-b" . sp-backward-sexp) + ("C-M-a" . sp-beginning-of-sexp) + ("C-M-e" . sp-end-of-sexp) + ("C-M-]" . sp-forward-slurp-sexp) + ("C-M-[" . sp-forward-barf-sexp) + ("C-M-." . sp-forward-slurp-sexp) + ("C-M-," . sp-forward-barf-sexp) + ("s->" . sp-forward-slurp-sexp) + ("s-<" . sp-forward-barf-sexp) + ("M-|" . sp-split-sexp) + ("M-t" . sp-backward-up-sexp) + ("C-" . sp-backward-kill-sexp) + ("C-" . sp-kill-sexp)) + + :hook + (prog-mode . smartparens-mode) + + :config + ;; smart pairing for all + (require 'smartparens-config) + + (defun sp-transpose-sexp-reverse () + (interactive) + (sp-transpose-sexp -1)) + + (defalias 'rw 'sp-rewrap-sexp) + (show-smartparens-global-mode +1) + + (setq sp-base-key-bindings 'paredit + sp-autoskip-closing-pair 'always + sp-hybrid-kill-entire-symbol nil) + + (custom-set-faces + '(sp-pair-overlay-face ((t (:inherit nil))))) + + (sp-pair "{" nil :post-handlers + '(((lambda (&rest _ignored) + (siren-smart-open-line-above)) "RET")))) + +(provide 'siren-smartparens) +;;; siren-smartparens.el ends here diff --git a/modules/text-editing/siren-sort-symbols.el b/modules/text-editing/siren-sort-symbols.el new file mode 100644 index 0000000..1c4f7b6 --- /dev/null +++ b/modules/text-editing/siren-sort-symbols.el @@ -0,0 +1,19 @@ +;;; siren-sort-symbols.el --- jimeh's Emacs Siren: sort-symbols. + +;;; Commentary: + +;; Helper command to sort symbols in region. Shamelessly ripped from: +;; https://www.emacswiki.org/emacs/SortWords + +;;; Code: + +(defun sort-symbols (reverse beg end) + "Sort symbols in region alphabetically, in REVERSE if negative. +See `sort-symbols'." + (interactive "*P\nr") + (sort-regexp-fields reverse "\\(\\sw\\|\\s_\\)+" "\\&" beg end)) + +(defalias 'ss 'sort-symbols) + +(provide 'siren-sort-symbols) +;;; siren-sort-symbols.el ends here diff --git a/modules/text-editing/siren-sort-words.el b/modules/text-editing/siren-sort-words.el new file mode 100644 index 0000000..739861e --- /dev/null +++ b/modules/text-editing/siren-sort-words.el @@ -0,0 +1,24 @@ +;;; siren-sort-words.el --- jimeh's Emacs Siren: sort-words. + +;;; Commentary: + +;; Helper command to sort words in region. Shamelessly ripped from: +;; https://www.emacswiki.org/emacs/SortWords + +;;; Code: + +(defun sort-words (reverse beg end) + "Sort words in region alphabetically, in REVERSE if negative. +Prefixed with negative \\[universal-argument], sorts in reverse. + +The variable `sort-fold-case' determines whether alphabetic case +affects the sort order. + +See `sort-regexp-fields'." + (interactive "*P\nr") + (sort-regexp-fields reverse "\\w+" "\\&" beg end)) + +(defalias 'sw 'sort-words) + +(provide 'siren-sort-words) +;;; siren-sort-words.el ends here diff --git a/modules/siren-string-inflection.el b/modules/text-editing/siren-string-inflection.el similarity index 100% rename from modules/siren-string-inflection.el rename to modules/text-editing/siren-string-inflection.el diff --git a/modules/text-editing/siren-toggle-comments.el b/modules/text-editing/siren-toggle-comments.el new file mode 100644 index 0000000..4b7abfc --- /dev/null +++ b/modules/text-editing/siren-toggle-comments.el @@ -0,0 +1,32 @@ +;;; siren-toggle-comments.el --- jimeh's Emacs Siren: toggle-comments + +;;; Commentary: + +;; Allows to toggle comments for current line or selected region. Shamelessly +;; ripped from textmate.el: https://github.com/defunkt/textmate.el + +;;; Code: + +(defmacro allow-line-as-region-for-function (orig-function) + `(defun ,(intern (concat (symbol-name orig-function) "-or-line")) + () + ,(format "Like `%s', but acts on the current line if mark is not active." + orig-function) + (interactive) + (if mark-active + (call-interactively (function ,orig-function)) + (save-excursion + ;; define a region (temporarily) -- so any C-u prefixes etc. are preserved. + (beginning-of-line) + (set-mark (point)) + (end-of-line) + (call-interactively (function ,orig-function)))))) + +(unless (fboundp 'comment-or-uncomment-region-or-line) + (allow-line-as-region-for-function comment-or-uncomment-region)) + +(global-set-key (kbd "C-c /") 'comment-or-uncomment-region-or-line) +(global-set-key (kbd "C-c C-/") 'comment-or-uncomment-region-or-line) + +(provide 'siren-toggle-comments) +;;; siren-toggle-comments.el ends here diff --git a/modules/siren-toggle-quotes.el b/modules/text-editing/siren-toggle-quotes.el similarity index 100% rename from modules/siren-toggle-quotes.el rename to modules/text-editing/siren-toggle-quotes.el diff --git a/modules/siren-yasnippet.el b/modules/text-editing/siren-yasnippet.el similarity index 93% rename from modules/siren-yasnippet.el rename to modules/text-editing/siren-yasnippet.el index 4b0f712..3fb1e00 100644 --- a/modules/siren-yasnippet.el +++ b/modules/text-editing/siren-yasnippet.el @@ -9,8 +9,9 @@ (use-package yasnippet-snippets) (use-package yasnippet + :demand :diminish yas-minor-mode - :init + :config (yas-global-mode t)) (provide 'siren-yasnippet) diff --git a/modules/siren-diff-hl.el b/modules/version-control/siren-diff-hl.el similarity index 53% rename from modules/siren-diff-hl.el rename to modules/version-control/siren-diff-hl.el index ffa43ee..b949724 100644 --- a/modules/siren-diff-hl.el +++ b/modules/version-control/siren-diff-hl.el @@ -7,9 +7,13 @@ ;;; Code: (use-package diff-hl - :init - (add-hook 'dired-mode-hook 'diff-hl-dired-mode) - (global-diff-hl-mode +1)) + :demand + :hook ((dired-mode . diff-hl-dired-mode) + (magit-post-refresh-hook . diff-hl-magit-post-refresh)) + + :config + (global-diff-hl-mode +1) + (diff-hl-flydiff-mode +1)) (provide 'siren-diff-hl) ;;; siren-diff-hl.el ends here diff --git a/modules/siren-ediff.el b/modules/version-control/siren-ediff.el similarity index 100% rename from modules/siren-ediff.el rename to modules/version-control/siren-ediff.el diff --git a/modules/siren-git-timemachine.el b/modules/version-control/siren-git-timemachine.el similarity index 100% rename from modules/siren-git-timemachine.el rename to modules/version-control/siren-git-timemachine.el diff --git a/modules/siren-github.el b/modules/version-control/siren-github.el similarity index 100% rename from modules/siren-github.el rename to modules/version-control/siren-github.el diff --git a/modules/siren-magit.el b/modules/version-control/siren-magit.el similarity index 66% rename from modules/siren-magit.el rename to modules/version-control/siren-magit.el index 74ee592..12c861f 100644 --- a/modules/siren-magit.el +++ b/modules/version-control/siren-magit.el @@ -8,15 +8,28 @@ (require 'siren-fci) (require 'siren-flyspell) -(require 'siren-ediff) (use-package magit :bind ("C-x g". magit-status) + :hook + (siren-magit-mode . siren-magit-mode-setup) + (git-commit-mode . siren-git-commit-mode-setup) + :init (defalias 'bl 'magit-blame) + (defun siren-magit-mode-setup ()) + + (defun siren-git-commit-mode-setup () + (subword-mode) + (setq tab-width 2) + (fci-mode t) + ;; (flyspell-mode) ;; in GUI causes git-commit-mode to lock up emacs + (linum-mode t) + (auto-fill-mode)) + :config (require 'magit) @@ -27,28 +40,12 @@ magit-revert-buffers 'silent magit-default-tracking-name-function 'magit-default-tracking-name-branch-only magit-repository-directories '("~/Projects" "~/src" "~/.emacs.d" "~/.dotfiles") - magit-display-buffer-function 'magit-display-buffer-same-window-except-diff-v1) - - (defun siren-magit-mode-defaults ()) - (setq siren-magit-mode-hook 'siren-magit-mode-defaults) - (add-hook 'magit-mode-hook (lambda () (run-hooks 'siren-magit-mode-hook))) - - (defun siren-git-commit-mode-defaults () - (subword-mode) - (setq tab-width 2) - (fci-mode t) - ;; (flyspell-mode) ;; in GUI causes git-commit-mode to lock up emacs - (linum-mode t) - (auto-fill-mode)) - - (setq siren-git-commit-mode-hook 'siren-git-commit-mode-defaults) - (add-hook 'git-commit-mode-hook (lambda () - (run-hooks 'siren-git-commit-mode-hook)))) + magit-display-buffer-function 'magit-display-buffer-same-window-except-diff-v1)) (use-package magit-gh-pulls + :hook (magit-mode . turn-on-magit-gh-pulls) :config - (setq gh-use-local-git-config t) - (add-hook 'magit-mode-hook 'turn-on-magit-gh-pulls)) + (setq gh-use-local-git-config t)) (provide 'siren-magit) ;;; siren-magit.el ends here diff --git a/modules/windows/siren-buffer-move.el b/modules/windows/siren-buffer-move.el new file mode 100644 index 0000000..d16792d --- /dev/null +++ b/modules/windows/siren-buffer-move.el @@ -0,0 +1,17 @@ +;;; siren-buffer-move.el --- jimeh's Emacs Siren: buffer-move + +;;; Commentary: + +;; Configuration for buffer-move + +;;; Code: + +(use-package buffer-move + :bind + ("M-K" . buf-move-down) + ("M-I" . buf-move-up) + ("M-J" . buf-move-left) + ("M-L" . buf-move-right)) + +(provide 'siren-buffer-move) +;;; siren-buffer-move.el ends here diff --git a/modules/windows/siren-resize-window.el b/modules/windows/siren-resize-window.el new file mode 100644 index 0000000..54f5223 --- /dev/null +++ b/modules/windows/siren-resize-window.el @@ -0,0 +1,15 @@ +;;; siren-resize-window.el --- jimeh's Emacs Siren: resize-window + +;;; Commentary: + +;; Configuration for resize-window. + +;;; Code: + +(use-package resize-window + :commands resize-window + :bind + ("C-;" . resize-window)) + +(provide 'siren-resize-window) +;;; siren-resize-window.el ends here diff --git a/modules/windows/siren-windmove.el b/modules/windows/siren-windmove.el new file mode 100644 index 0000000..98dec02 --- /dev/null +++ b/modules/windows/siren-windmove.el @@ -0,0 +1,18 @@ +;;; siren-windmove.el --- jimeh's Emacs Siren: windmove + +;;; Commentary: + +;; Configuration for windmove. + +;;; Code: + +(use-package windmove + :ensure nil ;; loaded from emacs built-ins + :config + (global-set-key (kbd "M-k") (siren-ignore-error-wrapper 'windmove-down)) + (global-set-key (kbd "M-i") (siren-ignore-error-wrapper 'windmove-up)) + (global-set-key (kbd "M-j") (siren-ignore-error-wrapper 'windmove-left)) + (global-set-key (kbd "M-l") (siren-ignore-error-wrapper 'windmove-right))) + +(provide 'siren-windmove) +;;; siren-windmove.el ends here diff --git a/modules/siren-zoom-window.el b/modules/windows/siren-zoom-window.el similarity index 100% rename from modules/siren-zoom-window.el rename to modules/windows/siren-zoom-window.el diff --git a/modules/siren-elscreen.el b/modules/workspaces/siren-elscreen.el similarity index 97% rename from modules/siren-elscreen.el rename to modules/workspaces/siren-elscreen.el index a614f13..4e7e5d6 100644 --- a/modules/siren-elscreen.el +++ b/modules/workspaces/siren-elscreen.el @@ -7,6 +7,7 @@ ;;; Code: (use-package elscreen + :demand :bind (("s-}" . elscreen-next) ("s-{" . elscreen-previous) @@ -27,7 +28,6 @@ ("C-;" . elscreen-display-screen-name-list)) :config - ;; Start ElScreen. (elscreen-start)) (use-package elscreen-buffer-group :defer t) diff --git a/modules/workspaces/siren-escreen.el b/modules/workspaces/siren-escreen.el new file mode 100644 index 0000000..dbc8486 --- /dev/null +++ b/modules/workspaces/siren-escreen.el @@ -0,0 +1,54 @@ +;;; siren-escreen.el --- jimeh's Emacs Siren: escreen configuration. + +;;; Commentary: + +;; Basic configuration for escreen. + +;;; Code: + +(use-package escreen + :ensure nil ;; loaded from vendor + :demand + + :bind (("s-}" . escreen-goto-next-screen) + ("s-{" . escreen-goto-prev-screen) + :map escreen-map + ("C-z" . escreen-goto-last-screen) + ("l" . escreen-goto-last-screen) + ("C-l" . escreen-goto-last-screen) + (";" . siren-escreen-get-active-screen) + ("C-;" . siren-escreen-get-active-screen) + ("C-c" . escreen-create-screen) + ("C-g" . escreen-goto-screen) + ("C-k" . escreen-kill-screen) + ("C-n" . escreen-goto-next-screen) + ("C-p" . escreen-goto-prev-screen)) + + :hook + (escreen-goto-screen . siren-escreen-get-active-screen) + + :init + (defun siren-escreen-get-active-screen () + "what the name says" + (interactive) + (let ((escreens (escreen-get-active-screen-numbers)) + (emphased "")) + (dolist (s escreens) + (setq emphased + (concat emphased (if (= escreen-current-screen-number s) + (propertize (number-to-string s) + ;;'face 'custom-variable-tag) " ") + ;;'face 'info-title-3) + 'face 'font-lock-warning-face) + ;;'face 'secondary-selection) + (number-to-string s)) + " "))) + (message "escreen: active screens: %s" emphased))) + + :config + (escreen-install) + (setq escreen-prefix-char (kbd "C-z")) + (global-set-key escreen-prefix-char 'escreen-prefix)) + +(provide 'siren-escreen) +;;; siren-escreen.el ends here diff --git a/modules/siren-eyebrowse.el b/modules/workspaces/siren-eyebrowse.el similarity index 100% rename from modules/siren-eyebrowse.el rename to modules/workspaces/siren-eyebrowse.el diff --git a/modules/workspaces/siren-perspective.el b/modules/workspaces/siren-perspective.el new file mode 100644 index 0000000..50b571a --- /dev/null +++ b/modules/workspaces/siren-perspective.el @@ -0,0 +1,48 @@ +;;; siren-perspective.el --- jimeh's Emacs Siren: perspective configuration. + +;;; Commentary: + +;; Basic configuration for perspective. + +;;; Code: + +(use-package perspective + :demand + :bind (:map persp-mode-map + ("C-z z" . persp-switch) + ("C-z C-z" . persp-switch) + ("C-z c" . persp-switch) + ("C-z C-c" . persp-switch) + ("C-z s" . persp-switch) + ("C-z C-s" . persp-switch) + ("C-z b" . persp-switch) + ("C-z C-b" . persp-switch) + ("C-z l" . persp-switch-last) + ("C-z C-l" . persp-switch-last) + ("C-z c" . persp-remove-buffer) + ("C-z C-c" . persp-remove-buffer) + ("C-z k" . persp-kill) + ("C-z C-k" . persp-kill) + ("C-z r" . persp-rename) + ("C-z C-r" . persp-rename) + ("C-z a" . persp-add-buffer) + ("C-z C-a" . persp-add-buffer) + ("C-z i" . persp-import) + ("C-z C-i" . persp-import) + ("C-z n" . persp-next) + ("C-z C-n" . persp-next) + ("C-z p" . persp-prev) + ("C-z C-p" . persp-prev)) + :config + (setq persp-mode-prefix-key "" + persp-initial-frame-name "0:main") + + (define-key persp-mode-map (kbd "C-z") perspective-map) + (persp-mode) + + ;; (custom-set-faces + ;; '(persp-selected-face ((t (:foreground "#d97a35" :weight bold))))) + ) + +(provide 'siren-perspective) +;;; siren-perspective.el ends here diff --git a/modules/siren-workgroups2.el b/modules/workspaces/siren-workgroups2.el similarity index 100% rename from modules/siren-workgroups2.el rename to modules/workspaces/siren-workgroups2.el diff --git a/vendor/dired+.el b/vendor/dired+.el index 10f6414..0855d24 100644 --- a/vendor/dired+.el +++ b/vendor/dired+.el @@ -8,9 +8,9 @@ ;; Created: Fri Mar 19 15:58:58 1999 ;; Version: 2017.10.23 ;; Package-Requires: () -;; Last-Updated: Sat Mar 3 09:33:56 2018 (-0800) +;; Last-Updated: Sun Mar 25 11:18:04 2018 (-0700) ;; By: dradams -;; Update #: 10754 +;; Update #: 10917 ;; URL: https://www.emacswiki.org/emacs/download/dired%2b.el ;; Doc URL: https://www.emacswiki.org/emacs/DiredPlus ;; Keywords: unix, mouse, directories, diredp, dired @@ -646,6 +646,7 @@ ;; ;; Macros defined here: ;; +;; `diredp-mark-if', `diredp-user-error', ;; `diredp-with-help-window'. ;; ;; @@ -653,7 +654,6 @@ ;; been REDEFINED HERE: ;; ;; `dired-map-over-marks' - Treat multiple `C-u' specially. -;; `dired-mark-if' - Better initial msg - Emacs bug #8523. ;; ;; ;; ***** NOTE: The following functions defined in `dired.el' have @@ -667,6 +667,8 @@ ;; `dired-dwim-target-directory' - Uses `diredp-dwim-any-frame-flag'. ;; `dired-find-file' - Allow `.' and `..' (Emacs 20 only). ;; `dired-get-filename' - Test `./' and `../' (like `.', `..'). +;; `dired-get-marked-files' - Can include `.' and `..'. +;; Allow FILTER + DISTINGUISH-ONE-MARKED. ;; `dired-goto-file' - Fix Emacs bug #7126. ;; Remove `/' from dir before compare. ;; (Emacs < 24 only.) @@ -679,6 +681,10 @@ ;; (don't just use nil). (Emacs 23+, and ;; only for MS Windows) ;; `dired-insert-set-properties' - `mouse-face' on whole line. +;; `dired-flag-auto-save-files', `dired-mark-directories', +;; `dired-mark-executables', `dired-mark-files-containing-regexp', +;; `dired-mark-files-regexp', `dired-mark-symlinks' +;; - Use `diredp-mark-if', not `dired-mark-if'. ;; `dired-mark-files-regexp' - Add regexp to `regexp-search-ring'. ;; More matching possibilities. ;; Added optional arg LOCALP. @@ -705,8 +711,7 @@ ;; take advantage of the new definition of macro ;; `dired-map-over-marks': ;; -;; `dired-do-redisplay', `dired-get-marked-files', -;; `dired-map-over-marks-check', +;; `dired-do-redisplay', `dired-map-over-marks-check', ;; `image-dired-dired-insert-marked-thumbs', ;; `image-dired-dired-toggle-marked-thumbs'. ;; @@ -730,7 +735,8 @@ ;; `dired-copy-filename-as-kill' - ;; Put file names also in var `diredp-last-copied-filenames'. ;; `dired-do-find-marked-files' - -;; Doc string reflects new `dired-simultaneous-find-file'. +;; Call `dired-get-marked-files' with original ARG. +;; Added optional arg INTERACTIVEP - no error if nil and no files. ;; `dired-do-run-mail' - Require confirmation. ;; `dired-mark-sexp' - 1. Variable `s' -> `blks'. ;; 2. Fixes to `uid' and `gid'. @@ -739,6 +745,7 @@ ;; Use separate frames instead of windows if `pop-up-frames' is ;; non-nil, or if prefix arg < 0. ;; +;; ;; ***** NOTE: (Emacs 20 only) The following variable defined in ;; `dired.el' has been REDEFINED HERE: ;; @@ -748,6 +755,20 @@ ;; ;;; Change Log: ;; +;; 2018/03/25 dadams +;; Added: diredp-user-error. +;; Updated for Emacs 27-pretest-2 change in dired-get-marked-files signature. +;; dired-get-marked-files: Added optional arg ERROR-IF-NONE-P. +;; diredp-list-marked, diredp-insert-subdirs, dired-do-(i)search(-regexp), dired-do-query-replace-regexp, +;; dired-do-find-marked-files, diredp-describe-marked-autofiles: +;; Added optional arg INTERACTIVEP. +;; Pass non-nil ERROR-IF-NONE-P to dired-get-marked-files when INTERACTIVEP. (See Emacs bug #30938.) +;; 2018/03/23 dadams +;; Added diredp-mark-if. Removed: redefinition of dired-mark-if. +;; Differences: msg and return value include both number of matches and number of changes. +;; Added redefinitions (use diredp-mark-if) of dired-flag-auto-save-files, +;; dired-mark-(files-containing-regexp|symlinks|directories|executables). +;; Everywhere: Use diredp-mark-if, not dired-mark-if. ;; 2018/03/03 dadams ;; diredp-delete-dups: defalias the symbol, not its symbol-function (dunno why I did the latter). ;; 2018/02/28 dadams @@ -1810,6 +1831,9 @@ rather than FUN itself, to `minibuffer-setup-hook'." (progn (add-hook 'minibuffer-setup-hook ,hook) ,@body) (remove-hook 'minibuffer-setup-hook ,hook))))))) +(defmacro diredp-user-error (&rest args) + `(if (fboundp 'user-error) (user-error ,@args) (error ,@args))) + ;; Define these for Emacs 20 and 21. (unless (fboundp 'dired-get-file-for-visit) ; Emacs 22+ (defun dired-get-file-for-visit () ; Not bound @@ -1843,6 +1867,7 @@ rather than FUN itself, to `minibuffer-setup-hook'." (defvar bookmark-default-file) ; In `bookmark.el' (defvar compilation-current-error) ; In `compile.el' (defvar delete-by-moving-to-trash) ; Built-in, Emacs 23+ +(defvar dired-always-read-filesystem) ; In `dired.el', Emacs 26+ (defvar dired-auto-revert-buffer) ; In `dired.el', Emacs 23+ (defvar dired-details-state) ; In `dired-details+.el' (defvar dired-keep-marker-hardlink) ; In `dired-x.el' @@ -2104,37 +2129,50 @@ Initialized to the value of option `diredp-hide-details-initially-flag'.") ;;; Macros -;; REPLACE ORIGINAL in `dired.el'. +;; Unlike `dired-mark-if': ;; -;; Do not count lines that satisfy predicate if they already have `dired-marker-char'. +;; 1. Value returned and message indicate both the number matched and the number changed. +;; 2. Added optional arg PLURAL, for irregular plurals (e.g. "directories"). ;; -(defmacro dired-mark-if (predicate msg) +(defmacro diredp-mark-if (predicate singular &optional plural) "Mark files for PREDICATE, according to `dired-marker-char'. PREDICATE is evaluated on each line, with point at beginning of line. -MSG is a noun phrase for the type of files being marked. -It should end with a noun that can be pluralized by adding `s'. -Return value is the number of files marked, or nil if none were marked." +SINGULAR is a singular noun phrase for the type of files being marked. +Optional arg PLURAL is a plural noun phrase for the type of files + being marked. +If PLURAL is nil then SINGULAR should end with a noun that can be +pluralized by adding `s'. + +Return nil if no files matched PREDICATE. +Otherwise return a cons (CHANGED . MATCHED), where: + CHANGED is the number of markings that were changed by the operation. + MATCHED is the number of files that matched PREDICATE." `(let ((inhibit-read-only t) - count) + changed matched) (save-excursion - (setq count 0) - (when ,msg (message "%s %ss%s..." - (cond ((eq dired-marker-char ?\040) "Unmarking") - ((eq dired-del-marker dired-marker-char) "Flagging") - (t "Marking")) - ,msg - (if (eq dired-del-marker dired-marker-char) " for deletion" ""))) + (setq matched 0 + changed 0) + (when ,singular (message "%s %s%s..." + (cond ((eq dired-marker-char ?\040) "Unmarking") + ((eq dired-del-marker dired-marker-char) "Flagging") + (t "Marking")) + (or ,plural (concat ,singular "s")) + (if (eq dired-del-marker dired-marker-char) " for deletion" ""))) (goto-char (point-min)) (while (not (eobp)) (when ,predicate + (setq matched (1+ matched)) (unless (diredp-looking-at-p (char-to-string dired-marker-char)) - (delete-char 1) (insert dired-marker-char) (setq count (1+ count)))) + (delete-char 1) (insert dired-marker-char) (setq changed (1+ changed)))) (forward-line 1)) - (when ,msg (message "%s %s%s %s%s" count ,msg - (dired-plural-s count) - (if (eq dired-marker-char ?\040) "un" "") - (if (eq dired-marker-char dired-del-marker) "flagged" "marked")))) - (and (> count 0) count))) + (when ,singular (message "%s %s%s%s newly %s%s" + matched + (if (= matched 1) ,singular (or ,plural (concat ,singular "s"))) + (if (not (= matched changed)) " matched, " "") + (if (not (= matched changed)) changed "") + (if (eq dired-marker-char ?\040) "un" "") + (if (eq dired-marker-char dired-del-marker) "flagged" "marked")))) + (and (> matched 0) (cons changed matched)))) ;; Just a helper function for `dired-map-over-marks'. @@ -2361,7 +2399,7 @@ Uses the `derived-mode-parent' property of the symbol to trace backwards." ;; 2. Doc string is updated to reflect the new ARG behavior. ;; 3. Allow, unlike vanilla Emacs, use of FILTER and DISTINGUISH-ONE-MARKED together. ;; -(defun dired-get-marked-files (&optional localp arg filter distinguish-one-marked) +(defun dired-get-marked-files (&optional localp arg filter distinguish-one-marked error-if-none-p) "Return names of the marked files and directories as a list of strings. The list is in the same order as the buffer, that is, the car is the first marked file. @@ -2383,6 +2421,8 @@ Optional third argument FILTER, if non-nil, is a function to select If DISTINGUISH-ONE-MARKED is non-nil, then return (t FILENAME) instead of (FILENAME) if only one file is marked (after any filtering by FILTER). +If ERROR-IF-NONE-P is non-nil, signal an error if the list of files is + empty. If ERROR-IF-NONE-P is a string then it is the error message. Note that the Dired+ version of this function differs from the vanilla version in these respects: @@ -2390,9 +2430,10 @@ version in these respects: * There are more possibilities for argument ARG (prefix argument). * Directories `.' and `..' can be included as marked. * You can use arguments FILTER and DISTINGUISH-ONE-MARKED together." - (let ((all (delq nil (save-excursion - (dired-map-over-marks (dired-get-filename localp t) - arg nil distinguish-one-marked)))) + (let ((all (delq nil (save-excursion (dired-map-over-marks (dired-get-filename localp 'NO-ERROR-IF-NOT-FILEP) + arg + nil + distinguish-one-marked)))) result) (if (and distinguish-one-marked (eq (car all) t)) (if (not filter) @@ -2400,6 +2441,8 @@ version in these respects: (and (funcall filter (cadr all)) (list t (cadr all)))) (dolist (file all) (when (or (not filter) (funcall filter file)) (push file result))) + (when (and (null result) error-if-none-p) + (diredp-user-error (if (stringp error-if-none-p) error-if-none-p "No files specified"))) (if (and distinguish-one-marked (= 1 (length result))) (cons t result) result)))) @@ -4294,7 +4337,7 @@ The full text of the line is used as the file name." (save-excursion (mouse-set-point e) (diredp-find-line-file-other-window))) ;;;###autoload -(defun diredp-list-marked (&optional arg predicate) ; Bound to `C-M-l' +(defun diredp-list-marked (&optional arg predicate interactivep) ; Bound to `C-M-l' "List the marked files in this Dired buffer. A prefix arg specifies files to use instead of the marked files: @@ -4310,8 +4353,9 @@ shows image previews. Non-interactively, non-nil arg PREDICATE is a file-name predicate. List only the files for which it returns non-nil." - (interactive (progn (diredp-ensure-mode) (list current-prefix-arg))) - (let ((files (dired-get-marked-files nil arg predicate))) (diredp-list-files files))) + (interactive (progn (diredp-ensure-mode) (list current-prefix-arg nil t))) + (let ((files (dired-get-marked-files nil arg predicate 'DISTINGUISH-ONE interactivep))) + (diredp-list-files files))) (defun diredp-list-files (files &optional dir bufname predicate) "Display FILES, a list of file names. Wildcard patterns are expanded. @@ -4647,18 +4691,20 @@ Raise an error first if not in Dired mode." (dired-kill-tree (dired-current-directory) nil 'KILL-ROOT))) ;;;###autoload -(defun diredp-insert-subdirs (&optional switches) ; Bound to `M-i' +(defun diredp-insert-subdirs (&optional switches interactivep) ; Bound to `M-i' "Insert the marked subdirectories. Like using \\`\\[dired-maybe-insert-subdir]' at each marked directory line." (interactive (list (and current-prefix-arg (read-string "Switches for listing: " (or (and (boundp 'dired-subdir-switches) dired-subdir-switches) - dired-actual-switches))))) - (dolist (subdir (dired-get-marked-files nil nil - (lambda (fl) - (and (file-directory-p fl) ; Exclude `.' and `..' - (not (diredp-string-match-p "/[.][.]?\\'" - fl)))))) + dired-actual-switches))) + t)) + (dolist (subdir (dired-get-marked-files nil + nil + (lambda (fl) (and (file-directory-p fl) ; Exclude `.' and `..' + (not (diredp-string-match-p "/[.][.]?\\'" fl)))) + nil + interactivep)) (dired-maybe-insert-subdir subdir switches))) ;;;###autoload @@ -5442,20 +5488,26 @@ then only the first such is used." (add-to-list 'regexp-search-ring regexp) ; Add REGEXP to `regexp-search-ring'. (let ((dired-marker-char (or marker-char dired-marker-char)) (sdirs (diredp-get-subdirs ignore-marks-p)) - (total-count 0) - dbufs) - (message "%s matching files..." (if (eq ?\040 dired-marker-char) "UNmarking" "Marking")) + (matched 0) + (changed 0) + dbufs chg.mtch) + (message "%s files..." (if (eq ?\040 dired-marker-char) "UNmarking" "Marking")) (dolist (dir (cons default-directory sdirs)) (when (setq dbufs (dired-buffers-for-dir (expand-file-name dir))) ; Dirs with Dired buffers only. (with-current-buffer (car dbufs) - (setq total-count - (+ total-count (or (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) - (not (eolp)) ; Empty line - (let ((fn (dired-get-filename nil 'NO-ERROR))) - (and fn (diredp-string-match-p regexp fn)))) - "matching file") - 0)))))) - (message "%s %d matching files" (if (eq ?\040 dired-marker-char) "UNmarked" "Marked") total-count))) + (setq chg.mtch (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) + (not (eolp)) ; Empty line + (let ((fn (dired-get-filename nil 'NO-ERROR))) + (and fn (diredp-string-match-p regexp fn)))) + "file") + changed (+ changed (or (car chg.mtch) 0)) + matched (+ matched (or (cdr chg.mtch) 0)))))) + (message "%s file%s%s%s newly %s" + matched + (dired-plural-s matched) + (if (not (= matched changed)) " matched, " "") + (if (not (= matched changed)) changed "") + (if (eq ?\040 dired-marker-char) "unmarked" "marked")))) (defun diredp-mark-extension-recursive (extension &optional arg) ; Bound to `M-+ * .' "Mark all files with a certain EXTENSION, including in marked subdirs. @@ -5532,8 +5584,8 @@ A non-positive prefix arg means to ignore subdir markings and act instead on ALL subdirs. That is, mark all in this directory and all descendant directories." (interactive "P") - (diredp-mark-recursive-1 arg "directories" "directory file" '(and (diredp-looking-at-p dired-re-dir) - (not (diredp-looking-at-p dired-re-dot))))) + (diredp-mark-recursive-1 arg "directories" "directory" '(and (diredp-looking-at-p dired-re-dir) + (not (diredp-looking-at-p dired-re-dot))))) ;;;###autoload (defun diredp-mark-symlinks-recursive (&optional arg) ; Bound to `M-+ * @' "Mark all symbolic links, including in marked subdirs. @@ -5556,14 +5608,22 @@ descendant directories." (ignorep (and numarg (<= numarg 0))) (dired-marker-char (if unmark ?\040 dired-marker-char)) (sdirs (diredp-get-subdirs ignorep)) - (total-count 0) - dbufs) + (changed 0) + (matched 0) + dbufs chg.mtch) (message "%s %s..." (if (eq ?\040 dired-marker-char) "UNmarking" "Marking") plural) (dolist (dir (cons default-directory sdirs)) (when (setq dbufs (dired-buffers-for-dir (expand-file-name dir))) ; Dirs with Dired buffers only. (with-current-buffer (car dbufs) - (setq total-count (+ total-count (or (dired-mark-if (eval predicate-sexp) singular) 0)))))) - (message "%s %d %s" (if (eq ?\040 dired-marker-char) "UNmarked" "Marked") total-count plural))) + (setq chg.mtch (diredp-mark-if (eval predicate-sexp) singular) + changed (+ changed (or (car chg.mtch) 0)) + matched (+ matched (or (cdr chg.mtch) 0)))))) + (message "%s %s%s%s newly %s" + matched + (if (= 1 matched) singular plural) + (if (not (= matched changed)) " matched, " "") + (if (not (= matched changed)) changed "") + (if (eq ?\040 dired-marker-char) "unmarked" "marked")))) ;;;###autoload (defun diredp-capitalize-recursive (&optional ignore-marks-p) ; Bound to `M-+ % c' @@ -6023,21 +6083,21 @@ As a special case, if TAGS is empty, then mark or unmark the files that have any tags at all, or if NONEP is non-nil then mark or unmark those that have no tags at all." (let ((dired-marker-char (if unmarkp ?\040 dired-marker-char))) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) - (let* ((fname (dired-get-filename nil t)) - (bmk (and fname (bmkp-get-autofile-bookmark fname nil prefix))) - (btgs (and bmk (bmkp-get-tags bmk))) - (presentp nil) - (allp (and btgs (catch 'diredp-m-f-t-an - (dolist (tag tags) - (setq presentp (assoc-default tag btgs nil t)) - (unless (if none-p (not presentp) presentp) - (throw 'diredp-m-f-t-an nil))) - t)))) - (if (null tags) - (if none-p (not btgs) btgs) - allp))) - (if none-p "no-tags-matching file" "all-tags-matching file")))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) + (let* ((fname (dired-get-filename nil t)) + (bmk (and fname (bmkp-get-autofile-bookmark fname nil prefix))) + (btgs (and bmk (bmkp-get-tags bmk))) + (presentp nil) + (allp (and btgs (catch 'diredp-m-f-t-an + (dolist (tag tags) + (setq presentp (assoc-default tag btgs nil t)) + (unless (if none-p (not presentp) presentp) + (throw 'diredp-m-f-t-an nil))) + t)))) + (if (null tags) + (if none-p (not btgs) btgs) + allp))) + (if none-p "no-tags-matching file" "all-tags-matching file")))) (defun diredp-mark-files-tagged-some/not-all (tags &optional notallp unmarkp prefix) "Mark or unmark files tagged with any or not all of TAGS. @@ -6050,20 +6110,20 @@ As a special case, if TAGS is empty, then mark or unmark the files that have any tags at all, or if NOTALLP is non-nil then mark or unmark those that have no tags at all." (let ((dired-marker-char (if unmarkp ?\040 dired-marker-char))) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) - (let* ((fname (dired-get-filename nil t)) - (bmk (and fname - (bmkp-get-autofile-bookmark fname nil prefix))) - (btgs (and bmk (bmkp-get-tags bmk))) - (presentp nil) - (allp (and btgs (catch 'diredp-m-f-t-sna - (dolist (tag tags) - (setq presentp (assoc-default tag btgs nil t)) - (when (if notallp (not presentp) presentp) - (throw 'diredp-m-f-t-sna t))) - nil)))) - (if (null tags) (if notallp (not btgs) btgs) allp))) - (if notallp "some-tags-not-matching file" "some-tags-matching file")))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) + (let* ((fname (dired-get-filename nil t)) + (bmk (and fname + (bmkp-get-autofile-bookmark fname nil prefix))) + (btgs (and bmk (bmkp-get-tags bmk))) + (presentp nil) + (allp (and btgs (catch 'diredp-m-f-t-sna + (dolist (tag tags) + (setq presentp (assoc-default tag btgs nil t)) + (when (if notallp (not presentp) presentp) + (throw 'diredp-m-f-t-sna t))) + nil)))) + (if (null tags) (if notallp (not btgs) btgs) allp))) + (if notallp "some-tags-not-matching file" "some-tags-matching file")))) ;;;###autoload (defun diredp-mark-files-tagged-all (tags &optional none-p prefix) ; `T m *' @@ -6136,18 +6196,18 @@ You need library `bookmark+.el' to use this command." (read-string "Prefix for autofile bookmark names: ")))) (diredp-ensure-bookmark+) (diredp-ensure-mode) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) - (lexical-let* ((fname (dired-get-filename nil t)) - (bmk (and fname - (bmkp-get-autofile-bookmark fname nil prefix))) - (btgs (and bmk (bmkp-get-tags bmk))) - (anyp (and btgs (bmkp-some #'(lambda (tag) - (diredp-string-match-p - regexp - (bmkp-tag-name tag))) - btgs)))) - (and btgs (if notp (not anyp) anyp)))) - "some-tag-matching-regexp file")) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) + (lexical-let* ((fname (dired-get-filename nil t)) + (bmk (and fname + (bmkp-get-autofile-bookmark fname nil prefix))) + (btgs (and bmk (bmkp-get-tags bmk))) + (anyp (and btgs (bmkp-some #'(lambda (tag) + (diredp-string-match-p + regexp + (bmkp-tag-name tag))) + btgs)))) + (and btgs (if notp (not anyp) anyp)))) + "some-tag-matching-regexp file")) ;;;###autoload (defun diredp-unmark-files-tagged-regexp (regexp &optional notp prefix) ; `T u %' @@ -6161,17 +6221,17 @@ You need library `bookmark+.el' to use this command." (diredp-ensure-bookmark+) (diredp-ensure-mode) (let ((dired-marker-char ?\040)) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) - (lexical-let* ((fname (dired-get-filename nil t)) - (bmk (and fname (bmkp-get-autofile-bookmark fname nil prefix))) - (btgs (and bmk (bmkp-get-tags bmk))) - (anyp (and btgs (bmkp-some #'(lambda (tag) - (diredp-string-match-p - regexp - (bmkp-tag-name tag))) - btgs)))) - (and btgs (if notp (not anyp) anyp)))) - "some-tag-matching-regexp file"))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) + (lexical-let* ((fname (dired-get-filename nil t)) + (bmk (and fname (bmkp-get-autofile-bookmark fname nil prefix))) + (btgs (and bmk (bmkp-get-tags bmk))) + (anyp (and btgs (bmkp-some #'(lambda (tag) + (diredp-string-match-p + regexp + (bmkp-tag-name tag))) + btgs)))) + (and btgs (if notp (not anyp) anyp)))) + "some-tag-matching-regexp file"))) ;;;###autoload (defun diredp-unmark-files-tagged-all (tags &optional none-p prefix) ; `T u *' @@ -6616,10 +6676,10 @@ You need library `bookmark+.el' to use this command." (defun diredp-mark/unmark-autofiles (&optional unmarkp) "Mark all autofiles, or unmark if UNMARKP is non-nil." (let ((dired-marker-char (if unmarkp ?\040 dired-marker-char))) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) - (let ((fname (dired-get-filename nil t))) - (and fname (bmkp-get-autofile-bookmark fname)))) - "autofile"))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) (not (eolp)) + (let ((fname (dired-get-filename nil t))) + (and fname (bmkp-get-autofile-bookmark fname)))) + "autofile"))) (when (and (fboundp 'bmkp-get-autofile-bookmark) ; Defined in `bookmark+-1.el'. (fboundp 'hlt-highlight-region)) ; Defined in `highlight.el'. @@ -7256,48 +7316,56 @@ A prefix argument ARG specifies files to use instead of those marked. ;; REPLACE ORIGINAL in `dired.el': ;; - ;; Added optional ARG, so you can act on next ARG files or on all files. + ;; 1. Added optional arg ARG, so you can act on next ARG files or on all files. + ;; 2. Added optional arg INTERACTIVEP. + ;; 3. Do not raise error if no files when not INTERACTIVEP. ;; - (defun dired-do-isearch (&optional arg) + (defun dired-do-isearch (&optional arg interactivep) "Search for a string through all marked files using Isearch. A prefix argument ARG specifies files to use instead of those marked. * An integer means use the next ARG files (previous -ARG, if < 0). * Two or more `C-u' (e.g. `C-u C-u') means ignore any marks and use all files in the Dired buffer. - * Any other prefix arg means use the current file." + * Any other prefix arg means use the current file. +When invoked interactively, raise an error if no files are marked." (interactive (let* ((arg current-prefix-arg) (C-u (and (consp arg) arg))) (when (and C-u (> (prefix-numeric-value arg) 16)) (setq arg '(16))) - (list arg))) - (multi-isearch-files (dired-get-marked-files nil arg 'dired-nondirectory-p))) + (list arg t))) + (multi-isearch-files (dired-get-marked-files nil arg 'dired-nondirectory-p nil interactivep))) ;; REPLACE ORIGINAL in `dired.el': ;; - ;; Added optional ARG, so you can act on next ARG files or on all files. + ;; 1. Added optional arg ARG, so you can act on next ARG files or on all files. + ;; 2. Added optional arg INTERACTIVEP. + ;; 3. Do not raise error if no files when not INTERACTIVEP. ;; - (defun dired-do-isearch-regexp (&optional arg) + (defun dired-do-isearch-regexp (&optional arg interactivep) "Search for a regexp through all marked files using Isearch. A prefix arg behaves as follows: * An integer means use the next ARG files (previous -ARG, if < 0). * Two or more `C-u' (e.g. `C-u C-u') means ignore any marks and use all files in the Dired buffer. - * Any other prefix arg means use the current file." + * Any other prefix arg means use the current file. +When invoked interactively, raise an error if no files are marked." (interactive (let* ((arg current-prefix-arg) (C-u (and (consp arg) arg))) (when (and C-u (> (prefix-numeric-value arg) 16)) (setq arg '(16))) - (list arg))) - (multi-isearch-files-regexp (dired-get-marked-files nil arg 'dired-nondirectory-p))) + (list arg t))) + (multi-isearch-files-regexp (dired-get-marked-files nil arg 'dired-nondirectory-p nil interactivep))) ) ;; REPLACE ORIGINAL in `dired.el': ;; -;; Added optional ARG, so you can act on next ARG files or on all files. +;; 1. Added optional arg ARG, so you can act on next ARG files or on all files. +;; 2. Added optional arg INTERACTIVEP. +;; 3. Do not raise error if no files when not INTERACTIVEP. ;; ;;;###autoload -(defun dired-do-search (regexp &optional arg) +(defun dired-do-search (regexp &optional arg interactivep) "Search through all marked files for a match for REGEXP. Stops when a match is found. To continue searching for next match, use command \\[tags-loop-continue]. @@ -7306,21 +7374,26 @@ A prefix arg behaves as follows: * An integer means use the next ARG files (previous -ARG, if < 0). * Two or more `C-u' (e.g. `C-u C-u') means ignore any marks and use all files in the Dired buffer. - * Any other prefix arg means use the current file." + * Any other prefix arg means use the current file. + +When invoked interactively, raise an error if no files are marked." (interactive (let* ((arg current-prefix-arg) (C-u (and (consp arg) arg))) (when (and C-u (> (prefix-numeric-value arg) 16)) (setq arg '(16))) (list (diredp-read-regexp "Search marked files (regexp): ") - arg))) - (tags-search regexp `(dired-get-marked-files nil ',arg 'dired-nondirectory-p))) + arg + t))) + (tags-search regexp `(dired-get-marked-files nil ',arg 'dired-nondirectory-p nil ,interactivep))) ;; REPLACE ORIGINAL in `dired.el': ;; -;; Added optional ARG, so you can act on next ARG files or on all files. +;; 1. Added optional arg ARG, so you can act on next ARG files or on all files. +;; 2. Added optional arg INTERACTIVEP. +;; 3. Do not raise error if no files when not INTERACTIVEP. ;; ;;;###autoload -(defun dired-do-query-replace-regexp (from to &optional arg) +(defun dired-do-query-replace-regexp (from to &optional arg interactivep) "Do `query-replace-regexp' of FROM with TO, on all marked files. NOTE: A prefix arg for this command acts differently than for other commands, so that you can use it to request word-delimited matches. @@ -7337,17 +7410,23 @@ So for example: * `C-u 4': act on the next 4 files. `C-4' means the same thing. * `C-u': act on the marked files, replacing word-delimited matches. +When invoked interactively, raise an error if no files are marked. + If you exit (\\[keyboard-quit], RET or q), you can resume the query replace with the command \\[tags-loop-continue]." (interactive (let ((common (query-replace-read-args "Query replace regexp in marked files" t t))) (list (nth 0 common) (nth 1 common) - current-prefix-arg))) + current-prefix-arg + t))) (let* ((argnum (and (consp arg) (prefix-numeric-value arg))) (delimited (and argnum (eq (logand (truncate (log argnum 4)) 1) 1))) ; Odd number of plain `C-u'. (all (and argnum (> argnum 4))) ; At least 3 plain `C-u'. - (dgmf-arg (dired-get-marked-files nil (if (and arg (atom arg)) (abs arg) (and all '(16))) - 'dired-nondirectory-p))) + (dgmf-arg (dired-get-marked-files nil + (if (and arg (atom arg)) (abs arg) (and all '(16))) + 'dired-nondirectory-p + nil + interactivep))) (dolist (file dgmf-arg) (let ((buffer (get-file-buffer file))) (when (and buffer (with-current-buffer buffer buffer-read-only)) @@ -7707,20 +7786,21 @@ Non-interactively: current-prefix-arg nil)) (let ((dired-marker-char (if unflag-p ?\ dired-marker-char))) - (dired-mark-if (and (diredp-looking-at-p " ") ; Not already marked - (let ((fn (dired-get-filename localp 'NO-ERROR))) ; Uninteresting - (and fn (diredp-string-match-p regexp fn)))) - msg)))) + (diredp-mark-if (and (diredp-looking-at-p " ") ; Not already marked + (let ((fn (dired-get-filename localp 'NO-ERROR))) ; Uninteresting + (and fn (diredp-string-match-p regexp fn)))) + msg)))) ;; REPLACE ORIGINAL in `dired-x.el'. ;; ;; 1. Call `dired-get-marked-files' with original ARG, to get its multi-`C-u' behavior. -;; ;; 2. Doc string updated to reflect change to `dired-simultaneous-find-file'. +;; 3. Added optional arg INTERACTIVEP. +;; 4. Do not raise error if no files when not INTERACTIVEP. ;; ;;;###autoload -(defun dired-do-find-marked-files (&optional arg) ; Bound to `F' +(defun dired-do-find-marked-files (&optional arg interactivep) ; Bound to `F' "Find marked files, displaying all of them simultaneously. With no prefix argument: @@ -7751,10 +7831,13 @@ than it does with other `dired-do-*' commands: it does NOT act on the next or previous (abs ARG) files, ignoring markings. To keep the Dired buffer displayed, split the window (e.g., `C-x 2') -first. To show only the marked files, type `\\[delete-other-windows]' first." - (interactive "P") - (dired-simultaneous-find-file (dired-get-marked-files nil (and (consp arg) arg)) - (and arg (prefix-numeric-value arg)))) +first. To show only the marked files, type `\\[delete-other-windows]' first. + +When invoked interactively, raise an error if no files are marked." + (interactive "P\np") + (dired-simultaneous-find-file + (dired-get-marked-files nil (and (consp arg) arg) nil nil interactivep) + (and arg (prefix-numeric-value arg)))) ;; REPLACE ORIGINAL in `dired-x.el'. @@ -8608,9 +8691,9 @@ The form of a file name used for matching: Note that the default matching behavior of this command is different for Dired+ than it is for vanilla Emacs. Using a positive prefix arg -or a double plain prefix arg (`C-u C-u' gives you the same behavior as -vanilla Emacs (marking or unmarking, respectively): matching against -names that are relative to the `default-directory'. +or a double plain prefix arg (`C-u C-u') gives you the same behavior +as vanilla Emacs (marking or unmarking, respectively): matching +against names that are relative to the `default-directory'. What Dired+ offers in addition is the possibility to match against names that are relative (have no directory part - no prefix arg or @@ -8633,20 +8716,121 @@ Non-interactively: (C-u-C-u (and (consp raw) (= 16 (car raw)))) (num (and raw (prefix-numeric-value raw)))) (list (diredp-read-regexp (concat (if (or (consp raw) (and num (zerop num))) - "UNmark" - "Mark") - " files (regexp): ")) + "UNmark" + "Mark") + " files (regexp): ")) (and raw (or C-u C-u-C-u (zerop num)) ?\040) (cond ((or (not raw) C-u) t) ; none, `C-u' ((> num 0) nil) ; `M-+', `C-u C-u' (t 'no-dir))))) ; `M--', `M-0' (add-to-list 'regexp-search-ring regexp) ; Add REGEXP to `regexp-search-ring'. (let ((dired-marker-char (or marker-char dired-marker-char))) - (dired-mark-if (and (not (diredp-looking-at-p dired-re-dot)) - (not (eolp)) ; Empty line - (let ((fn (dired-get-filename localp t))) - (and fn (diredp-string-match-p regexp fn)))) - "matching file"))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) + (not (eolp)) ; Empty line + (let ((fn (dired-get-filename localp t))) + (and fn (diredp-string-match-p regexp fn)))) + "file"))) + + +;; REPLACE ORIGINAL in `dired.el': +;; +;; Use `diredp-mark-if', not `dired-mark-if'. +;; +;;;###autoload +(defun dired-mark-files-containing-regexp (regexp &optional marker-char) + "Mark files with contents containing a REGEXP match. +A prefix argument means unmark them instead. +`.' and `..' are never marked. + +If a file is visited in a buffer and `dired-always-read-filesystem' is +nil, this looks in the buffer without revisiting the file, so the +results might be inconsistent with the file on disk if its contents +have changed since it was last visited." + (interactive + (list (diredp-read-regexp (concat (if current-prefix-arg "Unmark" "Mark") " files containing (regexp): ") + nil 'dired-regexp-history) + (and current-prefix-arg ?\040))) + (let ((dired-marker-char (or marker-char dired-marker-char))) + (diredp-mark-if (and (not (diredp-looking-at-p dired-re-dot)) + (not (eolp)) + (let ((fname (dired-get-filename nil t))) + (when (and fname (file-readable-p fname) (not (file-directory-p fname))) + (let ((prebuf (get-file-buffer fname))) + (message "Checking %s" fname) + ;; For now, do it inside Emacs. Grep might be better if there are lots of files. + (if (and prebuf (or (not (boundp 'dired-always-read-filesystem)) + (not dired-always-read-filesystem))) ; Emacs 26+ + (with-current-buffer prebuf + (save-excursion (goto-char (point-min)) (re-search-forward regexp nil t))) + (with-temp-buffer + (insert-file-contents fname) + (goto-char (point-min)) + (re-search-forward regexp nil t))))))) + "file"))) + + +;; REPLACE ORIGINAL in `dired.el': +;; +;; Use `diredp-mark-if', not `dired-mark-if'. +;; +;;;###autoload +(defun dired-mark-symlinks (unflag-p) + "Mark all symbolic links. +With prefix argument, unmark or unflag all those files." + (interactive "P") + (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char))) + (diredp-mark-if (diredp-looking-at-p dired-re-sym) "symbolic link"))) + + +;; REPLACE ORIGINAL in `dired.el': +;; +;; Use `diredp-mark-if', not `dired-mark-if'. +;; +;;;###autoload +(defun dired-mark-directories (unflag-p) + "Mark all directory file lines except `.' and `..'. +With prefix argument, unmark or unflag the files instead." + (interactive "P") + (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char))) + (diredp-mark-if (and (diredp-looking-at-p dired-re-dir) (not (diredp-looking-at-p dired-re-dot))) + "directory" "directories"))) + + +;; REPLACE ORIGINAL in `dired.el': +;; +;; Use `diredp-mark-if', not `dired-mark-if'. +;; +;;;###autoload +(defun dired-mark-executables (unflag-p) + "Mark all executable files. +With prefix argument, unmark or unflag the files instead." + (interactive "P") + (let ((dired-marker-char (if unflag-p ?\040 dired-marker-char))) + (diredp-mark-if (diredp-looking-at-p dired-re-exe) "executable file"))) + + +;; REPLACE ORIGINAL in `dired.el': +;; +;; Use `diredp-mark-if', not `dired-mark-if'. +;; +;;;###autoload +(defun dired-flag-auto-save-files (&optional unflag-p) + "Flag for deletion files whose names suggest they are auto save files. +A prefix argument says to unmark or unflag the files instead." + (interactive "P") + (let ((dired-marker-char (if unflag-p ?\040 dired-del-marker))) + (diredp-mark-if + ;; It is less than general to check for # here, but it's the only way this runs fast enough. + (and (save-excursion (end-of-line) + (or (eq (preceding-char) ?#) + ;; Handle executables in case of -F option. Need not worry about the other kinds + ;; of markings that -F makes, since they won't appear on real auto-save files. + (and (eq (preceding-char) ?*) + (progn (forward-char -1) (eq (preceding-char) ?#))))) + (not (diredp-looking-at-p dired-re-dir)) + (let ((fname (dired-get-filename t t))) + (and fname (auto-save-file-name-p (file-name-nondirectory fname))))) + "auto-save file"))) ;;;###autoload (defun diredp-capitalize (&optional arg) ; Bound to `% c' @@ -8969,13 +9153,13 @@ You need library `bookmark+.el' for this command." ;;;###autoload (defalias 'diredp-show-metadata-for-marked 'diredp-describe-marked-autofiles) ;;;###autoload -(defun diredp-describe-marked-autofiles (&optional internal-form-p) +(defun diredp-describe-marked-autofiles (&optional internal-form-p interactivep) "Show metadata for the marked files. If no file is marked, describe ALL autofiles in this directory. With a prefix argument, show the internal (Lisp) form of the metadata. - +When invoked interactively, raise an error if no files are marked. You need library `bookmark+.el' for this command." - (interactive "P") + (interactive "P\np") (diredp-ensure-bookmark+) (let ((help-xref-following nil)) (help-setup-xref (list `(lambda (_buf) @@ -8986,7 +9170,7 @@ You need library `bookmark+.el' for this command." (called-interactively-p 'interactive) (interactive-p)))) (diredp-with-help-window "*Help*" - (let ((marked (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED))) + (let ((marked (dired-get-marked-files nil nil nil 'DISTINGUISH-ONE-MARKED interactivep))) (unless (cdr marked) (message "Describing ALL autofiles here (none are marked)...") (setq marked (diredp-get-files 'IGNORE-MARKS-P))) @@ -9077,7 +9261,6 @@ present for some values of `ls-lisp-emulation'. This function operates only on the Dired buffer content. It does not refer at all to the underlying file system. Contrast this with `find-dired', which might be preferable for the task at hand." - ;; Using `sym' = "", instead of nil, for non-linked files avoids the trap of ;; (string-match "foo" sym) into which a user would soon fall. ;; Use `equal' instead of `=' in the example, as it works on integers and strings. @@ -9087,7 +9270,7 @@ refer at all to the underlying file system. Contrast this with (inode nil) (blks ()) mode nlink uid gid size time name sym) - (dired-mark-if + (diredp-mark-if (save-excursion (and ;; Sets vars INODE BLKS MODE NLINK UID GID SIZE TIME NAME and SYM @@ -9210,8 +9393,7 @@ With non-nil prefix arg, unmark them instead." (setq beg (save-excursion (goto-char beg) (line-beginning-position)) end (save-excursion (goto-char end) (line-end-position))) (let ((dired-marker-char (if unmark-p ?\040 dired-marker-char))) - (dired-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-unmarked-p)) - "region file")))) + (diredp-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-unmarked-p)) "region file")))) ;;;###autoload (defun diredp-unmark-region-files (&optional mark-p) ; Not bound @@ -9224,8 +9406,7 @@ With non-nil prefix arg, mark them instead." (setq beg (save-excursion (goto-char beg) (line-beginning-position)) end (save-excursion (goto-char end) (line-end-position))) (let ((dired-marker-char (if mark-p dired-marker-char ?\040))) - (dired-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-marked-p)) - "region file")))) + (diredp-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-marked-p)) "region file")))) ;;;###autoload (defun diredp-flag-region-files-for-deletion () ; Not bound @@ -9237,8 +9418,8 @@ With non-nil prefix arg, mark them instead." (setq beg (save-excursion (goto-char beg) (line-beginning-position)) end (save-excursion (goto-char end) (line-end-position))) (let ((dired-marker-char dired-del-marker)) - (dired-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-unmarked-p ?\D)) - "region file")))) + (diredp-mark-if (and (<= (point) end) (>= (point) beg) (diredp-this-file-unmarked-p ?\D)) + "region file")))) ;;;###autoload (defun diredp-toggle-marks-in-region (start end) ; Not bound @@ -9720,13 +9901,11 @@ output files usually are created there instead of in a subdir." ;;actual work and can be redefined for customization. (interactive "e") (lexical-let ((mouse-pos (event-start event)) - (command (dired-read-shell-command "! on %s: " nil - (dired-get-marked-files t nil)))) + (command (dired-read-shell-command "! on %s: " nil (dired-get-marked-files t nil)))) (select-window (posn-window mouse-pos)) (goto-char (posn-point mouse-pos)) (dired-bunch-files (- 10000 (length command)) - #'(lambda (&rest files) - (dired-run-shell-command (dired-shell-stuff-it command files t 1))) + (lambda (&rest files) (dired-run-shell-command (dired-shell-stuff-it command files t 1))) nil (dired-get-marked-files t 1)))) diff --git a/vendor/rubocopfmt.el b/vendor/rubocopfmt.el index 37ac1f2..58445ae 100644 --- a/vendor/rubocopfmt.el +++ b/vendor/rubocopfmt.el @@ -1,75 +1,89 @@ -;;; rubocopfmt.el --- Format ruby code with rubocopfmt. - -;; Copyright (C) 2017 Jim Myhrberg +;;; rubocopfmt.el --- Minor-mode to format Ruby code with RuboCop on save +;; Version: 0.2.2 +;; Keywords: convenience wp edit ruby rubocop +;; Package-Requires: ((cl-lib "0.5")) +;; URL: https://github.com/jimeh/rubocopfmt.el ;; Author: Jim Myhrberg -;; Keywords: ruby rubocop rubocopfmt -;; URL: https://github.com/jimeh/rubocopfmt-emacs -;; Version: 0.1.0 ;; This file is not part of GNU Emacs. ;;; License: ;; -;; Permission is hereby granted, free of charge, to any person obtaining a -;; copy of this software and associated documentation files (the "Software"), -;; to deal in the Software without restriction, including without limitation -;; the rights to use, copy, modify, merge, publish, distribute, sublicense, -;; and/or sell copies of the Software, and to permit persons to whom the -;; Software is furnished to do so, subject to the following conditions: +;; Copyright (c) 2014 The go-mode Authors. All rights reserved. +;; Portions Copyright (c) 2018 Jim Myhrberg. ;; -;; The above copyright notice and this permission notice shall be included in -;; all copies or substantial portions of the Software. +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions are +;; met: ;; -;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -;; DEALINGS IN THE SOFTWARE. +;; * Redistributions of source code must retain the above copyright +;; notice, this list of conditions and the following disclaimer. +;; * Redistributions in binary form must reproduce the above +;; copyright notice, this list of conditions and the following disclaimer +;; in the documentation and/or other materials provided with the +;; distribution. +;; * Neither the name of the copyright holder nor the names of its +;; contributors may be used to endorse or promote products derived from +;; this software without specific prior written permission. +;; +;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; Commentary: ;; -;; The core parts of rubocopfmt.el are borrowed from the gofmt related parts of -;; go-mode.el 1.4.0. So most credit goes to The Go Authors. +;; This library formats Ruby code by using rubocop and it's --auto-correct +;; option. ;;; Code: +(require 'cl-lib) + (defgroup rubocopfmt nil - "Minor mode for formatting Ruby buffers with rubocopfmt." + "Minor mode for formatting Ruby buffers with rubocop." + :group 'languages :link '(url-link "https://github.com/jimeh/rubocopfmt.el")) -(defcustom rubocopfmt-command "rubocopfmt" - "The 'rubocopfmt' command." +(defcustom rubocopfmt-rubocop-command "rubocop" + "Name of rubocop executable." :type 'string :group 'rubocopfmt) -(defun rubocopfmt () - "Format the current buffer with rubocopfmt." - (interactive) - (let ((patchbuf (get-buffer-create "*Rubocopfmt patch*")) - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8) - (rubocopfmt-args - (list "--diff-format" "rcs" - "--interactive" - "--src-file" (file-truename buffer-file-name)))) +(defcustom rubocopfmt-disabled-cops + '("Lint/Debugger" ; Don't remove debugger calls. + "Lint/UnusedBlockArgument" ; Don't rename unused block arguments. + "Lint/UnusedMethodArgument" ; Don't rename unused method arguments. + "Style/EmptyMethod" ; Don't remove blank line in empty methods. + ) + "A list of RuboCop cops to disable during auto-correction. +These cops are disabled because they cause confusion during +interactive use within a text-editor." + :type '(repeat string) + :group 'rubocopfmt) + +(defcustom rubocopfmt-show-errors 'buffer + "Where to display rubocopfmt error output. +It can either be displayed in its own buffer, in the echo area, +or not at all. + +Please note that Emacs outputs to the echo area when writing +files and will overwrite rubocopfmt's echo output if used from +inside a `before-save-hook'." + :type '(choice + (const :tag "Own buffer" buffer) + (const :tag "Echo area" echo) + (const :tag "None" nil)) + :group 'rubocopfmt) - (unwind-protect - (save-restriction - (widen) - (with-current-buffer patchbuf (erase-buffer)) - (message "Calling rubocopfmt: %s %s" - rubocopfmt-command rubocopfmt-args) - (apply #'call-process-region (point-min) (point-max) - rubocopfmt-command nil patchbuf nil rubocopfmt-args) - (if (= (buffer-size patchbuf) 0) - (message "Buffer is already rubocopfmted") - (progn - (rubocopfmt--apply-rcs-patch patchbuf) - (message "Applied rubocopfmt"))))) - (kill-buffer patchbuf))) (defun rubocopfmt--apply-rcs-patch (patch-buffer) "Apply an RCS-formatted diff from PATCH-BUFFER to the current buffer." @@ -90,7 +104,7 @@ (goto-char (point-min)) (while (not (eobp)) (unless (looking-at "^\\([ad]\\)\\([0-9]+\\) \\([0-9]+\\)") - (error "invalid rcs patch or internal error in rubocopfmt--apply-rcs-patch")) + (error "Invalid rcs patch or internal error in rubocopfmt--apply-rcs-patch")) (forward-line) (let ((action (match-string 1)) (from (string-to-number (match-string 2))) @@ -111,7 +125,7 @@ (cl-incf line-offset len) (rubocopfmt--delete-whole-line len))) (t - (error "invalid rcs patch or internal error in rubocopfmt--apply-rcs-patch"))))))))) + (error "Invalid rcs patch or internal error in rubocopfmt--apply-rcs-patch"))))))))) (defun rubocopfmt--delete-whole-line (&optional arg) "Delete the current line without putting it in the `kill-ring'. @@ -140,9 +154,119 @@ function." (progn (forward-visible-line arg) (point)))))) (defun rubocopfmt--goto-line (line) + "Move cursor to LINE." (goto-char (point-min)) (forward-line (1- line))) +(defun rubocopfmt--bundled-path-p (directory) + "Check if there is a Gemfile in DIRECTORY, or any parent of DIRECTORY." + (rubocopfmt--file-search-upward directory "Gemfile")) + +(defun rubocopfmt--file-search-upward (directory file) + "Search DIRECTORY for FILE and return its full path if found, or NIL if not. + +If FILE is not found in DIRECTORY, the parent of DIRECTORY will be searched." + (let ((parent-dir (file-truename (concat (file-name-directory directory) "../"))) + (current-path (if (not (string= (substring directory (- (length directory) 1)) "/")) + (concat directory "/" file) + (concat directory file)))) + + (if (file-exists-p current-path) + current-path + (when (and (not (string= (file-truename directory) parent-dir)) + (< (length parent-dir) (length (file-truename directory)))) + (rubocopfmt--file-search-upward parent-dir file))))) + +(defun rubocopfmt--parse-result (resultbuf tmpfile) + "Parse Rubocop result in RESULTBUF and write corrections to TMPFILE." + (let ((split 0)) + (with-current-buffer resultbuf + (goto-char (point-min)) + ;; Only find the separator when RuboCop has printed complaints. + (setq split (search-forward "\n====================\n" nil t)) + + ;; If no RuboCop complaints were printed, we need to find the separator at + ;; the beginning of the buffer. This separation helps prevent false + ;; positive separator matches. + (unless split + (setq split (search-forward "====================\n" nil t))) + + (if split + (when (> split 22) + (goto-char (point-min)) + (when (search-forward "[Corrected]" split t) + (write-region split (point-max) tmpfile) + t)) + (rubocopfmt--process-errors resultbuf) + nil)))) + +(defun rubocopfmt--process-errors (resultbuf) + "Display contents of RESULTBUF as errors." + (if (eq rubocopfmt-show-errors 'echo) + (with-current-buffer resultbuf + (message (buffer-string)))) + + (if (eq rubocopfmt-show-errors 'buffer) + (let ((errbuf (get-buffer-create "*Rubocopfmt Errors*"))) + (with-current-buffer errbuf + (erase-buffer) + (goto-char (point-min)) + (insert-buffer-substring resultbuf)) + (display-buffer errbuf)))) + + +;;;###autoload +(defun rubocopfmt () + "Format the current buffer with rubocop." + (interactive) + (let* ((coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8) + (tmpfile (make-temp-file "rubocopfmt" nil ".rb")) + (resultbuf (get-buffer-create "*Rubocopfmt Result*")) + (patchbuf (get-buffer-create "*Rubocopfmt Patch*")) + (buffer-file (file-truename buffer-file-name)) + (src-dir (file-name-directory buffer-file)) + (src-file (file-name-nondirectory buffer-file)) + (fmt-command rubocopfmt-rubocop-command) + (fmt-args (list "--stdin" src-file + "--auto-correct" + "--format" "emacs"))) + + (if (rubocopfmt--bundled-path-p src-dir) + (setq fmt-command "bundle" + fmt-args (append (list "exec" rubocopfmt-rubocop-command) + fmt-args))) + + (if rubocopfmt-disabled-cops + (setq fmt-args (append fmt-args (list "--except" + (combine-and-quote-strings + rubocopfmt-disabled-cops ","))))) + + (unwind-protect + (save-restriction + (widen) + (write-region nil nil tmpfile) + (with-current-buffer resultbuf (erase-buffer)) + (with-current-buffer patchbuf (erase-buffer)) + + (let ((current-directory src-dir)) + (message "Calling rubocop from directory \"%s\": %s %s" + src-dir fmt-command (mapconcat 'identity fmt-args " ")) + (apply #'call-process-region (point-min) (point-max) + fmt-command nil resultbuf nil fmt-args) + (if (rubocopfmt--parse-result resultbuf tmpfile) + (call-process-region (point-min) (point-max) "diff" + nil patchbuf nil "-n" "-" tmpfile))) + + (if (= (buffer-size patchbuf) 0) + (message "Buffer is already rubocopfmted") + (rubocopfmt--apply-rcs-patch patchbuf) + (message "Applied rubocopfmt"))) + + (delete-file tmpfile) + (kill-buffer resultbuf) + (kill-buffer patchbuf)))) + ;;;###autoload (define-minor-mode rubocopfmt-mode "Enable format-on-save for `ruby-mode' buffers via rubocopfmt."