diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el new file mode 100644 index 000000000..c783538dd --- /dev/null +++ b/modules/completion/company/autoload.el @@ -0,0 +1,38 @@ +;;; company.el + +;;;###autoload +(defun +company/complete () + "Bring up the completion popup. If only one result, complete it." + (interactive) + (require 'company) + (when (and (company-manual-begin) + (= company-candidates-length 1)) + (company-complete-common))) + +;;;###autoload +(defun +company/whole-lines (command &optional arg &rest ignored) + "`company-mode' completion backend that completes whole-lines, akin to vim's +C-x C-l." + (interactive (list 'interactive)) + (require 'company) + (unless (bound-and-true-p company-mode) (company-mode)) + (let ((lines (split-string + (replace-regexp-in-string + "^[\t\s]+" "" + (concat (buffer-substring-no-properties (point-min) (line-beginning-position)) + (buffer-substring-no-properties (line-end-position) (point-max)))) + "\\(\r\n\\|[\n\r]\\)" t))) + (cl-case command + (interactive (company-begin-backend '+company/whole-lines)) + (prefix (company-grab-line "^[\t\s]*\\(.+\\)" 1)) + (candidates (all-completions arg lines))))) + +;;;###autoload +(defun +company/dict-or-keywords () + "`company-mode' completion combining `company-dict' and `company-keywords'." + (interactive) + (require 'company-dict) + (require 'company-keywords) + (let ((company-backends '((company-keywords company-dict)))) + (call-interactively 'company-complete))) + diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el new file mode 100644 index 000000000..004deb281 --- /dev/null +++ b/modules/completion/company/config.el @@ -0,0 +1,99 @@ +;;; completion/company/config.el + +(@def-setting :company-backend (modes backends) + "Register company BACKENDS to MODES." + (let* ((modes (if (listp modes) modes (list modes))) + (backends (if (listp backends) backends (list backends))) + (def-name (intern (format "doom--init-company-%s" + (mapconcat 'identity (mapcar 'symbol-name modes) "-")))) + (quoted (eq (car-safe backends) 'quote))) + ;; TODO more type checks + `(progn + (defun ,def-name () + (require 'company) + (set (make-local-variable 'company-backends) + (append '((,@backends)) company-backends))) + (@add-hook ,modes ',def-name)))) + + +;; +;; Packages +;; + +(@def-package company + :commands (company-mode global-company-mode company-complete + company-complete-common company-manual-begin company-grab-line) + :config + (setq company-idle-delay nil + company-minimum-prefix-length 2 + company-tooltip-limit 10 + company-dabbrev-downcase nil + company-dabbrev-ignore-case nil + company-dabbrev-code-other-buffers t + company-tooltip-align-annotations t + company-require-match 'never + company-global-modes '(not eshell-mode comint-mode erc-mode message-mode help-mode) + company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) + company-backends '(company-capf) + company-quickhelp-delay nil + company-statistics-file (concat doom-cache-dir "/company-stats-cache.el")) + + (@set :company-backend 'python-mode '(company-anaconda)) + + (push 'company-sort-by-occurrence company-transformers) + + (@after yasnippet + (setq-default company-backends (append company-backends '(company-yasnippet)))) + + (@map (:map company-active-map + ;; Don't interfere with insert mode binding for `evil-delete-backward-word' + "C-w" nil + + "C-o" 'company-search-kill-others + "C-n" 'company-select-next + "C-p" 'company-select-previous + "C-h" 'company-quickhelp-manual-begin + "C-S-h" 'company-show-doc-buffer + "C-S-s" 'company-search-candidates + "C-s" 'company-filter-candidates + "C-SPC" 'company-complete-common + [tab] 'company-complete-common-or-cycle + [backtab] 'company-select-previous + [escape] (@λ (company-abort) (evil-normal-state 1)) + [C-return] 'counsel-company) + + ;; Automatically applies to `company-filter-map' + (:map company-search-map + "C-n" 'company-search-repeat-forward + "C-p" 'company-search-repeat-backward + "C-s" (@λ (company-search-abort) (company-filter-candidates)) + [escape] 'company-search-abort)) + + (global-company-mode +1) + + ;; Looks ugly on OSX without emacs-mac build + (require 'company-quickhelp) + (company-quickhelp-mode +1) + + (require 'company-statistics) + (company-statistics-mode +1)) + + +(@def-package company-dict + :commands company-dict) + + +;; +;; Autoloads +;; + +(autoload 'company-capf "company-capf") +(autoload 'company-yasnippet "company-yasnippet") +(autoload 'company-dabbrev "company-dabbrev") +(autoload 'company-dabbrev-code "company-dabbrev-code") +(autoload 'company-etags "company-etags") +(autoload 'company-elisp "company-elisp") +(autoload 'company-files "company-files") +(autoload 'company-gtags "company-gtags") +(autoload 'company-ispell "company-ispell") + diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el new file mode 100644 index 000000000..97dceb218 --- /dev/null +++ b/modules/completion/company/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; completion/company/packages.el + +(@package company) +(@package company-dict) +(@package company-quickhelp) +(@package company-statistics)