## Highlight whitespace at end of line
add-highlighter global/ regex '^.*[^ ]( +)$' 1:black,red
add-highlighter global/ number-lines -relative -hlcursor

hook global WinSetOption .* %{
    remove-highlighter global/show-ws
    add-highlighter global/show-ws show-whitespaces -tabpad ' '

    face global Whitespace rgb:3c3836+f
    face global comment rgb:665c54+f
}

add-highlighter global/ show-matching

set global indentwidth 4

hook global WinSetOption filetype=(verilog|nix|vhdl) %{
    set buffer tabstop 2
    set buffer indentwidth 2
}

hook global WinSetOption filetype=vhdl %{
    set buffer comment_block_begin '/*'
    set buffer comment_block_end '/*'
    set buffer comment_line '--'
}

## == keybinds ==

map global normal 'J' "Jx"
map global normal 'K' "Kx"

# tabs
map global insert '<tab>' '<a-;><a-gt>'
map global insert '<s-tab>' '<a-;><a-lt>'

define-command W w

# Commenting
map global normal '#' ':comment-line<ret>'
map global user '#' ':comment-block<ret>' -docstring 'Block comment'

# Clipboard commands
map global normal '<a-y>' '|pbcopy<ret>u:echo "Copied text to clipboard"<ret>'
map global normal '<c-v>' '!pbpaste<ret>'

# Buffer user mode
map global user 'b' ':enter-user-mode buffers<ret>' -docstring 'buffer mode'
map global user 'B' ':enter-user-mode -lock buffers<ret>' -docstring 'buffer mode (lock)'

# command to copy <filename>:<line> into the clipboard (useful for pasting into debugger)
define-command copy-location -docstring "Copies <filename>:<line> for the current cursor into the clipboard" %{
    evaluate-commands %sh{
        set -e
        printf "%s" "$kak_bufname:$kak_cursor_line" | pbcopy
        echo "echo 'Copied $kak_bufname:$kak_cursor_line into clipboard'"
    }
}

define-command copy-location-path -docstring "Copies <full path>:<line> for the current cursor into the clipboard" %{
    evaluate-commands %sh{
        set -e
        printf "%s" "$kak_buffile:$kak_cursor_line" | pbcopy
        echo "echo 'Copied $kak_buffile:$kak_cursor_line into clipboard'"
    }
}

map global user 'y' ':copy-location<ret>' -docstring "Copy location"
map global user 'Y' ':copy-location-path<ret>' -docstring "Copy location (full path)"

## == plugin configuration ==

# Custom function surround
define-command -hidden surround-function %{
    prompt 'function: ' %{
        execute-keys "<a-:><a-;>Z;ha%val{text}(<esc><a-;>L<a-z>ua)<esc>"
    }
}
define-command -hidden surround-tag %{
    prompt 'tag: ' %{
        execute-keys "<a-:><a-;>Z;ha<lt>%val{text}<gt><esc><a-;>L<a-z>ua<lt>/%val{text}<gt><esc>"
    }
}
define-command -hidden surround-Tag %{
    prompt 'tag: ' %{
        execute-keys "xZ<a-:><a-;>gih<a-h>yz<gt>xZO<c-r>""<lt>%val{text}<gt><esc>zo<c-r>""<lt>%val{text}<gt><esc>z"
    }
}
define-command -hidden surround-ins %{
    prompt 'prefix: ' %{
        execute-keys "<a-:><a-;>Z;ha%val{text}<esc><a-;>L<a-z>u"
    }
}

map global mirror 'f' ':surround-function<ret>' -docstring 'function'
map global mirror 't' ':surround-tag<ret>' -docstring 'function'
map global mirror 'T' ':surround-Tag<ret>' -docstring 'function'
map global mirror 'i' ':surround-ins<ret>' -docstring 'function'

map global normal ö ':enter-user-mode mirror<ret>' -docstring 'mirror mode'

# LSP stuff
map global normal 'Å' ':lsp-enable<ret>' -docstring 'Enable LSP'
map global normal 'å' ':enter-user-mode lsp<ret>' -docstring 'LSP mode'
map global lsp 'R' ':lsp-rename-prompt<ret>' -docstring 'Rename symbol'

define-command lsp-clear-references %{
    set-option window lsp_references # empty
}
map global lsp '"' ':lsp-clear-references<ret>' -docstring "Clear references"

face global Reference white,rgb:550055
face global ReferenceBind white,rgb:552200

map global insert '<c-s>' '<a-;>:enter-user-mode lsp<ret>s'

#TODO
# map global user '&' ':qhl-word<ret>' -docstring "Highlight current word"
# map global user '"' ':unqhl<ret>' -docstring "Remove highlight"

## == Colors ==

define-command update-cursor-style %{
    evaluate-commands %sh{
        if [ $(echo "$kak_selection" | wc -c) -eq 2 ] ; then
            echo 'face buffer PrimaryCursor white,+uiF'
        else
            echo 'face buffer PrimaryCursor white,rgb:b05fde+uiF'
        fi
    }
}

hook global NormalKey .* %{
    update-cursor-style
}

hook global WinCreate .* %{
    update-cursor-style
}

face global PrimaryCursorEol PrimaryCursor
face global SecondaryCursorEol SecondaryCursor

face global operator blue
face global type rgb:aa66ee+b

face global MenuBackground rgb:eecc44+i
face global MenuForeground blue+bi
face global Information rgb:44ccee+b

face global MatchingChar ,rgb:665c54+bF

## Filetype formatting

hook global BufSetOption filetype=rust %{
    set-option buffer formatcmd 'rustfmt'

    hook buffer -group rust-inlay-hints BufReload .* rust-analyzer-inlay-hints
    hook buffer -group rust-inlay-hints NormalIdle .* rust-analyzer-inlay-hints
}

hook global WinSetOption filetype=python %{
    set-option window formatcmd 'black -q  -'
}

set-option global ignored_files "^(\..*|.*\.(o|so|a)|__pycache__)$"

## APL execute on =

define-command -hidden dyalog-execute %{
    execute-keys -itersel 'i⎕←<esc>HH|dyalogscript /dev/fd/0<ret>'
}
map global normal '=' ':dyalog-execute<ret>'