From 89e3c632ef550f33534a935515519f8d14aa1fef Mon Sep 17 00:00:00 2001 From: Julien Nicoulaud Date: Sat, 25 Dec 2010 18:33:08 +0100 Subject: [PATCH] Add Zsh syntax highlighting script --- zsh-syntax-highlighting.zsh | 88 +++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 zsh-syntax-highlighting.zsh diff --git a/zsh-syntax-highlighting.zsh b/zsh-syntax-highlighting.zsh new file mode 100644 index 0000000..ce44620 --- /dev/null +++ b/zsh-syntax-highlighting.zsh @@ -0,0 +1,88 @@ +#!/usr/bin/env zsh +# Copyleft 2010 zsh-syntax-highlighting contributors +# All wrongs reserved. + +# Token types styles. +# See http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#SEC135 +ZLE_RESERVED_WORD_STYLE='fg=yellow,bold' +ZLE_ALIAS_STYLE='fg=magenta,bold' +ZLE_BUILTIN_STYLE='fg=cyan,bold' +ZLE_FUNCTION_STYLE='fg=blue,bold' +ZLE_COMMAND_STYLE='fg=green,bold' +ZLE_COMMAND_UNKNOWN_TOKEN_STYLE='fg=red,bold' + +ZLE_HYPHEN_CLI_OPTION='fg=yellow,bold' +ZLE_DOUBLE_HYPHEN_CLI_OPTION='fg=green,bold' +ZLE_SINGLE_QUOTED='fg=magenta,bold' +ZLE_DOUBLE_QUOTED='fg=red,bold' +ZLE_BACK_QUOTED='fg=cyan,bold' +ZLE_GLOBING='fg=blue,bold' + +ZLE_DEFAULT='fg=white,bold' + +ZLE_TOKENS_FOLLOWED_BY_COMMANDS=('|' '||' ';' '&' '&&' 'sudo' 'start' 'time' 'strace' 'ยง') + +# Recolorize the current ZLE buffer. +colorize-zle-buffer() { + region_highlight=() + colorize=true + start_pos=0 + for arg in ${(z)BUFFER}; do + ((start_pos+=${#BUFFER[$start_pos+1,-1]}-${#${BUFFER[$start_pos+1,-1]## #}})) + ((end_pos=$start_pos+${#arg})) + if $colorize; then + colorize=false + res=$(LC_ALL=C builtin type $arg 2>/dev/null) + case $res in + *'reserved word'*) style=$ZLE_RESERVED_WORD_STYLE;; + *'an alias'*) style=$ZLE_ALIAS_STYLE;; + *'shell builtin'*) style=$ZLE_BUILTIN_STYLE;; + *'shell function'*) style=$ZLE_FUNCTION_STYLE;; + *"$cmd is"*) style=$ZLE_COMMAND_STYLE;; + *) style=$ZLE_COMMAND_UNKNOWN_TOKEN_STYLE;; + esac + else + case $arg in + '--'*) style=$ZLE_DOUBLE_HYPHEN_CLI_OPTION;; + '-'*) style=$ZLE_HYPHEN_CLI_OPTION;; + "'"*"'") style=$ZLE_SINGLE_QUOTED;; + '"'*'"') style=$ZLE_DOUBLE_QUOTED;; + '`'*'`') style=$ZLE_BACK_QUOTED;; + *"*"*) style=$ZLE_GLOBING;; + *) style=$ZLE_DEFAULT;; + esac + fi + region_highlight+=("$start_pos $end_pos $style") + [[ ${${ZLE_TOKENS_FOLLOWED_BY_COMMANDS[(r)${arg//|/\|}]}:+yes} = 'yes' ]] && colorize=true + start_pos=$end_pos + done +} + +# Bind the function to ZLE events. +ZLE_COLORED_FUNCTIONS=( + self-insert + delete-char + backward-delete-char + kill-word + backward-kill-word + up-line-or-history + down-line-or-history + beginning-of-history + end-of-history + undo + redo + yank +) + +for f in $ZLE_COLORED_FUNCTIONS; do + eval "$f() { zle .$f && colorize-zle-buffer } ; zle -N $f" +done + +# Expand or complete hack + +# create an expansion widget which mimics the original "expand-or-complete" (you can see the default setup using "zle -l -L") +zle -C orig-expand-or-complete .expand-or-complete _main_complete + +# use the orig-expand-or-complete inside the colorize function (for some reason, using the ".expand-or-complete" widget doesn't work the same) +expand-or-complete() { builtin zle orig-expand-or-complete && colorize-zle-buffer } +zle -N expand-or-complete