[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 13/35: Make company-clang work asynchronously
From: |
Dmitry Gutov |
Subject: |
[elpa] 13/35: Make company-clang work asynchronously |
Date: |
Sat, 19 Apr 2014 10:12:16 +0000 |
dgutov pushed a commit to branch master
in repository elpa.
commit 5cef93597739782b9be4b9ffdae686cffc0c7946
Author: Dmitry Gutov <address@hidden>
Date: Tue Apr 1 08:07:51 2014 +0300
Make company-clang work asynchronously
#62
---
company-clang.el | 48 ++++++++++++++++++++++++++++++------------------
1 files changed, 30 insertions(+), 18 deletions(-)
diff --git a/company-clang.el b/company-clang.el
index 787ecef..42a5487 100644
--- a/company-clang.el
+++ b/company-clang.el
@@ -1,6 +1,6 @@
-;;; company-clang.el --- company-mode completion back-end for Clang
+;;; company-clang.el --- company-mode completion back-end for Clang -*-
lexical-binding: t -*-
-;; Copyright (C) 2009, 2011, 2013 Free Software Foundation, Inc.
+;; Copyright (C) 2009, 2011, 2013-2014 Free Software Foundation, Inc.
;; Author: Nikolaj Schumacher
@@ -107,7 +107,7 @@ or automatically through a custom
`company-clang-prefix-guesser'."
(defconst company-clang--completion-pattern
"^COMPLETION: \\_<\\(%s[a-zA-Z0-9_:]*\\)\\(?: : \\(.*\\)$\\)?$")
-(defconst company-clang--error-buffer-name "*clang error*")
+(defconst company-clang--error-buffer-name "*clang-error*")
(defun company-clang--lang-option ()
(if (eq major-mode 'objc-mode)
@@ -175,20 +175,30 @@ or automatically through a custom
`company-clang-prefix-guesser'."
(setq buffer-read-only t)
(goto-char (point-min))))))
-(defun company-clang--call-process (prefix &rest args)
+(defun company-clang--start-process (prefix callback &rest args)
(let ((objc (derived-mode-p 'objc-mode))
- (buf (get-buffer-create "*clang-output*"))
- res)
+ (buf (get-buffer-create "*clang-output*")))
(with-current-buffer buf (erase-buffer))
- (setq res (if (company-clang--auto-save-p)
- (apply 'call-process company-clang-executable nil buf nil
args)
- (apply 'call-process-region (point-min) (point-max)
- company-clang-executable nil buf nil args)))
- (with-current-buffer buf
- (unless (eq 0 res)
- (company-clang--handle-error res args))
- ;; Still try to get any useful input.
- (company-clang--parse-output prefix objc))))
+ (if (get-buffer-process buf)
+ (funcall callback nil)
+ (let ((process (apply #'start-process "company-clang" buf
+ company-clang-executable args)))
+ (set-process-sentinel
+ process
+ (lambda (proc status)
+ (unless (string-match-p "hangup" status)
+ (funcall
+ callback
+ (let ((res (process-exit-status proc)))
+ (with-current-buffer buf
+ (unless (eq 0 res)
+ (company-clang--handle-error res args))
+ ;; Still try to get any useful input.
+ (company-clang--parse-output prefix objc)))))))
+ (unless (company-clang--auto-save-p)
+ (send-region process (point-min) (point-max))
+ (send-string process "\n")
+ (process-send-eof process))))))
(defsubst company-clang--build-location (pos)
(save-excursion
@@ -214,15 +224,16 @@ or automatically through a custom
`company-clang-prefix-guesser'."
(list (company-clang--build-location pos))
(list (if (company-clang--auto-save-p) buffer-file-name "-"))))
-(defun company-clang--candidates (prefix)
+(defun company-clang--candidates (prefix callback)
(and (company-clang--auto-save-p)
(buffer-modified-p)
(basic-save-buffer))
(when (null company-clang--prefix)
(company-clang-set-prefix (or (funcall company-clang-prefix-guesser)
'none)))
- (apply 'company-clang--call-process
+ (apply 'company-clang--start-process
prefix
+ callback
(company-clang--build-complete-args (- (point) (length prefix)))))
(defun company-clang--prefix ()
@@ -301,7 +312,8 @@ passed via standard input."
company-clang-executable
(not (company-in-string-or-comment))
(company-clang--prefix)))
- (candidates (company-clang--candidates arg))
+ (candidates (cons :async
+ (lambda (cb) (company-clang--candidates arg cb))))
(meta (company-clang--meta arg))
(annotation (company-clang--annotation arg))
(post-completion (let ((anno (company-clang--annotation arg)))
- [elpa] branch master updated (0c8e3a1 -> 77719a9), Dmitry Gutov, 2014/04/19
- [elpa] 02/35: More robust and simpler logic in prefix test, Dmitry Gutov, 2014/04/19
- [elpa] 03/35: Test new prefix behavior, option company-abort-manual-when-too-short, Dmitry Gutov, 2014/04/19
- [elpa] 08/35: Use `condition-case-unless-debug', Dmitry Gutov, 2014/04/19
- [elpa] 04/35: Minor tweaks, Dmitry Gutov, 2014/04/19
- [elpa] 07/35: Drop support for `crop', Dmitry Gutov, 2014/04/19
- [elpa] 10/35: Bump version, Dmitry Gutov, 2014/04/19
- [elpa] 09/35: Add Package-Requires header, Dmitry Gutov, 2014/04/19
- [elpa] 13/35: Make company-clang work asynchronously,
Dmitry Gutov <=
- [elpa] 12/35: Remove `company-locate-dominating-file', Dmitry Gutov, 2014/04/19
- [elpa] 16/35: Update NEWS, Dmitry Gutov, 2014/04/19
- [elpa] 17/35: company--merge-async: tweak, Dmitry Gutov, 2014/04/19
- [elpa] 19/35: Move company-elisp require, Dmitry Gutov, 2014/04/19
- [elpa] 14/35: Implement async operation for grouped backends, Dmitry Gutov, 2014/04/19
- [elpa] 18/35: company--force-sync: change calling convention, Dmitry Gutov, 2014/04/19
- [elpa] 20/35: Change the summary, Dmitry Gutov, 2014/04/19
- [elpa] 22/35: company--multi-backend-adapter-candidates: bind backend locally, Dmitry Gutov, 2014/04/19
- [elpa] 21/35: Define and use `company-grab-symbol-cons', Dmitry Gutov, 2014/04/19
- [elpa] 23/35: Introduce `company-tooltip-minimum-width', Dmitry Gutov, 2014/04/19