From d3c2c17ff906f4510d3389022f9aa6bb263121aa Mon Sep 17 00:00:00 2001 From: Maciej Szlosarczyk Date: Mon, 8 Apr 2019 11:23:36 +0300 Subject: [PATCH] Improve ctags and company configuration Set ctags command based on major mode Set different company backends based on major mode Completely abandon robe in favour of ctags for Ruby Set up Erlang configuration --- .gitignore | 1 + 06company-yasnippet.el | 66 ++++++++++-------------------------------- 08ctags.el | 30 +++++++++++++++++++ 20elisp.el | 5 ++++ 20elixir.el | 15 ++++++++-- 20erlang.el | 44 ++++++++++++++++++++++++++++ 20ruby.el | 14 +++++++-- 20rust.el | 7 ++++- 20web.el | 14 +++++++++ init.el | 2 ++ 10 files changed, 141 insertions(+), 57 deletions(-) create mode 100644 08ctags.el create mode 100644 20erlang.el diff --git a/.gitignore b/.gitignore index 85fea45..5c73e78 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ recentf TAGS eshell/history tramp +url/* diff --git a/06company-yasnippet.el b/06company-yasnippet.el index 31e3795..3dc5faa 100644 --- a/06company-yasnippet.el +++ b/06company-yasnippet.el @@ -23,62 +23,26 @@ (global-company-mode 1) (yas-global-mode 1) -(setq-default company-backends '(company-tern ;; Javascript - (company-yasnippet ;; Snippets for all programming languages - company-etags) ;; Ctags for any language - company-elisp ; Emacs Lisp - company-clang company-cmake ;; C - company-lsp ;; Language server protocol - company-ansible ;; Ansible - alchemist-company ;; Elixir - company-racer ;; Rust - company-web-html ;; HTML - (company-dabbrev-code company-dabbrev company-abbrev) ;; abbrev - company-capf ;; Backend for default complete-at-point function - company-keywords ;; Keywords for all languages - company-files ; files & directory - )) +;; Absolute defaults for company mode +(setq-default company-backends + '((company-files ; files & directory + company-keywords ; keywords + company-capf + ) + (company-dabbrev company-abbrev) + )) -(setq-default company-lsp-cache-candidates 1 ;; Cache LSP results - company-lsp-async 1 ;; Fetch LSP results asynchronously +(setq-default + company-lsp-cache-candidates 1 ;; Cache LSP results + company-lsp-async 1 ;; Fetch LSP results asynchronously ) ;;; Yasnippet configuration (define-key prog-mode-map (kbd "C-c y") 'company-yasnippet) -(define-key prog-mode-map (kbd "") 'company-yasnippet) +(define-key prog-mode-map (kbd "") 'company-indent-or-complete-common) +(define-key prog-mode-map (kbd "TAB") 'company-yasnippet) (define-key text-mode-map (kbd "C-c y") 'company-yasnippet) -(define-key text-mode-map (kbd "") 'company-yasnippet) - -;; Sentinel function for capturing ctags -(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") - (kill-buffer (get-buffer "*ctags*")) - (visit-tags-table (format "%sTAGS" (projectile-project-root)))) - (t - (message "Creating tags file...failed") - (pop-to-buffer (get-buffer "*ctags*")) - ))) - -;; (setq ctags-commands -;; '(("emacs-lisp-mode" . "Some string")) -;; ("enh-ruby-mode" . "Some other string") -;; ) - -;; (defun buffer-mode-as-string (&optional-buffer) -;; "Get current mode from &OPTIONAL-BUFFER or current buffer." -;; (when option) - -;; (message "%s" -;; (cdr -;; (assoc -;; (format "%s" (buffer-local-value 'major-mode -;; (current-buffer))) ctags-commands))) - -;; (message (format "%s" (buffer-local-value 'major-mode (current-buffer)))) - -;; (message ()) +(define-key text-mode-map (kbd "") 'company-indent-or-complete-common) +(define-key text-mode-map (kbd "TAB") 'company-indent-or-complete-common) diff --git a/08ctags.el b/08ctags.el new file mode 100644 index 0000000..fc9155e --- /dev/null +++ b/08ctags.el @@ -0,0 +1,30 @@ +;; Do not mix ctags between folders +(setq tags-add-tables nil) + +;; Sentinel function for capturing ctags +(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") + (kill-buffer (get-buffer "*ctags*")) + (visit-tags-table (format "%sTAGS" (projectile-project-root)))) + (t + (message "Creating tags file...failed") + (pop-to-buffer (get-buffer "*ctags*")) + ))) + +(setq ctags-refresh-command + (format "ctags -e -R -f %sTAGS %s." + (projectile-project-root) (projectile-project-root))) + +(defun refresh-ctags () + "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)) + +;; Ctags bindings +(define-key prog-mode-map (kbd "C-c E") 'refresh-ctags) diff --git a/20elisp.el b/20elisp.el index 30ff3d4..52148a9 100644 --- a/20elisp.el +++ b/20elisp.el @@ -1,6 +1,11 @@ (defun activate-emacs-lisp-mode () "Goodies for editing emacs files." (set-indent 2) ;; Default indentation of 2 characters + (column-enforce-n 80) + + ;; Company list override + (add-to-list (make-local-variable 'company-backends) + '(company-elisp company-yasnippet)) ) (add-hook 'emacs-lisp-mode-hook 'activate-emacs-lisp-mode) diff --git a/20elixir.el b/20elixir.el index 5c4ee70..3b880ec 100644 --- a/20elixir.el +++ b/20elixir.el @@ -1,2 +1,13 @@ -(add-hook 'elixir-mode 'alchemist-mode) -(add-hook 'elixir-mode 'ruby-end-mode) +(add-hook 'elixir-mode-hook 'alchemist-mode) +(add-hook 'elixir-mode-hook 'ruby-end-mode) + +(defun activate-elixir-mode () + "All things Elixir." + (set-indent 2) + (column-enforce-n 80) + + ;; Company list override + (add-to-list (make-local-variable 'company-backends) + '(alchemist-company company-yasnippet))) + +(add-hook 'alchemist-mode-hook 'activate-elixir-mode) diff --git a/20erlang.el b/20erlang.el new file mode 100644 index 0000000..01c99fa --- /dev/null +++ b/20erlang.el @@ -0,0 +1,44 @@ +;; Add erlang installation to load path +(setq erlang-asdf-root "/Users/maciej/.asdf/installs/erlang/21.2.6/") + +(setq load-path + (cons (format "%slib/tools-3.0.2/emacs" erlang-asdf-root) + load-path)) + +(require 'erlang-start) + +(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)) + +;; Flycheck checker for Erlang +(flycheck-define-checker erlang-otp + "An Erlang syntax checker using the Erlang interpreter." + :command ("erlc" "-o" temporary-directory "-Wall" + "-I" "../include" "-I" "../../include" + "-I" "../../../include" source) + :error-patterns + ((warning line-start (file-name) ":" line ": Warning:" (message) line-end) + (error line-start (file-name) ":" line ": " (message) line-end)) + :modes (erlang-mode)) + +(defun activate-erlang-mode () + "All things for Erlang." + (flycheck-select-checker 'erlang-otp) + + ;; Set specific ctags command + (setq-local + ctags-refresh-command + (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) + + (add-to-list (make-local-variable 'company-backends) + '(company-etags company-yasnippet)) + ) + + ;; Company list override + (add-to-list (make-local-variable 'company-backends) 'company-etags)) + +(add-hook 'erlang-mode-hook 'activate-erlang-mode) diff --git a/20ruby.el b/20ruby.el index d138ba7..514529b 100644 --- a/20ruby.el +++ b/20ruby.el @@ -8,8 +8,8 @@ (message "Starting ctags process") (start-process-shell-command "ctags" "*ctags*" - (format "ctags -e -R --languages=ruby -f %sTAGS %s. $(bundle list --paths)" - (projectile-project-root) (projectile-project-root))) + (format "ctags -e -R --languages=ruby -f %sTAGS %s. $(bundle list --paths)" + (projectile-project-root) (projectile-project-root))) (set-process-sentinel (get-process "ctags") 'ctags-process-callback)) ;; Ruby specific key bindings @@ -33,7 +33,15 @@ (column-enforce-n 80)) ;; Do not insert magic encoding comment at the begining of each file - (setq ruby-insert-encoding-magic-comment nil)) + (setq ruby-insert-encoding-magic-comment nil) + + ;; Company list override + (add-to-list (make-local-variable 'company-backends) '(company-etags company-yasnippet)) + + ;; Set specific ctags command + (setq-local ctags-refresh-command + (format "ctags -e -R --languages=ruby -f %sTAGS %s. $(bundle list --paths)" + (projectile-project-root) (projectile-project-root)))) (add-hook 'enh-ruby-mode-hook 'activate-ruby-mode) diff --git a/20rust.el b/20rust.el index f562cd3..b627b73 100644 --- a/20rust.el +++ b/20rust.el @@ -2,7 +2,12 @@ "All things for Rust mode" (interactive) (set-indent 4) - (column-enforce-n 99)) + (column-enforce-n 99) + + ;; Company list override + (add-to-list (make-local-variable 'company-backends) + '(company-capf company-yasnippet)) + ) (add-hook 'rust-mode-hook 'activate-rust-mode) (add-hook 'rust-mode-hook 'racer-mode) diff --git a/20web.el b/20web.el index c68540a..0ab43fe 100644 --- a/20web.el +++ b/20web.el @@ -4,3 +4,17 @@ ;; Tern is used for completion (add-hook 'js2-mode-hook 'tern-mode) + +(defun activate-js2-mode () + ;; Company list override + (add-to-list (make-local-variable 'company-backends) + '(company-tern company-yasnippet))) + +(add-hook 'js2-mode-hook 'activate-js2-mode) + +(defun activate-web-mode () + ;; Company list override + (add-to-list (make-local-variable 'company-backends) + '(company-web-html company-yasnippet))) + +(add-hook 'web-mode-hook 'activate-web-mode) diff --git a/init.el b/init.el index 8f4b580..e844ad6 100644 --- a/init.el +++ b/init.el @@ -106,6 +106,7 @@ (load "~/.emacs.d/06company-yasnippet.el") (load "~/.emacs.d/07projectile.el") (load "~/.emacs.d/08purpose.el") +(load "~/.emacs.d/08ctags.el") (load "~/.emacs.d/09ispell.el") (load "~/.emacs.d/10themes.el") @@ -114,6 +115,7 @@ (load "~/.emacs.d/20ruby.el") (load "~/.emacs.d/20web.el") (load "~/.emacs.d/20elixir.el") +(load "~/.emacs.d/20erlang.el") (load "~/.emacs.d/20sh.el") (load "~/.emacs.d/20rust.el")