colorize: add ability to colorize multiple files into less (#7662)

cless is an alias for a colorized less wrappper: colorize_via_pygmentize_less.
Note that cless opens many files as independent files, navigatable with `:n` and `:p`.
This commit is contained in:
Francisco de Zuviría 2019-04-22 16:06:47 -03:00 committed by Marc Cornellà
parent 9b2410fbcf
commit ebd13b60c1
2 changed files with 35 additions and 3 deletions

View file

@ -2,6 +2,10 @@
With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats. With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats.
Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting
method for a given extension, it will try to find one by looking at the file contents. If no highlight method
is found it will just cat the file normally, without syntax highlighting.
To use it, add colorize to the plugins array of your zshrc file: To use it, add colorize to the plugins array of your zshrc file:
``` ```
plugins=(... colorize) plugins=(... colorize)
@ -9,9 +13,16 @@ plugins=(... colorize)
## Usage ## Usage
* `ccat <file> [files]`: colorize the contents of the file (or files, if more than one are provided). If no arguments are passed it will colorize the standard input or stdin. * `ccat <file> [files]`: colorize the contents of the file (or files, if more than one are provided).
If no arguments are passed it will colorize the standard input or stdin.
Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting method for a given extension, it will try to find one by looking at the file contents. If no highlight method is found it will just cat the file normally, without syntax highlighting. * `cless <file> [files]`: colorize the contents of the file (or files, if more than one are provided) and
open less. If no arguments are passed it will colorize the standard input or stdin.
Note that `cless` will behave as less when provided more than one file: you have to navigate files with
the commands `:n` for next and `:p` for previous. The downside is that less options are not supported.
But you can circumvent this by either using the LESS environment variable, or by running `ccat file1 file2|less --opts`.
In the latter form, the file contents will be concatenated and presented by less as a single file.
## Requirements ## Requirements

View file

@ -1,5 +1,6 @@
# easier alias to use the plugin # easier alias to use the plugin
alias ccat='colorize_via_pygmentize' alias ccat='colorize_via_pygmentize'
alias cless='colorize_via_pygmentize_less'
colorize_via_pygmentize() { colorize_via_pygmentize() {
if ! (( $+commands[pygmentize] )); then if ! (( $+commands[pygmentize] )); then
@ -16,7 +17,7 @@ colorize_via_pygmentize() {
# guess lexer from file extension, or # guess lexer from file extension, or
# guess it from file contents if unsuccessful # guess it from file contents if unsuccessful
local FNAME lexer local FNAME lexer
for FNAME in $@ for FNAME in "$@"
do do
lexer=$(pygmentize -N "$FNAME") lexer=$(pygmentize -N "$FNAME")
if [[ $lexer != text ]]; then if [[ $lexer != text ]]; then
@ -26,3 +27,23 @@ colorize_via_pygmentize() {
fi fi
done done
} }
colorize_via_pygmentize_less() (
# this function is a subshell so tmp_files can be shared to cleanup function
declare -a tmp_files
cleanup () {
[[ ${#tmp_files} -gt 0 ]] && rm -f "${tmp_files[@]}"
exit
}
trap 'cleanup' EXIT HUP TERM INT
while (( $# != 0 )); do #TODO: filter out less opts
tmp_file="$(mktemp --tmpdir "tmp.colorize.XXXX.$(sed 's/\//./g' <<< "$1")")"
tmp_files+=("$tmp_file")
colorize_via_pygmentize "$1" > "$tmp_file"
shift 1
done
less -f "${tmp_files[@]}"
)