Moved .emacs.el into init.el.
This commit is contained in:
parent
d1cb094b67
commit
6a5e58b1f8
@ -13,11 +13,14 @@
|
|||||||
(when (< emacs-major-version 24)
|
(when (< emacs-major-version 24)
|
||||||
;; For important compatibility libraries like cl-lib
|
;; For important compatibility libraries like cl-lib
|
||||||
(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
|
(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
|
||||||
|
(setq package-enable-at-startup nil)
|
||||||
(package-initialize) ;; You might already have this line
|
(package-initialize) ;; You might already have this line
|
||||||
|
|
||||||
(require 'iso-transl)
|
(require 'iso-transl)
|
||||||
(require 'use-package)
|
(require 'use-package)
|
||||||
|
|
||||||
|
(setq use-package-verbose t)
|
||||||
|
|
||||||
;; No menu, scrollbar, display line and column
|
;; No menu, scrollbar, display line and column
|
||||||
(menu-bar-mode -1)
|
(menu-bar-mode -1)
|
||||||
(tool-bar-mode -1)
|
(tool-bar-mode -1)
|
||||||
@ -85,8 +88,21 @@
|
|||||||
(helm-mode 1))
|
(helm-mode 1))
|
||||||
|
|
||||||
(use-package yasnippet
|
(use-package yasnippet
|
||||||
:config
|
:config
|
||||||
(yas-global-mode 1))
|
(yas-global-mode 1))
|
||||||
|
|
||||||
|
(defun flycheck-autolist-hook ()
|
||||||
|
(if (flycheck-has-current-errors-p)
|
||||||
|
(flycheck-list-errors)
|
||||||
|
(if (get-buffer "*Flycheck errors*") (delete-window (get-buffer-window "*Flycheck errors*")))))
|
||||||
|
|
||||||
|
(use-package flycheck
|
||||||
|
:config
|
||||||
|
(require 'flycheck-color-mode-line)
|
||||||
|
(add-hook 'flycheck-mode-hook 'flycheck-color-mode-line-mode)
|
||||||
|
(add-hook 'flycheck-mode-hook 'flycheck-pos-tip-mode)
|
||||||
|
(add-hook 'flycheck-after-syntax-check-hook 'flycheck-autolist-hook)
|
||||||
|
(global-flycheck-mode))
|
||||||
|
|
||||||
(use-package company
|
(use-package company
|
||||||
:init
|
:init
|
||||||
@ -276,7 +292,12 @@
|
|||||||
;; If there is more than one, they won't work right.
|
;; If there is more than one, they won't work right.
|
||||||
'(safe-local-variable-values
|
'(safe-local-variable-values
|
||||||
(quote
|
(quote
|
||||||
((encoding . utf-8)
|
((company-clang-arguments
|
||||||
|
("-std=c++14" "-I/home/mcapelle/Dev/cpp/include/" "-I/home/mcapelle/Dev/cpp/lns/lib/build/include/"))
|
||||||
|
(company-clang-arguments . clang-args)
|
||||||
|
(eval setq clang-args
|
||||||
|
("-std=c++14" "-I/home/mcapelle/Dev/cpp/include/" "-I/home/mcapelle/Dev/cpp/lns/lib/build/include/"))
|
||||||
|
(encoding . utf-8)
|
||||||
(company-clang-arguments "-std=c++14" "-I/home/mcapelle/Dev/cpp/include/" "-I/home/mcapelle/Dev/cpp/lns/lib/build/include/")))))
|
(company-clang-arguments "-std=c++14" "-I/home/mcapelle/Dev/cpp/include/" "-I/home/mcapelle/Dev/cpp/lns/lib/build/include/")))))
|
||||||
(custom-set-faces
|
(custom-set-faces
|
||||||
;; custom-set-faces was added by Custom.
|
;; custom-set-faces was added by Custom.
|
@ -1,638 +0,0 @@
|
|||||||
;;; auto-complete-clang-async.el --- Auto Completion source for clang for GNU Emacs
|
|
||||||
|
|
||||||
;; Copyright (C) 2010 Brian Jiang
|
|
||||||
;; Copyright (C) 2012 Taylan Ulrich Bayirli/Kammer
|
|
||||||
|
|
||||||
;; Authors: Brian Jiang <brianjcj@gmail.com>
|
|
||||||
;; Golevka(?) [https://github.com/Golevka]
|
|
||||||
;; Taylan Ulrich Bayirli/Kammer <taylanbayirli@gmail.com>
|
|
||||||
;; Many others
|
|
||||||
;; Keywords: completion, convenience
|
|
||||||
;; Version: 0
|
|
||||||
|
|
||||||
;; This program is free software; you can redistribute it and/or modify
|
|
||||||
;; it under the terms of the GNU General Public License as published by
|
|
||||||
;; the Free Software Foundation, either version 3 of the License, or
|
|
||||||
;; (at your option) any later version.
|
|
||||||
|
|
||||||
;; This program is distributed in the hope that it will be useful,
|
|
||||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
;; GNU General Public License for more details.
|
|
||||||
|
|
||||||
;; You should have received a copy of the GNU General Public License
|
|
||||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
|
|
||||||
;; Auto Completion source for clang.
|
|
||||||
;; Uses a "completion server" process to utilize libclang.
|
|
||||||
;; Also provides flymake syntax checking.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
|
|
||||||
(provide 'auto-complete-clang-async)
|
|
||||||
(eval-when-compile (require' cl))
|
|
||||||
(require 'auto-complete)
|
|
||||||
(require 'flymake)
|
|
||||||
|
|
||||||
|
|
||||||
(defcustom ac-clang-complete-executable
|
|
||||||
(executable-find "clang-complete")
|
|
||||||
"Location of clang-complete executable."
|
|
||||||
:group 'auto-complete
|
|
||||||
:type 'file)
|
|
||||||
|
|
||||||
(defcustom ac-clang-lang-option-function nil
|
|
||||||
"Function to return the lang type for option -x."
|
|
||||||
:group 'auto-complete
|
|
||||||
:type 'function)
|
|
||||||
|
|
||||||
(defcustom ac-clang-cflags nil
|
|
||||||
"Extra flags to pass to the Clang executable.
|
|
||||||
This variable will typically contain include paths, e.g., (\"-I~/MyProject\" \"-I.\")."
|
|
||||||
:group 'auto-complete
|
|
||||||
:type '(repeat (string :tag "Argument" "")))
|
|
||||||
(make-variable-buffer-local 'ac-clang-cflags)
|
|
||||||
|
|
||||||
(defun ac-clang-set-cflags ()
|
|
||||||
"Set `ac-clang-cflags' interactively."
|
|
||||||
(interactive)
|
|
||||||
(setq ac-clang-cflags (split-string (read-string "New cflags: ")))
|
|
||||||
(ac-clang-update-cmdlineargs))
|
|
||||||
|
|
||||||
(defun ac-clang-set-cflags-from-shell-command ()
|
|
||||||
"Set `ac-clang-cflags' to a shell command's output.
|
|
||||||
|
|
||||||
set new cflags for ac-clang from shell command output"
|
|
||||||
(interactive)
|
|
||||||
(setq ac-clang-cflags
|
|
||||||
(split-string
|
|
||||||
(shell-command-to-string
|
|
||||||
(read-shell-command "Shell command: " nil nil
|
|
||||||
(and buffer-file-name
|
|
||||||
(file-relative-name buffer-file-name))))))
|
|
||||||
(ac-clang-update-cmdlineargs))
|
|
||||||
|
|
||||||
(defvar ac-clang-prefix-header nil
|
|
||||||
"The prefix header to pass to the Clang executable.")
|
|
||||||
(make-variable-buffer-local 'ac-clang-prefix-header)
|
|
||||||
|
|
||||||
(defvar ac-clang-async-do-autocompletion-automatically t
|
|
||||||
"If autocompletion is automatically triggered when you type ., -> or ::")
|
|
||||||
|
|
||||||
(defun ac-clang-set-prefix-header (prefix-header)
|
|
||||||
"Set `ac-clang-prefix-header' interactively."
|
|
||||||
(interactive
|
|
||||||
(let ((default (car (directory-files "." t "\\([^.]h\\|[^h]\\).pch\\'" t))))
|
|
||||||
(list
|
|
||||||
(read-file-name (concat "Clang prefix header (currently " (or ac-clang-prefix-header "nil") "): ")
|
|
||||||
(when default (file-name-directory default))
|
|
||||||
default nil (when default (file-name-nondirectory default))))))
|
|
||||||
(cond
|
|
||||||
((string-match "^[\s\t]*$" prefix-header)
|
|
||||||
(setq ac-clang-prefix-header nil))
|
|
||||||
(t
|
|
||||||
(setq ac-clang-prefix-header prefix-header))))
|
|
||||||
|
|
||||||
|
|
||||||
(defconst ac-clang-completion-pattern
|
|
||||||
"^COMPLETION: \\(%s[^\s\n:]*\\)\\(?: : \\)*\\(.*$\\)")
|
|
||||||
|
|
||||||
(defun ac-clang-parse-output (prefix)
|
|
||||||
(goto-char (point-min))
|
|
||||||
(let ((pattern (format ac-clang-completion-pattern
|
|
||||||
(regexp-quote prefix)))
|
|
||||||
lines match detailed-info
|
|
||||||
(prev-match ""))
|
|
||||||
(while (re-search-forward pattern nil t)
|
|
||||||
(setq match (match-string-no-properties 1))
|
|
||||||
(unless (string= "Pattern" match)
|
|
||||||
(setq detailed-info (match-string-no-properties 2))
|
|
||||||
|
|
||||||
(if (string= match prev-match)
|
|
||||||
(progn
|
|
||||||
(when detailed-info
|
|
||||||
(setq match (propertize match
|
|
||||||
'ac-clang-help
|
|
||||||
(concat
|
|
||||||
(get-text-property 0 'ac-clang-help (car lines))
|
|
||||||
"\n"
|
|
||||||
detailed-info)))
|
|
||||||
(setf (car lines) match)
|
|
||||||
))
|
|
||||||
(setq prev-match match)
|
|
||||||
(when detailed-info
|
|
||||||
(setq match (propertize match 'ac-clang-help detailed-info)))
|
|
||||||
(push match lines))))
|
|
||||||
lines))
|
|
||||||
|
|
||||||
|
|
||||||
(defconst ac-clang-error-buffer-name "*clang error*")
|
|
||||||
|
|
||||||
(defun ac-clang-handle-error (res args)
|
|
||||||
(goto-char (point-min))
|
|
||||||
(let* ((buf (get-buffer-create ac-clang-error-buffer-name))
|
|
||||||
(cmd (concat ac-clang-complete-executable " " (mapconcat 'identity args " ")))
|
|
||||||
(pattern (format ac-clang-completion-pattern ""))
|
|
||||||
(err (if (re-search-forward pattern nil t)
|
|
||||||
(buffer-substring-no-properties (point-min)
|
|
||||||
(1- (match-beginning 0)))
|
|
||||||
;; Warn the user more agressively if no match was found.
|
|
||||||
(message "clang failed with error %d:\n%s" res cmd)
|
|
||||||
(buffer-string))))
|
|
||||||
|
|
||||||
(with-current-buffer buf
|
|
||||||
(let ((inhibit-read-only t))
|
|
||||||
(erase-buffer)
|
|
||||||
(insert (current-time-string)
|
|
||||||
(format "\nclang failed with error %d:\n" res)
|
|
||||||
cmd "\n\n")
|
|
||||||
(insert err)
|
|
||||||
(setq buffer-read-only t)
|
|
||||||
(goto-char (point-min))))))
|
|
||||||
|
|
||||||
(defun ac-clang-call-process (prefix &rest args)
|
|
||||||
(let ((buf (get-buffer-create "*clang-output*"))
|
|
||||||
res)
|
|
||||||
(with-current-buffer buf (erase-buffer))
|
|
||||||
(setq res (apply 'call-process-region (point-min) (point-max)
|
|
||||||
ac-clang-complete-executable nil buf nil args))
|
|
||||||
(with-current-buffer buf
|
|
||||||
(unless (eq 0 res)
|
|
||||||
(ac-clang-handle-error res args))
|
|
||||||
;; Still try to get any useful input.
|
|
||||||
(ac-clang-parse-output prefix))))
|
|
||||||
|
|
||||||
|
|
||||||
(defsubst ac-clang-create-position-string (pos)
|
|
||||||
(save-excursion
|
|
||||||
(goto-char pos)
|
|
||||||
(format "row:%d\ncolumn:%d\n"
|
|
||||||
(line-number-at-pos)
|
|
||||||
(1+ (- (point) (line-beginning-position))))))
|
|
||||||
|
|
||||||
(defsubst ac-clang-lang-option ()
|
|
||||||
(or (and ac-clang-lang-option-function
|
|
||||||
(funcall ac-clang-lang-option-function))
|
|
||||||
(cond ((eq major-mode 'c++-mode)
|
|
||||||
"c++")
|
|
||||||
((eq major-mode 'c-mode)
|
|
||||||
"c")
|
|
||||||
((eq major-mode 'objc-mode)
|
|
||||||
(cond ((string= "m" (file-name-extension (buffer-file-name)))
|
|
||||||
"objective-c")
|
|
||||||
(t
|
|
||||||
"objective-c++")))
|
|
||||||
(t
|
|
||||||
"c++"))))
|
|
||||||
|
|
||||||
(defsubst ac-clang-build-complete-args ()
|
|
||||||
(append '("-cc1" "-fsyntax-only")
|
|
||||||
(list "-x" (ac-clang-lang-option))
|
|
||||||
ac-clang-cflags
|
|
||||||
(when (stringp ac-clang-prefix-header)
|
|
||||||
(list "-include-pch" (expand-file-name ac-clang-prefix-header)))))
|
|
||||||
|
|
||||||
|
|
||||||
(defsubst ac-clang-clean-document (s)
|
|
||||||
(when s
|
|
||||||
(setq s (replace-regexp-in-string "<#\\|#>\\|\\[#" "" s))
|
|
||||||
(setq s (replace-regexp-in-string "#\\]" " " s)))
|
|
||||||
s)
|
|
||||||
|
|
||||||
(defun ac-clang-document (item)
|
|
||||||
(if (stringp item)
|
|
||||||
(let (s)
|
|
||||||
(setq s (get-text-property 0 'ac-clang-help item))
|
|
||||||
(ac-clang-clean-document s)))
|
|
||||||
;; (popup-item-property item 'ac-clang-help)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
(defface ac-clang-candidate-face
|
|
||||||
'((t (:background "lightgray" :foreground "navy")))
|
|
||||||
"Face for clang candidate"
|
|
||||||
:group 'auto-complete)
|
|
||||||
|
|
||||||
(defface ac-clang-selection-face
|
|
||||||
'((t (:background "navy" :foreground "white")))
|
|
||||||
"Face for the clang selected candidate."
|
|
||||||
:group 'auto-complete)
|
|
||||||
|
|
||||||
(defsubst ac-clang-in-string/comment ()
|
|
||||||
"Return non-nil if point is in a literal (a comment or string)."
|
|
||||||
(nth 8 (syntax-ppss)))
|
|
||||||
|
|
||||||
|
|
||||||
(defvar ac-clang-template-start-point nil)
|
|
||||||
(defvar ac-clang-template-candidates (list "ok" "no" "yes:)"))
|
|
||||||
|
|
||||||
(defun ac-clang-action ()
|
|
||||||
(interactive)
|
|
||||||
;; (ac-last-quick-help)
|
|
||||||
(let ((help (ac-clang-clean-document (get-text-property 0 'ac-clang-help (cdr ac-last-completion))))
|
|
||||||
(raw-help (get-text-property 0 'ac-clang-help (cdr ac-last-completion)))
|
|
||||||
(candidates (list)) ss fn args (ret-t "") ret-f)
|
|
||||||
(setq ss (split-string raw-help "\n"))
|
|
||||||
(dolist (s ss)
|
|
||||||
(when (string-match "\\[#\\(.*\\)#\\]" s)
|
|
||||||
(setq ret-t (match-string 1 s)))
|
|
||||||
(setq s (replace-regexp-in-string "\\[#.*?#\\]" "" s))
|
|
||||||
(cond ((string-match "^\\([^(<]*\\)\\(:.*\\)" s)
|
|
||||||
(setq fn (match-string 1 s)
|
|
||||||
args (match-string 2 s))
|
|
||||||
(push (propertize (ac-clang-clean-document args) 'ac-clang-help ret-t
|
|
||||||
'raw-args args) candidates))
|
|
||||||
((string-match "^\\([^(]*\\)\\((.*)\\)" s)
|
|
||||||
(setq fn (match-string 1 s)
|
|
||||||
args (match-string 2 s))
|
|
||||||
(push (propertize (ac-clang-clean-document args) 'ac-clang-help ret-t
|
|
||||||
'raw-args args) candidates)
|
|
||||||
(when (string-match "\{#" args)
|
|
||||||
(setq args (replace-regexp-in-string "\{#.*#\}" "" args))
|
|
||||||
(push (propertize (ac-clang-clean-document args) 'ac-clang-help ret-t
|
|
||||||
'raw-args args) candidates))
|
|
||||||
(when (string-match ", \\.\\.\\." args)
|
|
||||||
(setq args (replace-regexp-in-string ", \\.\\.\\." "" args))
|
|
||||||
(push (propertize (ac-clang-clean-document args) 'ac-clang-help ret-t
|
|
||||||
'raw-args args) candidates)))
|
|
||||||
((string-match "^\\([^(]*\\)(\\*)\\((.*)\\)" ret-t) ;; check whether it is a function ptr
|
|
||||||
(setq ret-f (match-string 1 ret-t)
|
|
||||||
args (match-string 2 ret-t))
|
|
||||||
(push (propertize args 'ac-clang-help ret-f 'raw-args "") candidates)
|
|
||||||
(when (string-match ", \\.\\.\\." args)
|
|
||||||
(setq args (replace-regexp-in-string ", \\.\\.\\." "" args))
|
|
||||||
(push (propertize args 'ac-clang-help ret-f 'raw-args "") candidates)))))
|
|
||||||
(cond (candidates
|
|
||||||
(setq candidates (delete-dups candidates))
|
|
||||||
(setq candidates (nreverse candidates))
|
|
||||||
(setq ac-clang-template-candidates candidates)
|
|
||||||
(setq ac-clang-template-start-point (point))
|
|
||||||
(ac-complete-clang-template)
|
|
||||||
|
|
||||||
(unless (cdr candidates) ;; unless length > 1
|
|
||||||
(message (replace-regexp-in-string "\n" " ; " help))))
|
|
||||||
(t
|
|
||||||
(message (replace-regexp-in-string "\n" " ; " help))))))
|
|
||||||
|
|
||||||
(defun ac-clang-prefix ()
|
|
||||||
(or (ac-prefix-symbol)
|
|
||||||
(let ((c (char-before)))
|
|
||||||
(when (or (eq ?\. c)
|
|
||||||
;; ->
|
|
||||||
(and (eq ?> c)
|
|
||||||
(eq ?- (char-before (1- (point)))))
|
|
||||||
;; ::
|
|
||||||
(and (eq ?: c)
|
|
||||||
(eq ?: (char-before (1- (point))))))
|
|
||||||
(point)))))
|
|
||||||
|
|
||||||
(defun ac-clang-same-count-in-string (c1 c2 s)
|
|
||||||
(let ((count 0) (cur 0) (end (length s)) c)
|
|
||||||
(while (< cur end)
|
|
||||||
(setq c (aref s cur))
|
|
||||||
(cond ((eq c1 c)
|
|
||||||
(setq count (1+ count)))
|
|
||||||
((eq c2 c)
|
|
||||||
(setq count (1- count))))
|
|
||||||
(setq cur (1+ cur)))
|
|
||||||
(= count 0)))
|
|
||||||
|
|
||||||
(defun ac-clang-split-args (s)
|
|
||||||
(let ((sl (split-string s ", *")))
|
|
||||||
(cond ((string-match "<\\|(" s)
|
|
||||||
(let ((res (list)) (pre "") subs)
|
|
||||||
(while sl
|
|
||||||
(setq subs (pop sl))
|
|
||||||
(unless (string= pre "")
|
|
||||||
(setq subs (concat pre ", " subs))
|
|
||||||
(setq pre ""))
|
|
||||||
(cond ((and (ac-clang-same-count-in-string ?\< ?\> subs)
|
|
||||||
(ac-clang-same-count-in-string ?\( ?\) subs))
|
|
||||||
;; (cond ((ac-clang-same-count-in-string ?\< ?\> subs)
|
|
||||||
(push subs res))
|
|
||||||
(t
|
|
||||||
(setq pre subs))))
|
|
||||||
(nreverse res)))
|
|
||||||
(t
|
|
||||||
sl))))
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-template-candidate ()
|
|
||||||
ac-clang-template-candidates)
|
|
||||||
|
|
||||||
(defun ac-clang-template-action ()
|
|
||||||
(interactive)
|
|
||||||
(unless (null ac-clang-template-start-point)
|
|
||||||
(let ((pos (point)) sl (snp "")
|
|
||||||
(s (get-text-property 0 'raw-args (cdr ac-last-completion))))
|
|
||||||
(cond ((string= s "")
|
|
||||||
;; function ptr call
|
|
||||||
(setq s (cdr ac-last-completion))
|
|
||||||
(setq s (replace-regexp-in-string "^(\\|)$" "" s))
|
|
||||||
(setq sl (ac-clang-split-args s))
|
|
||||||
(cond ((featurep 'yasnippet)
|
|
||||||
(dolist (arg sl)
|
|
||||||
(setq snp (concat snp ", ${" arg "}")))
|
|
||||||
(condition-case nil
|
|
||||||
(yas/expand-snippet (concat "(" (substring snp 2) ")")
|
|
||||||
ac-clang-template-start-point pos) ;; 0.6.1c
|
|
||||||
(error
|
|
||||||
;; try this one:
|
|
||||||
(ignore-errors (yas/expand-snippet
|
|
||||||
ac-clang-template-start-point pos
|
|
||||||
(concat "(" (substring snp 2) ")"))) ;; work in 0.5.7
|
|
||||||
)))
|
|
||||||
((featurep 'snippet)
|
|
||||||
(delete-region ac-clang-template-start-point pos)
|
|
||||||
(dolist (arg sl)
|
|
||||||
(setq snp (concat snp ", $${" arg "}")))
|
|
||||||
(snippet-insert (concat "(" (substring snp 2) ")")))
|
|
||||||
(t
|
|
||||||
(message "Dude! You are too out! Please install a yasnippet or a snippet script:)"))))
|
|
||||||
(t
|
|
||||||
(unless (string= s "()")
|
|
||||||
(setq s (replace-regexp-in-string "{#" "" s))
|
|
||||||
(setq s (replace-regexp-in-string "#}" "" s))
|
|
||||||
(cond ((featurep 'yasnippet)
|
|
||||||
(setq s (replace-regexp-in-string "<#" "${" s))
|
|
||||||
(setq s (replace-regexp-in-string "#>" "}" s))
|
|
||||||
(setq s (replace-regexp-in-string ", \\.\\.\\." "}, ${..." s))
|
|
||||||
(condition-case nil
|
|
||||||
(yas/expand-snippet s ac-clang-template-start-point pos) ;; 0.6.1c
|
|
||||||
(error
|
|
||||||
;; try this one:
|
|
||||||
(ignore-errors (yas/expand-snippet ac-clang-template-start-point pos s)) ;; work in 0.5.7
|
|
||||||
)))
|
|
||||||
((featurep 'snippet)
|
|
||||||
(delete-region ac-clang-template-start-point pos)
|
|
||||||
(setq s (replace-regexp-in-string "<#" "$${" s))
|
|
||||||
(setq s (replace-regexp-in-string "#>" "}" s))
|
|
||||||
(setq s (replace-regexp-in-string ", \\.\\.\\." "}, $${..." s))
|
|
||||||
(snippet-insert s))
|
|
||||||
(t
|
|
||||||
(message "Dude! You are too out! Please install a yasnippet or a snippet script:)")))))))))
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-template-prefix ()
|
|
||||||
ac-clang-template-start-point)
|
|
||||||
|
|
||||||
|
|
||||||
;; This source shall only be used internally.
|
|
||||||
(ac-define-source clang-template
|
|
||||||
'((candidates . ac-clang-template-candidate)
|
|
||||||
(prefix . ac-clang-template-prefix)
|
|
||||||
(requires . 0)
|
|
||||||
(action . ac-clang-template-action)
|
|
||||||
(document . ac-clang-document)
|
|
||||||
(cache)
|
|
||||||
(symbol . "t")))
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
|
||||||
;;; Rest of the file is related to async.
|
|
||||||
;;;
|
|
||||||
|
|
||||||
(defvar ac-clang-status 'idle)
|
|
||||||
(defvar ac-clang-current-candidate nil)
|
|
||||||
(defvar ac-clang-completion-process nil)
|
|
||||||
(defvar ac-clang-saved-prefix "")
|
|
||||||
|
|
||||||
(make-variable-buffer-local 'ac-clang-status)
|
|
||||||
(make-variable-buffer-local 'ac-clang-current-candidate)
|
|
||||||
(make-variable-buffer-local 'ac-clang-completion-process)
|
|
||||||
|
|
||||||
;;;
|
|
||||||
;;; Functions to speak with the clang-complete process
|
|
||||||
;;;
|
|
||||||
|
|
||||||
(defun ac-clang-send-source-code (proc)
|
|
||||||
(save-restriction
|
|
||||||
(widen)
|
|
||||||
(process-send-string
|
|
||||||
proc (format "source_length:%d\n"
|
|
||||||
(length (string-as-unibyte ; fix non-ascii character problem
|
|
||||||
(buffer-substring-no-properties (point-min) (point-max)))
|
|
||||||
)))
|
|
||||||
(process-send-string proc (buffer-substring-no-properties (point-min) (point-max)))
|
|
||||||
(process-send-string proc "\n\n")))
|
|
||||||
|
|
||||||
(defun ac-clang-send-reparse-request (proc)
|
|
||||||
(if (eq (process-status proc) 'run)
|
|
||||||
(save-restriction
|
|
||||||
(widen)
|
|
||||||
(process-send-string proc "SOURCEFILE\n")
|
|
||||||
(ac-clang-send-source-code proc)
|
|
||||||
(process-send-string proc "REPARSE\n\n"))))
|
|
||||||
|
|
||||||
(defun ac-clang-send-completion-request (proc)
|
|
||||||
(save-restriction
|
|
||||||
(widen)
|
|
||||||
(process-send-string proc "COMPLETION\n")
|
|
||||||
(process-send-string proc (ac-clang-create-position-string (- (point) (length ac-prefix))))
|
|
||||||
(ac-clang-send-source-code proc)))
|
|
||||||
|
|
||||||
(defun ac-clang-send-syntaxcheck-request (proc)
|
|
||||||
(save-restriction
|
|
||||||
(widen)
|
|
||||||
(process-send-string proc "SYNTAXCHECK\n")
|
|
||||||
(ac-clang-send-source-code proc)))
|
|
||||||
|
|
||||||
(defun ac-clang-send-cmdline-args (proc)
|
|
||||||
;; send message head and num_args
|
|
||||||
(process-send-string proc "CMDLINEARGS\n")
|
|
||||||
(process-send-string
|
|
||||||
proc (format "num_args:%d\n" (length (ac-clang-build-complete-args))))
|
|
||||||
|
|
||||||
;; send arguments
|
|
||||||
(mapc
|
|
||||||
(lambda (arg)
|
|
||||||
(process-send-string proc (format "%s " arg)))
|
|
||||||
(ac-clang-build-complete-args))
|
|
||||||
(process-send-string proc "\n"))
|
|
||||||
|
|
||||||
(defun ac-clang-update-cmdlineargs ()
|
|
||||||
(interactive)
|
|
||||||
(if (listp ac-clang-cflags)
|
|
||||||
(ac-clang-send-cmdline-args ac-clang-completion-process)
|
|
||||||
(message "`ac-clang-cflags' should be a list of strings")))
|
|
||||||
|
|
||||||
(defun ac-clang-send-shutdown-command (proc)
|
|
||||||
(if (eq (process-status proc) 'run)
|
|
||||||
(process-send-string proc "SHUTDOWN\n"))
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-append-process-output-to-process-buffer (process output)
|
|
||||||
"Append process output to the process buffer."
|
|
||||||
(with-current-buffer (process-buffer process)
|
|
||||||
(save-excursion
|
|
||||||
;; Insert the text, advancing the process marker.
|
|
||||||
(goto-char (process-mark process))
|
|
||||||
(insert output)
|
|
||||||
(set-marker (process-mark process) (point)))
|
|
||||||
(goto-char (process-mark process))))
|
|
||||||
|
|
||||||
|
|
||||||
;;
|
|
||||||
;; Receive server responses (completion candidates) and fire auto-complete
|
|
||||||
;;
|
|
||||||
(defun ac-clang-parse-completion-results (proc)
|
|
||||||
(with-current-buffer (process-buffer proc)
|
|
||||||
(ac-clang-parse-output ac-clang-saved-prefix)))
|
|
||||||
|
|
||||||
(defun ac-clang-filter-output (proc string)
|
|
||||||
(ac-clang-append-process-output-to-process-buffer proc string)
|
|
||||||
(if (string= (substring string -1 nil) "$")
|
|
||||||
(case ac-clang-status
|
|
||||||
(preempted
|
|
||||||
(setq ac-clang-status 'idle)
|
|
||||||
(ac-start)
|
|
||||||
(ac-update))
|
|
||||||
|
|
||||||
(otherwise
|
|
||||||
(setq ac-clang-current-candidate (ac-clang-parse-completion-results proc))
|
|
||||||
;; (message "ac-clang results arrived")
|
|
||||||
(setq ac-clang-status 'acknowledged)
|
|
||||||
(ac-start :force-init t)
|
|
||||||
(ac-update)
|
|
||||||
(setq ac-clang-status 'idle)))))
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-candidate ()
|
|
||||||
(case ac-clang-status
|
|
||||||
(idle
|
|
||||||
;; (message "ac-clang-candidate triggered - fetching candidates...")
|
|
||||||
(setq ac-clang-saved-prefix ac-prefix)
|
|
||||||
|
|
||||||
;; NOTE: although auto-complete would filter the result for us, but when there's
|
|
||||||
;; a HUGE number of candidates avaliable it would cause auto-complete to
|
|
||||||
;; block. So we filter it uncompletely here, then let auto-complete filter
|
|
||||||
;; the rest later, this would ease the feeling of being "stalled" at some degree.
|
|
||||||
|
|
||||||
;; (message "saved prefix: %s" ac-clang-saved-prefix)
|
|
||||||
(with-current-buffer (process-buffer ac-clang-completion-process)
|
|
||||||
(erase-buffer))
|
|
||||||
(setq ac-clang-status 'wait)
|
|
||||||
(setq ac-clang-current-candidate nil)
|
|
||||||
|
|
||||||
;; send completion request
|
|
||||||
(ac-clang-send-completion-request ac-clang-completion-process)
|
|
||||||
ac-clang-current-candidate)
|
|
||||||
|
|
||||||
(wait
|
|
||||||
;; (message "ac-clang-candidate triggered - wait")
|
|
||||||
ac-clang-current-candidate)
|
|
||||||
|
|
||||||
(acknowledged
|
|
||||||
;; (message "ac-clang-candidate triggered - ack")
|
|
||||||
(setq ac-clang-status 'idle)
|
|
||||||
ac-clang-current-candidate)
|
|
||||||
|
|
||||||
(preempted
|
|
||||||
;; (message "clang-async is preempted by a critical request")
|
|
||||||
nil)))
|
|
||||||
|
|
||||||
|
|
||||||
;; Syntax checking with flymake
|
|
||||||
|
|
||||||
(defun ac-clang-flymake-process-sentinel ()
|
|
||||||
(interactive)
|
|
||||||
(setq flymake-err-info flymake-new-err-info)
|
|
||||||
(setq flymake-new-err-info nil)
|
|
||||||
(setq flymake-err-info
|
|
||||||
(flymake-fix-line-numbers
|
|
||||||
flymake-err-info 1 (flymake-count-lines)))
|
|
||||||
(flymake-delete-own-overlays)
|
|
||||||
(flymake-highlight-err-lines flymake-err-info))
|
|
||||||
|
|
||||||
(defun ac-clang-flymake-process-filter (process output)
|
|
||||||
(ac-clang-append-process-output-to-process-buffer process output)
|
|
||||||
(flymake-log 3 "received %d byte(s) of output from process %d"
|
|
||||||
(length output) (process-id process))
|
|
||||||
(flymake-parse-output-and-residual output)
|
|
||||||
(when (string= (substring output -1 nil) "$")
|
|
||||||
(flymake-parse-residual)
|
|
||||||
(ac-clang-flymake-process-sentinel)
|
|
||||||
(setq ac-clang-status 'idle)
|
|
||||||
(set-process-filter ac-clang-completion-process 'ac-clang-filter-output)))
|
|
||||||
|
|
||||||
(defun ac-clang-syntax-check ()
|
|
||||||
(interactive)
|
|
||||||
(when (eq ac-clang-status 'idle)
|
|
||||||
(with-current-buffer (process-buffer ac-clang-completion-process)
|
|
||||||
(erase-buffer))
|
|
||||||
(setq ac-clang-status 'wait)
|
|
||||||
(set-process-filter ac-clang-completion-process 'ac-clang-flymake-process-filter)
|
|
||||||
(ac-clang-send-syntaxcheck-request ac-clang-completion-process)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-shutdown-process ()
|
|
||||||
(if ac-clang-completion-process
|
|
||||||
(ac-clang-send-shutdown-command ac-clang-completion-process)))
|
|
||||||
|
|
||||||
(defun ac-clang-reparse-buffer ()
|
|
||||||
(if ac-clang-completion-process
|
|
||||||
(ac-clang-send-reparse-request ac-clang-completion-process)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-async-autocomplete-autotrigger ()
|
|
||||||
(interactive)
|
|
||||||
(if ac-clang-async-do-autocompletion-automatically
|
|
||||||
(ac-clang-async-preemptive)
|
|
||||||
(self-insert-command 1)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defun ac-clang-async-preemptive ()
|
|
||||||
(interactive)
|
|
||||||
(self-insert-command 1)
|
|
||||||
(if (eq ac-clang-status 'idle)
|
|
||||||
(ac-start)
|
|
||||||
(setq ac-clang-status 'preempted)))
|
|
||||||
|
|
||||||
(defun ac-clang-launch-completion-process ()
|
|
||||||
(let ((filename (buffer-file-name)))
|
|
||||||
(if filename
|
|
||||||
(ac-clang-launch-completion-process-with-file filename))))
|
|
||||||
|
|
||||||
(defun ac-clang-launch-completion-process-with-file (filename)
|
|
||||||
(setq ac-clang-completion-process
|
|
||||||
(let ((process-connection-type nil))
|
|
||||||
(apply 'start-process
|
|
||||||
"clang-complete" "*clang-complete*"
|
|
||||||
ac-clang-complete-executable
|
|
||||||
(append (ac-clang-build-complete-args)
|
|
||||||
(list filename)))))
|
|
||||||
|
|
||||||
(set-process-filter ac-clang-completion-process 'ac-clang-filter-output)
|
|
||||||
(set-process-query-on-exit-flag ac-clang-completion-process nil)
|
|
||||||
;; Pre-parse source code.
|
|
||||||
(ac-clang-send-reparse-request ac-clang-completion-process)
|
|
||||||
|
|
||||||
(add-hook 'kill-buffer-hook 'ac-clang-shutdown-process nil t)
|
|
||||||
(add-hook 'before-revert-hook 'ac-clang-shutdown-process nil t)
|
|
||||||
(add-hook 'before-save-hook 'ac-clang-reparse-buffer)
|
|
||||||
|
|
||||||
(local-set-key (kbd ".") 'ac-clang-async-autocomplete-autotrigger)
|
|
||||||
(local-set-key (kbd ":") 'ac-clang-async-autocomplete-autotrigger)
|
|
||||||
(local-set-key (kbd ">") 'ac-clang-async-autocomplete-autotrigger))
|
|
||||||
|
|
||||||
|
|
||||||
(ac-define-source clang-async
|
|
||||||
'((candidates . ac-clang-candidate)
|
|
||||||
(candidate-face . ac-clang-candidate-face)
|
|
||||||
(selection-face . ac-clang-selection-face)
|
|
||||||
(prefix . ac-clang-prefix)
|
|
||||||
(requires . 0)
|
|
||||||
(document . ac-clang-document)
|
|
||||||
(action . ac-clang-action)
|
|
||||||
(cache)
|
|
||||||
(symbol . "c")))
|
|
||||||
|
|
||||||
;;; auto-complete-clang-async.el ends here
|
|
Loading…
Reference in New Issue
Block a user