diff --git a/snippets/kakoune/wordcount.kak b/snippets/kakoune/wordcount.kak new file mode 100644 index 0000000..5059100 --- /dev/null +++ b/snippets/kakoune/wordcount.kak @@ -0,0 +1,131 @@ +# Count characters, words, lines, and paragraphs in selection. +# Author: Francois Tonneau + +# VARIABLES + +declare-option -hidden int wordcount_non_space_chars 0 +declare-option -hidden int wordcount_all_chars 0 + +declare-option -hidden int wordcount_words 0 + +declare-option -hidden int wordcount_non_empty_lines 0 +declare-option -hidden int wordcount_all_lines 0 + +declare-option -hidden int wordcount_paragraphs 0 + +# PUBLIC COMMANDS + +define-command \ +-docstring 'Count characters - words - lines - paragraphs' \ +wordcount-count %{ + evaluate-commands %sh{ + if expr "$kak_selections_length" : '.* .*' >/dev/null; then + printf %s\\n 'fail multiple selections not allowed' + exit + fi + printf %s\\n wordcount-proceed + } +} + +alias global woc wordcount-count + +# IMPLEMENTATION + +define-command \ +-hidden \ +wordcount-proceed %{ + wordcount-grow-lines + wordcount-count-chars + wordcount-count-words + wordcount-count-lines + wordcount-count-pars + wordcount-summarize +} + +define-command \ +-hidden \ +wordcount-grow-lines %{ + execute-keys +} + +define-command \ +-hidden \ +wordcount-count-chars %{ + evaluate-commands %sh{ + bulk=$(printf %s "$kak_selection" \ + | tr -d '\n' \ + | wc -m \ + ) + nonspace=$(printf %s "$kak_selection" \ + | tr -d '\n' \ + | sed 's/[[:space:]]/ /g' \ + | tr -d ' ' \ + | wc -m \ + ) + printf %s\\n "set-option window wordcount_all_chars $bulk" + printf %s\\n "set-option window wordcount_non_space_chars $nonspace" + } +} + +define-command \ +-hidden \ +wordcount-count-words %{ + evaluate-commands %sh{ + words=$( printf %s "$kak_selection" \ + | wc -w \ + ) + printf %s\\n "set-option window wordcount_words $words" + } +} + +define-command \ +-hidden \ +wordcount-count-lines %{ + evaluate-commands %sh{ + all=$( printf %s "$kak_selection" \ + | wc -l \ + ) + nonempty=$( printf %s "$kak_selection" \ + | sed -n /^$/!p \ + | wc -l \ + ) + printf %s\\n "set-option window wordcount_all_lines $all" + printf %s\\n "set-option window wordcount_non_empty_lines $nonempty" + } +} + +define-command \ +-hidden \ +wordcount-count-pars %{ + # + # Unless it is empty, consider the selection to be 1 paragraph by default. + # Then count paragraph separations (\n\n [^\n]). + try %{ + execute-keys -draft [^\n] + set-option window wordcount_paragraphs 1 + } \ + catch %{ + set-option window wordcount_paragraphs 0 + } + evaluate-commands -draft %{ + try %{ + execute-keys s \n\n [^\n] + evaluate-commands -itersel %{ + set -add window wordcount_paragraphs 1 + } + } + } +} + +define-command \ +-hidden \ +wordcount-summarize %{ + info -title 'Word Count' \ +" Words: %opt(wordcount_words) + Characters, including space: %opt(wordcount_all_chars) + Characters, excluding space: %opt(wordcount_non_space_chars) + Total lines: %opt(wordcount_all_lines) + Non-empty lines: %opt(wordcount_non_empty_lines) + Paragraphs: %opt(wordcount_paragraphs)" +} +