summaryrefslogtreecommitdiff
path: root/Functions/Misc/sticky-note
diff options
context:
space:
mode:
authorBart Schaefer <barts@users.sourceforge.net>2010-11-27 19:47:00 +0000
committerBart Schaefer <barts@users.sourceforge.net>2010-11-27 19:47:00 +0000
commit828574d953596545ad0d62beb952a6a5978e9244 (patch)
tree66370a9947504fd37f32313abfcb09af1bdad37a /Functions/Misc/sticky-note
parentcf17c398322befed2ac30485f759a4fabc8bef08 (diff)
downloadzsh-828574d953596545ad0d62beb952a6a5978e9244.tar.gz
zsh-828574d953596545ad0d62beb952a6a5978e9244.zip
users/15583: update with zstyles and for ease of use in zle-line-init.
Diffstat (limited to 'Functions/Misc/sticky-note')
-rw-r--r--Functions/Misc/sticky-note127
1 files changed, 88 insertions, 39 deletions
diff --git a/Functions/Misc/sticky-note b/Functions/Misc/sticky-note
index f52a8812e..cfe9ea684 100644
--- a/Functions/Misc/sticky-note
+++ b/Functions/Misc/sticky-note
@@ -1,9 +1,5 @@
#!/bin/zsh -fi
-# A little zsh sticky-note ("post-it") application. Sticky notes are
-# stored in the file named by the STICKYFILE variable (defaults to
-# $HOME/.zsticky). The number of notes stored is STICKYSIZE (1000).
-#
-# Load this file as a function:
+# A zsh sticky-note ("post-it") application. Load this file as a function:
# autoload -Uz sticky-note
#
# It may then be bound as a widget:
@@ -12,30 +8,102 @@
# sticky-note
# sticky-note -b
# sticky-note -l ...
-# With the -l option, lists previous sticky notes. Most options of the
+# The -b option is like "zed -b": it installs keymaps/bindings only.
+# Use the -l option to list previous sticky notes. Most options of the
# "fc -l" command are supported, for selecting which notes to display.
-# The -b option is like "zed -b": installs keymaps/bindings only.
+# If "sticky-note -l" is run from inside a widget, the cursor is moved
+# to the top left of the terminal before display and returned to its
+# original position after display. The -l option is implicitly added
+# when sticky-note is called from zle-line-init, to avoid inadvertently
+# trapping the user inside the note editor.
#
-# Otherwise invokes the line editor with the previous notes available
+# Otherwise, invoke the line editor with the previous notes available
# as an editor history. Two quick taps on the return/enter key finish
# the note, or you can use use ^X^W as usual (ZZ in vicmd mode).
+# The application is configured by three zstyles, all using the context
+# ":sticky-note". The first two styles are "notefile" and "maxnotes"
+# to name the file in which notes are stored and the maximum number of
+# notes to retain:
+# zstyle :sticky-note notefile ~/.zsticky
+# zstyle :sticky-note maxnotes 1000
+
+# The "theme" style may be set to control the appearance of the notes.
+# The style is an associative array; the current set of values (defaults
+# in parens) are:
+# bg => name or ANSI escape for background color (yellow)
+# fg => name or ANSI escape for foreground color (black)
+# color => ANSI escape for color scheme ($theme[bg]$theme[fg])
+# reset => ANSI escape to restore "normal" colors
+# Values given as names are looked up in the $bg and $fg arrays from the
+# "colors" function. If a "color" field is set, the "bg" and "fg" fields
+# are not used. Example:
+# zstyle :sticky-note theme \
+# bg red \
+# fg $fg_bold[yellow]
+
+# For backwards compatibility with an earlier version, the notefile may
+# also be named by the STICKYFILE variable (defaults to $HOME/.zsticky).
+# The number of notes stored may be given by STICKYSIZE (1000).
+
# I encourage all you creative people to contribute enhancements ...
-# no-prize for the first person to put the most recent sticky note in
-# his PS1 string.
emulate -LR zsh
+setopt nobanghist extendedhistory histignoredups
local STICKYFILE=${STICKYFILE:-$HOME/.zsticky}
local STICKYSIZE=${STICKYSIZE:-1000}
+local sticky stickyfile stickysize
+
+zstyle -s :sticky-note notefile stickyfile || stickyfile=$STICKYFILE
+zstyle -s :sticky-note maxnotes stickysize || stickysize=$STICKYSIZE
+
+# Set up keybindings (adapted from "zed")
+if ! bindkey -M sticky >& /dev/null
+then
+ bindkey -N sticky main
+ bindkey -M sticky ^X^W accept-line
+ bindkey -M sticky ^M^M accept-line # Two quick RETs ends note
+ bindkey -M sticky ^M self-insert-unmeta
+fi
+if ! bindkey -M sticky-vicmd >& /dev/null
+then
+ bindkey -N sticky-vicmd vicmd
+ bindkey -M sticky-vicmd ZZ accept-line
+fi
+
+[[ "$1" == -b ]] && return 0
+
+# Look up color theme
+local -A theme
+(($+bg && $+fg)) || { autoload -Uz colors; colors }
+zstyle -m :sticky-note theme '*' || {
+ zstyle :sticky-note theme bg yellow fg black
+}
+zstyle -a :sticky-note theme theme
+(( ${+bg[$theme[bg]]} )) && theme[bg]=$bg[$theme[bg]]
+(( ${+fg[$theme[fg]]} )) && theme[fg]=$fg[$theme[fg]]
+(( ${+theme[color]} )) || theme[color]=$theme[bg]$theme[fg]
+(( ${+theme[reset]} )) || theme[reset]=$reset_color
# If invoked as a widget, behave a bit like run-help
if zle
then
- if [[ $CONTEXT = (cont|select|vared) ]]
+ zmodload -i zsh/parameter
+ if [[ $* == -*l* || $functrace == *zle-line-init:* ]]
+ then
+ fc -ap $stickyfile $stickysize $stickysize
+ echoti sc
+ echoti home
+ print -nr "$theme[color]"
+ fc -l "${@:--1}" | while read -r sticky; do print -- "$sticky"; done
+ print -nr "$theme[reset]"
+ echoti rc
+ elif [[ $CONTEXT = (cont|select|vared) ]]
then
zle -M "No stickies during ${${(z)PREBUFFER}[1]:-$CONTEXT}, sorry"
zle .beep
+ zle -R
else
zle .push-line
BUFFER=sticky-note
@@ -44,43 +112,24 @@ then
return 0
fi
-(($+bg && $+fg)) || { autoload -Uz colors; colors }
-
# Invoked as a command, behave like zed, but write a history file
-setopt nobanghist extendedhistory histignoredups
-fc -ap $STICKYFILE $STICKYSIZE $STICKYSIZE
+fc -ap $stickyfile $stickysize $stickysize
# With a -l option, list the existing sticky notes
-if [[ "$1" == -*l* ]]
+if [[ "$*" == -*l* ]]
then
- print -nr "$bg[yellow]$fg[black]"
- fc -f "$@"
- print -nr "$reset_color"
+ print -nr "$theme[color]"
+ # Use read/print loop to interpolate "\n" in history lines
+ fc -f "$@" | while read -r sticky; do print -- "$sticky"; done
+ print -nr "$theme[reset]"
return 0
fi
-# Set up keybindings (adapted from "zed")
-if ! bindkey -M sticky >& /dev/null
-then
- bindkey -N sticky main
- bindkey -M sticky ^X^W accept-line
- bindkey -M sticky ^M^M accept-line # Two quick RETs ends note
- bindkey -M sticky ^M self-insert-unmeta
-fi
-if ! bindkey -M sticky-vicmd >& /dev/null
-then
- bindkey -N sticky-vicmd vicmd
- bindkey -M sticky-vicmd ZZ accept-line
-fi
-
-[[ "$1" == -b ]] && return 0
-
-# Edit a new sticky note and add it to the STICKYFILE
-local sticky
-while vared -h -p "%{$bg[yellow]$fg[black]%}" -M sticky -m sticky-vicmd sticky
+# Edit a new sticky note and add it to the stickyfile
+while vared -h -p "%{$theme[color]%}" -M sticky -m sticky-vicmd sticky
do
{
- print -s -- "$sticky"
+ [[ -n "$sticky" ]] && print -s -- "$sticky"
} always {
(( TRY_BLOCK_ERROR = 0 ))
} && break