hook global BufCreate .*\.(c|cc|cpp|cxx|C|h|hh|hpp|hxx|H) %{ set buffer filetype cpp } hook global BufOpen .* %{ %sh{ mimetype="$(file -b --mime-type ${kak_bufname})" if [[ "${mimetype}" == "text/x-c++" || "${mimetype}" == "text/x-c" ]]; then echo set buffer filetype cpp; fi } } hook global WinSetOption filetype=cpp %~ addhl group cpp-highlight addhl -group cpp-highlight regex "\<(this|true|false|NULL|nullptr|)\>|\<-?\d+[fdiu]?|'((\\.)?|[^'\\])'" 0:value addhl -group cpp-highlight regex "\<(void|int|char|unsigned|float|bool|size_t)\>" 0:type addhl -group cpp-highlight regex "\<(while|for|if|else|do|switch|case|default|goto|break|continue|return|using|try|catch|throw|new|delete|and|or|not|operator|explicit)\>" 0:keyword addhl -group cpp-highlight regex "\<(const|mutable|auto|namespace|inline|static|volatile|class|struct|enum|union|public|protected|private|template|typedef|virtual|friend|extern|typename|override|final)\>" 0:attribute addhl -group cpp-highlight regex "^\h*?#.*?(?s\h+$d } } hook window InsertChar \n -id cpp-indent %@ eval -draft -itersel %_ # preserve previous line indent try %{ exec -draft ks^\h+yjP } # indent after lines ending with { or ( try %[ exec -draft k[{(]\h*$j ] # cleanup trailing white space son previous line try %{ exec -draft ks\h+$d } # align to opening paren of previous line try %{ exec -draft [(\`\([^\n]+\n[^\n]*\n?\'s\`..|.\'& } # copy // comments prefix try %{ exec -draft ks^\h*\K(/{2,})yP } _ @ hook window InsertChar \} -id cpp-indent %[ # deindent on insert } alone on a line try %[ exec -draft ^\h+\}$< ] # add ; after } if class or struct definition try %[ exec -draft "hm(class|struct)\`(class|struct)[^{}\n]+(\n)?\s*\{\'ma;" ] ] ~ hook global WinSetOption filetype=(?!cpp).* %{ rmhl cpp-highlight rmhooks window cpp-indent rmhooks window cpp-hooks } hook global BufNew .*\.(h|hh|hpp|hxx|H) %{ exec ggi%ggxs\.c_A_INCLUDEDggxyppI#ifndefjI#definejI#endif//O } decl str-list alt_dirs ".;.." def alt %{ %sh{ shopt -s extglob alt_dirs=${kak_opt_alt_dirs//;/ } file=$(basename ${kak_bufname}) dir=$(dirname ${kak_bufname}) case ${file} in *.c|*.cc|*.cpp|*.cxx|*.C) for alt_dir in ${alt_dirs}; do altname=$(ls -1 "${dir}/${alt_dir}/${file%.*}".@(h|hh|hpp|hxx|H) 2> /dev/null | head -n 1) [[ -e ${altname} ]] && break done ;; *.h|*.hh|*.hpp|*.hxx|*.H) for alt_dir in ${alt_dirs}; do altname=$(ls -1 "${dir}/${alt_dir}/${file%.*}".@(c|cc|cpp|cxx|C) 2> /dev/null | head -n 1) [[ -e ${altname} ]] && break done ;; esac if [[ -e ${altname} ]]; then echo edit "'${altname}'" else echo echo "'alternative file not found'" fi }}