Merge remote-tracking branch 'origin/master' into feature/android
This commit is contained in:
commit
5f6971e5cb
5 changed files with 233 additions and 83 deletions
14
etc/NEWS
14
etc/NEWS
|
@ -59,18 +59,23 @@ trash when deleting. Default is nil.
|
|||
|
||||
* Editing Changes in Emacs 30.1
|
||||
|
||||
+++
|
||||
** Emacs now has better support for touchscreen events.
|
||||
Many touch screen gestures are now implemented, as is support for
|
||||
tapping buttons and opening menus.
|
||||
|
||||
|
||||
---
|
||||
** New command 'kill-matching-buffers-no-ask'.
|
||||
Kills buffers whose name matches a regexp without asking for
|
||||
This works like 'kill-matching-buffers', but without asking for
|
||||
confirmation.
|
||||
|
||||
+++
|
||||
** New helper variable 'transpose-sexps-function'.
|
||||
Emacs now can set this variable to customize the behavior of the
|
||||
'transpose-sexps' function.
|
||||
|
||||
+++
|
||||
** New function 'transpose-sexps-default-function'.
|
||||
The previous implementation is moved into its own function, to be
|
||||
bound by 'transpose-sexps-function'.
|
||||
|
@ -191,6 +196,13 @@ activate this behavior.
|
|||
|
||||
* New Modes and Packages in Emacs 30.1
|
||||
|
||||
** New major modes based on the tree-sitter library.
|
||||
|
||||
+++
|
||||
*** New major mode 'html-ts-mode'.
|
||||
An optional major mode based on the tree-sitter library for editing
|
||||
HTML files.
|
||||
|
||||
---
|
||||
** The highly accessible Modus themes collection has six items.
|
||||
The 'modus-operandi' and 'modus-vivendi' are the main themes that have
|
||||
|
|
|
@ -7100,10 +7100,11 @@ specifies the list of buffers to kill, asking for approval for each one."
|
|||
(setq list (cdr list))))
|
||||
|
||||
(defun kill-matching-buffers (regexp &optional internal-too no-ask)
|
||||
"Kill buffers whose name matches the specified REGEXP.
|
||||
Ignores buffers whose name starts with a space, unless optional
|
||||
prefix argument INTERNAL-TOO is non-nil. Asks before killing
|
||||
each buffer, unless NO-ASK is non-nil."
|
||||
"Kill buffers whose names match the regular expression REGEXP.
|
||||
Interactively, prompt for REGEXP.
|
||||
Ignores buffers whose names start with a space, unless optional
|
||||
prefix argument INTERNAL-TOO(interactively, the prefix argument)
|
||||
is non-nil. Asks before killing each buffer, unless NO-ASK is non-nil."
|
||||
(interactive "sKill buffers matching this regular expression: \nP")
|
||||
(dolist (buffer (buffer-list))
|
||||
(let ((name (buffer-name buffer)))
|
||||
|
@ -7113,11 +7114,13 @@ each buffer, unless NO-ASK is non-nil."
|
|||
(funcall (if no-ask 'kill-buffer 'kill-buffer-ask) buffer)))))
|
||||
|
||||
(defun kill-matching-buffers-no-ask (regexp &optional internal-too)
|
||||
"Kill buffers whose name matches the specified REGEXP.
|
||||
Ignores buffers whose name starts with a space, unless optional
|
||||
prefix argument INTERNAL-TOO is non-nil. Equivalent to
|
||||
`kill-matching-buffers' but never ask before killing each
|
||||
buffer."
|
||||
"Kill buffers whose names match the regular expression REGEXP.
|
||||
Interactively, prompt for REGEXP.
|
||||
Like `kill-matching-buffers', but doesn't ask for confirmation
|
||||
before killing each buffer.
|
||||
Ignores buffers whose names start with a space, unless the
|
||||
optional argument INTERNAL-TOO (interactively, the prefix argument)
|
||||
is non-nil."
|
||||
(interactive "sKill buffers matching this regular expression: \nP")
|
||||
(kill-matching-buffers regexp internal-too t))
|
||||
|
||||
|
|
|
@ -228,7 +228,7 @@ NODE should be a labeled_statement."
|
|||
(defvar c-ts-mode-indent-block-type-regexp
|
||||
(rx (or "compound_statement"
|
||||
"field_declaration_list"
|
||||
"enumeratior_list"))
|
||||
"enumerator_list"))
|
||||
"Regexp matching types of block nodes (i.e., {} blocks).")
|
||||
|
||||
(defun c-ts-mode--statement-offset (node parent &rest _)
|
||||
|
|
137
lisp/textmodes/html-ts-mode.el
Normal file
137
lisp/textmodes/html-ts-mode.el
Normal file
|
@ -0,0 +1,137 @@
|
|||
;;; html-ts-mode.el --- tree-sitter support for HTML -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
|
||||
;; Author : Theodor Thornhill <theo@thornhill.no>
|
||||
;; Maintainer : Theodor Thornhill <theo@thornhill.no>
|
||||
;; Created : January 2023
|
||||
;; Keywords : html languages tree-sitter
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
;; GNU Emacs 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.
|
||||
|
||||
;; GNU Emacs 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 GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
;;
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'treesit)
|
||||
(require 'sgml-mode)
|
||||
|
||||
(declare-function treesit-parser-create "treesit.c")
|
||||
(declare-function treesit-node-type "treesit.c")
|
||||
|
||||
(defcustom html-ts-mode-indent-offset 2
|
||||
"Number of spaces for each indentation step in `html-ts-mode'."
|
||||
:version "29.1"
|
||||
:type 'integer
|
||||
:safe 'integerp
|
||||
:group 'html)
|
||||
|
||||
(defvar html-ts-mode--indent-rules
|
||||
`((html
|
||||
((parent-is "fragment") point-min 0)
|
||||
((node-is "/>") parent-bol 0)
|
||||
((node-is ">") parent-bol 0)
|
||||
((node-is "end_tag") parent-bol 0)
|
||||
((parent-is "comment") prev-adaptive-prefix 0)
|
||||
((parent-is "element") parent-bol html-ts-mode-indent-offset)
|
||||
((parent-is "script_element") parent-bol html-ts-mode-indent-offset)
|
||||
((parent-is "style_element") parent-bol html-ts-mode-indent-offset)
|
||||
((parent-is "start_tag") parent-bol html-ts-mode-indent-offset)
|
||||
((parent-is "self_closing_tag") parent-bol html-ts-mode-indent-offset)))
|
||||
"Tree-sitter indent rules.")
|
||||
|
||||
(defvar html-ts-mode--font-lock-settings
|
||||
(treesit-font-lock-rules
|
||||
:language 'html
|
||||
:override t
|
||||
:feature 'comment
|
||||
`((comment) @font-lock-comment-face)
|
||||
:language 'html
|
||||
:override t
|
||||
:feature 'keyword
|
||||
`("doctype" @font-lock-keyword-face)
|
||||
:language 'html
|
||||
:override t
|
||||
:feature 'definition
|
||||
`((tag_name) @font-lock-function-name-face)
|
||||
:language 'html
|
||||
:override t
|
||||
:feature 'string
|
||||
`((quoted_attribute_value) @font-lock-string-face)
|
||||
:language 'html
|
||||
:override t
|
||||
:feature 'property
|
||||
`((attribute_name) @font-lock-variable-name-face))
|
||||
"Tree-sitter font-lock settings for `html-ts-mode'.")
|
||||
|
||||
(defun html-ts-mode--defun-name (node)
|
||||
"Return the defun name of NODE.
|
||||
Return nil if there is no name or if NODE is not a defun node."
|
||||
(when (equal (treesit-node-type node) "tag_name")
|
||||
(treesit-node-text node t)))
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode html-ts-mode html-mode "HTML"
|
||||
"Major mode for editing Html, powered by tree-sitter."
|
||||
:group 'html
|
||||
|
||||
(unless (treesit-ready-p 'html)
|
||||
(error "Tree-sitter for HTML isn't available"))
|
||||
|
||||
(treesit-parser-create 'html)
|
||||
|
||||
;; Comments.
|
||||
(setq-local treesit-text-type-regexp
|
||||
(regexp-opt '("comment" "text")))
|
||||
|
||||
;; Indent.
|
||||
(setq-local treesit-simple-indent-rules html-ts-mode--indent-rules)
|
||||
|
||||
;; Navigation.
|
||||
(setq-local treesit-defun-type-regexp "element")
|
||||
|
||||
(setq-local treesit-defun-name-function #'html-ts-mode--defun-name)
|
||||
|
||||
(setq-local treesit-sentence-type-regexp
|
||||
(regexp-opt '("start_tag"
|
||||
"self_closing_tag"
|
||||
"end_tag")))
|
||||
|
||||
(setq-local treesit-sexp-type-regexp
|
||||
(regexp-opt '("tag"
|
||||
"text"
|
||||
"attribute"
|
||||
"value")))
|
||||
|
||||
;; Font-lock.
|
||||
(setq-local treesit-font-lock-settings html-ts-mode--font-lock-settings)
|
||||
(setq-local treesit-font-lock-feature-list
|
||||
'((comment keyword definition)
|
||||
(property string)
|
||||
() ()))
|
||||
|
||||
;; Imenu.
|
||||
(setq-local treesit-simple-imenu-settings
|
||||
'(("Element" "\\`tag_name\\'" nil nil)))
|
||||
(treesit-major-mode-setup))
|
||||
|
||||
(if (treesit-ready-p 'html)
|
||||
(add-to-list 'auto-mode-alist '("\\.html\\'" . html-ts-mode)))
|
||||
|
||||
(provide 'html-ts-mode)
|
||||
|
||||
;;; html-ts-mode.el ends here
|
|
@ -83,7 +83,7 @@
|
|||
'("zero" "two" "four"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-indices-subcommand ()
|
||||
"Interpolate list variable with subcommand expansion for indices"
|
||||
"Interpolate list variable with subcommand expansion for indices."
|
||||
(skip-unless (executable-find "echo"))
|
||||
(let ((eshell-test-value '("zero" "one" "two" "three" "four")))
|
||||
(eshell-command-result-equal
|
||||
|
@ -94,7 +94,7 @@
|
|||
'("zero" "two"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-split-indices ()
|
||||
"Interpolate string variable with indices"
|
||||
"Interpolate string variable with indices."
|
||||
(let ((eshell-test-value "zero one two three four"))
|
||||
(eshell-command-result-equal "echo $eshell-test-value[0]"
|
||||
"zero")
|
||||
|
@ -104,7 +104,7 @@
|
|||
'("zero" "two" "four"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-string-split-indices ()
|
||||
"Interpolate string variable with string splitter and indices"
|
||||
"Interpolate string variable with string splitter and indices."
|
||||
(let ((eshell-test-value "zero:one:two:three:four"))
|
||||
(eshell-command-result-equal "echo $eshell-test-value[: 0]"
|
||||
"zero")
|
||||
|
@ -117,7 +117,7 @@
|
|||
'("zero" "two"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-regexp-split-indices ()
|
||||
"Interpolate string variable with regexp splitter and indices"
|
||||
"Interpolate string variable with regexp splitter and indices."
|
||||
(let ((eshell-test-value "zero:one!two:three!four"))
|
||||
(eshell-command-result-equal "echo $eshell-test-value['[:!]' 0]"
|
||||
"zero")
|
||||
|
@ -129,7 +129,7 @@
|
|||
'("zero" "two"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-assoc ()
|
||||
"Interpolate alist variable with index"
|
||||
"Interpolate alist variable with index."
|
||||
(let ((eshell-test-value '(("foo" . 1) (bar . 2))))
|
||||
(eshell-command-result-equal "echo $eshell-test-value[foo]"
|
||||
1)
|
||||
|
@ -137,7 +137,7 @@
|
|||
2)))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-length-list ()
|
||||
"Interpolate length of list variable"
|
||||
"Interpolate length of list variable."
|
||||
(let ((eshell-test-value '((1 2) (3) (5 (6 7 8 9)))))
|
||||
(eshell-command-result-equal "echo $#eshell-test-value" 3)
|
||||
(eshell-command-result-equal "echo $#eshell-test-value[1]" 1)
|
||||
|
@ -149,19 +149,19 @@
|
|||
(eshell-command-result-equal "echo $#eshell-test-value" 6)))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-length-alist ()
|
||||
"Interpolate length of alist variable"
|
||||
"Interpolate length of alist variable."
|
||||
(let ((eshell-test-value '(("foo" . (1 2 3)))))
|
||||
(eshell-command-result-equal "echo $#eshell-test-value" 1)
|
||||
(eshell-command-result-equal "echo $#eshell-test-value[foo]" 3)))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-splice ()
|
||||
"Splice-interpolate list variable"
|
||||
"Splice-interpolate list variable."
|
||||
(let ((eshell-test-value '(1 2 3)))
|
||||
(eshell-command-result-equal "echo a $@eshell-test-value z"
|
||||
'("a" 1 2 3 "z"))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-var-splice-concat ()
|
||||
"Splice-interpolate and concat list variable"
|
||||
"Splice-interpolate and concat list variable."
|
||||
(let ((eshell-test-value '(1 2 3)))
|
||||
(eshell-command-result-equal "echo it is a$@'eshell-test-value'z"
|
||||
'("it" "is" "a1" 2 "3z"))
|
||||
|
@ -175,49 +175,49 @@
|
|||
'("it" "is" 1 2 (31 2 3)))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-lisp ()
|
||||
"Interpolate Lisp form evaluation"
|
||||
"Interpolate Lisp form evaluation."
|
||||
(eshell-command-result-equal "+ $(+ 1 2) 3" 6))
|
||||
|
||||
(ert-deftest esh-var-test/interp-lisp-indices ()
|
||||
"Interpolate Lisp form evaluation with index"
|
||||
"Interpolate Lisp form evaluation with index."
|
||||
(eshell-command-result-equal "+ $(list 1 2)[1] 3" 5))
|
||||
|
||||
(ert-deftest esh-var-test/interp-cmd ()
|
||||
"Interpolate command result"
|
||||
"Interpolate command result."
|
||||
(eshell-command-result-equal "+ ${+ 1 2} 3" 6))
|
||||
|
||||
(ert-deftest esh-var-test/interp-cmd-indices ()
|
||||
"Interpolate command result with index"
|
||||
"Interpolate command result with index."
|
||||
(eshell-command-result-equal "+ ${listify 1 2}[1] 3" 5))
|
||||
|
||||
(ert-deftest esh-var-test/interp-cmd-external ()
|
||||
"Interpolate command result from external command"
|
||||
"Interpolate command result from external command."
|
||||
(skip-unless (executable-find "echo"))
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "echo ${*echo hi}"
|
||||
"hi\n")))
|
||||
|
||||
(ert-deftest esh-var-test/interp-cmd-external-indices ()
|
||||
"Interpolate command result from external command with index"
|
||||
"Interpolate command result from external command with index."
|
||||
(skip-unless (executable-find "echo"))
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "echo ${*echo \"hi\nbye\"}[1]"
|
||||
"bye\n")))
|
||||
|
||||
(ert-deftest esh-var-test/interp-temp-cmd ()
|
||||
"Interpolate command result redirected to temp file"
|
||||
"Interpolate command result redirected to temp file."
|
||||
(eshell-command-result-equal "cat $<echo hi>" "hi"))
|
||||
|
||||
(ert-deftest esh-var-test/interp-concat-lisp ()
|
||||
"Interpolate and concat Lisp form"
|
||||
"Interpolate and concat Lisp form."
|
||||
(eshell-command-result-equal "+ $(+ 1 2)3 3" 36))
|
||||
|
||||
(ert-deftest esh-var-test/interp-concat-lisp2 ()
|
||||
"Interpolate and concat two Lisp forms"
|
||||
"Interpolate and concat two Lisp forms."
|
||||
(eshell-command-result-equal "+ $(+ 1 2)$(+ 1 2) 3" 36))
|
||||
|
||||
(ert-deftest esh-var-test/interp-concat-cmd ()
|
||||
"Interpolate and concat command with literal"
|
||||
"Interpolate and concat command with literal."
|
||||
(eshell-command-result-equal "+ ${+ 1 2}3 3" 36)
|
||||
(eshell-command-result-equal "echo ${*echo \"foo\nbar\"}-baz"
|
||||
'("foo" "bar-baz"))
|
||||
|
@ -230,11 +230,11 @@
|
|||
'("hi" "23")))
|
||||
|
||||
(ert-deftest esh-var-test/interp-concat-cmd2 ()
|
||||
"Interpolate and concat two commands"
|
||||
"Interpolate and concat two commands."
|
||||
(eshell-command-result-equal "+ ${+ 1 2}${+ 1 2} 3" 36))
|
||||
|
||||
(ert-deftest esh-var-test/interp-concat-cmd-external ()
|
||||
"Interpolate command result from external command with concatenation"
|
||||
"Interpolate command result from external command with concatenation."
|
||||
(skip-unless (executable-find "echo"))
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "echo ${echo hi}-${*echo there}"
|
||||
|
@ -244,7 +244,7 @@
|
|||
;; Quoted variable interpolation
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var ()
|
||||
"Interpolate variable inside double-quotes"
|
||||
"Interpolate variable inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"$user-login-name\""
|
||||
user-login-name))
|
||||
|
||||
|
@ -256,7 +256,7 @@
|
|||
(concat "hi, " user-login-name)))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-list-var ()
|
||||
"Interpolate list variable inside double-quotes"
|
||||
"Interpolate list variable inside double-quotes."
|
||||
(let ((eshell-test-value '(1 2 3)))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value\""
|
||||
"(1 2 3)")))
|
||||
|
@ -268,7 +268,7 @@
|
|||
"a(1 2 3)z")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-indices ()
|
||||
"Interpolate string variable with indices inside double-quotes"
|
||||
"Interpolate string variable with indices inside double-quotes."
|
||||
(let ((eshell-test-value '("zero" "one" "two" "three" "four")))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[0]\""
|
||||
"zero")
|
||||
|
@ -283,8 +283,7 @@
|
|||
"(\"one\" \"two\" \"four\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quote-interp-var-indices-subcommand ()
|
||||
"Interpolate list variable with subcommand expansion for indices
|
||||
inside double-quotes"
|
||||
"Interpolate list variable with subcommand expansion for indices inside double-quotes."
|
||||
(skip-unless (executable-find "echo"))
|
||||
(let ((eshell-test-value '("zero" "one" "two" "three" "four")))
|
||||
(eshell-command-result-equal
|
||||
|
@ -297,7 +296,7 @@ inside double-quotes"
|
|||
"(\"one\" \"two\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-split-indices ()
|
||||
"Interpolate string variable with indices inside double-quotes"
|
||||
"Interpolate string variable with indices inside double-quotes."
|
||||
(let ((eshell-test-value "zero one two three four"))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[0]\""
|
||||
"zero")
|
||||
|
@ -305,8 +304,7 @@ inside double-quotes"
|
|||
"(\"zero\" \"two\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-string-split-indices ()
|
||||
"Interpolate string variable with string splitter and indices
|
||||
inside double-quotes"
|
||||
"Interpolate string variable with string splitter and indices inside double-quotes."
|
||||
(let ((eshell-test-value "zero:one:two:three:four"))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[: 0]\""
|
||||
"zero")
|
||||
|
@ -319,7 +317,7 @@ inside double-quotes"
|
|||
"(\"zero\" \"two\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-regexp-split-indices ()
|
||||
"Interpolate string variable with regexp splitter and indices"
|
||||
"Interpolate string variable with regexp splitter and indices."
|
||||
(let ((eshell-test-value "zero:one!two:three!four"))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value['[:!]' 0]\""
|
||||
"zero")
|
||||
|
@ -332,7 +330,7 @@ inside double-quotes"
|
|||
"(\"zero\" \"two\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-assoc ()
|
||||
"Interpolate alist variable with index inside double-quotes"
|
||||
"Interpolate alist variable with index inside double-quotes."
|
||||
(let ((eshell-test-value '(("foo" . 1) (bar . 2))))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[foo]\""
|
||||
"1")
|
||||
|
@ -340,7 +338,7 @@ inside double-quotes"
|
|||
"2")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-length-list ()
|
||||
"Interpolate length of list variable inside double-quotes"
|
||||
"Interpolate length of list variable inside double-quotes."
|
||||
(let ((eshell-test-value '((1 2) (3) (5 (6 7 8 9)))))
|
||||
(eshell-command-result-equal "echo \"$#eshell-test-value\""
|
||||
"3")
|
||||
|
@ -350,13 +348,13 @@ inside double-quotes"
|
|||
"4")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-length-string ()
|
||||
"Interpolate length of string variable inside double-quotes"
|
||||
"Interpolate length of string variable inside double-quotes."
|
||||
(let ((eshell-test-value "foobar"))
|
||||
(eshell-command-result-equal "echo \"$#eshell-test-value\""
|
||||
"6")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-length-alist ()
|
||||
"Interpolate length of alist variable inside double-quotes"
|
||||
"Interpolate length of alist variable inside double-quotes."
|
||||
(let ((eshell-test-value '(("foo" . (1 2 3)))))
|
||||
(eshell-command-result-equal "echo \"$#eshell-test-value\""
|
||||
"1")
|
||||
|
@ -364,7 +362,7 @@ inside double-quotes"
|
|||
"3")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-var-splice ()
|
||||
"Splice-interpolate list variable inside double-quotes"
|
||||
"Splice-interpolate list variable inside double-quotes."
|
||||
(let ((eshell-test-value '(1 2 3)))
|
||||
(eshell-command-result-equal "echo a \"$@eshell-test-value\" z"
|
||||
'("a" "1 2 3" "z"))))
|
||||
|
@ -376,27 +374,27 @@ inside double-quotes"
|
|||
"a1 2 3z")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-lisp ()
|
||||
"Interpolate Lisp form evaluation inside double-quotes"
|
||||
"Interpolate Lisp form evaluation inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"hi $(concat \\\"the\\\" \\\"re\\\")\""
|
||||
"hi there"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-lisp-indices ()
|
||||
"Interpolate Lisp form evaluation with index"
|
||||
"Interpolate Lisp form evaluation with index."
|
||||
(eshell-command-result-equal "concat \"$(list 1 2)[1]\" cool"
|
||||
"2cool"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-cmd ()
|
||||
"Interpolate command result inside double-quotes"
|
||||
"Interpolate command result inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"hi ${echo \\\"there\\\"}\""
|
||||
"hi there"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-cmd-indices ()
|
||||
"Interpolate command result with index inside double-quotes"
|
||||
"Interpolate command result with index inside double-quotes."
|
||||
(eshell-command-result-equal "concat \"${listify 1 2}[1]\" cool"
|
||||
"2cool"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-temp-cmd ()
|
||||
"Interpolate command result redirected to temp file inside double-quotes"
|
||||
"Interpolate command result redirected to temp file inside double-quotes."
|
||||
(let ((temporary-file-directory
|
||||
(file-name-as-directory (make-temp-file "esh-vars-tests" t))))
|
||||
(unwind-protect
|
||||
|
@ -404,7 +402,7 @@ inside double-quotes"
|
|||
(delete-directory temporary-file-directory t))))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-concat-cmd ()
|
||||
"Interpolate and concat command with literal"
|
||||
"Interpolate and concat command with literal."
|
||||
(eshell-command-result-equal "echo \"${echo \\\"foo\nbar\\\"} baz\""
|
||||
"foo\nbar baz"))
|
||||
|
||||
|
@ -412,13 +410,13 @@ inside double-quotes"
|
|||
;; Interpolating commands
|
||||
|
||||
(ert-deftest esh-var-test/command-interp ()
|
||||
"Interpolate a variable as a command name"
|
||||
"Interpolate a variable as a command name."
|
||||
(let ((eshell-test-value "printnl"))
|
||||
(eshell-command-result-equal "$eshell-test-value hello there"
|
||||
"hello\nthere\n")))
|
||||
|
||||
(ert-deftest esh-var-test/command-interp-splice ()
|
||||
"Interpolate a splice variable as a command name with arguments"
|
||||
"Interpolate a splice variable as a command name with arguments."
|
||||
(let ((eshell-test-value '("printnl" "hello" "there")))
|
||||
(eshell-command-result-equal "$@eshell-test-value"
|
||||
"hello\nthere\n")))
|
||||
|
@ -427,13 +425,13 @@ inside double-quotes"
|
|||
;; Interpolated variable conversion
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-var-number ()
|
||||
"Interpolate numeric variable"
|
||||
"Interpolate numeric variable."
|
||||
(let ((eshell-test-value 123))
|
||||
(eshell-command-result-equal "type-of $eshell-test-value"
|
||||
'integer)))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-var-split-indices ()
|
||||
"Interpolate and convert string variable with indices"
|
||||
"Interpolate and convert string variable with indices."
|
||||
;; Check that numeric forms are converted to numbers.
|
||||
(let ((eshell-test-value "000 010 020 030 040"))
|
||||
(eshell-command-result-equal "echo $eshell-test-value[0]"
|
||||
|
@ -448,7 +446,7 @@ inside double-quotes"
|
|||
"baz\n")))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-quoted-var-number ()
|
||||
"Interpolate numeric quoted numeric variable"
|
||||
"Interpolate numeric quoted numeric variable."
|
||||
(let ((eshell-test-value 123))
|
||||
(eshell-command-result-equal "type-of $'eshell-test-value'"
|
||||
'integer)
|
||||
|
@ -456,7 +454,7 @@ inside double-quotes"
|
|||
'integer)))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-quoted-var-split-indices ()
|
||||
"Interpolate and convert quoted string variable with indices"
|
||||
"Interpolate and convert quoted string variable with indices."
|
||||
(let ((eshell-test-value "000 010 020 030 040"))
|
||||
(eshell-command-result-equal "echo $'eshell-test-value'[0]"
|
||||
0)
|
||||
|
@ -464,11 +462,11 @@ inside double-quotes"
|
|||
'(0 20))))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-cmd-string-newline ()
|
||||
"Interpolate trailing-newline command result"
|
||||
"Interpolate trailing-newline command result."
|
||||
(eshell-command-result-equal "echo ${echo \"foo\n\"}" "foo"))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-cmd-multiline ()
|
||||
"Interpolate multi-line command result"
|
||||
"Interpolate multi-line command result."
|
||||
(eshell-command-result-equal "echo ${echo \"foo\nbar\"}"
|
||||
'("foo" "bar"))
|
||||
;; Numeric output should be converted to numbers...
|
||||
|
@ -479,24 +477,24 @@ inside double-quotes"
|
|||
'("01" "02" "hi")))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-cmd-number ()
|
||||
"Interpolate numeric command result"
|
||||
"Interpolate numeric command result."
|
||||
(eshell-command-result-equal "echo ${echo \"1\"}" 1))
|
||||
|
||||
(ert-deftest esh-var-test/interp-convert-cmd-split-indices ()
|
||||
"Interpolate command result with indices"
|
||||
"Interpolate command result with indices."
|
||||
(eshell-command-result-equal "echo ${echo \"000 010 020\"}[0]"
|
||||
0)
|
||||
(eshell-command-result-equal "echo ${echo \"000 010 020\"}[0 2]"
|
||||
'(0 20)))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-var-number ()
|
||||
"Interpolate numeric variable inside double-quotes"
|
||||
"Interpolate numeric variable inside double-quotes."
|
||||
(let ((eshell-test-value 123))
|
||||
(eshell-command-result-equal "type-of \"$eshell-test-value\""
|
||||
'string)))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-var-split-indices ()
|
||||
"Interpolate string variable with indices inside double-quotes"
|
||||
"Interpolate string variable with indices inside double-quotes."
|
||||
(let ((eshell-test-value "000 010 020 030 040"))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[0]\""
|
||||
"000")
|
||||
|
@ -504,7 +502,7 @@ inside double-quotes"
|
|||
"(\"000\" \"020\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-quoted-var-number ()
|
||||
"Interpolate numeric quoted variable inside double-quotes"
|
||||
"Interpolate numeric quoted variable inside double-quotes."
|
||||
(let ((eshell-test-value 123))
|
||||
(eshell-command-result-equal "type-of \"$'eshell-test-value'\""
|
||||
'string)
|
||||
|
@ -512,7 +510,7 @@ inside double-quotes"
|
|||
'string)))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-quoted-var-split-indices ()
|
||||
"Interpolate quoted string variable with indices inside double-quotes"
|
||||
"Interpolate quoted string variable with indices inside double-quotes."
|
||||
(let ((eshell-test-value "000 010 020 030 040"))
|
||||
(eshell-command-result-equal "echo \"$eshell-test-value[0]\""
|
||||
"000")
|
||||
|
@ -520,23 +518,23 @@ inside double-quotes"
|
|||
"(\"000\" \"020\")")))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-cmd-string-newline ()
|
||||
"Interpolate trailing-newline command result inside double-quotes"
|
||||
"Interpolate trailing-newline command result inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"${echo \\\"foo\n\\\"}\""
|
||||
"foo")
|
||||
(eshell-command-result-equal "echo \"${echo \\\"foo\n\n\\\"}\""
|
||||
"foo"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-cmd-multiline ()
|
||||
"Interpolate multi-line command result inside double-quotes"
|
||||
"Interpolate multi-line command result inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"${echo \\\"foo\nbar\\\"}\""
|
||||
"foo\nbar"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-cmd-number ()
|
||||
"Interpolate numeric command result inside double-quotes"
|
||||
"Interpolate numeric command result inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"${echo \\\"1\\\"}\"" "1"))
|
||||
|
||||
(ert-deftest esh-var-test/quoted-interp-convert-cmd-split-indices ()
|
||||
"Interpolate command result with indices inside double-quotes"
|
||||
"Interpolate command result with indices inside double-quotes."
|
||||
(eshell-command-result-equal "echo \"${echo \\\"000 010 020\\\"}[0]\""
|
||||
"000"))
|
||||
|
||||
|
@ -695,19 +693,19 @@ it, since the setter is nil."
|
|||
(window-body-height nil 'remap)))
|
||||
|
||||
(ert-deftest esh-var-test/columns-var ()
|
||||
"$COLUMNS should equal (window-body-width nil 'remap)"
|
||||
"$COLUMNS should equal (window-body-width nil 'remap)."
|
||||
(eshell-command-result-equal "echo $COLUMNS"
|
||||
(window-body-width nil 'remap)))
|
||||
|
||||
(ert-deftest esh-var-test/inside-emacs-var ()
|
||||
"Test presence of \"INSIDE_EMACS\" in subprocesses"
|
||||
"Test presence of \"INSIDE_EMACS\" in subprocesses."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "env"
|
||||
(format "INSIDE_EMACS=%s,eshell"
|
||||
emacs-version))))
|
||||
|
||||
(ert-deftest esh-var-test/inside-emacs-var-split-indices ()
|
||||
"Test using \"INSIDE_EMACS\" with split indices"
|
||||
"Test using \"INSIDE_EMACS\" with split indices."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "echo $INSIDE_EMACS[, 1]"
|
||||
"eshell")))
|
||||
|
@ -776,7 +774,7 @@ it, since the setter is nil."
|
|||
(eshell-command-result-equal "echo $UID" (user-uid)))
|
||||
|
||||
(ert-deftest esh-var-test/last-status-var-lisp-command ()
|
||||
"Test using the \"last exit status\" ($?) variable with a Lisp command"
|
||||
"Test using the \"last exit status\" ($?) variable with a Lisp command."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "zerop 0; echo $?"
|
||||
"t\n0\n")
|
||||
|
@ -786,7 +784,7 @@ it, since the setter is nil."
|
|||
"1\n" nil t)))
|
||||
|
||||
(ert-deftest esh-var-test/last-status-var-lisp-form ()
|
||||
"Test using the \"last exit status\" ($?) variable with a Lisp form"
|
||||
"Test using the \"last exit status\" ($?) variable with a Lisp form."
|
||||
(let ((eshell-lisp-form-nil-is-failure t))
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "(zerop 0); echo $?"
|
||||
|
@ -809,7 +807,7 @@ This tests when `eshell-lisp-form-nil-is-failure' is nil."
|
|||
"1\n" nil t))))
|
||||
|
||||
(ert-deftest esh-var-test/last-status-var-ext-cmd ()
|
||||
"Test using the \"last exit status\" ($?) variable with an external command"
|
||||
"Test using the \"last exit status\" ($?) variable with an external command."
|
||||
(skip-unless (executable-find "["))
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "[ foo = foo ]; echo $?"
|
||||
|
@ -818,19 +816,19 @@ This tests when `eshell-lisp-form-nil-is-failure' is nil."
|
|||
"1\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-result-var ()
|
||||
"Test using the \"last result\" ($$) variable"
|
||||
"Test using the \"last result\" ($$) variable."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "+ 1 2; + $$ 2"
|
||||
"3\n5\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-result-var-twice ()
|
||||
"Test using the \"last result\" ($$) variable twice"
|
||||
"Test using the \"last result\" ($$) variable twice."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "+ 1 2; + $$ $$"
|
||||
"3\n6\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-result-var-ext-cmd ()
|
||||
"Test using the \"last result\" ($$) variable with an external command"
|
||||
"Test using the \"last result\" ($$) variable with an external command."
|
||||
(skip-unless (executable-find "["))
|
||||
(with-temp-eshell
|
||||
;; MS-DOS/MS-Windows have an external command 'format', which we
|
||||
|
@ -842,7 +840,7 @@ This tests when `eshell-lisp-form-nil-is-failure' is nil."
|
|||
"nil\n"))))
|
||||
|
||||
(ert-deftest esh-var-test/last-result-var-split-indices ()
|
||||
"Test using the \"last result\" ($$) variable with split indices"
|
||||
"Test using the \"last result\" ($$) variable with split indices."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output
|
||||
"string-join (list \"01\" \"02\") :; + $$[: 1] 3"
|
||||
|
@ -852,13 +850,13 @@ This tests when `eshell-lisp-form-nil-is-failure' is nil."
|
|||
"01:02\n02\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-arg-var ()
|
||||
"Test using the \"last arg\" ($_) variable"
|
||||
"Test using the \"last arg\" ($_) variable."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "+ 1 2; + $_ 4"
|
||||
"3\n6\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-arg-var-indices ()
|
||||
"Test using the \"last arg\" ($_) variable with indices"
|
||||
"Test using the \"last arg\" ($_) variable with indices."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "+ 1 2; + $_[0] 4"
|
||||
"3\n5\n")
|
||||
|
@ -866,7 +864,7 @@ This tests when `eshell-lisp-form-nil-is-failure' is nil."
|
|||
"3\n6\n")))
|
||||
|
||||
(ert-deftest esh-var-test/last-arg-var-split-indices ()
|
||||
"Test using the \"last arg\" ($_) variable with split indices"
|
||||
"Test using the \"last arg\" ($_) variable with split indices."
|
||||
(with-temp-eshell
|
||||
(eshell-match-command-output "concat 01:02 03:04; + $_[0][: 1] 5"
|
||||
"01:0203:04\n7\n")
|
||||
|
|
Loading…
Add table
Reference in a new issue