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 } } # cleanup trailing whitespaces when exiting insert mode hook window InsertChar \n -id cpp-hooks %[ try %{ exec -draft ks\h+$d } ] # cleanup trailing white space son previous line hook window InsertChar \n -id cpp-indent %@ try %{ exec -draft ks^\h+yjP } # preserve previous line indent try %[ exec -draft k[{(]\h*$j ] # indent after lines ending with { or ( try %{ exec -draft [(\`\([^\n]+\n[^\n]*\n?\'s\`..|.\'& } # align to opening paren of previous line @ hook window InsertChar \} -id cpp-indent %[ try %[ exec -draft ^\h+\}$< ] ] # deindent on insert } alone on a line ~ 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 }}