diff --git a/kak/filetypes/css.kak b/kak/filetypes/css.kak new file mode 100644 index 0000000..e0525a5 --- /dev/null +++ b/kak/filetypes/css.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-css %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=css %{ filetype-css } diff --git a/kak/filetypes/go.kak b/kak/filetypes/go.kak new file mode 100644 index 0000000..a52b02b --- /dev/null +++ b/kak/filetypes/go.kak @@ -0,0 +1,7 @@ +define-command -hidden -override filetype-go %{ + set-option window tabstop 4 + set-option window indentwidth 0 + set-option window formatcmd 'gofmt' +} + +hook global WinSetOption filetype=go %{ filetype-go } diff --git a/kak/filetypes/html.kak b/kak/filetypes/html.kak new file mode 100644 index 0000000..5164aa1 --- /dev/null +++ b/kak/filetypes/html.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-html %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=html %{ filetype-html } diff --git a/kak/filetypes/javascript.kak b/kak/filetypes/javascript.kak new file mode 100644 index 0000000..8d6c2ee --- /dev/null +++ b/kak/filetypes/javascript.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-javascript %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=javascript %{ filetype-javascript } diff --git a/kak/filetypes/json.kak b/kak/filetypes/json.kak new file mode 100644 index 0000000..d66a9c2 --- /dev/null +++ b/kak/filetypes/json.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-json %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=json %{ filetype-json } diff --git a/kak/filetypes/markdown.kak b/kak/filetypes/markdown.kak new file mode 100644 index 0000000..90dabd9 --- /dev/null +++ b/kak/filetypes/markdown.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-markdown %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=markdown %{ filetype-markdown } diff --git a/kak/filetypes/python.kak b/kak/filetypes/python.kak new file mode 100644 index 0000000..20b8721 --- /dev/null +++ b/kak/filetypes/python.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-python %{ + set-option window tabstop 4 + set-option window indentwidth 4 +} + +hook global WinSetOption filetype=python %{ filetype-python } diff --git a/kak/filetypes/rust.kak b/kak/filetypes/rust.kak new file mode 100644 index 0000000..0f8f33b --- /dev/null +++ b/kak/filetypes/rust.kak @@ -0,0 +1,7 @@ +define-command -hidden -override filetype-rust %{ + set-option window tabstop 4 + set-option window indentwidth 4 + set-option window formatcmd 'rustfmt --edition 2021' +} + +hook global WinSetOption filetype=rust %{ filetype-rust } diff --git a/kak/filetypes/scss.kak b/kak/filetypes/scss.kak new file mode 100644 index 0000000..f8c5144 --- /dev/null +++ b/kak/filetypes/scss.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-scss %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=scss %{ filetype-scss } diff --git a/kak/filetypes/sh.kak b/kak/filetypes/sh.kak new file mode 100644 index 0000000..c018b46 --- /dev/null +++ b/kak/filetypes/sh.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-sh %{ + set-option window tabstop 4 + set-option window indentwidth 4 +} + +hook global WinSetOption filetype=sh %{ filetype-sh } diff --git a/kak/filetypes/toml.kak b/kak/filetypes/toml.kak new file mode 100644 index 0000000..7d9d297 --- /dev/null +++ b/kak/filetypes/toml.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-toml %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=toml %{ filetype-toml } diff --git a/kak/filetypes/yaml.kak b/kak/filetypes/yaml.kak new file mode 100644 index 0000000..21554be --- /dev/null +++ b/kak/filetypes/yaml.kak @@ -0,0 +1,6 @@ +define-command -hidden -override filetype-yaml %{ + set-option window tabstop 2 + set-option window indentwidth 2 +} + +hook global WinSetOption filetype=yaml %{ filetype-yaml } diff --git a/kak/kakrc b/kak/kakrc index 3aff536..fe08e00 100644 --- a/kak/kakrc +++ b/kak/kakrc @@ -1,56 +1,7 @@ -colorscheme mygruvbox -add-highlighter global/ number-lines -hlcursor - -# Highlight trailing whitespace -# Softwrap long lines -add-highlighter global/ wrap -word -indent -marker ">>>" -add-highlighter global/ show-whitespaces - -set-option -add global ui_options terminal_status_on_top=true -set-option -add global ui_options terminal_assistant=cat - -set-option global tabstop 4 -set-option global indentwidth 4 -set-option global scrolloff 1,3 - -# Clipboard management mappings -map -docstring "yank the selection into the clipboard" global user y " wl-copy" -map -docstring "paste the clipboard" global user p " wl-paste" - -map -docstring "Show filetype" global user t ': echo %opt{filetype}' -map -docstring "Open file" global user o ': tmux-repl-vertical "echo ""evaluate-commands -client %val{client} e $(fzf)"" | kak -p %val{session}"' -map -docstring "Zeile auskommentieren" global normal ":comment-line" -map -docstring "Speichern" global normal ":w" -map -docstring "Beenden" global normal ":q" -map -docstring "Cursor nach oben erweitern" global normal "" -map -docstring "Cursor nach unten erweitern" global normal "" - -map global normal '|echo "$(($kak_selection + 1))"' -map global normal '|echo "$(($kak_selection - 1))"' - -# Convert spaces to tabs -hook global BufWritePre .* %{ - try %{ execute-keys -draft '%@' } -} - -# hook global BufWritePost .* %{ -# echo %sh{ sassc main.scss > main.css } -# } - - -eval %sh{kak-debug init --session $kak_session} -map global user d ':enter-user-mode dap' -docstring 'DAP mode' - -eval %sh{kak-lsp} -lsp-enable - -lsp-inlay-diagnostics-enable global - -# gd -> zur Definition springen -map global goto d ': lsp-definition' -docstring 'definition' -# gr -> Referenzen (Aufrufstellen) auflisten -map global goto r ': lsp-references' -docstring 'references' - - -# LLM-Integration (FIM + smartcat) -source "%val{config}/llm.kak" +source "%val{config}/modules/ui.kak" +source "%val{config}/modules/editing.kak" +source "%val{config}/modules/mappings.kak" +source "%val{config}/modules/filetypes.kak" +source "%val{config}/modules/lsp.kak" +source "%val{config}/modules/debug.kak" +source "%val{config}/modules/llm.kak" diff --git a/kak/modules/debug.kak b/kak/modules/debug.kak new file mode 100644 index 0000000..2b8f816 --- /dev/null +++ b/kak/modules/debug.kak @@ -0,0 +1,5 @@ +evaluate-commands %sh{ + command -v kak-debug >/dev/null || exit 0 + kak-debug init --session "$kak_session" + printf "%s\n" "map global user d ':enter-user-mode dap' -docstring 'DAP mode'" +} diff --git a/kak/modules/editing.kak b/kak/modules/editing.kak new file mode 100644 index 0000000..e5a6401 --- /dev/null +++ b/kak/modules/editing.kak @@ -0,0 +1,7 @@ +set-option global tabstop 4 +set-option global indentwidth 4 +set-option global scrolloff 1,3 + +hook global BufWritePre .* %{ + try %{ execute-keys -draft '%@' } +} diff --git a/kak/modules/filetypes.kak b/kak/modules/filetypes.kak new file mode 100644 index 0000000..8058058 --- /dev/null +++ b/kak/modules/filetypes.kak @@ -0,0 +1,19 @@ +declare-option -hidden str-list filetype_modules + +define-command -hidden -params 1 filetype-module-load %{ + evaluate-commands %sh{ + ft="$1" + file="$kak_config/filetypes/$ft.kak" + [ -f "$file" ] || exit 0 + for loaded in $kak_opt_filetype_modules; do + [ "$loaded" = "$ft" ] && exit 0 + done + printf 'set-option -add global filetype_modules %%{%s}\n' "$ft" + printf 'source %%{%s}\n' "$file" + printf 'try %%{ filetype-%s }\n' "$ft" + } +} + +hook global WinSetOption filetype=(.+) %{ + filetype-module-load %val{hook_param_capture_1} +} diff --git a/kak/modules/llm.kak b/kak/modules/llm.kak new file mode 100644 index 0000000..80d5ca5 --- /dev/null +++ b/kak/modules/llm.kak @@ -0,0 +1,46 @@ +declare-option str llm_ctx "/tmp/kak-fim.buf" +declare-option str llm_gen "/tmp/kak-gen.out" + +define-command fim-complete -docstring "FIM-Completion am Cursor (Mistral)" %{ + write -force %opt{llm_ctx} + execute-keys "!python3 %val{config}/scripts/mistral-fim.py %opt{llm_ctx} %val{cursor_line} %val{cursor_column}" +} +map global user f ': fim-complete' -docstring 'FIM complete' + +define-command -params 1 gen -docstring 'LLM: Codeblock generieren & einfügen' %{ + write -force %opt{llm_ctx} + nop %sh{ + { printf 'Anweisung: %s\n\nVorhandener Code als Kontext:\n' "$1" + cat "$kak_opt_llm_ctx"; } | sc default > "$kak_opt_llm_gen" + } + execute-keys "!cat %opt{llm_gen}" +} +map global user G ': gen ""' -docstring 'Codeblock generieren' + +define-command -params 1 gen-sel -docstring 'LLM: Selektion neu generieren' %{ + nop %sh{ + printf 'Anweisung: %s\n\nCode:\n%s' "$1" "$kak_selection" \ + | sc default > "$kak_opt_llm_gen" + } + execute-keys "|cat %opt{llm_gen}" +} +map global user g ': gen-sel ""' -docstring 'Selektion neu generieren' + +define-command -params 1 ask -docstring 'LLM-Frage zum Buffer' %{ + write -force %opt{llm_ctx} + evaluate-commands %sh{ + ans=$( { printf 'Frage: %s\n\nCode:\n' "$1"; cat "$kak_opt_llm_ctx"; } \ + | sc ask | sed "s/'/''/g") + printf "info -title 'Le Chat' '%s'" "$ans" + } +} +map global user A ': ask ""' -docstring 'Ask about the buffer' + +define-command -params 1 ask-sel -docstring 'LLM-Frage zur Selektion' %{ + evaluate-commands %sh{ + ans=$(printf 'Frage: %s\n\nCode:\n%s' "$1" "$kak_selection" \ + | sc ask | sed "s/'/''/g") + printf "info -title 'Le Chat' '%s'" "$ans" + } +} +map global user a ': ask-sel ""' -docstring 'Ask about selection' diff --git a/kak/modules/lsp.kak b/kak/modules/lsp.kak new file mode 100644 index 0000000..6ac7eaf --- /dev/null +++ b/kak/modules/lsp.kak @@ -0,0 +1,5 @@ +evaluate-commands %sh{ + command -v kak-lsp >/dev/null || exit 0 + kak-lsp --kakoune -s "$kak_session" + printf '%s\n' 'lsp-enable' +} diff --git a/kak/modules/mappings.kak b/kak/modules/mappings.kak new file mode 100644 index 0000000..eafa59c --- /dev/null +++ b/kak/modules/mappings.kak @@ -0,0 +1,13 @@ +map -docstring "yank the selection into the clipboard" global user y " wl-copy" +map -docstring "paste the clipboard" global user p " wl-paste" +map -docstring "Show filetype" global user t ': echo %opt{filetype}' +map -docstring "Open file" global user o ': tmux-repl-vertical "echo ""evaluate-commands -client %val{client} e $(fzf)"" | kak -p %val{session}"' + +map -docstring "Zeile auskommentieren" global normal ":comment-line" +map -docstring "Speichern" global normal ":w" +map -docstring "Beenden" global normal ":q" +map -docstring "Cursor nach oben erweitern" global normal "" +map -docstring "Cursor nach unten erweitern" global normal "" + +map global normal '|echo "$(($kak_selection + 1))"' +map global normal '|echo "$(($kak_selection - 1))"' diff --git a/kak/modules/ui.kak b/kak/modules/ui.kak new file mode 100644 index 0000000..c0c3219 --- /dev/null +++ b/kak/modules/ui.kak @@ -0,0 +1,8 @@ +colorscheme mygruvbox + +add-highlighter global/ number-lines -hlcursor +add-highlighter global/ wrap -word -indent -marker ">>>" +add-highlighter global/ show-whitespaces + +set-option -add global ui_options terminal_status_on_top=true +set-option -add global ui_options terminal_assistant=cat diff --git a/kak/scripts/mistral-fim.py b/kak/scripts/mistral-fim.py new file mode 100755 index 0000000..171c019 --- /dev/null +++ b/kak/scripts/mistral-fim.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +import json, os, sys, urllib.request + +buf, line, col = sys.argv[1], int(sys.argv[2]), int(sys.argv[3]) +CTX_BEFORE, CTX_AFTER = 120, 60 # Kontext-Budget in Zeilen + +lines = open(buf, encoding="utf-8").read().split("\n") +before, cur, after = lines[:line-1], (lines[line-1] if line-1 < len(lines) else ""), lines[line:] + +prefix = "\n".join(before + [cur[:col-1]]) +suffix = "\n".join([cur[col-1:]] + after) +prefix = "\n".join(prefix.split("\n")[-CTX_BEFORE:]) # nach hinten kappen +suffix = "\n".join(suffix.split("\n")[:CTX_AFTER]) + +body = json.dumps({ + "model": "codestral-latest", + "prompt": prefix, "suffix": suffix, + "max_tokens": 96, "temperature": 0.2, +}).encode() + +req = urllib.request.Request( + "https://api.mistral.ai/v1/fim/completions", data=body, + headers={"Authorization": "Bearer " + os.environ["MISTRAL_API_KEY"], + "Content-Type": "application/json"}) +try: + with urllib.request.urlopen(req, timeout=20) as r: + sys.stdout.write(json.load(r)["choices"][0]["message"]["content"]) +except Exception: + pass # fail silent → leeres Insert