diff --git a/core/core-company.el b/core/core-company.el index ea785c5f8..0bbda662b 100644 --- a/core/core-company.el +++ b/core/core-company.el @@ -23,19 +23,24 @@ company-frontends '(company-pseudo-tooltip-unless-just-one-frontend company-echo-metadata-frontend company-preview-if-just-one-frontend) + company-backends '((company-capf + company-yasnippet + company-dabbrev-code + company-files + company-keywords) + company-dabbrev) company-dict-dir (concat narf-private-dir "dict/")) :config - ;; (use-package company-dict :defer t) - ;; (setq-default company-backends (append '(company-dict company-keywords) company-backends)) - + (add-to-list 'company-transformers 'company-sort-by-occurrence) (setq-default company-backends (append '(company-keywords) company-backends)) - ;; TODO: Investigate yasnippet (after! yasnippet (setq-default company-backends (append '(company-capf company-yasnippet) company-backends))) - (add-to-list 'company-transformers 'company-sort-by-occurrence) - (add-company-backend! nxml-mode (nxml yasnippet)) - (add-company-backend! emacs-lisp-mode (elisp yasnippet)) + (define-company-backend! nxml-mode (nxml yasnippet)) + (define-company-backend! emacs-lisp-mode (elisp yasnippet)) + + ;; (use-package company-dict :defer t) + ;; (setq-default company-backends (append '(company-dict company-keywords) company-backends)) ;; Rewrite evil-complete to use company-dabbrev (setq company-dabbrev-code-other-buffers t @@ -51,6 +56,5 @@ (global-company-mode +1)) - (provide 'core-company) ;;; core-company.el ends here diff --git a/core/lib/defuns-company.el b/core/lib/defuns-company.el index e4a5d5851..cbdef7914 100644 --- a/core/lib/defuns-company.el +++ b/core/lib/defuns-company.el @@ -14,5 +14,18 @@ (company-complete) (call-interactively 'company-select-previous)))) +;;;###autoload +(defun narf/company-complete-common-or-complete-full () + (interactive) + (when (company-manual-begin) + (if (eq last-command #'company-complete-common-or-cycle) + (let ((company-selection-wrap-around t)) + (call-interactively #'company-complete-selection)) + (let ((buffer-mod-tick (buffer-chars-modified-tick))) + (call-interactively #'company-complete-common) + (when (= buffer-mod-tick (buffer-chars-modified-tick)) + (call-interactively #'company-complete-selection) + (call-interactively #'company-complete)))))) + (provide 'defuns-company) ;;; defuns-company.el ends here diff --git a/core/lib/macros-company.el b/core/lib/macros-company.el index 2f202582f..746886a70 100644 --- a/core/lib/macros-company.el +++ b/core/lib/macros-company.el @@ -2,7 +2,7 @@ ;; for ../core-company.el ;;;###autoload -(defmacro add-company-backend! (hook backends) +(defmacro define-company-backend! (hook backends) "Register a company backend for a mode." (let ((def-name (intern (format "narf--init-company-%s" hook))) (quoted (eq (car-safe backends) 'quote))) diff --git a/modules/module-cc.el b/modules/module-cc.el index 489c2a00c..69ba928c9 100644 --- a/modules/module-cc.el +++ b/modules/module-cc.el @@ -5,7 +5,7 @@ :config (after! company (require 'company-cmake) - (add-company-backend! cmake-mode (cmake yasnippet)))) + (define-company-backend! cmake-mode (cmake yasnippet)))) (use-package glsl-mode :mode ("\\.glsl\\'" "\\.vert\\'" "\\.frag\\'" "\\.geom\\'")) @@ -36,9 +36,9 @@ (after! company ;; TODO Clang is *really* slow in larger projects, maybe replace it with ;; irony-mode or ycmd? - (add-company-backend! c-mode (c-headers clang)) - (add-company-backend! c++-mode (c-headers clang)) - (add-company-backend! objc-mode (c-headers xcode))) + (define-company-backend! c-mode (c-headers clang)) + (define-company-backend! c++-mode (c-headers clang)) + (define-company-backend! objc-mode (c-headers xcode))) (add-hook! c++-mode 'narf|init-c++-C11-highlights) (add-hook! c++-mode (setq flycheck-clang-language-standard "c++11" diff --git a/modules/module-csharp.el b/modules/module-csharp.el index e1355718d..137f980ef 100644 --- a/modules/module-csharp.el +++ b/modules/module-csharp.el @@ -26,7 +26,7 @@ :n "ta" (λ (omnisharp-unit-test "all")))) (after! company - (add-company-backend! csharp-mode (omnisharp)) + (define-company-backend! csharp-mode (omnisharp)) (add-hook! csharp-mode 'turn-on-eldoc-mode)) (mapc (lambda (x) diff --git a/modules/module-go.el b/modules/module-go.el index 751c5804d..950e32da2 100644 --- a/modules/module-go.el +++ b/modules/module-go.el @@ -34,7 +34,7 @@ (use-package company-go :config - (add-company-backend! go-mode (go yasnippet)))) + (define-company-backend! go-mode (go yasnippet)))) (provide 'module-go) ;;; module-go.el ends here diff --git a/modules/module-js.el b/modules/module-js.el index 59a8dd5d3..6817ede18 100644 --- a/modules/module-js.el +++ b/modules/module-js.el @@ -76,7 +76,7 @@ :config (after! company (require 'company-tern) - (add-company-backend! js2-mode (tern)))) + (define-company-backend! js2-mode (tern)))) (use-package unityjs-mode :mode "/Assets/.*\\.js$" diff --git a/modules/module-php.el b/modules/module-php.el index 935bdac77..33373f6fe 100644 --- a/modules/module-php.el +++ b/modules/module-php.el @@ -8,7 +8,7 @@ php-extras-eldoc-functions-file (concat narf-temp-dir "php-extras-eldoc-functions")) :config (require 'php-extras) - (add-company-backend! php-mode '(php-extras-company)) + (define-company-backend! php-mode '(php-extras-company)) ;; TODO Tie into emr (require 'php-refactor-mode) diff --git a/modules/module-python.el b/modules/module-python.el index 5070b237e..310ebff12 100644 --- a/modules/module-python.el +++ b/modules/module-python.el @@ -41,7 +41,7 @@ (after! company (require 'company-anaconda) - (add-company-backend! python-mode (anaconda))) + (define-company-backend! python-mode (anaconda))) (after! emr (mapc (lambda (x) diff --git a/modules/module-ruby.el b/modules/module-ruby.el index c2700eb5c..8a52aaf45 100644 --- a/modules/module-ruby.el +++ b/modules/module-ruby.el @@ -61,7 +61,7 @@ (evil-set-initial-state 'inf-ruby-mode 'insert) (after! company (require 'company-inf-ruby) - (add-company-backend! inf-ruby-mode (inf-ruby)))) + (define-company-backend! inf-ruby-mode (inf-ruby)))) (use-package robe :commands (robe-mode robe-start ruby-load-file) @@ -71,7 +71,7 @@ :config (after! company (require 'company-robe) - (add-company-backend! ruby-mode (robe)))) + (define-company-backend! ruby-mode (robe)))) (use-package ruby-refactor :after emr diff --git a/modules/module-rust.el b/modules/module-rust.el index 1eaf8da76..65efe62f4 100644 --- a/modules/module-rust.el +++ b/modules/module-rust.el @@ -17,13 +17,14 @@ :config (add-hook! rust-mode 'flycheck-mode)) (use-package racer + :if (! (file-exists-p "/usr/local/bin/racer")) :config - (bind! :m "gd" 'racer-find-definition) (setq racer-cmd "/usr/local/bin/racer" racer-rust-src-path "~/Dropbox/lib/rust/src/") + (bind! :m "gd" 'racer-find-definition) (add-hook! rust-mode '(racer-mode eldoc-mode flycheck-rust-setup)) - (add-company-backend! rust-mode (racer)))) + (define-company-backend! rust-mode (racer)))) (provide 'module-rust) ;;; module-rust.el ends here diff --git a/modules/module-swift.el b/modules/module-swift.el index 47d5fe24d..136f4a7b7 100644 --- a/modules/module-swift.el +++ b/modules/module-swift.el @@ -4,7 +4,7 @@ :mode "\\.swift$" :config (after! flycheck (add-to-list 'flycheck-checkers 'swift)) - (after! company (add-company-backend! swift-mode (xcode)))) + (after! company (define-company-backend! swift-mode (xcode)))) ;; TODO Set up emacs task runners for fruitstrap diff --git a/modules/module-web.el b/modules/module-web.el index 7f8c0ab38..0ac83c748 100644 --- a/modules/module-web.el +++ b/modules/module-web.el @@ -5,7 +5,7 @@ (use-package sass-mode :mode "\\.sass$" :config - (after! company (add-company-backend! sass-mode (css)))) + (after! company (define-company-backend! sass-mode (css)))) (use-package scss-mode :mode "\\.scss$" @@ -29,7 +29,7 @@ :modes 'scss-mode :predicate (lambda () (not (use-region-p))))) - (after! company (add-company-backend! scss-mode (css)))) + (after! company (define-company-backend! scss-mode (css)))) (use-package web-beautify :commands (web-beautify-js web-beautify-css web-beautify-html) diff --git a/private/my-bindings.el b/private/my-bindings.el index 03212ac28..ea326cc31 100644 --- a/private/my-bindings.el +++ b/private/my-bindings.el @@ -256,8 +256,8 @@ "C-S-h" 'company-show-location "C-S-s" 'company-search-candidates "C-s" 'company-filter-candidates - "C-SPC" 'company-complete-common - [tab] 'company-complete + "C-SPC" 'company-complete-common-or-cycle + [tab] 'narf/company-complete-common-or-complete-full "" 'company-select-previous [escape] 'company-abort "" 'helm-company)