zsh-workers
 help / color / mirror / Atom feed
* Suggested improvement for sticky-note
       [not found] <1185563186.165566.1619896723304.ref@mail.yahoo.com>
@ 2021-05-01 19:18 ` vapnik spaknik
  2021-05-02 23:57   ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: vapnik spaknik @ 2021-05-01 19:18 UTC (permalink / raw)
  To: Zsh Hackers List

[-- Attachment #1: Type: text/plain, Size: 231 bytes --]

Hi,
    it's fun & useful to be able to display sticky notes in blinking text, or different colours, to make them stand out or colour code them.
The attached diff implements that feature by adding the -b option to print.

Joe

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: sticky-note.diff --]
[-- Type: text/x-patch, Size: 427 bytes --]

99c99
<     fc -l "${@:--1}" | while read -r sticky; do print -- "$sticky"; done
---
>     fc -l "${@:--1}" | while read -r sticky; do print -b -- "$sticky"; done
123c123
<   fc -f "$@" | while read -r sticky; do print -- "$sticky"; done
---
>   fc -f "$@" | while read -r sticky; do print -b -- "$sticky"; done
132c132
<     [[ -n "$sticky" ]] && print -s -- "$sticky"
---
>     [[ -n "$sticky" ]] && print -b -s -- "$sticky"

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Suggested improvement for sticky-note
  2021-05-01 19:18 ` Suggested improvement for sticky-note vapnik spaknik
@ 2021-05-02 23:57   ` Bart Schaefer
  2021-05-04  2:06     ` vapnik spaknik
  0 siblings, 1 reply; 6+ messages in thread
From: Bart Schaefer @ 2021-05-02 23:57 UTC (permalink / raw)
  To: vapnik spaknik; +Cc: Zsh Hackers List

[-- Attachment #1: Type: text/plain, Size: 991 bytes --]

On Sat, May 1, 2021 at 12:19 PM vapnik spaknik <vapniks@yahoo.com> wrote:
>
> Hi,
>     it's fun & useful to be able to display sticky notes in blinking text, or different colours, to make them stand out or colour code them.
> The attached diff implements that feature by adding the -b option to print.

First, thanks for the suggestion, the comment inviting improvements
was written in 2008 and I think this is the first time anyone actually
sent one.

Second, a couple of meta-notes:
* Please send patches in unified diff (diff -u) format, or use "git
diff" or "git send-email" if you have a checked-out source tree.
* Attached patches should be content-type text/plain and preferably
use a ".txt" file extension so they can easily be read in the email
itself, rather than fed to an external viewer (which in the case of
".diff" might attempt to apply the patch).

Third, this is the sort of thing that ought to be customizable.  So,
how about the attached, which adds an "escapes" style?

[-- Attachment #2: sticky-note.txt --]
[-- Type: text/plain, Size: 2949 bytes --]

diff --git a/Functions/Misc/sticky-note b/Functions/Misc/sticky-note
index efe5ec1eb..ad4fc30e5 100644
--- a/Functions/Misc/sticky-note
+++ b/Functions/Misc/sticky-note
@@ -21,7 +21,7 @@
 # as an editor history.  Two quick taps on the return/enter key finish
 # the note, or you can use ^X^W as usual (ZZ in vicmd mode).
 
-# The application is configured by three zstyles, all using the context
+# The application is configured by four 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:
@@ -42,6 +42,17 @@
 #     bg red \
 #     fg $fg_bold[yellow]
 
+# Finally the "escapes" style may be used to control the intepretation of
+# of character sequences such as '\Cx' and '%B' in the content of each
+# note.  The style may be set to either one or two strings:
+#   none    => no interpretation, other strings in the value are ignored
+#   echo    => escape sequences of the "echo" command are interpreted
+#   bindkey => escapes of the "bindkey" command are interpreted
+#   prompt  => interpret prompt escapes, may be paired with echo or bindkey
+# The default is "echo" for compatibility with previous versions.  Note
+# that use of some escape sequences may garble the display, or clash
+# with the "theme" style.
+
 # 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).
@@ -74,6 +85,21 @@ fi
 
 [[ "$1" == -b ]] && return 0
 
+# Set escape handling
+local -a escapes prop
+if zstyle -a :sticky-note escapes escapes
+then
+  prop=(-r)
+  if [[ $escapes != *none* ]]
+  then
+    case $escapes in
+    (*bindkey*) prop=({$prop/-r/-b});;
+    (*echo*) prop=(${prop/-r/});;
+    esac
+    [[ $escapes = *prompt* ]] && prop+=(-P)
+  fi
+fi
+
 # Look up color theme
 local -A theme
 (($+bg && $+fg)) || { autoload -Uz colors; colors }
@@ -96,7 +122,7 @@ then
     echoti sc
     echoti home
     print -nr "$theme[color]"
-    fc -l "${@:--1}" | while read -r sticky; do print -- "$sticky"; done
+    fc -l "${@:--1}" | while read -r sticky; do print $prop -- "$sticky"; done
     print -nr "$theme[reset]"
     echoti rc
   elif [[ $CONTEXT = (cont|select|vared) ]]
@@ -120,7 +146,7 @@ if [[ "$*" == -*l* ]]
 then
   print -nr "$theme[color]"
   # Use read/print loop to interpolate "\n" in history lines
-  fc -f "$@" | while read -r sticky; do print -- "$sticky"; done
+  fc -f "$@" | while read -r sticky; do print $prop -- "$sticky"; done
   print -nr "$theme[reset]"
   return 0
 fi
@@ -129,7 +155,7 @@ fi
 while vared -h -p "%{$theme[color]%}" -M sticky -m sticky-vicmd sticky
 do
   {
-    [[ -n "$sticky" ]] && print -s -- "$sticky"
+    [[ -n "$sticky" ]] && print -rs -- "$sticky"
   } always {
     (( TRY_BLOCK_ERROR = 0 ))
   } && break

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Suggested improvement for sticky-note
  2021-05-02 23:57   ` Bart Schaefer
@ 2021-05-04  2:06     ` vapnik spaknik
  2021-05-09 20:50       ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: vapnik spaknik @ 2021-05-04  2:06 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh Hackers List

[-- Attachment #1: Type: text/plain, Size: 905 bytes --]


> On Monday, May 3, 2021, 12:57:46 AM GMT+1, Bart Schaefer <schaefer@brasslantern.com> wrote: 

>> On Sat, May 1, 2021 at 12:19 PM vapnik spaknik <vapniks@yahoo.com> wrote:

>> Hi,
>>    it's fun & useful to be able to display sticky notes in blinking text, or different colours, to make them stand out or colour code them.
>> The attached diff implements that feature by adding the -b option to print.

> Third, this is the sort of thing that ought to be customizable.  So,
> how about the attached, which adds an "escapes" style?

I actually made some changes before reading this email, after realizing that many users might not know the correct escape codes to use. 
The attached diff (against the original) adds options for selecting a background colour &/or blinking when creating a new sticky note, and automatically adds the appropriate escape codes. It also adds a help option.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: sticky-note.diff --]
[-- Type: text/x-patch, Size: 3209 bytes --]

--- /gnu/store/2hsg15n644f0glrcbkb1kqknmmqdar03-zsh-5.8/share/zsh/5.8/functions/sticky-note	1970-01-01 01:00:01.000000000 +0100
+++ /home/ben/.oh-my-zsh/custom/autoload/sticky-note	2021-05-02 23:45:17.021881434 +0100
@@ -49,7 +49,7 @@
 # I encourage all you creative people to contribute enhancements ...
 
 emulate -LR zsh
-setopt nobanghist extendedhistory histignoredups
+setopt nobanghist extendedhistory histignoredups noflowcontrol extendedglob
 
 local STICKYFILE=${STICKYFILE:-$HOME/.zsticky}
 local STICKYSIZE=${STICKYSIZE:-1000}
@@ -72,19 +72,47 @@
   bindkey -M sticky-vicmd ZZ accept-line
 fi
 
-[[ "$1" == -b ]] && return 0
+if [[ "$*" == *-h* ]]; then
+    print "Usage: sticky-note [OPTION]...
+Where [OPTION]s can be:
+
+ -h      display this help and exit
+ -l      list existing sticky notes
+ -b      install keymaps & keybindings, and exit
+ -c COL  make sticky note a certain colour (ignored with -l option)
+ -B      make sticky note blink (ignored with -l option)
+
+With no option a new sticky note is prompted for, with colour specified 
+by the \"theme\" zstyle for the \":sticky-note\" context"
+    return 0
+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]]
+(( ${+bg[$theme[bg]]} )) && theme[bg]=$bg[$theme[bg]]
 (( ${+theme[color]} )) || theme[color]=$theme[bg]$theme[fg]
 (( ${+theme[reset]} )) || theme[reset]=$reset_color
+# If -c <COL> option is supplied use <COL> as background colour
+if [[ "$*" == *-c\ [a-z]##* ]]; then
+    theme[newcolor]="$bg[${*//(#b)*-c ([a-z]#)*/$match}]${theme[fg]}"
+else
+    theme[newcolor]=$theme[color]
+fi
+# blink text if -B option supplied
+if [[ "$*" == *-B* ]]; then
+    theme[newcolor]+="$(echoti blink)"
+fi
+
+local fcopts="${${${${@//-B}//-c #[a-z]#}## #}%% #}"
 
 # If invoked as a widget, behave a bit like run-help
 if zle
@@ -96,7 +124,7 @@
     echoti sc
     echoti home
     print -nr "$theme[color]"
-    fc -l "${@:--1}" | while read -r sticky; do print -- "$sticky"; done
+    fc -l "${fcopts:--1}" | while read -r sticky; do print -b -- "$sticky"; done
     print -nr "$theme[reset]"
     echoti rc
   elif [[ $CONTEXT = (cont|select|vared) ]]
@@ -120,19 +148,20 @@
 then
   print -nr "$theme[color]"
   # Use read/print loop to interpolate "\n" in history lines
-  fc -f "$@" | while read -r sticky; do print -- "$sticky"; done
+  fc -f "${fcopts}" | while read -r sticky; do print -b -- "$sticky"; done
   print -nr "$theme[reset]"
   return 0
 fi
 
 # Edit a new sticky note and add it to the stickyfile
-while vared -h -p "%{$theme[color]%}" -M sticky -m sticky-vicmd sticky
+while vared -h -e -p "%{$theme[newcolor]%}" -M sticky -m sticky-vicmd sticky
 do
   {
-    [[ -n "$sticky" ]] && print -s -- "$sticky"
+    [[ -n "$sticky" ]] && print -s -- "${theme[newcolor]}$sticky${theme[color]}\e[25m"
   } always {
     (( TRY_BLOCK_ERROR = 0 ))
   } && break
   echo -n -e '\a'
 done
 return 0
+

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Suggested improvement for sticky-note
  2021-05-04  2:06     ` vapnik spaknik
@ 2021-05-09 20:50       ` Bart Schaefer
  2021-05-11 10:18         ` Mikael Magnusson
  2021-05-11 12:37         ` vapnik spaknik
  0 siblings, 2 replies; 6+ messages in thread
From: Bart Schaefer @ 2021-05-09 20:50 UTC (permalink / raw)
  To: vapnik spaknik; +Cc: Zsh Hackers List

Just now getting back to this ...

On Mon, May 3, 2021 at 7:06 PM vapnik spaknik <vapniks@yahoo.com> wrote:
>
> The attached diff (against the original)

... is still a file with the ".diff" suffix instead of ".txt" ...

> adds options for selecting a background colour &/or blinking when creating a new sticky note, and automatically adds the appropriate escape codes. It also adds a help option.

There are a few reasonable suggestions here mixed with quite a number
of things that could be improved.  Adding noflowcontrol to the setopts
is probably a good idea, and passing "-e" to vared should at least be
configurable.  That also caused me to notice that interrupting
sticky-note with a keyboard interrupt (^C) can cause old notes to
disappear, so that should be fixed.  Help text is good if other new
command-line options are coming.

On the flip side:

The ad-hoc option recognition by pattern-matching "$*" is going to be
error prone.  Previously all the options were mutually exclusive so
just testing $1 was OK, but if there are going to be several options
that can appear in combination there ought to be a call to zparseopts
(or at least getopts).

Hardwiring two options for color and blink seems pretty arbitrary
(compare the "escapes" style in my patch that selects among three
variants).  What if someone wants italics or boldface or underlining
instead of blinking?

It's a bit strange to use $(echoti blink) for "on" but then hardwire
$'\e25m' for "off".  Anyway, $(echoti blink) just spits out an error
on my terminal, which the patch doesn't account for.

Having the note blink while it is being edited is rather
weird/distracting even if you want it to blink when displayed later.
(There's a reason web browsers dropped support for the HTML <blink>
tag, but we won't go there.)  Also, during editing the visual changes
are part of the vared prompt, but then are stored as raw ANSI escapes
in the text of the sticky note itself, which will have odd
side-effects when using history to access previous notes.

This is a mixing of metaphors, so to speak.  Visual changes are in the
text but the interpretation of bindkey sequences is done by "print -b"
after the text is read back from the file and is being displayed.
Even so, the raw escapes only work when combined with your -B option,
because if "print -b" is not used, the ASCII 033 are converted to "^"
"[" before being sent to the terminal.

Finally, you've embedded the definition-time theme color in the note
at the point where blink is turned off, so if the theme changes (new
zstyle applied) any notes that had color changes or blink will revert
to the previous theme's coloring.  In fact this makes me aware that it
doesn't really work to interpret prompt escapes, because (for example)
after %Bbold%b the background color reverts as well and the rest of
the note is no longer yellow.

It's going to take a bit more thought to decide what it's possible to
salvage from this, so no patch yet.

For any other zsh-workers reading this:  Does anyone know why
putpromptchar() has this?
            case 'b':
                txtchangeset(txtchangep, TXTNOBOLDFACE, TXTBOLDFACE);
                txtunset(TXTBOLDFACE);
                tsetcap(TCALLATTRSOFF, TSC_PROMPT|TSC_DIRTY);
                break;
That is, why TCALLATTRSOFF ?  That isn't done for %s or %u ... why is
there no TCBOLDFACEEND defined?


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Suggested improvement for sticky-note
  2021-05-09 20:50       ` Bart Schaefer
@ 2021-05-11 10:18         ` Mikael Magnusson
  2021-05-11 12:37         ` vapnik spaknik
  1 sibling, 0 replies; 6+ messages in thread
From: Mikael Magnusson @ 2021-05-11 10:18 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: vapnik spaknik, Zsh Hackers List

On 5/9/21, Bart Schaefer <schaefer@brasslantern.com> wrote:
> Just now getting back to this ...
>
[...]
> Finally, you've embedded the definition-time theme color in the note
> at the point where blink is turned off, so if the theme changes (new
> zstyle applied) any notes that had color changes or blink will revert
> to the previous theme's coloring.  In fact this makes me aware that it
> doesn't really work to interpret prompt escapes, because (for example)
> after %Bbold%b the background color reverts as well and the rest of
> the note is no longer yellow.
>
> It's going to take a bit more thought to decide what it's possible to
> salvage from this, so no patch yet.
>
> For any other zsh-workers reading this:  Does anyone know why
> putpromptchar() has this?
>             case 'b':
>                 txtchangeset(txtchangep, TXTNOBOLDFACE, TXTBOLDFACE);
>                 txtunset(TXTBOLDFACE);
>                 tsetcap(TCALLATTRSOFF, TSC_PROMPT|TSC_DIRTY);
>                 break;
> That is, why TCALLATTRSOFF ?  That isn't done for %s or %u ... why is
> there no TCBOLDFACEEND defined?

I think that's a shortcoming in termcap and/or terminfo. In termcap
there is md (1m) and me (0m) that should correspond to bold, but 0m
turns off all attributes. Compare with us (4m) and ue (24m).
https://www.gnu.org/software/termutils/manual/termcap-1.3/html_chapter/termcap_4.html
also implies that there is no specific termcap sequence to only turn
off specific appearance modes.

When it comes to ANSI sequences though, there definitely are. From ctlseqs.txt,

            Ps = 2 2  -> Normal (neither bold nor faint)
            Ps = 2 4  -> Not underlined
            Ps = 2 5  -> Steady (not blinking)
            Ps = 2 7  -> Positive (not inverse)
            Ps = 2 8  -> Visible, i.e., not hidden (VT300)

Since we already assume ANSI for things like colors, I don't think we
would lose a lot of compatibility in practice if we just use 22
instead of 0 for %b, but we could potentially put it behind a setopt?

-- 
Mikael Magnusson


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Suggested improvement for sticky-note
  2021-05-09 20:50       ` Bart Schaefer
  2021-05-11 10:18         ` Mikael Magnusson
@ 2021-05-11 12:37         ` vapnik spaknik
  1 sibling, 0 replies; 6+ messages in thread
From: vapnik spaknik @ 2021-05-11 12:37 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh Hackers List

> On Sunday, May 9, 2021, 09:50:18 PM GMT+1, Bart Schaefer <schaefer@brasslantern.com> wrote:

>> On Mon, May 3, 2021 at 7:06 PM vapnik spaknik <vapniks@yahoo.com> wrote:
>>
>> The attached diff (against the original)

> ... is still a file with the ".diff" suffix instead of ".txt" ...

oops, sorry

> .....
> Hardwiring two options for color and blink seems pretty arbitrary
> (compare the "escapes" style in my patch that selects among three
> variants).  What if someone wants italics or boldface or underlining
> instead of blinking?

I thought most people would only need to differentiate different categories of notes (colours), and important ones (blinking), but I guess blinking might be a bit annoying for some.

> It's a bit strange to use $(echoti blink) for "on" but then hardwire
> $'\e25m' for "off".  Anyway, $(echoti blink) just spits out an error
> on my terminal, which the patch doesn't account for.

I thought echoti would be more portable, obviously I was wrong, but couldn't find any echoti command to turn off blinking.

> Having the note blink while it is being edited is rather
> weird/distracting even if you want it to blink when displayed later.
> (There's a reason web browsers dropped support for the HTML <blink>
> tag, but we won't go there.)  Also, during editing the visual changes
> are part of the vared prompt, but then are stored as raw ANSI escapes
> in the text of the sticky note itself, which will have odd
> side-effects when using history to access previous notes.

> This is a mixing of metaphors, so to speak.  Visual changes are in the
> text but the interpretation of bindkey sequences is done by "print -b"
> after the text is read back from the file and is being displayed.
> Even so, the raw escapes only work when combined with your -B option,
> because if "print -b" is not used, the ASCII 033 are converted to "^"
> "[" before being sent to the terminal.

> Finally, you've embedded the definition-time theme color in the note
> at the point where blink is turned off, so if the theme changes (new
> zstyle applied) any notes that had color changes or blink will revert
> to the previous theme's coloring.  In fact this makes me aware that it
> doesn't really work to interpret prompt escapes, because (for example)
> after %Bbold%b the background color reverts as well and the rest of
> the note is no longer yellow.

Seems I overlooked a few things when I hacked that up a few days ago.
It did cross my mind to use getopts, but I thought it would be better to keep 
the code short, and not make too many changes.
The patched sticky-note works for my purposes, but if I get some time at some 
point in the future (can't say when) I will have another look at it, unless you beat me to it..



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-05-11 12:37 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1185563186.165566.1619896723304.ref@mail.yahoo.com>
2021-05-01 19:18 ` Suggested improvement for sticky-note vapnik spaknik
2021-05-02 23:57   ` Bart Schaefer
2021-05-04  2:06     ` vapnik spaknik
2021-05-09 20:50       ` Bart Schaefer
2021-05-11 10:18         ` Mikael Magnusson
2021-05-11 12:37         ` vapnik spaknik

zsh-workers

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.vuxu.org/zsh-workers

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 zsh-workers zsh-workers/ http://inbox.vuxu.org/zsh-workers \
		zsh-workers@zsh.org
	public-inbox-index zsh-workers

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.workers


code repositories for the project(s) associated with this inbox:

	https://git.vuxu.org/mirror/zsh/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git