summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2022-12-31 15:13:50 -0800
committerYuan Fu <casouri@gmail.com>2022-12-31 16:23:07 -0800
commitddfeee3e8a7b00905e89f36a9ffc0eefdc0d61a4 (patch)
tree1f7af5a7a9852adf2d86621807a4f9899e16ca2f /lisp
parent683746978061f3bfc12d4bf524c15649f7b290fa (diff)
downloademacs-ddfeee3e8a7b00905e89f36a9ffc0eefdc0d61a4.tar.gz
emacs-ddfeee3e8a7b00905e89f36a9ffc0eefdc0d61a4.tar.bz2
emacs-ddfeee3e8a7b00905e89f36a9ffc0eefdc0d61a4.zip
Build recipe interactively in treesit-install-language-grammar
If there is not existing recipe for a language, prompt to build the recipe interactively. * lisp/treesit.el (treesit--install-language-grammar-build-recipe): New functions. (treesit-install-language-grammar): Use the new function.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/treesit.el49
1 files changed, 38 insertions, 11 deletions
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 52983ec0c90..77715798e1a 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -2633,6 +2633,29 @@ the grammar's parser.c file resides, defaulting to \"src\".
CC and C++ are C and C++ compilers, defaulting to \"cc\" and
\"c++\", respectively.")
+(defun treesit--install-language-grammar-build-recipe (lang)
+ "Interactively build a recipe for LANG and return it.
+See `treesit-language-source-alist' for details."
+ (when (y-or-n-p (format "There is no recipe for %s, do you want to build it interactively?" lang))
+ (cl-labels ((empty-string-to-nil (string)
+ (if (equal string "") nil string)))
+ (list
+ lang
+ (read-string
+ "Enter the URL of the Git repository of the language grammar: ")
+ (empty-string-to-nil
+ (read-string
+ "Enter the tag or branch (default: default branch): "))
+ (empty-string-to-nil
+ (read-string
+ "Enter the subdirectory in which the parser.c file resides (default: \"src\"): "))
+ (empty-string-to-nil
+ (read-string
+ "Enter the C compiler to use (default: auto-detect): "))
+ (empty-string-to-nil
+ (read-string
+ "Enter the C++ compiler to use (default: auto-detect): "))))))
+
(defun treesit-install-language-grammar (lang)
"Build and install the tree-sitter language grammar library for LANG.
@@ -2645,17 +2668,21 @@ executable programs, such as the C/C++ compiler and linker."
(interactive (list (intern
(completing-read
"Language: "
- (mapcar #'car treesit-language-source-alist)
- nil t))))
- (condition-case err
- (apply #'treesit--install-language-grammar-1
- ;; The nil is OUT-DIR.
- (cons nil (assoc lang treesit-language-source-alist)))
- (error
- (display-warning
- 'treesit
- (format "Error encountered when installing language grammar: %s"
- err))))
+ (mapcar #'car treesit-language-source-alist)))))
+ (when-let ((recipe
+ (or (assoc lang treesit-language-source-alist)
+ (treesit--install-language-grammar-build-recipe
+ lang))))
+ (condition-case err
+ (apply #'treesit--install-language-grammar-1
+ ;; The nil is OUT-DIR.
+ (cons nil recipe))
+ (error
+ (display-warning
+ 'treesit
+ (format "Error encountered when installing language grammar: %s"
+ err)))))
+
;; Check that the installed language grammar is loadable.
(pcase-let ((`(,available . ,err)
(treesit-language-available-p lang t)))