home/rc/core/kakrc.kak
Maxime Coste 0fa59e5fd2 rc/: Tweak some regexes to be compatible with our impl limitations
The upcoming custom implementation does not support arbitrary lookarounds,
and other advanced regex features. Simplify the regexes to avoid those.
2017-10-25 10:27:39 +08:00

92 lines
4.0 KiB
Plaintext

# http://kakoune.org
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
# Detection
# ‾‾‾‾‾‾‾‾‾
hook global BufCreate (.*/)?(kakrc|.*.kak) %{
set buffer filetype kak
}
# Highlighters & Completion
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
add-highlighter -group / regions -default code kakrc \
comment (^|\h)\K# $ '' \
double_string %{(^|\h)\K"} %{(?<!\\)(\\\\)*"} '' \
single_string %{(^|\h)\K'} %{(?<!\\)(\\\\)*'} '' \
shell '(^|\h)\K%sh\{' '\}' '\{' \
shell '(^|\h)\K%sh\(' '\)' '\(' \
shell '(^|\h)\K%sh\[' '\]' '\[' \
shell '(^|\h)\K%sh<' '>' '<' \
shell '(^|\h)\K-shell-(completion|candidates)\h+%\{' '\}' '\{' \
shell '(^|\h)\K-shell-(completion|candidates)\h+%\(' '\)' '\(' \
shell '(^|\h)\K-shell-(completion|candidates)\h+%\[' '\]' '\[' \
shell '(^|\h)\K-shell-(completion|candidates)\h+%<' '>' '<'
%sh{
# Grammar
keywords="edit write write-all kill quit write-quit write-all-quit map unmap alias unalias
buffer buffer-next buffer-previous delete-buffer add-highlighter remove-highlighter
hook remove-hooks define-command echo debug source try fail
set-option unset-option update-option declare-option exec eval prompt menu on-key info
set-face rename-client set-register select change-directory rename-session colorscheme"
attributes="global buffer window current
normal insert menu prompt goto view user object
number_lines show_matching show_whitespaces fill regex dynregex group flag_lines
ranges line column wrap ref regions replace-ranges"
types="int bool str regex int-list str-list completions line-specs range-specs"
values="default black red green yellow blue magenta cyan white"
join() { printf "%s" "$1" | tr -s ' \n' "$2"; }
# Add the language's grammar to the static completion list
printf '%s\n' "hook global WinSetOption filetype=kak %{
set window static_words '$(join "${keywords}:${attributes}:${types}:${values}" '|')'
set -- window extra_word_chars '-'
}"
# Highlight keywords (which are always surrounded by whitespace)
printf '%s\n' "add-highlighter -group /kakrc/code regex [\s\A]\K($(join "${keywords}" '|'))(?=[\s\z])\b 0:keyword
add-highlighter -group /kakrc/code regex [\s\A]\K($(join "${attributes}" '|'))(?=[\s\z])\b 0:attribute
add-highlighter -group /kakrc/code regex [\s\A]\K($(join "${types}" '|'))(?=[\s\z])\b 0:type
add-highlighter -group /kakrc/code regex [\s\A]\K($(join "${values}" '|'))(?=[\s\z])\b 0:value"
}
add-highlighter -group /kakrc/code regex \brgb:[0-9a-fA-F]{6}\b 0:value
add-highlighter -group /kakrc/double_string fill string
add-highlighter -group /kakrc/single_string fill string
add-highlighter -group /kakrc/comment fill comment
add-highlighter -group /kakrc/shell ref sh
# Commands
# ‾‾‾‾‾‾‾‾
def -hidden kak-indent-on-new-line %{
eval -draft -itersel %{
# copy '#' comment prefix and following white spaces
try %{ exec -draft k <a-x> s ^\h*#\h* <ret> y jgh P }
# preserve previous line indent
try %{ exec -draft \; K <a-&> }
# cleanup trailing whitespaces from previous line
try %{ exec -draft k <a-x> s \h+$ <ret> d }
# indent after line ending with %[\W\S]
try %{ exec -draft k <a-x> <a-k> \%[\W\S]$ <ret> j <a-gt> }
}
}
# Initialization
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
hook -group kak-highlight global WinSetOption filetype=kak %{ add-highlighter ref kakrc }
hook global WinSetOption filetype=kak %{
hook window InsertChar \n -group kak-indent kak-indent-on-new-line
# cleanup trailing whitespaces on current line insert end
hook window InsertEnd .* -group kak-indent %{ try %{ exec -draft \; <a-x> s ^\h+$ <ret> d } }
}
hook -group kak-highlight global WinSetOption filetype=(?!kak).* %{ remove-highlighter kakrc }
hook global WinSetOption filetype=(?!kak).* %{ remove-hooks window kak-indent }