6f28178b91
An indent hook automatically adds whitespace, so it seems prudent to add the hook to remove unwanted whitespace again. This is what we do in most languages already.
68 lines
3.4 KiB
Plaintext
68 lines
3.4 KiB
Plaintext
# Syntax highlighting and indentation for Elvish (https://elv.sh)
|
|
|
|
hook global BufCreate .*\.elv %{
|
|
set-option buffer filetype elvish
|
|
}
|
|
|
|
hook global WinSetOption filetype=elvish %<
|
|
require-module elvish
|
|
|
|
hook window ModeChange pop:insert:.* -group elvish-trim-indent elvish-trim-indent
|
|
hook window InsertChar \n -group elvish-insert elvish-indent
|
|
hook window InsertChar [\]})] -group elvish-insert elvish-deindent
|
|
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window elvish-.+ }
|
|
>
|
|
|
|
hook -group elvish-highlight global WinSetOption filetype=elvish %{
|
|
add-highlighter window/elvish ref elvish
|
|
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/elvish }
|
|
}
|
|
|
|
provide-module elvish %§
|
|
|
|
add-highlighter shared/elvish regions
|
|
add-highlighter shared/elvish/code default-region group
|
|
add-highlighter shared/elvish/double_string region '"' (?<!\\)(\\\\)*" fill string
|
|
add-highlighter shared/elvish/single_string region "'" ('')*' fill string
|
|
add-highlighter shared/elvish/comment region '#' $ fill comment
|
|
|
|
add-highlighter shared/elvish/code/variable regex \$[\w\d-_:~]+ 0:variable
|
|
add-highlighter shared/elvish/code/variable_in_assignment regex (?:^|\{\s|\(|\||\;)\h*(?:var|set|tmp|del)((?:\h+[\w\d-_:~]+)*) 1:variable
|
|
add-highlighter shared/elvish/code/variable_in_for regex (?:^|\{\s|\(|\||\;)\h*for\h+([\w\d-_:~]*) 1:variable
|
|
add-highlighter shared/elvish/code/variable_in_except regex \}\h+except\h+([\w\d-_:~]*) 1:variable
|
|
|
|
add-highlighter shared/elvish/code/builtin regex (?:^|\{\s|\(|\||\;)\h*(!=|!=s|%|\*|\+|-gc|-ifaddrs|-log|-override-wcwidth|-stack|-|/|<|<=|<=s|<s|==|==s|>|>=|>=s|>s|all|assoc|base|bool|break|call|cd|compare|constantly|continue|count|defer|deprecate|dissoc|drop|each|eawk|echo|eq|eval|exact-num|exec|exit|external|fail|fg|float64|from-json|from-lines|from-terminated|get-env|has-env|has-external|has-key|has-value|is|keys|kind-of|make-map|multi-error|nop|not-eq|not|ns|num|one|only-bytes|only-values|order|peach|pprint|print|printf|put|rand|randint|range|read-line|read-upto|repeat|repr|resolve|return|run-parallel|search-external|set-env|show|sleep|slurp|src|styled|styled-segment|take|tilde-abbr|time|to-json|to-lines|to-string|to-terminated|unset-env|use-mod|wcswidth)(?![-:])\b 1:builtin
|
|
add-highlighter shared/elvish/code/keyword regex (?:^|\{\s|\(|\||\;)\h*(use|var|set|tmp|del|and|or|coalesce|pragma|while|for|try|fn|if)(?![-:])\b 1:keyword
|
|
add-highlighter shared/elvish/code/keyword_block regex \}\h+(elif|else|except|finally)(?![-:])\b 1:keyword
|
|
|
|
add-highlighter shared/elvish/code/metachar regex [*?|&\;<>()[\]{}] 0:operator
|
|
|
|
define-command -hidden elvish-trim-indent %{
|
|
evaluate-commands -no-hooks -draft -itersel %{
|
|
execute-keys <a-x>
|
|
# remove trailing white spaces
|
|
try %{ execute-keys -draft s \h + $ <ret> d }
|
|
}
|
|
}
|
|
|
|
define-command -hidden elvish-indent %< evaluate-commands -draft -itersel %<
|
|
execute-keys <semicolon>
|
|
try %<
|
|
# if the previous line is a comment, copy indent, # and whitespace
|
|
execute-keys -draft k <a-x> s^\h*#\h*<ret> yjP
|
|
> catch %<
|
|
# copy indent
|
|
execute-keys -draft K <a-&>
|
|
# indent after { [ ( |
|
|
try %< execute-keys -draft k <a-x> <a-k>[[{(|]\h*$<ret> j <a-gt> >
|
|
>
|
|
>>
|
|
|
|
define-command -hidden elvish-deindent %< evaluate-commands -draft -itersel %<
|
|
try %<
|
|
# Deindent only when there is a lone closing character
|
|
execute-keys -draft <a-x> <a-k>^\h*[^\h]$<ret> <a-lt>
|
|
>
|
|
>>
|
|
§
|