-
Notifications
You must be signed in to change notification settings - Fork 1
/
magma-completion.el
112 lines (84 loc) · 3.5 KB
/
magma-completion.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
;;; magma-completion.el --- Code completion for magma. ; -*- lexical-binding: t; -*-
;; Copyright (C) 2007-2014 Luk Bettale
;; 2013-2014 Thibaut Verron
;; Licensed under the GNU General Public License.
;; 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 2 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.
;;; Commentary:
;; Documentation available in README.org or on
;; https://github.com/ThibautVerron/magma-mode
;;; Code:
(require 'magma-smie)
(require 'magma-scan)
(defvar magma-mode-hook)
(declare-function magma-mode "magma-mode.el")
(defvar magma-completion-table-file
(f-join magma-path "data/magma_symbols.txt")
"File containing the list of symbols")
(defvar magma-completion-table-base
(magma-scan-completion-file magma-completion-table-file)
"Completion table (internal)")
(defvar-local magma-completion-table nil
"Buffer local completion table (internal)")
(defun magma-find-completions-at-point ()
"List possible completions at point."
(let* ((bounds (bounds-of-thing-at-point 'word))
(start (car bounds))
(end (cdr bounds)))
(and bounds (list start end magma-completion-table :exclusive 'no))))
(defun magma-init-completion ()
"Prepare the mode for completion.
Function run at mode initialisation, activating the completion and defining
its initial dictionary."
(interactive)
(setq magma-completion-table magma-completion-table-base)
(make-local-variable 'completion-at-point-functions)
(setq completion-at-point-functions (list 'magma-find-completions-at-point))
)
(defun magma-interactive-add-to-completion-table (str)
"Parse the string STR, and extract new symbols to add to the completion table."
(magma--debug-message "Scanning input for completion candidates...")
(magma--debug-message (format "Input : %s" str))
(setq magma-completion-table
(let ((prev-table magma-completion-table))
(save-excursion
(with-temp-buffer
(let ((magma-mode-hook nil))
(magma-mode))
(setq magma-completion-table prev-table)
(insert str)
(magma-scan t)
magma-completion-table)))))
(defun magma-interactive-init-completion ()
"Initialize completion in interactive buffers."
(magma-init-completion)
(add-hook 'comint-input-filter-functions
'magma-interactive-add-to-completion-table nil t))
(defun magma-editor-init-completion ()
"Initialize completion in edition buffers."
(magma-init-completion)
(magma-editor-rebuild-completion-table)
)
(defun magma-editor-rebuild-completion-table ()
"Rescan the current buffer."
(interactive)
(magma--debug-message "Rebuilding the completion table...")
(ignore (magma-scan)))
(defun magma-completion-at-point ()
"Completion at point function for magma buffers."
(interactive)
(magma-editor-rebuild-completion-table)
;; Fixme: maybe rebuild only if called twice, or something...
(completion-at-point))
;; Extra functions for the snippets
(defun magma-filename-p (str)
"Test whether STR is a magma file name."
(string-match-p "\\.m$" str))
(provide 'magma-completion)
;;; magma-completion.el ends here