Forked from paradoxxxzero/live-command-coloring.sh
Created
December 24, 2010 11:56
-
-
Save jedahan/754142 to your computer and use it in GitHub Desktop.
fish-style syntax highlighting for zsh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/zsh | |
# Copyleft 2010 paradoxxxzero All wrongs reserved | |
# With contribution from James Ahlborn | |
# https://gist.github.com/752727 | |
# Fork of https://gist.github.com/586698 by nicoulaj / dingram / roylzuo ... | |
# From http://www.zsh.org/mla/users/2010/msg00692.html | |
# 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]}-${#${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 | |
# Thanks to James Ahlborn : | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi, just to say I created a project and added everyone who made changes as author:
https://github.com/nicoulaj/zsh-syntax-highlighting
It will be easier for people than tracking the most up-to-date fork :)