hook global BufCreate .*\.(c|cc|cpp|cxx|C|h|hh|hpp|hxx|H) %{ set buffer filetype cpp } hook global BufSetOption mimetype=text/x-c(\+\+)? %{ set buffer filetype cpp } def -hidden _cpp_indent_on_new_line %~ eval -draft -itersel %_ # preserve previous line indent try %{ exec -draft K } # indent after lines ending with { or ( try %[ exec -draft k [{(]\h*$ j ] # cleanup trailing white space son previous line try %{ exec -draft k s \h+$ d } # align to opening paren of previous line try %{ exec -draft [( \`\([^\n]+\n[^\n]*\n?\' s \`\(\h*.|.\' & } # align to previous statement start when previous line closed a parenthesis # try %{ exec -draft \)M\`\(.*\)[^\n()]*\n\h*\n?\'s\`|.\'1 } # copy // comments prefix try %{ exec -draft k s ^\h*\K(/{2,}) yP } # indent after visibility specifier try %[ exec -draft k ^\h*(public|private|protected):\h*$ j ] # indent after if|else|while|for try %[ exec -draft )MB \`(if|else|while|for)\h*\(.*\)\h*\n\h*\n?\' s \`|.\' 11 ] _ ~ def -hidden _cpp_indent_on_opening_curly_brace %[ # align indent with opening paren when { is entered on a new line after the closing paren try %[ exec -draft -itersel h)M \`\(.*\)\h*\n\h*\{\' s \`|.\' 1 ] ] def -hidden _cpp_indent_on_closing_curly_brace %[ # align to opening curly brace when alone on a line try %[ exec -itersel -draft ^\h+\}$hms\`|.\'1 ] # add ; after } if class or struct definition try %[ exec -draft "hm(class|struct)\`(class|struct)[^{}\n]+(\n)?\s*\{\'ma;" ] ] defhl cpp addhl -def-group cpp regex "\<(this|true|false|NULL|nullptr|)\>|\<-?\d+[fdiu]?|'((\\.)?|[^'\\])'" 0:value addhl -def-group cpp regex "\<(void|int|char|unsigned|float|bool|size_t)\>" 0:type addhl -def-group cpp 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 -def-group cpp 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 -def-group cpp regex "^\h*?#.*?(?s\h+$d } } hook window InsertChar \n -id cpp-indent _cpp_indent_on_new_line hook window InsertChar \{ -id cpp-indent _cpp_indent_on_opening_curly_brace hook window InsertChar \} -id cpp-indent _cpp_indent_on_closing_curly_brace ] hook global WinSetOption filetype=(?!cpp).* %{ rmhl cpp rmhooks window cpp-indent rmhooks window cpp-hooks } def -hidden _cpp_insert_include_guards %{ exec ggi%ggxs\.c_A_INCLUDEDggxyppI#ifndefjI#definejI#endif//O } hook global BufNew .*\.(h|hh|hpp|hxx|H) _cpp_insert_include_guards 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 }}