[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master d4088c5 02/66: replace <LANG> <CONFIG> tag in variables
From: |
Dmitry Gutov |
Subject: |
[elpa] master d4088c5 02/66: replace <LANG> <CONFIG> tag in variables |
Date: |
Tue, 13 Jan 2015 02:44:42 +0000 |
branch: master
commit d4088c5d080fcfebffcc5df56e340a9c2a7032d8
Author: Chen Bin <address@hidden>
Commit: Dmitry Gutov <address@hidden>
replace <LANG> <CONFIG> tag in variables
---
company-cmake.el | 121 ++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 94 insertions(+), 27 deletions(-)
diff --git a/company-cmake.el b/company-cmake.el
index a466f60..d6db7e4 100644
--- a/company-cmake.el
+++ b/company-cmake.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2013 Free Software Foundation, Inc.
;; Author: Chen Bin <chenbin DOT sh AT gmail>
-;; Version: 0.1
+;; Version: 0.2
;; 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
@@ -45,48 +45,113 @@
They affect which types of symbols we get completion candidates for.")
(defvar company-cmake--completion-pattern
- "^\\(%s[a-zA-Z0-9_]%s\\)$"
+ "^\\(%s[a-zA-Z0-9_<>]%s\\)$"
"Regexp to match the candidates.")
(defvar company-cmake-modes '(cmake-mode)
"Major modes in which cmake may complete.")
+(defvar company-cmake-candidates-cache nil
+ "Cache for the raw candidates.")
+
(defvar company-cmake--meta-command-cache nil
"Cache for command arguments to retrieve descriptions for the candidates.")
-(defun company-cmake--parse-output (prefix cmd)
- "Analyze the temp buffer and collect lines."
- (goto-char (point-min))
- (let ((pattern (format company-cmake--completion-pattern
+(defun company-cmake--replace-tags (rlt)
+ (setq rlt (replace-regexp-in-string "\\(.*\\)<LANG>\\(.*\\)"
+ (mapconcat 'identity '("\\1CXX\\2"
"\\1C\\2" "\\1Fortran\\2") "\n")
+ rlt))
+ (setq rlt (replace-regexp-in-string "\\(.*\\)<CONFIG>\\(.*\\)"
+ (mapconcat 'identity '("\\1DEBUG\\2"
"\\1RELEASE\\2" "\\1RELWITHDEBINFO\\2" "\\1MINSIZEREL\\2") "\n")
+ rlt))
+ rlt)
+
+(defun company-cmake--fill-candidates-cache (arg)
+ "Fill candidates cache if needed."
+ (let (rlt)
+ (unless company-cmake-candidates-cache
+ (setq company-cmake-candidates-cache (make-hash-table :test 'equal)))
+
+ ;; If hash is empty, fill it.
+ (unless (gethash arg company-cmake-candidates-cache)
+ (with-temp-buffer
+ (setq res (call-process company-cmake-executable nil t nil arg))
+ (unless (eq 0 res)
+ (message "cmake executable exited with error=%d" res))
+ (setq rlt (buffer-string)))
+ (setq rlt (company-cmake--replace-tags rlt))
+ (puthash arg rlt company-cmake-candidates-cache))
+ ))
+
+(defun company-cmake-find-match (pattern line)
+ (let (match)
+ ;; General Flags
+ (if (string-match pattern line)
+ (if (setq match (match-string 1 line))
+ (puthash match cmd company-cmake--meta-command-cache)))
+ match))
+
+(defun company-cmake-parse (prefix content cmd)
+ (let ((start 0)
+ (pattern (format company-cmake--completion-pattern
(regexp-quote prefix)
(if (zerop (length prefix)) "+" "*")))
- (case-fold-search nil)
- lines match)
- (while (re-search-forward pattern nil t)
- (setq match (match-string-no-properties 1))
- (puthash match cmd company-cmake--meta-command-cache)
- (push match lines))
- lines))
+ (lines (split-string content "\n"))
+ (lang-patterns ())
+ match
+ rlt)
+ (dolist (line lines)
+ (if (setq match (company-cmake-find-match pattern line))
+ (push match rlt)))
+ rlt))
(defun company-cmake--candidates (prefix)
(let ((res 0)
results
- cmd)
- (setq company-cmake--meta-command-cache (make-hash-table :test 'equal))
+ cmd-opts
+ str)
+
+ (unless company-cmake--meta-command-cache
+ (setq company-cmake--meta-command-cache (make-hash-table :test 'equal)))
+
(dolist (arg company-cmake-executable-arguments)
- (with-temp-buffer
- (setq res (call-process company-cmake-executable nil t nil arg))
- (unless (eq 0 res)
- (message "cmake executable exited with error=%d" res))
- (setq cmd (replace-regexp-in-string "-list$" "" arg) )
- (setq results (nconc results (company-cmake--parse-output prefix
cmd)))))
+ (company-cmake--fill-candidates-cache arg)
+ (setq cmd-opts (replace-regexp-in-string "-list$" "" arg) )
+
+ (setq str (gethash arg company-cmake-candidates-cache))
+ (if str
+ (setq results (nconc results (company-cmake-parse prefix str
cmd-opts)))
+ ))
results))
-(defun company-cmake--meta (prefix)
- (let ((cmd-opts (gethash prefix company-cmake--meta-command-cache))
+(defun company-cmake--unexpand-candidate (candidate)
+ (cond
+ ((string-match "^CMAKE_\\(C\\|CXX\\|Fortran\\)\\(_.*\\)$" candidate)
+ (setq candidate (concat "CMAKE_<LANG>_" (match-string 2 candidate))))
+
+ ;; C flags
+ ((string-match "^\\(.*_\\)IS_GNU\\(C\\|CXX\\|Fortran\\)$" candidate)
+ (setq candidate (concat (match-string 1 candidate) "IS_GNU<LANG>")))
+
+ ;; C flags
+ ((string-match "^\\(.*_\\)OVERRIDE_\\(C\\|CXX\\|Fortran\\)$" candidate)
+ (setq candidate (concat (match-string 1 candidate) "OVERRIDE_<LANG>")))
+
+ ((string-match
"^\\(.*\\)\\(_DEBUG\\|_RELEASE\\|_RELWITHDEBINFO\\|_MINSIZEREL\\)\\(.*\\)$"
candidate)
+ (setq candidate (concat (match-string 1 candidate)
+ "_<CONFIG>"
+ (match-string 3 candidate)))))
+ candidate)
+
+(defun company-cmake--meta (candidate)
+ (let ((cmd-opts (gethash candidate company-cmake--meta-command-cache))
result)
+ (setq candidate (company-cmake--unexpand-candidate candidate))
+
+ ;; Don't cache the documentation of every candidate (command)
+ ;; Cache in this case will cost too much memory.
(with-temp-buffer
- (call-process company-cmake-executable nil t nil cmd-opts prefix)
+ (call-process company-cmake-executable nil t nil cmd-opts candidate)
;; Go to the third line, trim it and return the result.
;; Tested with cmake 2.8.9.
(goto-char (point-min))
@@ -96,10 +161,12 @@ They affect which types of symbols we get completion
candidates for.")
(setq result (replace-regexp-in-string "^[ \t\n\r]+" "" result))
result)))
-(defun company-cmake--doc-buffer (prefix)
- (let ((cmd-opts (gethash prefix company-cmake--meta-command-cache)))
+(defun company-cmake--doc-buffer (candidate)
+ (let ((cmd-opts (gethash candidate company-cmake--meta-command-cache)))
+
+ (setq candidate (company-cmake--unexpand-candidate candidate))
(with-temp-buffer
- (call-process company-cmake-executable nil t nil cmd-opts prefix)
+ (call-process company-cmake-executable nil t nil cmd-opts candidate)
;; Go to the third line, trim it and return the doc buffer.
;; Tested with cmake 2.8.9.
(goto-char (point-min))
- [elpa] master updated (0ead54c -> 092486e), Dmitry Gutov, 2015/01/12
- [elpa] master 6846466 01/66: company-capf: Distinguish between `finished' and `exact' in post-completion, Dmitry Gutov, 2015/01/12
- [elpa] master d4088c5 02/66: replace <LANG> <CONFIG> tag in variables,
Dmitry Gutov <=
- [elpa] master 250f7af 04/66: s/Fortran/G77, Dmitry Gutov, 2015/01/12
- [elpa] master b6da724 03/66: Clean up a little, Dmitry Gutov, 2015/01/12
- [elpa] master 67ead1a 06/66: Bump the year, Dmitry Gutov, 2015/01/12
- [elpa] master eb03746 09/66: company-cmake--unexpand-candidate: Remove extra underscore, Dmitry Gutov, 2015/01/12
- [elpa] master 28f8dc6 11/66: Update NEWS, Dmitry Gutov, 2015/01/12
- [elpa] master e5627dd 12/66: company-etags-file-table: Check that TAGS is not a directory, Dmitry Gutov, 2015/01/12
- [elpa] master e66f2c3 13/66: company-bbdb: Use the whole line content after `: ' as prefix, Dmitry Gutov, 2015/01/12
- [elpa] master 79d4b0d 10/66: company-cmake: Support G77/Fortran distinction, Dmitry Gutov, 2015/01/12
- [elpa] master 4375685 14/66: company-complete-number: Handle keypad events, Dmitry Gutov, 2015/01/12
- [elpa] master e692260 15/66: Show numbers in tooltip irrespective of scrolling, Dmitry Gutov, 2015/01/12