Merge pull request #99 from trishume/company-contrib

Company Mode Contrib Layer
This commit is contained in:
Sylvain Benner 2014-11-08 18:00:29 -05:00
commit 532c1f4d11
5 changed files with 171 additions and 0 deletions

View file

@ -0,0 +1,25 @@
# Company Mode
In order to use this you should disable the default `auto-complete` package plus everything that depends on it:
```elisp
(setq-default dotspacemacs-excluded-packages
'(auto-complete ac-ispell tern-auto-complete auto-complete-clang enslime edts))
```
## Clang Fanciness
In `funcs.el` there are some fancy improvements to `company-clang`.
It includes a hook to load a projects `.clang_complete` file, which is just a text
file with one clang flag per line, a format also used by other text editor clang plugins.
Not only does this allow proper autocomplete on projects with extra includes and flags,
but I also hooked it into flycheck so that the error messages don't complain about missing
header files and skip the actual problems.
Basically, Spacemacs now has better Clang/C++ than any other Emacs config.
## Maintainer
This contrib layer was written by and should be maintained by @trishume, everyone else is
welcome to contribute.

View file

@ -0,0 +1,83 @@
; .clang_complete file loading
; Sets the arguments for company-clang based on a project-specific text file.
; START Based on the Sarcasm/irony-mode compilation database code.
(defun company-mode/find-clang-complete-file ()
(when buffer-file-name
(let ((dir (locate-dominating-file buffer-file-name ".clang_complete")))
(when dir
(concat (file-name-as-directory dir) ".clang_complete")))))
(defun company-mode/load-clang-complete-file (cc-file)
"Load the flags from CC-FILE, one flag per line."
(let ((invocation-dir (expand-file-name (file-name-directory cc-file)))
(case-fold-search nil)
compile-flags)
(with-temp-buffer
(insert-file-contents cc-file)
; Replace relative paths with absolute paths (by @trishume)
;(goto-char (point-min))
(while (re-search-forward "\\(-I\\|-isystem\n\\)\\(\\S-\\)" nil t)
(replace-match (format "%s%s" (match-string 1) (expand-file-name (match-string 2) invocation-dir))))
; Turn lines into a list
(setq compile-flags
;; remove whitespaces at the end of each line, if any
(mapcar #'(lambda (line)
(if (string-match "[ \t]+$" line)
(replace-match "" t t line)
line))
(split-string (buffer-string) "\n" t))))
compile-flags))
; END Back to things written by @trishume
(defun company-mode/more-than-prefix-guesser ()
(unless company-clang-arguments
(let* ((cc-file (company-mode/find-clang-complete-file))
(flags (when cc-file (company-mode/load-clang-complete-file cc-file))))
(when flags (setq-local company-clang-arguments flags))))
(company-clang-guess-prefix))
; START Based on the built in flycheck-clang c++ checker
(eval-after-load 'flycheck
'(progn
(flycheck-define-checker c/c++-company
"A C/C++ syntax checker using parameters from clang-complete"
:command ("clang"
"-fsyntax-only"
"-fno-color-diagnostics" ; Do not include color codes in output
"-fno-caret-diagnostics" ; Do not visually indicate the source
; location
"-fno-diagnostics-show-option" ; Do not show the corresponding
; warning group
"-x" (eval
(pcase major-mode
(`c++-mode "c++")
(`c-mode "c")))
(option-list "" company-clang-arguments concat)
source)
:error-patterns
((error line-start
(message "In file included from") " " (file-name) ":" line ":"
line-end)
(info line-start (file-name) ":" line ":" column
": note: " (optional (message)) line-end)
(warning line-start (file-name) ":" line ":" column
": warning: " (optional (message)) line-end)
(error line-start (file-name) ":" line ":" column
": " (or "fatal error" "error") ": " (optional (message)) line-end))
:error-filter
(lambda (errors)
(let ((errors (flycheck-sanitize-errors errors)))
(dolist (err errors)
;; Clang will output empty messages for #error/#warning pragmas without
;; messages. We fill these empty errors with a dummy message to get
;; them past our error filtering
(setf (flycheck-error-message err)
(or (flycheck-error-message err) "no message")))
(flycheck-fold-include-errors errors "In file included from")))
:modes (c-mode c++-mode)
:next-checkers ((warning . c/c++-cppcheck)))
(add-to-list 'flycheck-checkers 'c/c++-company)))
; END

View file

@ -0,0 +1,41 @@
(defvar company-mode-packages
'(
company
company-tern
))
(defun company-mode/init-company ()
(use-package company
:config
(progn
(setq company-idle-delay 0.0
company-minimum-prefix-length 2
company-require-match nil
company-transformers '(company-sort-by-occurrence)
company-dabbrev-ignore-case nil
company-dabbrev-downcase nil
company-tooltip-flip-when-above t
company-frontends '(company-pseudo-tooltip-frontend)
company-clang-prefix-guesser 'company-mode/more-than-prefix-guesser)
(global-company-mode 1)
; Fix integration of company and yasnippet
(define-key company-active-map (kbd "TAB") nil)
(define-key company-active-map (kbd "<tab>") nil)
(define-key company-active-map [tab] nil)
(add-hook 'markdown-mode-hook '(lambda () (company-mode -1)))
; The default common face is a really ugly underlined thing with a different background.
(custom-set-faces
'(company-tooltip-common ((t (:inherit company-tooltip :weight bold :underline nil))))
'(company-tooltip-common-selection ((t (:inherit company-tooltip-selection :weight bold :underline nil)))))
(spacemacs//diminish company-mode ""))))
(defun company-mode/init-company-tern ()
(use-package company-tern
:defer t
:config
(add-to-list 'company-backends 'company-tern)))

View file

@ -4,3 +4,17 @@ Mostly consists of support for additional languages including:
LaTeX, Idris, OpenSCAD, Julia, Arduino, QML, Lua
Also adds smooth scrolling and Helm Ag support.
## Company Auctex
Along with other things this layer includes company-auctex, it's only enabled if you also enable my other contrib layer `company-mode`.
The autocompletion it offers is great and almost works, unlike auto-complete-auctex which lags so hard it's worthless.
The problem is the almost. There are a few issues that need to be fixed for it to be nice:
- https://github.com/capitaomorte/yasnippet/issues/537 To allow you to delete expanded macro braces, this will need to be merged.
- https://github.com/alexeyr/company-auctex/pull/3 For completing environments like `align*` properly, this will need to be merged.
- https://github.com/alexeyr/company-auctex/issues/4
Currently I've manually applied both of these patches to the folders in my `elpa` directory, which isn't a good solution.
If the patches aren't merged in a reasonable amount of time I'll add the patched forks/branches as extension submodules.

View file

@ -15,6 +15,9 @@
ag
))
(when (member 'trishume dotspacemacs-configuration-layers)
(add-to-list 'trishume-packages 'company-auctex))
(defun trishume/init-auctex ()
(defun load-auctex-on-demand ()
(interactive)
@ -24,6 +27,10 @@
(use-package smartparens
:config (require 'smartparens-latex))
(when (member 'company-mode dotspacemacs-configuration-layers)
(use-package company-auctex
:init (company-auctex-init)))
(defun build-view ()
(interactive)
(if (buffer-modified-p)
@ -42,6 +49,7 @@
(add-hook 'LaTeX-mode-hook '(lambda () (local-set-key (kbd "H-r") 'build-view)))
(add-hook 'LaTeX-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
(add-hook 'LaTeX-mode-hook 'spacemacs/load-yasnippet)
(evil-leader/set-key
"oe" 'LaTeX-environment