;;; funcs.el --- Elixir Layer functions File for Spacemacs ;; ;; Copyright (c) 2012-2018 Sylvain Benner & Contributors ;; ;; Author: Sylvain Benner ;; URL: https://github.com/syl20bnr/spacemacs ;; ;; This file is not part of GNU Emacs. ;; ;;; License: GPLv3 (defun spacemacs//elixir-setup-backend () "Conditionally setup elixir backend." (pcase elixir-backend (`alchemist (spacemacs//elixir-setup-alchemist)) (`lsp (spacemacs//elixir-setup-lsp)))) (defun spacemacs//elixir-setup-company () "Conditionally setup company based on backend." (if (eq elixir-backend `alchemist) (spacemacs//elixir-setup-alchemist-company) (spacemacs//elixir-setup-lsp-company))) (defun spacemacs//elixir-setup-dap () "Conditionally setup elixir DAP integration." ;; currently DAP is only available using LSP (pcase elixir-backend (`lsp (spacemacs//elixir-setup-lsp-dap)))) ;;alchemist (defun spacemacs//elixir-setup-alchemist () (alchemist-mode)) (defun spacemacs//elixir-setup-alchemist-company () (when (configuration-layer/package-used-p 'alchemist) (progn (spacemacs|add-company-backends :backends alchemist-company :modes elixir-mode alchemist-iex-mode) (company-mode)))) ;;lsp (defun spacemacs//elixir-setup-lsp () "Setup lsp backend." (if (configuration-layer/layer-used-p 'lsp) (progn (add-to-list 'exec-path elixir-ls-path) (lsp)) (message "`lsp' layer is not installed, please add `lsp' layer to your dotfile."))) (defun spacemacs//elixir-setup-lsp-company () "Setup lsp auto-completion." (if (configuration-layer/layer-used-p 'lsp) (progn (spacemacs|add-company-backends :backends company-lsp :modes elixir-mode :append-hooks nil :call-hooks t) (company-mode)) (message "`lsp' layer is not installed, please add `lsp' layer to your dotfile."))) (defun spacemacs//elixir-setup-lsp-dap () "Setup DAP integration." (require 'dap-elixir)) ;; others (defun spacemacs//elixir-default () "Default settings for elixir buffers" ;; highlight all breakpoints (spacemacs/elixir-annotate-pry) ;; make C-j work the same way as RET (local-set-key (kbd "C-j") 'newline-and-indent)) (defun spacemacs//elixir-looking-back-special-p (expr) (save-excursion (when (or (looking-back " ") (looking-back "-")) (backward-char)) (looking-back expr))) (defun spacemacs//elixir-point-after-fn-p (id action context) (save-excursion (when (looking-back id) (backward-char)) (looking-back "fn"))) (defun spacemacs//elixir-do-end-close-action (id action context) (when (eq action 'insert) (cond ((spacemacs//elixir-looking-back-special-p id) (insert " ") (backward-char)) ((looking-back "(") (insert ") ") (backward-char) (backward-char)) (t (newline-and-indent) (forward-line -1) (indent-according-to-mode))))) (defun spacemacs//elixir-enable-compilation-checking () "Enable compile checking if `elixir-enable-compilation-checking' is non nil." (when (or elixir-enable-compilation-checking) (flycheck-mix-setup) ;; enable credo only if there are no compilation errors (flycheck-add-next-checker 'elixir-mix '(warning . elixir-credo)))) (defun spacemacs/elixir-annotate-pry () "Highlight breakpoint lines." (interactive) (highlight-lines-matching-regexp "require IEx; IEx.pry")) (defun spacemacs/elixir-toggle-breakpoint () "Add a breakpoint line or clear it if line is already a breakpoint." (interactive) (let ((trace "require IEx; IEx.pry") (line (thing-at-point 'line))) (if (and line (string-match trace line)) (kill-whole-line) (progn (back-to-indentation) (insert trace) (newline-and-indent)))))