[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/php-mode 6049ad7453 5/9: Add php-complete.el
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/php-mode 6049ad7453 5/9: Add php-complete.el |
Date: |
Sat, 1 Oct 2022 23:59:03 -0400 (EDT) |
branch: elpa/php-mode
commit 6049ad74539fa6fab59234ccc76dcb70ec4ce1ae
Author: USAMI Kenta <tadsan@zonu.me>
Commit: USAMI Kenta <tadsan@zonu.me>
Add php-complete.el
---
CHANGELOG.md | 6 +++
Makefile | 4 +-
lisp/php-complete.el | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 132 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index be5eb0448c..426174e365 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ All notable changes of the PHP Mode 1.19.1 release series are
documented in this
## Unreleased
+### Added
+
+ * **New feature: `php-complete`**
+ * Add `php-complete-complete-function` to autocomplete function names
([#708])
+
### Changed
* Make continued expressions inside lists (arguments and arrays, etc.) have
the same indent width as outside the list ([#703])
@@ -16,6 +21,7 @@ All notable changes of the PHP Mode 1.19.1 release series are
documented in this
[#703]: https://github.com/emacs-php/php-mode/pull/703
[#704]: https://github.com/emacs-php/php-mode/pull/704
[#707]: https://github.com/emacs-php/php-mode/pull/707
+[#708]: https://github.com/emacs-php/php-mode/pull/708
## [1.24.1] - 2022-10-08
diff --git a/Makefile b/Makefile
index 42fcf641e5..97922d2a50 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
EMACS ?= emacs
CASK ?= cask
-ELS = lisp/php.el lisp/php-align.el lisp/php-face.el lisp/php-project.el
lisp/php-local-manual.el lisp/php-mode.el lisp/php-mode-debug.el
+ELS = lisp/php.el lisp/php-align.el lisp/php-complete.el lisp/php-defs.el
lisp/php-face.el lisp/php-project.el lisp/php-local-manual.el lisp/php-mode.el
lisp/php-mode-debug.el
AUTOLOADS = php-mode-autoloads.el
ELCS = $(ELS:.el=.elc)
@@ -24,7 +24,7 @@ AUTHORS.md: etc/git/AUTHORS.md.in .mailmap
autoloads: $(AUTOLOADS)
-$(AUTOLOADS): lisp/php.el lisp/php-align.el lisp/php-face.el
lisp/php-project.el lisp/php-local-manual.el lisp/php-mode-debug.el
lisp/php-mode.el
+$(AUTOLOADS): $(ELS)
$(EMACS) --batch -L lisp/ --eval \
"(let ((user-emacs-directory default-directory)) \
(require 'package) \
diff --git a/lisp/php-complete.el b/lisp/php-complete.el
new file mode 100644
index 0000000000..588efa7852
--- /dev/null
+++ b/lisp/php-complete.el
@@ -0,0 +1,124 @@
+;;; php-complete.el --- PHP auto-compiletion functions -*-
lexical-binding: t; -*-
+
+;; Copyright (C) 2022 Friends of Emacs-PHP development
+;; Copyright (C) 2021, 2022 Free Software Foundation, Inc.
+
+;; Author: USAMI Kenta <tadsan@zonu.me>
+
+;; Created: 18 Sep 2022
+;; Version: 1.24.1
+;; Keywords: languages, php
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Provide auto-compiletion functions.
+
+;; These functions are copied function from GNU ELPA.
+;;
+;; - cape--table-with-properties (cape.el)
+;; - cape--bounds (cape.el)
+;; - cape--interactive (cape.el)
+
+;;; Code:
+(eval-when-compile
+ (require 'cl-lib))
+(require 'php)
+(require 'php-defs)
+
+;;;###autoload
+(defgroup php-complete nil
+ "Auto completion for PHP edition."
+ :tag "PHP Completion"
+ :group 'php-mode)
+
+;;;###autoload
+(defcustom php-complete-function-modules '(bcmath core gmp libxml intl
mbstring pcntl posix sodium xml xmlwriter)
+ "Module names for function names completion."
+ :tag "PHP Complete Function Modules"
+ :type (eval-when-compile `(set ,@(mapcar (lambda (elm) (list 'const (car
elm)))
+ php-defs-functions-alist)))
+ :safe (lambda (value) (and (listp value) (cl-loop for v in values
+ always (assq v
php-defs-functions-alist))))
+ :group 'php-complete)
+
+;;; Cape functions:
+
+;; These functions are copied from cape.el package.
https://github.com/minad/cape
+;; Thanks to original author Daniel Mendler (@minad)
+
+(cl-defun php-complete--cape-table-with-properties (table &key category (sort
t) &allow-other-keys)
+ "Create completion TABLE with properties.
+CATEGORY is the optional completion category.
+SORT should be nil to disable sorting."
+ (if (or (not table) (and (not category) sort))
+ table
+ (let ((metadata `(metadata
+ ,@(and category `((category . ,category)))
+ ,@(and (not sort) '((display-sort-function . identity)
+ (cycle-sort-function . identity))))))
+ (lambda (str pred action)
+ (if (eq action 'metadata)
+ metadata
+ (complete-with-action action table str pred))))))
+
+(defun php-complete--cape-bounds (thing)
+ "Return bounds of THING."
+ (or (bounds-of-thing-at-point thing) (cons (point) (point))))
+
+(defun php-complete--cape-interactive (capf)
+ "Complete with CAPF."
+ (let ((completion-at-point-functions (list capf)))
+ (or (completion-at-point) (user-error "%s: No completions" capf))))
+
+;;; Variables:
+(defvar php-complete--functions-cache (make-hash-table :test #'equal))
+
+;;; Data source functions:
+(defun php-complete--functions ()
+ "Return PHP function names."
+ (let* ((modules (sort php-complete-function-modules #'string<))
+ (functions (gethash modules php-complete--functions-cache)))
+ (unless functions
+ (setq functions (sort (cl-loop for module in modules
+ append (assq module
php-defs-functions-alist))
+ #'string<))
+ (puthash modules functions php-complete--functions-cache))
+ functions))
+
+;;; Compiletion function:
+
+;;;###autoload
+(defun php-complete-complete-function (&optional interactive)
+ "Complete PHP keyword at point.
+
+If INTERACTIVE is nil the function acts like a capf."
+ (interactive (list t))
+ (if interactive
+ (php-complete--cape-interactive #'php-complete-complete-function)
+ (let ((bounds (php-complete--cape-bounds 'symbol))
+ (tokens (nreverse (php-leading-tokens 2))))
+ `(,(car bounds) ,(cdr bounds)
+ ,(php-complete--cape-table-with-properties
+ (unless (or (member (nth 0 tokens) '("->" "::"))
+ (string-prefix-p "$" (nth 1 tokens)))
+ (php-complete--functions))
+ :category 'cape-keyword)
+ :annotation-function (lambda (_) " PHP functions")
+ :company-kind (lambda (_) 'keyword)
+ :exclusive 'no))))
+
+(provide 'php-complete)
+;;; php-complete.el ends here
- [nongnu] elpa/php-mode updated (6513efaf6f -> 7e4905a6e9), ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 6049ad7453 5/9: Add php-complete.el,
ELPA Syncer <=
- [nongnu] elpa/php-mode 651d524bdb 1/9: Add script/extract_functions.php, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 5179a1c28a 3/9: Copy c-end-of-token function from cc-engine.el, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 4609c9334c 4/9: Add php-leading-tokens, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 6531053ce6 2/9: Add php-defs.el, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode b3718d488d 6/9: Copy thing-at-point-bounds-of-string-at-point function from thingatpt.el, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 51670f3364 7/9: Add "=>" to php-mode token as pseudo-operator, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 836663957b 8/9: Add functions-txt subcommand to extract_functions.php, ELPA Syncer, 2022/10/01
- [nongnu] elpa/php-mode 7e4905a6e9 9/9: Merge pull request #708 from emacs-php/feature/php-completion, ELPA Syncer, 2022/10/01