spacemacs/contrib/lang/c-c++/packages.el
Tu Do 000791c5f3 [feature] new Semantic layer
This separates Semantic layer from language major modes, so Semantic
features are only enabled when the layer is added, allow user to choose
using it or not.

Conflicts:
	contrib/lang/c-c++/packages.el
2015-04-21 01:15:40 -04:00

122 lines
4.5 KiB
EmacsLisp

;;; packages.el --- C/C++ Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2014 Sylvain Benner
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(setq c-c++-packages
'(
cc-mode
cmake-mode
company
company-c-headers
flycheck
helm-gtags
stickyfunc-enhance
))
(unless (version< emacs-version "24.4")
(add-to-list 'c-c++-packages 'srefactor))
(defun c-c++/init-cc-mode ()
(use-package cc-mode
:defer t
:config
(progn
(add-to-list 'auto-mode-alist '("\\.cxx$" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.hpp$" . c++-mode))
(add-to-list 'auto-mode-alist '("\\.h$" . c++-mode))
(require 'compile)
(c-toggle-auto-newline 1)
(evil-leader/set-key-for-mode 'c-mode
"mga" 'projectile-find-other-file
"mgA" 'projectile-find-other-file-other-window)
(evil-leader/set-key-for-mode 'c++-mode
"mga" 'projectile-find-other-file
"mgA" 'projectile-find-other-file-other-window))))
(defun c-c++/init-cmake-mode ()
(use-package cmake-mode
:mode (("CMakeLists\\.txt\\'" . cmake-mode) ("\\.cmake\\'" . cmake-mode))
:init (push 'company-cmake company-backends-cmake-mode)))
(defun c-c++/post-init-flycheck ()
(add-to-hooks 'flycheck-mode '(c-mode-hook c++-mode-hook)))
(defun c-c++/post-init-helm-gtags ()
(add-hook 'c-mode-common-hook 'helm-gtags-mode)
(spacemacs/gtags-define-keys-for-mode 'c-mode)
(spacemacs/gtags-define-keys-for-mode 'c++-mode))
(defun c-c++/post-init-srefactor ()
(semantic/enable-semantic-mode 'c-mode)
(semantic/enable-semantic-mode 'c++-mode)
(evil-leader/set-key-for-mode 'c-mode "mr" 'srefactor-refactor-at-point)
(evil-leader/set-key-for-mode 'c++-mode "mr" 'srefactor-refactor-at-point))
(defun c-c++/post-init-stickyfunc-enhance ()
(add-to-hooks 'spacemacs/lazy-load-stickyfunc-enhance '(c-mode-hook c++-mode-hook)))
(when (configuration-layer/layer-usedp 'auto-completion)
(defun c-c++/post-init-company ()
;; push this backend by default
(push '(company-clang :with company-yasnippet)
company-backends-c-mode-common)
(spacemacs|add-company-hook c-mode-common)
(spacemacs|add-company-hook cmake-mode)
;; .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 (if cc-file (company-mode/load-clang-complete-file cc-file) '())))
(setq-local company-clang-arguments flags)
(setq flycheck-clang-args flags)))
(company-clang-guess-prefix))
(setq company-clang-prefix-guesser 'company-mode/more-than-prefix-guesser))
(defun c-c++/init-company-c-headers ()
(use-package company-c-headers
:if (configuration-layer/package-usedp 'company)
:defer t
:init (push 'company-c-headers company-backends-c-mode-common))))