Various improvements to lua-ts-mode (Bug#66159)
* lisp/progmodes/lua-ts-mode.el (lua-ts-mode): Improve movement. (lua-ts--simple-indent-rules): Improve indentation rules. (lua-ts-mode-map): Add key bindings and menus. (lua-ts-mode-hook): Make hook available in Customize. (lua-ts-inferior-history, lua-ts-inferior--write-history): Add option to read/write an input history file. (lua-ts-inferior-lua, lua-ts-send-buffer, lua-ts-send-file) (lua-ts-send-region, lua-ts-inferior-prompt) (lua-ts-inferior-prompt-continue): Support for sending buffer, file or region to the inferior process. (lua-ts-show-process-buffer, lua-ts-hide-process-buffer) (lua-ts-kill-process): New functions. (lua-ts-inferior-prompt-regexp): Remove option. * test/lisp/progmodes/lua-ts-mode-resources/indent.erts: * test/lisp/progmodes/lua-ts-mode-resources/movement.erts: Add tests.
This commit is contained in:
parent
731dd5f92e
commit
1c261e0a6c
3 changed files with 1068 additions and 221 deletions
|
@ -38,7 +38,12 @@
|
|||
(require 'cl-lib)
|
||||
(require 'rx))
|
||||
|
||||
(declare-function treesit-induce-sparse-tree "treesit.c")
|
||||
(declare-function treesit-node-child-by-field-name "treesit.c")
|
||||
(declare-function treesit-node-child-count "treesit.c")
|
||||
(declare-function treesit-node-first-child-for-pos "treesit.c")
|
||||
(declare-function treesit-node-parent "treesit.c")
|
||||
(declare-function treesit-node-start "treesit.c")
|
||||
(declare-function treesit-node-type "treesit.c")
|
||||
(declare-function treesit-parser-create "treesit.c")
|
||||
(declare-function treesit-search-subtree "treesit.c")
|
||||
|
@ -48,6 +53,15 @@
|
|||
:prefix "lua-ts-"
|
||||
:group 'languages)
|
||||
|
||||
(defcustom lua-ts-mode-hook nil
|
||||
"Hook run after entering `lua-ts-mode'."
|
||||
:type 'hook
|
||||
:options '(flymake-mode
|
||||
hs-minor-mode
|
||||
outline-minor-mode)
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
(defcustom lua-ts-indent-offset 4
|
||||
"Number of spaces for each indentation step in `lua-ts-mode'."
|
||||
:type 'natnum
|
||||
|
@ -57,7 +71,7 @@
|
|||
|
||||
(defcustom lua-ts-luacheck-program "luacheck"
|
||||
"Location of the Luacheck program."
|
||||
:type '(choice (const nil) string)
|
||||
:type '(choice (const :tag "None" nil) string)
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
|
@ -70,7 +84,7 @@
|
|||
|
||||
(defcustom lua-ts-inferior-program "lua"
|
||||
"Program to run in the inferior Lua process."
|
||||
:type '(choice (const nil) string)
|
||||
:type '(choice (const :tag "None" nil) string)
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
|
@ -82,13 +96,28 @@
|
|||
|
||||
(defcustom lua-ts-inferior-startfile nil
|
||||
"File to load into the inferior Lua process at startup."
|
||||
:type '(choice (const nil) (file :must-match t))
|
||||
:type '(choice (const :tag "None" nil) (file :must-match t))
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
(defcustom lua-ts-inferior-prompt-regexp "^>>?[[:blank:]]"
|
||||
"Regular expression matching the prompt of the inferior Lua process."
|
||||
:type 'regexp
|
||||
(defcustom lua-ts-inferior-prompt ">"
|
||||
"Prompt used by the inferior Lua process."
|
||||
:type 'string
|
||||
:safe 'stringp
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
(defcustom lua-ts-inferior-prompt-continue ">>"
|
||||
"Continuation prompt used by the inferior Lua process."
|
||||
:type 'string
|
||||
:safe 'stringp
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
(defcustom lua-ts-inferior-history nil
|
||||
"File used to save command history of the inferior Lua process."
|
||||
:type '(choice (const :tag "None" nil) file)
|
||||
:safe 'string-or-null-p
|
||||
:group 'lua-ts
|
||||
:version "30.1")
|
||||
|
||||
|
@ -103,6 +132,12 @@
|
|||
"close" "flush" "lines" "read" "seek" "setvbuf" "write")
|
||||
"Lua built-in functions for tree-sitter font-locking.")
|
||||
|
||||
(defvar lua-ts--keywords
|
||||
'("and" "do" "else" "elseif" "end" "for" "function"
|
||||
"goto" "if" "in" "local" "not" "or" "repeat"
|
||||
"return" "then" "until" "while")
|
||||
"Lua keywords for tree-sitter font-locking and navigation.")
|
||||
|
||||
(defvar lua-ts--font-lock-settings
|
||||
(treesit-font-lock-rules
|
||||
:language 'lua
|
||||
|
@ -167,13 +202,11 @@
|
|||
|
||||
:language 'lua
|
||||
:feature 'keyword
|
||||
'((break_statement) @font-lock-keyword-face
|
||||
`((break_statement) @font-lock-keyword-face
|
||||
(true) @font-lock-constant-face
|
||||
(false) @font-lock-constant-face
|
||||
(nil) @font-lock-constant-face
|
||||
["and" "do" "else" "elseif" "end" "for" "function"
|
||||
"goto" "if" "in" "local" "not" "or" "repeat"
|
||||
"return" "then" "until" "while"]
|
||||
,(vconcat lua-ts--keywords)
|
||||
@font-lock-keyword-face)
|
||||
|
||||
:language 'lua
|
||||
|
@ -235,27 +268,145 @@
|
|||
|
||||
(defvar lua-ts--simple-indent-rules
|
||||
`((lua
|
||||
((or (node-is "comment")
|
||||
(parent-is "comment_content")
|
||||
(parent-is "string_content")
|
||||
(node-is "]]"))
|
||||
no-indent 0)
|
||||
((and (n-p-gp "field" "table_constructor" "arguments")
|
||||
lua-ts--multi-arg-function-call-matcher)
|
||||
parent lua-ts-indent-offset)
|
||||
((and (n-p-gp "}" "table_constructor" "arguments")
|
||||
lua-ts--multi-arg-function-call-matcher)
|
||||
parent 0)
|
||||
((or (node-is "do")
|
||||
(node-is "then")
|
||||
(node-is "elseif_statement")
|
||||
(node-is "else_statement")
|
||||
(node-is "until")
|
||||
(node-is ")")
|
||||
(node-is "}"))
|
||||
standalone-parent 0)
|
||||
((or (and (parent-is "arguments") lua-ts--first-child-matcher)
|
||||
(and (parent-is "parameters") lua-ts--first-child-matcher)
|
||||
(and (parent-is "table_constructor") lua-ts--first-child-matcher))
|
||||
standalone-parent lua-ts-indent-offset)
|
||||
((or (parent-is "arguments")
|
||||
(parent-is "parameters")
|
||||
(parent-is "table_constructor"))
|
||||
(nth-sibling 1) 0)
|
||||
((and (n-p-gp "block" "function_definition" "parenthesized_expression")
|
||||
lua-ts--nested-function-block-matcher
|
||||
lua-ts--nested-function-block-include-matcher)
|
||||
parent lua-ts-indent-offset)
|
||||
((and (n-p-gp "block" "function_definition" "arguments")
|
||||
lua-ts--nested-function-argument-matcher)
|
||||
parent lua-ts-indent-offset)
|
||||
((match "function_definition" "parenthesized_expression")
|
||||
standalone-parent lua-ts-indent-offset)
|
||||
((node-is "block") standalone-parent lua-ts-indent-offset)
|
||||
((parent-is "block") parent 0)
|
||||
((and (node-is "end") lua-ts--end-line-matcher)
|
||||
standalone-parent lua-ts--end-indent-offset)
|
||||
((match "end" "function_declaration") parent 0)
|
||||
((and (n-p-gp "end" "function_definition" "parenthesized_expression")
|
||||
lua-ts--nested-function-end-argument-matcher)
|
||||
parent 0)
|
||||
((and (n-p-gp "end" "function_definition" "parenthesized_expression")
|
||||
lua-ts--nested-function-block-matcher
|
||||
lua-ts--nested-function-end-matcher
|
||||
lua-ts--nested-function-last-function-matcher)
|
||||
parent 0)
|
||||
((n-p-gp "end" "function_definition" "arguments") parent 0)
|
||||
((or (match "end" "function_definition")
|
||||
(node-is "end"))
|
||||
standalone-parent 0)
|
||||
((or (parent-is "function_declaration")
|
||||
(parent-is "function_definition")
|
||||
(parent-is "do_statement")
|
||||
(parent-is "for_statement")
|
||||
(parent-is "repeat_statement")
|
||||
(parent-is "while_statement")
|
||||
(parent-is "if_statement")
|
||||
(parent-is "else_statement")
|
||||
(parent-is "elseif_statement"))
|
||||
standalone-parent lua-ts-indent-offset)
|
||||
((parent-is "chunk") column-0 0)
|
||||
((node-is "comment_end") column-0 0)
|
||||
((parent-is "block") parent-bol 0)
|
||||
((node-is "}") parent-bol 0)
|
||||
((node-is ")") parent-bol 0)
|
||||
((node-is "else_statement") parent-bol 0)
|
||||
((node-is "elseif_statement") parent-bol 0)
|
||||
((node-is "end") parent-bol 0)
|
||||
((node-is "until") parent-bol 0)
|
||||
((parent-is "for_statement") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "function_declaration") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "function_definition") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "if_statement") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "else_statement") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "repeat_statement") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "while_statement") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "table_constructor") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "arguments") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "parameters") parent-bol lua-ts-indent-offset)
|
||||
((parent-is "ERROR") no-indent 0))))
|
||||
|
||||
(defun lua-ts--end-line-matcher (&rest _)
|
||||
"Matches if there is more than one `end' on the current line."
|
||||
(> (lua-ts--end-count) 1))
|
||||
|
||||
(defun lua-ts--end-indent-offset (&rest _)
|
||||
"Calculate indent offset based on `end' count."
|
||||
(- (* (1- (lua-ts--end-count)) lua-ts-indent-offset)))
|
||||
|
||||
(defun lua-ts--end-count ()
|
||||
"Count the number of `end's on the current line."
|
||||
(count-matches "end" (line-beginning-position) (line-end-position)))
|
||||
|
||||
(defun lua-ts--first-child-matcher (node &rest _)
|
||||
"Matches if NODE is the first among its siblings."
|
||||
(= (treesit-node-index node) 1))
|
||||
|
||||
(defun lua-ts--function-definition-p (node)
|
||||
"Return t if NODE is a function_definition."
|
||||
(equal "function_definition" (treesit-node-type node)))
|
||||
|
||||
(defun lua-ts--g-g-g-parent (node)
|
||||
"Return the great-great-grand-parent of NODE."
|
||||
(let* ((parent (treesit-node-parent node))
|
||||
(g-parent (treesit-node-parent parent))
|
||||
(g-g-parent (treesit-node-parent g-parent)))
|
||||
(treesit-node-parent g-g-parent)))
|
||||
|
||||
(defun lua-ts--multi-arg-function-call-matcher (_n parent &rest _)
|
||||
"Matches if PARENT has multiple arguments."
|
||||
(> (treesit-node-child-count (treesit-node-parent parent)) 3))
|
||||
|
||||
(defun lua-ts--nested-function-argument-matcher (node &rest _)
|
||||
"Matches if NODE is in a nested function argument."
|
||||
(save-excursion
|
||||
(goto-char (treesit-node-start node))
|
||||
(treesit-beginning-of-defun)
|
||||
(backward-char 2)
|
||||
(not (looking-at ")("))))
|
||||
|
||||
(defun lua-ts--nested-function-block-matcher (node &rest _)
|
||||
"Matches if NODE is in a nested function block."
|
||||
(let* ((g-g-g-parent (lua-ts--g-g-g-parent node))
|
||||
(g-g-g-type (treesit-node-type g-g-g-parent)))
|
||||
(not (equal g-g-g-type "chunk"))))
|
||||
|
||||
(defun lua-ts--nested-function-block-include-matcher (node _p bol &rest _)
|
||||
"Matches if NODE's child at BOL is not another block."
|
||||
(let* ((child (treesit-node-first-child-for-pos node bol))
|
||||
(child-type (treesit-node-type child))
|
||||
(g-g-g-type (treesit-node-type (lua-ts--g-g-g-parent node))))
|
||||
(or (equal child-type "assignment_statement")
|
||||
(and (equal child-type "return_statement")
|
||||
(or (equal g-g-g-type "arguments")
|
||||
(and (equal g-g-g-type "expression_list")
|
||||
(not (treesit-search-subtree child "function_call"))))))))
|
||||
|
||||
(defun lua-ts--nested-function-end-matcher (node &rest _)
|
||||
"Matches if NODE is the `end' of a nested function."
|
||||
(save-excursion
|
||||
(goto-char (treesit-node-start node))
|
||||
(treesit-beginning-of-defun)
|
||||
(looking-at "function[[:space:]]*")))
|
||||
|
||||
(defun lua-ts--nested-function-end-argument-matcher (node &rest _)
|
||||
"Matches if great-great-grandparent of NODE is arguments."
|
||||
(equal "arguments" (treesit-node-type (lua-ts--g-g-g-parent node))))
|
||||
|
||||
(defun lua-ts--nested-function-last-function-matcher (_n parent &rest _)
|
||||
"Matches if PARENT is the last nested function."
|
||||
(let ((sparse-tree
|
||||
(treesit-induce-sparse-tree parent #'lua-ts--function-definition-p)))
|
||||
(= 1 (length (cadr sparse-tree)))))
|
||||
|
||||
(defvar lua-ts--syntax-table
|
||||
(let ((table (make-syntax-table)))
|
||||
(modify-syntax-entry ?+ "." table)
|
||||
|
@ -352,26 +503,126 @@ Calls REPORT-FN directly."
|
|||
(defun lua-ts-inferior-lua ()
|
||||
"Run a Lua interpreter in an inferior process."
|
||||
(interactive)
|
||||
(let* ((buffer lua-ts-inferior-buffer)
|
||||
(name (string-replace "*" "" buffer))
|
||||
(program lua-ts-inferior-program)
|
||||
(prompt-regexp lua-ts-inferior-prompt-regexp)
|
||||
(switches lua-ts-inferior-options)
|
||||
(startfile lua-ts-inferior-startfile))
|
||||
(unless (comint-check-proc buffer)
|
||||
(set-buffer (apply (function make-comint) name program startfile switches))
|
||||
(unless (comint-check-proc lua-ts-inferior-buffer)
|
||||
(apply #'make-comint-in-buffer
|
||||
(string-replace "*" "" lua-ts-inferior-buffer)
|
||||
lua-ts-inferior-buffer
|
||||
lua-ts-inferior-program
|
||||
lua-ts-inferior-startfile
|
||||
lua-ts-inferior-options)
|
||||
(when lua-ts-inferior-history
|
||||
(set-process-sentinel (get-buffer-process lua-ts-inferior-buffer)
|
||||
'lua-ts-inferior--write-history))
|
||||
(with-current-buffer lua-ts-inferior-buffer
|
||||
(setq-local comint-input-ignoredups t
|
||||
comint-input-ring-file-name lua-ts-inferior-history
|
||||
comint-use-prompt-regexp t
|
||||
comint-prompt-read-only t
|
||||
comint-prompt-regexp prompt-regexp
|
||||
comint-use-prompt-regexp t))
|
||||
(select-window (display-buffer buffer '((display-buffer-reuse-window
|
||||
display-buffer-pop-up-frame)
|
||||
(reusable-frames . t))))))
|
||||
comint-prompt-regexp (rx-to-string `(: bol
|
||||
,lua-ts-inferior-prompt
|
||||
(1+ space))))
|
||||
(comint-read-input-ring t)
|
||||
(add-hook 'comint-preoutput-filter-functions
|
||||
(lambda (string)
|
||||
(if (or (not (equal (buffer-name) lua-ts-inferior-buffer))
|
||||
(equal string
|
||||
(concat lua-ts-inferior-prompt-continue " ")))
|
||||
string
|
||||
(concat
|
||||
;; Filter out the extra prompt characters that
|
||||
;; accumulate in the output when sending regions
|
||||
;; to the inferior process.
|
||||
(replace-regexp-in-string (rx-to-string
|
||||
`(: bol
|
||||
(* ,lua-ts-inferior-prompt
|
||||
(? ,lua-ts-inferior-prompt)
|
||||
(1+ space))
|
||||
(group (* nonl))))
|
||||
"\\1" string)
|
||||
;; Re-add the prompt for the next line.
|
||||
lua-ts-inferior-prompt " "))))))
|
||||
(select-window (display-buffer lua-ts-inferior-buffer
|
||||
'((display-buffer-reuse-window
|
||||
display-buffer-pop-up-frame)
|
||||
(reusable-frames . t))))
|
||||
(get-buffer-process (current-buffer)))
|
||||
|
||||
(defun lua-ts-send-buffer ()
|
||||
"Send current buffer to the inferior Lua process."
|
||||
(interactive)
|
||||
(lua-ts-send-region (point-min) (point-max)))
|
||||
|
||||
(defun lua-ts-send-file (file)
|
||||
"Send contents of FILE to the inferior Lua process."
|
||||
(interactive "f")
|
||||
(with-temp-buffer
|
||||
(insert-file-contents-literally file)
|
||||
(lua-ts-send-region (point-min) (point-max))))
|
||||
|
||||
(defun lua-ts-send-region (beg end)
|
||||
"Send region between BEG and END to the inferior Lua process."
|
||||
(interactive "r")
|
||||
(let ((string (buffer-substring-no-properties beg end))
|
||||
(proc-buffer (lua-ts-inferior-lua)))
|
||||
(comint-send-string proc-buffer "print()") ; Prevent output from
|
||||
(comint-send-string proc-buffer "\n") ; appearing at prompt.
|
||||
(comint-send-string proc-buffer string)
|
||||
(comint-send-string proc-buffer "\n")))
|
||||
|
||||
(defun lua-ts-show-process-buffer ()
|
||||
"Show the inferior Lua process buffer."
|
||||
(interactive)
|
||||
(display-buffer lua-ts-inferior-buffer))
|
||||
|
||||
(defun lua-ts-hide-process-buffer ()
|
||||
"Hide the inferior Lua process buffer."
|
||||
(interactive)
|
||||
(delete-windows-on lua-ts-inferior-buffer))
|
||||
|
||||
(defun lua-ts-kill-process ()
|
||||
"Kill the inferior Lua process."
|
||||
(interactive)
|
||||
(with-current-buffer lua-ts-inferior-buffer
|
||||
(kill-buffer-and-window)))
|
||||
|
||||
(defun lua-ts-inferior--write-history (process _)
|
||||
"Write history file for inferior Lua PROCESS."
|
||||
;; Depending on how the process is killed the buffer may not be
|
||||
;; around anymore; e.g. `kill-buffer'.
|
||||
(when-let* ((buffer (process-buffer process))
|
||||
((buffer-live-p (process-buffer process))))
|
||||
(with-current-buffer buffer (comint-write-input-ring))))
|
||||
|
||||
(defvar lua-ts-mode-map
|
||||
(let ((map (make-sparse-keymap "Lua")))
|
||||
(define-key map "\C-c\C-n" 'lua-ts-inferior-lua)
|
||||
(define-key map "\C-c\C-c" 'lua-ts-send-buffer)
|
||||
(define-key map "\C-c\C-l" 'lua-ts-send-file)
|
||||
(define-key map "\C-c\C-r" 'lua-ts-send-region)
|
||||
map)
|
||||
"Keymap for `lua-ts-mode' buffers.")
|
||||
|
||||
(easy-menu-define lua-ts-mode-menu lua-ts-mode-map
|
||||
"Menu bar entry for `lua-ts-mode'."
|
||||
`("Lua"
|
||||
["Evaluate Buffer" lua-ts-send-buffer]
|
||||
["Evaluate File" lua-ts-send-file]
|
||||
["Evaluate Region" lua-ts-send-region]
|
||||
"--"
|
||||
["Start Process" lua-ts-inferior-lua]
|
||||
["Show Process Buffer" lua-ts-show-process-buffer]
|
||||
["Hide Process Buffer" lua-ts-hide-process-buffer]
|
||||
["Kill Process" lua-ts-kill-process]
|
||||
"--"
|
||||
["Customize" (lambda () (interactive) (customize-group "lua-ts"))]))
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode lua-ts-mode prog-mode "Lua"
|
||||
"Major mode for editing Lua files, powered by tree-sitter."
|
||||
"Major mode for editing Lua files, powered by tree-sitter.
|
||||
|
||||
\\{lua-ts-mode-map}"
|
||||
:syntax-table lua-ts--syntax-table
|
||||
(use-local-map lua-ts-mode-map)
|
||||
|
||||
(when (treesit-ready-p 'lua)
|
||||
(treesit-parser-create 'lua)
|
||||
|
@ -404,20 +655,39 @@ Calls REPORT-FN directly."
|
|||
(rx (or "function_declaration" "function_definition")))
|
||||
(setq-local treesit-thing-settings
|
||||
`((lua
|
||||
(sentence ,(rx (or "do_statement"
|
||||
"field"
|
||||
"for_statement"
|
||||
"function_call"
|
||||
"if_statement"
|
||||
"repeat_statement"
|
||||
"return_statement"
|
||||
"variable_declaration"
|
||||
"while_statement")))
|
||||
(sexp ,(rx (or "arguments"
|
||||
"block"
|
||||
"parameters"
|
||||
"string"
|
||||
"table_constructor")))
|
||||
(function ,(rx (or "function_declaration"
|
||||
"function_definition")))
|
||||
(keyword ,(regexp-opt lua-ts--keywords
|
||||
'symbols))
|
||||
(loop-statement ,(rx (or "do_statement"
|
||||
"for_statement"
|
||||
"repeat_statement"
|
||||
"while_statement")))
|
||||
(sentence (or function
|
||||
loop-statement
|
||||
,(rx (or "assignment_statement"
|
||||
"comment"
|
||||
"field"
|
||||
"function_call"
|
||||
"if_statement"
|
||||
"return_statement"
|
||||
"variable_declaration"))))
|
||||
(sexp (or function
|
||||
keyword
|
||||
loop-statement
|
||||
,(rx (or "arguments"
|
||||
"break_statement"
|
||||
"expression_list"
|
||||
"false"
|
||||
"identifier"
|
||||
"nil"
|
||||
"number"
|
||||
"parameters"
|
||||
"parenthesized_expression"
|
||||
"string"
|
||||
"table_constructor"
|
||||
"true"
|
||||
"vararg_expression"))))
|
||||
(text "comment"))))
|
||||
|
||||
;; Imenu.
|
||||
|
|
|
@ -5,48 +5,424 @@ Code:
|
|||
(lua-ts-mode)
|
||||
(indent-region (point-min) (point-max)))
|
||||
|
||||
Name: Basic Indent
|
||||
Name: Chunk Indent
|
||||
|
||||
=-=
|
||||
print(
|
||||
0,
|
||||
1
|
||||
print(1)
|
||||
print(2)
|
||||
=-=
|
||||
print(1)
|
||||
print(2)
|
||||
=-=-=
|
||||
|
||||
Name: Function Indent
|
||||
|
||||
=-=
|
||||
function f1(n)
|
||||
print(n)
|
||||
return n + 1
|
||||
end
|
||||
|
||||
local function f2(n)
|
||||
print(n)
|
||||
return n * 2
|
||||
end
|
||||
|
||||
local f3 = function(n)
|
||||
print(n)
|
||||
return n / 3
|
||||
end
|
||||
|
||||
function f4(...)
|
||||
local f = function (...)
|
||||
if ok
|
||||
then print(1)
|
||||
else print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
function f5(...)
|
||||
local f = function (...)
|
||||
if ok
|
||||
then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
function f6(...)
|
||||
local f = function (...)
|
||||
if ok then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
;(function ()
|
||||
return true
|
||||
end)()
|
||||
=-=
|
||||
function f1(n)
|
||||
print(n)
|
||||
return n + 1
|
||||
end
|
||||
|
||||
local function f2(n)
|
||||
print(n)
|
||||
return n * 2
|
||||
end
|
||||
|
||||
local f3 = function(n)
|
||||
print(n)
|
||||
return n / 3
|
||||
end
|
||||
|
||||
function f4(...)
|
||||
local f = function (...)
|
||||
if ok
|
||||
then print(1)
|
||||
else print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
function f5(...)
|
||||
local f = function (...)
|
||||
if ok
|
||||
then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
function f6(...)
|
||||
local f = function (...)
|
||||
if ok then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
return f
|
||||
end
|
||||
|
||||
;(function ()
|
||||
return true
|
||||
end)()
|
||||
=-=-=
|
||||
|
||||
Name: Conditional Indent
|
||||
|
||||
=-=
|
||||
if true then
|
||||
print(true)
|
||||
return 1
|
||||
elseif false then
|
||||
print(false)
|
||||
return -1
|
||||
else
|
||||
print(nil)
|
||||
return 0
|
||||
end
|
||||
|
||||
if true
|
||||
then
|
||||
print(true)
|
||||
return 1
|
||||
elseif false
|
||||
then
|
||||
print(false)
|
||||
return -1
|
||||
else
|
||||
print(nil)
|
||||
return 0
|
||||
end
|
||||
|
||||
if true
|
||||
then return 1
|
||||
elseif false
|
||||
then return -1
|
||||
else return 0
|
||||
end
|
||||
=-=
|
||||
if true then
|
||||
print(true)
|
||||
return 1
|
||||
elseif false then
|
||||
print(false)
|
||||
return -1
|
||||
else
|
||||
print(nil)
|
||||
return 0
|
||||
end
|
||||
|
||||
if true
|
||||
then
|
||||
print(true)
|
||||
return 1
|
||||
elseif false
|
||||
then
|
||||
print(false)
|
||||
return -1
|
||||
else
|
||||
print(nil)
|
||||
return 0
|
||||
end
|
||||
|
||||
if true
|
||||
then return 1
|
||||
elseif false
|
||||
then return -1
|
||||
else return 0
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: Loop Indent
|
||||
|
||||
=-=
|
||||
for k,v in pairs({}) do
|
||||
print(k)
|
||||
print(v)
|
||||
end
|
||||
|
||||
for i=1,10
|
||||
do print(i)
|
||||
end
|
||||
|
||||
while n < 10 do
|
||||
n = n + 1
|
||||
print(n)
|
||||
end
|
||||
|
||||
while n < 10
|
||||
do
|
||||
n = n + 1
|
||||
print(n)
|
||||
end
|
||||
|
||||
for i=0,9 do
|
||||
repeat n = n+1
|
||||
until n > 99
|
||||
end
|
||||
|
||||
repeat
|
||||
z = z * 2
|
||||
print(z)
|
||||
until z > 12
|
||||
|
||||
for i,x in ipairs(t) do
|
||||
while i < 9
|
||||
do
|
||||
local n = t[x]
|
||||
repeat n = n + 1
|
||||
until n > #t
|
||||
while n < 99
|
||||
do
|
||||
print(n)
|
||||
end
|
||||
end
|
||||
print(t[i])
|
||||
end
|
||||
|
||||
do
|
||||
local a = b
|
||||
print(a + 1)
|
||||
end
|
||||
=-=
|
||||
for k,v in pairs({}) do
|
||||
print(k)
|
||||
print(v)
|
||||
end
|
||||
|
||||
for i=1,10
|
||||
do print(i)
|
||||
end
|
||||
|
||||
while n < 10 do
|
||||
n = n + 1
|
||||
print(n)
|
||||
end
|
||||
|
||||
while n < 10
|
||||
do
|
||||
n = n + 1
|
||||
print(n)
|
||||
end
|
||||
|
||||
for i=0,9 do
|
||||
repeat n = n+1
|
||||
until n > 99
|
||||
end
|
||||
|
||||
repeat
|
||||
z = z * 2
|
||||
print(z)
|
||||
until z > 12
|
||||
|
||||
for i,x in ipairs(t) do
|
||||
while i < 9
|
||||
do
|
||||
local n = t[x]
|
||||
repeat n = n + 1
|
||||
until n > #t
|
||||
while n < 99
|
||||
do
|
||||
print(n)
|
||||
end
|
||||
end
|
||||
print(t[i])
|
||||
end
|
||||
|
||||
do
|
||||
local a = b
|
||||
print(a + 1)
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: Bracket Indent
|
||||
|
||||
=-=
|
||||
fn(
|
||||
)
|
||||
|
||||
tb={
|
||||
}
|
||||
=-=
|
||||
fn(
|
||||
)
|
||||
|
||||
local function f(o)
|
||||
if o.x > o.y then
|
||||
return o.x
|
||||
elseif o.y > o.z then
|
||||
return o.y
|
||||
else
|
||||
return o.z
|
||||
end
|
||||
tb={
|
||||
}
|
||||
=-=-=
|
||||
|
||||
Name: Multi-line String Indent
|
||||
|
||||
=-=
|
||||
local s = [[
|
||||
Multi-line
|
||||
string content
|
||||
]]
|
||||
|
||||
function f()
|
||||
local str = [[
|
||||
multi-line
|
||||
string
|
||||
]]
|
||||
return true
|
||||
end
|
||||
=-=
|
||||
local s = [[
|
||||
Multi-line
|
||||
string content
|
||||
]]
|
||||
|
||||
function f()
|
||||
local str = [[
|
||||
multi-line
|
||||
string
|
||||
]]
|
||||
return true
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: Multi-line Comment Indent
|
||||
|
||||
=-=
|
||||
--[[
|
||||
Multi-line
|
||||
comment content
|
||||
]]
|
||||
|
||||
function f()
|
||||
--[[
|
||||
multi-line
|
||||
comment
|
||||
]]
|
||||
return true
|
||||
end
|
||||
=-=
|
||||
--[[
|
||||
Multi-line
|
||||
comment content
|
||||
]]
|
||||
|
||||
function f()
|
||||
--[[
|
||||
multi-line
|
||||
comment
|
||||
]]
|
||||
return true
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: Argument Indent
|
||||
|
||||
=-=
|
||||
h(
|
||||
"string",
|
||||
1000
|
||||
)
|
||||
|
||||
local p = h(
|
||||
"string",
|
||||
1000
|
||||
)
|
||||
|
||||
fn(1,
|
||||
2,
|
||||
3)
|
||||
|
||||
fn( 1, 2,
|
||||
3, 4 )
|
||||
|
||||
f({
|
||||
x = 1,
|
||||
y = 2,
|
||||
z = 3,
|
||||
x = 1,
|
||||
y = 2,
|
||||
z = 3,
|
||||
})
|
||||
|
||||
;(function()
|
||||
return false
|
||||
)()
|
||||
f({ x = 1,
|
||||
y = 2,
|
||||
z = 3, })
|
||||
|
||||
Test({
|
||||
a=1
|
||||
})
|
||||
|
||||
Test({
|
||||
a = 1,
|
||||
b = 2,
|
||||
},
|
||||
nil)
|
||||
=-=
|
||||
print(
|
||||
0,
|
||||
1
|
||||
h(
|
||||
"string",
|
||||
1000
|
||||
)
|
||||
|
||||
local function f(o)
|
||||
if o.x > o.y then
|
||||
return o.x
|
||||
elseif o.y > o.z then
|
||||
return o.y
|
||||
else
|
||||
return o.z
|
||||
end
|
||||
end
|
||||
local p = h(
|
||||
"string",
|
||||
1000
|
||||
)
|
||||
|
||||
fn(1,
|
||||
2,
|
||||
3)
|
||||
|
||||
fn( 1, 2,
|
||||
3, 4 )
|
||||
|
||||
f({
|
||||
x = 1,
|
||||
|
@ -54,99 +430,250 @@ f({
|
|||
z = 3,
|
||||
})
|
||||
|
||||
;(function()
|
||||
return false
|
||||
)()
|
||||
=-=-=
|
||||
f({ x = 1,
|
||||
y = 2,
|
||||
z = 3, })
|
||||
|
||||
Name: Argument Indent
|
||||
|
||||
=-=
|
||||
function h(
|
||||
string,
|
||||
number,
|
||||
options)
|
||||
print(string, number, options)
|
||||
end
|
||||
|
||||
local p = h(
|
||||
"sring",
|
||||
1000,
|
||||
{
|
||||
cost = 2,
|
||||
length = 8,
|
||||
parallelism = 4,
|
||||
Test({
|
||||
a=1
|
||||
})
|
||||
=-=
|
||||
function h(
|
||||
string,
|
||||
number,
|
||||
options)
|
||||
print(string, number, options)
|
||||
end
|
||||
|
||||
local p = h(
|
||||
"sring",
|
||||
1000,
|
||||
{
|
||||
cost = 2,
|
||||
length = 8,
|
||||
parallelism = 4,
|
||||
})
|
||||
Test({
|
||||
a = 1,
|
||||
b = 2,
|
||||
},
|
||||
nil)
|
||||
=-=-=
|
||||
|
||||
Name: Continuation Indent
|
||||
Name: Parameter Indent
|
||||
|
||||
=-=
|
||||
function f()
|
||||
local str = [[
|
||||
multi-line
|
||||
string
|
||||
]]
|
||||
--[[
|
||||
multi-line
|
||||
comment
|
||||
]]
|
||||
return true
|
||||
function f1(
|
||||
a,
|
||||
b
|
||||
)
|
||||
print(a,b)
|
||||
end
|
||||
|
||||
local function f2(a,
|
||||
b)
|
||||
print(a,b)
|
||||
end
|
||||
|
||||
local f3 = function( a, b,
|
||||
c, d )
|
||||
print(a,b,c,d)
|
||||
end
|
||||
=-=
|
||||
function f()
|
||||
local str = [[
|
||||
multi-line
|
||||
string
|
||||
]]
|
||||
--[[
|
||||
multi-line
|
||||
comment
|
||||
]]
|
||||
return true
|
||||
function f1(
|
||||
a,
|
||||
b
|
||||
)
|
||||
print(a,b)
|
||||
end
|
||||
|
||||
local function f2(a,
|
||||
b)
|
||||
print(a,b)
|
||||
end
|
||||
|
||||
local f3 = function( a, b,
|
||||
c, d )
|
||||
print(a,b,c,d)
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: Loop Indent
|
||||
Name: Table Indent
|
||||
|
||||
=-=
|
||||
for k, v in pairs({}) do
|
||||
print(k, v)
|
||||
end
|
||||
local Other = {
|
||||
First={up={Step=true,Jump=true},
|
||||
down={Step=true,Jump=true},
|
||||
left={Step=true,Jump=true},
|
||||
right={Step=true,Jump=true}},
|
||||
Second={up={Step=true,Jump=true},
|
||||
down={Step=true,Jump=true},
|
||||
left={Step=true,Jump=true},
|
||||
right={Step=true,Jump=true}},
|
||||
Third={up={Goto=true},
|
||||
down={Goto=true},
|
||||
left={Goto=true},
|
||||
right={Goto=true}}
|
||||
}
|
||||
|
||||
while n < 10 do
|
||||
n = n + 1
|
||||
end
|
||||
|
||||
repeat
|
||||
z = z * 2
|
||||
until z > 12
|
||||
local Other = {
|
||||
a = 1,
|
||||
b = 2,
|
||||
c = 3,
|
||||
}
|
||||
=-=
|
||||
for k, v in pairs({}) do
|
||||
print(k, v)
|
||||
end
|
||||
local Other = {
|
||||
First={up={Step=true,Jump=true},
|
||||
down={Step=true,Jump=true},
|
||||
left={Step=true,Jump=true},
|
||||
right={Step=true,Jump=true}},
|
||||
Second={up={Step=true,Jump=true},
|
||||
down={Step=true,Jump=true},
|
||||
left={Step=true,Jump=true},
|
||||
right={Step=true,Jump=true}},
|
||||
Third={up={Goto=true},
|
||||
down={Goto=true},
|
||||
left={Goto=true},
|
||||
right={Goto=true}}
|
||||
}
|
||||
|
||||
while n < 10 do
|
||||
n = n + 1
|
||||
end
|
||||
|
||||
repeat
|
||||
z = z * 2
|
||||
until z > 12
|
||||
local Other = {
|
||||
a = 1,
|
||||
b = 2,
|
||||
c = 3,
|
||||
}
|
||||
=-=-=
|
||||
|
||||
Code:
|
||||
(lambda ()
|
||||
(setq indent-tabs-mode nil)
|
||||
(setq lua-ts-indent-offset 4)
|
||||
(lua-ts-mode)
|
||||
(indent-region (point-min) (point-max)))
|
||||
|
||||
Name: End Indent
|
||||
|
||||
=-=
|
||||
function f(x)
|
||||
for y=1,x.y do
|
||||
for x=1,x.z do
|
||||
if x.y and x.z then
|
||||
if y <= x then
|
||||
y = y + 1
|
||||
end end end end
|
||||
return {x,y} or {math.random(),math.random()}
|
||||
end
|
||||
|
||||
for y=1,x.y do
|
||||
for x=1,x.z do
|
||||
if x.y and x.z then
|
||||
if y <= x then
|
||||
y = y + 1
|
||||
end
|
||||
end end end
|
||||
=-=
|
||||
function f(x)
|
||||
for y=1,x.y do
|
||||
for x=1,x.z do
|
||||
if x.y and x.z then
|
||||
if y <= x then
|
||||
y = y + 1
|
||||
end end end end
|
||||
return {x,y} or {math.random(),math.random()}
|
||||
end
|
||||
|
||||
for y=1,x.y do
|
||||
for x=1,x.z do
|
||||
if x.y and x.z then
|
||||
if y <= x then
|
||||
y = y + 1
|
||||
end
|
||||
end end end
|
||||
=-=-=
|
||||
|
||||
Name: Nested Function Indent
|
||||
|
||||
=-=
|
||||
function a(...)
|
||||
return (function (x)
|
||||
return x
|
||||
end)(foo(...))
|
||||
end
|
||||
|
||||
function b(n)
|
||||
local x = 1
|
||||
return function (i)
|
||||
return function (...)
|
||||
return (function (n, ...)
|
||||
return function (f, ...)
|
||||
return (function (...)
|
||||
if ... and x < 9 then
|
||||
x = x + 1
|
||||
return ...
|
||||
end end)(n(f, ...))
|
||||
end, ...
|
||||
end)(i(...))
|
||||
end end end
|
||||
|
||||
function c(f)
|
||||
local f1 = function (...)
|
||||
if nil ~= ... then
|
||||
return f(...)
|
||||
end
|
||||
end
|
||||
return function (i)
|
||||
return function (...)
|
||||
local fn = function (n, ...)
|
||||
local x = function (f, ...)
|
||||
return f1(n(f, ...))
|
||||
end
|
||||
return x
|
||||
end
|
||||
return fn(i(...))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function d(f)
|
||||
local f1 = function (c, f, ...)
|
||||
if ... then
|
||||
if f(...) then
|
||||
return ...
|
||||
else
|
||||
return c(f, ...)
|
||||
end end end
|
||||
return function (i)
|
||||
return function (...)
|
||||
return (function (n, ...)
|
||||
local function j (f, ...)
|
||||
return f1(j, f, n(f, ...))
|
||||
end
|
||||
return j, ...
|
||||
end)(i(...))
|
||||
end end end
|
||||
|
||||
function e (n, t)
|
||||
return function (i)
|
||||
return function (...)
|
||||
return (
|
||||
function (n, ...)
|
||||
local x, y, z = 0, {}
|
||||
return (function (f, ...)
|
||||
return (function (i, ...) return i(i, ...) end)(
|
||||
function (i, ...)
|
||||
return f(function (x, ...)
|
||||
return i(i, ...)(x, ...)
|
||||
end, ...)
|
||||
end)
|
||||
end)(function (j)
|
||||
return function(f, ...)
|
||||
return (function (c, f, ...)
|
||||
if ... then
|
||||
if n+1 == x then
|
||||
local y1, x1 = y, x
|
||||
y, x = {}, 0
|
||||
return (function (...)
|
||||
z = ...
|
||||
return ...
|
||||
end)(t(y1-1, x1-1, ...))
|
||||
else
|
||||
x = x - 1
|
||||
return c(f,
|
||||
(function (...)
|
||||
z = ...
|
||||
return ...
|
||||
end)(t(y, x, ...)))
|
||||
end
|
||||
elseif x ~= 0 then
|
||||
x = 0
|
||||
return z, y
|
||||
end end)(j, f, n(f, ...))
|
||||
end end), ...
|
||||
end)(i(...))
|
||||
end end end
|
||||
=-=-=
|
||||
|
|
|
@ -147,7 +147,7 @@ end|
|
|||
print(1)
|
||||
=-=-=
|
||||
|
||||
Name: forward-sentence moves over for statements
|
||||
Name: forward-sentence moves over do statements
|
||||
|
||||
=-=
|
||||
|do
|
||||
|
@ -417,34 +417,6 @@ Code:
|
|||
|
||||
Point-Char: |
|
||||
|
||||
Name: forward-sexp moves over blocks
|
||||
|
||||
=-=
|
||||
local function Test()
|
||||
|local t = {
|
||||
a = 1,
|
||||
}
|
||||
|
||||
if true then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
=-=
|
||||
local function Test()
|
||||
local t = {
|
||||
a = 1,
|
||||
}
|
||||
|
||||
if true then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end|
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over arguments
|
||||
|
||||
=-=
|
||||
|
@ -481,6 +453,84 @@ local t = { 1,
|
|||
3 }|
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over parenthesized expressions
|
||||
|
||||
=-=
|
||||
|(function (x) return x + 1 end)(41)
|
||||
=-=
|
||||
(function (x) return x + 1 end)|(41)
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over function declarations
|
||||
|
||||
=-=
|
||||
|function foo (x)
|
||||
if false then
|
||||
print "foo"
|
||||
elseif true then
|
||||
print "bar"
|
||||
end
|
||||
end
|
||||
=-=
|
||||
function foo (x)
|
||||
if false then
|
||||
print "foo"
|
||||
elseif true then
|
||||
print "bar"
|
||||
end
|
||||
end|
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over do statements
|
||||
|
||||
=-=
|
||||
|do
|
||||
print(a + 1)
|
||||
end
|
||||
=-=
|
||||
do
|
||||
print(a + 1)
|
||||
end|
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over for statements
|
||||
|
||||
=-=
|
||||
|for k,v in pairs({}) do
|
||||
print(k, v)
|
||||
end
|
||||
=-=
|
||||
for k,v in pairs({}) do
|
||||
print(k, v)
|
||||
end|
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over repeat statements
|
||||
|
||||
=-=
|
||||
|repeat
|
||||
n = n + 1
|
||||
until n > 10
|
||||
=-=
|
||||
repeat
|
||||
n = n + 1
|
||||
until n > 10|
|
||||
=-=-=
|
||||
|
||||
Name: forward-sexp moves over while statements
|
||||
|
||||
=-=
|
||||
|while n < 99
|
||||
do
|
||||
n = n+1
|
||||
end
|
||||
=-=
|
||||
while n < 99
|
||||
do
|
||||
n = n+1
|
||||
end|
|
||||
=-=-=
|
||||
|
||||
Code:
|
||||
(lambda ()
|
||||
(lua-ts-mode)
|
||||
|
@ -488,34 +538,6 @@ Code:
|
|||
|
||||
Point-Char: |
|
||||
|
||||
Name: backward-sexp moves over blocks
|
||||
|
||||
=-=
|
||||
local function Test()
|
||||
local t = {
|
||||
a = 1,
|
||||
}
|
||||
|
||||
if true then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end|
|
||||
end
|
||||
=-=
|
||||
local function Test()
|
||||
|local t = {
|
||||
a = 1,
|
||||
}
|
||||
|
||||
if true then
|
||||
print(1)
|
||||
else
|
||||
print(0)
|
||||
end
|
||||
end
|
||||
=-=-=
|
||||
|
||||
Name: backward-sexp moves over arguments
|
||||
|
||||
=-=
|
||||
|
@ -551,3 +573,31 @@ local t = |{ 1,
|
|||
2,
|
||||
3 }
|
||||
=-=-=
|
||||
|
||||
Name: backward-sexp moves over parenthesized expressions
|
||||
|
||||
=-=
|
||||
(function (x) return x + 1 end)|(41)
|
||||
=-=
|
||||
|(function (x) return x + 1 end)(41)
|
||||
=-=-=
|
||||
|
||||
Name: backward-sexp moves over function declarations
|
||||
|
||||
=-=
|
||||
function foo (x)
|
||||
if false then
|
||||
print "foo"
|
||||
elseif true then
|
||||
print "bar"
|
||||
end
|
||||
end|
|
||||
=-=
|
||||
|function foo (x)
|
||||
if false then
|
||||
print "foo"
|
||||
elseif true then
|
||||
print "bar"
|
||||
end
|
||||
end
|
||||
=-=-=
|
||||
|
|
Loading…
Add table
Reference in a new issue