From b16f9bbd223f92b5a928a28d7bbf9b6dd925d9e3 Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Thu, 11 Jul 2019 23:20:16 +0300 Subject: [PATCH 1/4] Automatically run ctags command on save --- 08ctags.el | 41 ++++++++++++++++++++++++++++++----------- 20clang.el | 2 +- 20erlang.el | 7 +++++-- 20ruby.el | 8 ++++++-- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/08ctags.el b/08ctags.el index 8535c9a..3b7407a 100644 --- a/08ctags.el +++ b/08ctags.el @@ -1,9 +1,14 @@ ;; Do not mix ctags between folders +(provide 'my-ctags-config) + (setq tags-add-tables nil) +(setq ctags/refresh-command + (format "ctags -e -R -f %sTAGS %s." + default-directory default-directory)) ;; Sentinel function for capturing ctags -(defun ctags-process-callback (process event) - "Show status of asynchronous ctags-process after it finishes." +(defun ctags/process-callback (process event) + "Show status of asynchronous ctags/process after it finishes." (cond ((string-equal event "finished\n") (message "Creating tag files...completed") @@ -14,17 +19,31 @@ (pop-to-buffer (get-buffer "*ctags*")) ))) -(setq ctags-refresh-command - (format "ctags -e -R -f %sTAGS %s." - default-directory default-directory)) - -(defun refresh-ctags () +(cl-defun ctags/refresh-ctags (&key silent) "Refresh ctags according to currently set command." (interactive) - (message "Starting ctags process") - (start-process-shell-command "ctags" "*ctags*" ctags-refresh-command) - (set-process-sentinel (get-process "ctags") 'ctags-process-callback)) + ;; Print message if not silent + (when (not silent) (message "Starting ctags process...")) + + ;; Return if a version of the process is already running + (when (not (get-process "ctags")) + (start-process-shell-command "ctags" "*ctags*" ctags/refresh-command) + (set-process-sentinel (get-process "ctags") 'ctags/process-callback))) ;; Ctags bindings -(define-key prog-mode-map (kbd "C-c E") 'refresh-ctags) +(define-key prog-mode-map (kbd "C-c E") 'ctags/refresh-ctags) + +;; Automatically update tags on save, but be silent about it. +(setq ctags/major-modes-to-update-on-save '()) +(defun ctags/update-tags-on-save () + "Update tags if current major mode is part of the list." + (interactive) + (when (member major-mode ctags/major-modes-to-update-on-save) + (ctags/refresh-ctags :silent t))) + +(defun ctags/update-this-mode-on-save (mode) + "Update MODE on save." + (add-to-list (make-local-variable 'ctags/major-modes-to-update-on-save) mode)) + +(add-hook 'after-save-hook 'ctags/update-tags-on-save) diff --git a/20clang.el b/20clang.el index 9c0a972..2ab385f 100644 --- a/20clang.el +++ b/20clang.el @@ -7,7 +7,7 @@ '(company-etags company-yasnippet)) (setq-local - ctags-refresh-command + ctags/refresh-command (format "ctags -e -R --languages=C -f %sTAGS %s." (projectile-project-root) (projectile-project-root) diff --git a/20erlang.el b/20erlang.el index c8c2ac2..a5cb68e 100644 --- a/20erlang.el +++ b/20erlang.el @@ -27,7 +27,7 @@ ;; Set specific ctags command (setq-local - ctags-refresh-command + ctags/refresh-command (format "ctags -e -R --languages=erlang -f %sTAGS %s. %slib/stdlib-* %slib/kernel-*" (projectile-project-root) (projectile-project-root) @@ -44,4 +44,7 @@ (activate-erlang-mode) ;; Enable flycheck - (flycheck-select-checker 'erlang-otp)) + (flycheck-select-checker 'erlang-otp) + + ;; Automatically update tags on save + (ctags/update-this-mode-on-save 'erlang-mode)) diff --git a/20ruby.el b/20ruby.el index 1f2f402..7da8e77 100644 --- a/20ruby.el +++ b/20ruby.el @@ -26,10 +26,14 @@ (setq ruby-insert-encoding-magic-comment nil) ;; Company list override - (add-to-list (make-local-variable 'company-backends) '(company-etags company-yasnippet)) + (add-to-list (make-local-variable 'company-backends) + '(company-etags company-yasnippet)) + + ;; Automatically update tags on save + (ctags/update-this-mode-on-save 'enh-ruby-mode) ;; Set specific ctags command - (setq-local ctags-refresh-command + (setq-local ctags/refresh-command (format "ctags -e -R --languages=ruby -f %sTAGS %s. $(bundle list --paths)" (projectile-project-root) (projectile-project-root)))) From 42406821d9f31b8b4c93cd1a0dc745dbca20f56e Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Mon, 15 Jul 2019 11:31:00 +0300 Subject: [PATCH 2/4] Add macros file, load it on start --- 02macros.el | 6 ++++++ init.el | 1 + 2 files changed, 7 insertions(+) create mode 100644 02macros.el diff --git a/02macros.el b/02macros.el new file mode 100644 index 0000000..d5cd478 --- /dev/null +++ b/02macros.el @@ -0,0 +1,6 @@ +(defmacro -> (&rest body) + "Clojure -> macro for BODY." + (let ((result (pop body))) + (dolist (form body result) + (setq result (append (list (car form) result) + (cdr form)))))) diff --git a/init.el b/init.el index ce0898a..1443fad 100644 --- a/init.el +++ b/init.el @@ -104,6 +104,7 @@ ;; Additional files (load "~/.emacs.d/01mac.el") +(load "~/.emacs.d/02macros.el") (load "~/.emacs.d/02ivy.el") (load "~/.emacs.d/03hydra.el") (load "~/.emacs.d/04magit.el") From 239e8fc9df7cc00ef94b7d1061802ea302d67b08 Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Mon, 15 Jul 2019 11:31:23 +0300 Subject: [PATCH 3/4] Load erlang mode separately for each buffer --- 20erlang.el | 64 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/20erlang.el b/20erlang.el index a5cb68e..08f2015 100644 --- a/20erlang.el +++ b/20erlang.el @@ -1,15 +1,36 @@ -;; Add erlang installation to load path -(setq erlang-asdf-root "$HOME/.asdf/installs/erlang/21.3.8/") +(cl-defun erlang/emacs-path (erlang-version) + (car (split-string + (shell-command-to-string + (format "find $HOME/.asdf/installs/erlang/%s/ -name erlang.el" + erlang-version)) "erlang.el"))) -(setq load-path - (cons (format "%slib/tools-3.1/emacs" erlang-asdf-root) - load-path)) +(cl-defun erlang/erlang-path (erlang-version) + (format "$HOME/.asdf/installs/erlang/%s/" erlang-version)) -(require 'erlang-start) +(defun erlang/erlang-plist (erlang-version) + "Create property list for ERLANG-VERSION." + (list :version erlang-version + :erlang-path (erlang/erlang-path erlang-version) + :emacs-path (erlang/emacs-path erlang-version))) -(setq erlang-root-dir erlang-asdf-root) -(setq exec-path (cons (format "%sbin" erlang-asdf-root) exec-path)) -(setq erlang-man-root-dir (format "%sman" erlang-asdf-root)) +(cl-defun erlang/installed-erlangs () + (split-string + (shell-command-to-string + (format "asdf list erlang")))) + +(cl-defun erlang/available-versions--plist () + (mapcar 'erlang/erlang-plist (erlang/installed-erlangs))) + +(setq erlang/available-versions (erlang/available-versions--plist)) + +(cl-defun erlang/currently-in-use () + (car (split-string (shell-command-to-string "asdf current erlang")))) + +(cl-defun erlang/current-version--plistp (erlang-plist) + (equal (plist-get erlang-plist :version) (erlang/currently-in-use))) + +(cl-defun erlang/current-plist () + (seq-find 'erlang/current-version--plistp erlang/available-versions)) ;; Flycheck checker for Erlang (flycheck-define-checker erlang-otp @@ -22,8 +43,24 @@ (error line-start (file-name) ":" line ": " (message) line-end)) :modes (my-erlang-mode)) -(defun activate-erlang-mode () +(defun erlang/activate-erlang-mode () "All things for all Erlang, including header files." + (when (featurep 'erlang-start) (unload-feature 'erlang-start)) + + (setq erlang/current-erlang (erlang/current-plist)) + + (add-to-list (make-local-variable 'load-path) + (plist-get erlang/current-erlang :emacs-path)) + + (add-to-list (make-local-variable 'exec-path) + (format "%slib/tools-3.1/emacs" + (plist-get erlang/current-erlang :erlang-path))) + + (setq-local erlang-man-root-dir + (format "%sman" + (plist-get erlang/current-erlang :erlang-path))) + + (require 'erlang-start) ;; Set specific ctags command (setq-local @@ -31,13 +68,14 @@ (format "ctags -e -R --languages=erlang -f %sTAGS %s. %slib/stdlib-* %slib/kernel-*" (projectile-project-root) (projectile-project-root) - erlang-asdf-root erlang-asdf-root)) + (plist-get erlang/current-erlang :erlang-path) + (plist-get erlang/current-erlang :erlang-path))) ;; Company list override (add-to-list (make-local-variable 'company-backends) '(company-etags company-yasnippet))) -(add-hook 'erlang-mode-hook 'activate-erlang-mode) +(add-hook 'erlang-mode-hook 'erlang/activate-erlang-mode) (define-derived-mode my-erlang-mode erlang-mode "My Erlang mode" "A mode for Erlang things" @@ -46,5 +84,5 @@ ;; Enable flycheck (flycheck-select-checker 'erlang-otp) - ;; Automatically update tags on save + ;; Automatically update tags on save (ctags/update-this-mode-on-save 'erlang-mode)) From 389d95dd078bdd46029f38ab0b391ff7e793686f Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Mon, 15 Jul 2019 11:31:45 +0300 Subject: [PATCH 4/4] Do not update Ruby tags on save, it's painfully slow --- 20ruby.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/20ruby.el b/20ruby.el index 7da8e77..d31da66 100644 --- a/20ruby.el +++ b/20ruby.el @@ -29,9 +29,6 @@ (add-to-list (make-local-variable 'company-backends) '(company-etags company-yasnippet)) - ;; Automatically update tags on save - (ctags/update-this-mode-on-save 'enh-ruby-mode) - ;; Set specific ctags command (setq-local ctags/refresh-command (format "ctags -e -R --languages=ruby -f %sTAGS %s. $(bundle list --paths)"