2014-07-21 00:53:21 +02:00
|
|
|
# http://common-lisp.net
|
|
|
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
|
|
|
|
|
|
|
# Detection
|
|
|
|
# ‾‾‾‾‾‾‾‾‾
|
|
|
|
|
|
|
|
hook global BufCreate .*[.](lisp) %{
|
2017-11-03 08:34:41 +01:00
|
|
|
set-option buffer filetype lisp
|
2014-07-21 00:53:21 +02:00
|
|
|
}
|
|
|
|
|
2019-04-10 05:54:19 +02:00
|
|
|
# Initialization
|
|
|
|
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
|
|
|
|
|
|
|
|
hook global WinSetOption filetype=lisp %{
|
2019-03-13 06:24:33 +01:00
|
|
|
require-module lisp
|
2019-04-10 05:54:19 +02:00
|
|
|
|
2022-04-30 11:22:47 +02:00
|
|
|
hook window ModeChange pop:insert:.* -group lisp-trim-indent lisp-trim-indent
|
2019-04-10 05:54:19 +02:00
|
|
|
hook window InsertChar \n -group lisp-indent lisp-indent-on-new-line
|
2019-07-06 21:25:46 +02:00
|
|
|
set-option buffer extra_word_chars '_' '+' '-' '*' '/' '@' '$' '%' '^' '&' '_' '=' '<' '>' '~' '.'
|
2019-04-10 05:54:19 +02:00
|
|
|
|
|
|
|
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window lisp-.+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
hook -group lisp-highlight global WinSetOption filetype=lisp %{
|
|
|
|
add-highlighter window/lisp ref lisp
|
|
|
|
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/lisp }
|
2019-03-13 06:24:33 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
provide-module lisp %{
|
|
|
|
|
2014-07-21 00:53:21 +02:00
|
|
|
# Highlighters
|
|
|
|
# ‾‾‾‾‾‾‾‾‾‾‾‾
|
|
|
|
|
2018-06-30 01:49:57 +02:00
|
|
|
add-highlighter shared/lisp regions
|
|
|
|
add-highlighter shared/lisp/code default-region group
|
2018-07-02 12:59:12 +02:00
|
|
|
add-highlighter shared/lisp/string region '"' (?<!\\)(\\\\)*" fill string
|
|
|
|
add-highlighter shared/lisp/comment region ';' '$' fill comment
|
2014-07-21 00:53:21 +02:00
|
|
|
|
2023-07-01 08:59:02 +02:00
|
|
|
add-highlighter shared/lisp/code/ regex (#?(['`:]|,@?))?\b[a-zA-Z][\w!$%&*+./:<=>?@^_~-]* 0:variable
|
2018-06-30 01:49:57 +02:00
|
|
|
add-highlighter shared/lisp/code/ regex \b(nil|true|false)\b 0:value
|
|
|
|
add-highlighter shared/lisp/code/ regex (((\Q***\E)|(///)|(\Q+++\E)){1,3})|(1[+-])|(<|>|<=|=|>=) 0:operator
|
|
|
|
add-highlighter shared/lisp/code/ regex \b(def[a-z]+|if|do|let|lambda|catch|and|assert|while|def|do|fn|finally|let|loop|new|quote|recur|set!|throw|try|var|case|if-let|if-not|when|when-first|when-let|when-not|(cond(->|->>)?))\b 0:keyword
|
2018-08-13 19:48:53 +02:00
|
|
|
add-highlighter shared/lisp/code/ regex \*[a-zA-Z][\w!$%&*+./:<=>?@^_~-]*\* 0:variable
|
2018-08-13 19:49:15 +02:00
|
|
|
add-highlighter shared/lisp/code/ regex (\b\d+)?\.\d+([eEsSfFdDlL]\d+)?\b 0:value
|
2014-07-21 00:53:21 +02:00
|
|
|
|
|
|
|
# Commands
|
|
|
|
# ‾‾‾‾‾‾‾‾
|
|
|
|
|
2018-12-19 10:10:26 +01:00
|
|
|
define-command -hidden lisp-trim-indent %{
|
2015-11-04 10:48:47 +01:00
|
|
|
# remove trailing white spaces
|
2022-03-16 23:20:07 +01:00
|
|
|
try %{ execute-keys -draft -itersel x s \h+$ <ret> d }
|
2014-07-21 00:53:21 +02:00
|
|
|
}
|
|
|
|
|
2018-09-28 13:28:21 +02:00
|
|
|
declare-option \
|
|
|
|
-docstring 'regex matching the head of forms which have options *and* indented bodies' \
|
|
|
|
regex lisp_special_indent_forms \
|
|
|
|
'(?:def.*|if(-.*|)|let.*|lambda|with-.*|when(-.*|))'
|
|
|
|
|
2017-11-03 08:34:41 +01:00
|
|
|
define-command -hidden lisp-indent-on-new-line %{
|
2018-09-28 13:28:21 +02:00
|
|
|
# registers: i = best align point so far; w = start of first word of form
|
|
|
|
evaluate-commands -draft -save-regs '/"|^@iw' -itersel %{
|
|
|
|
execute-keys -draft 'gk"iZ'
|
|
|
|
try %{
|
|
|
|
execute-keys -draft '[bl"i<a-Z><gt>"wZ'
|
|
|
|
|
2019-02-04 18:23:57 +01:00
|
|
|
try %{
|
|
|
|
# If a special form, indent another (indentwidth - 1) spaces
|
|
|
|
execute-keys -draft '"wze<a-k>\A' %opt{lisp_special_indent_forms} '\z<ret>'
|
|
|
|
execute-keys -draft '"wze<a-L>s.{' %sh{printf $(( kak_opt_indentwidth - 1 ))} '}\K.*<ret><a-;>;"i<a-Z><gt>'
|
|
|
|
} catch %{
|
|
|
|
# If not "special" form and parameter appears on line 1, indent to parameter
|
2020-01-03 20:56:21 +01:00
|
|
|
execute-keys -draft '"wz<a-K>[()\[\]{}]<ret>e<a-l>s\h\K[^\s].*<ret><a-;>;"i<a-Z><gt>'
|
2019-02-04 18:23:57 +01:00
|
|
|
}
|
2018-09-28 13:28:21 +02:00
|
|
|
}
|
|
|
|
try %{ execute-keys -draft '[rl"i<a-Z><gt>' }
|
|
|
|
try %{ execute-keys -draft '[Bl"i<a-Z><gt>' }
|
2022-04-15 00:14:17 +02:00
|
|
|
execute-keys -draft ';"i<a-z>a&,'
|
2014-07-21 00:53:21 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-13 06:24:33 +01:00
|
|
|
}
|