+ (use-package irony
+ :ensure t
+ :config
+ (add-hook 'c++-mode-hook 'irony-mode)
+ (add-hook 'c-mode-hook 'irony-mode)
+ (add-hook 'objc-mode-hook 'irony-mode))
+
+ ;; replace the `completion-at-point' and `complete-symbol' bindings in
+ ;; irony-mode's buffers by irony-mode's function
+
+ (defun my-irony-mode-hook ()
+ (define-key irony-mode-map [remap completion-at-point]
+ 'irony-completion-at-point-async)
+ (define-key irony-mode-map [remap complete-symbol]
+ 'irony-completion-at-point-async))
+
+ (add-hook 'irony-mode-hook 'my-irony-mode-hook)
+ (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
+
+ (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
+
+ ;; add C++ completions, because by default c++ file can not complete
+ ;; c++ std functions, another method is create .dir-local.el file, for p
+ ;; for project see irony
+ (defun sd/c++-mode-local-vars ()
+ (setq irony--compile-options
+ '("-std=c++11"
+ "-stdlib=libc++"
+ "-I/usr/include/c++/4.2.1")))
+#+END_SRC
+
+irony-company
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package company-irony
+ :ensure t)
+
+ (use-package flycheck-irony
+ :ensure t)
+
+ (use-package company-c-headers
+ :ensure t
+ :config
+ (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/"))
+
+ ;; (with-eval-after-load 'company
+ ;; (add-to-list 'company-backends 'company-irony)
+ ;; (add-to-list 'company-backends 'company-c-headers))
+
+ (with-eval-after-load 'company
+ (push '(company-irony :with company-yasnippet) company-backends)
+ (push '(company-c-headers :with company-yasnippet) company-backends))
+
+ (with-eval-after-load 'flycheck
+ (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
+#+END_SRC
+
+*** flycheck
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package flycheck
+ :ensure t)
+#+END_SRC
+
+*** gtags
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ggtags
+ :ensure t
+ :config
+ (define-key ggtags-mode-map (kbd "M-g d") 'ggtags-find-definition)
+ (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference)
+ (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference)
+ (define-key ggtags-mode-map (kbd "C-c g s") 'ggtags-find-other-symbol)
+ (define-key ggtags-mode-map (kbd "C-c g h") 'ggtags-view-tag-history)
+ (define-key ggtags-mode-map (kbd "C-c g r") 'ggtags-find-reference)
+ (define-key ggtags-mode-map (kbd "C-c g f") 'ggtags-find-file)
+ (define-key ggtags-mode-map (kbd "C-c g c") 'ggtags-create-tags)
+ (define-key ggtags-mode-map (kbd "C-c g u") 'ggtags-update-tags))
+
+ (add-hook 'c-mode-common-hook
+ (lambda ()
+ (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
+ (ggtags-mode 1))))
+
+ (require 'cc-mode)
+ (require 'semantic)
+
+ (global-semanticdb-minor-mode 1)
+ (global-semantic-idle-scheduler-mode 1)
+
+ (semantic-mode 1)
+#+END_SRC
+
+*** google C style
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package google-c-style
+ :ensure t
+ :config
+ (add-hook 'c-mode-hook 'google-set-c-style)
+ (add-hook 'c++-mode-hook 'google-set-c-style))
+#+END_SRC
+
+** Lua
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package lua-mode