[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Feedback, Hyperbole 7.0.8 Test Release
From: |
gravitypost |
Subject: |
Re: Feedback, Hyperbole 7.0.8 Test Release |
Date: |
Thu, 30 Jan 2020 21:35:37 +0100 |
User-agent: |
Posteo Webmail |
Glad it wasn't just me! Cool, glad I could help out!
Looking back at the user group, you also asked for feature requests, and
I had a couple -- though I'm not sure how feasible any of them are.
Feature Idea #1: `jump-to-next-button` Command
==============================================
This is something that would be nice to have rather than a missing
feature, but
I've often wished there were a command I could bind to a key that would
jump to
the next explicit button in a file -- sort of like how you can tab
between
fields in the Customize interface. I created a macro to do this using
regexes,
but it was kinda... janky.
Feature Idea #2: Honor styling markup from other modes in Koutline Files
========================================================================
I use the Markdown and Org styling stuff reflexively in other documents
-- it would
probably increase usage if some of those styling options were available
in KOTL
files. Ideally Koutliner could draw the markup handling from an existing
mode
rather than re-implementing every possible markup language -- but that
actually
brings me to...
Feature Idea #3: Treat Koutliner cells as containers for other content
======================================================================
I haven't used a lot of Koutliner -- despite loving the Augment-style
numbering
-- primarily because it doesn't appear to be compatible with the
document
systems I'm already heavily bought into, like Org and Markdown. Now, it
can
export outlines to Org and Html, and from there I can get it into
something
more familiar, but it feels like there's more opportunity here.
One of the hugely cool things about Koutliner, and which is missing from
Org,
is the Cell concept. I like the idea of addressable cells that I can
work with
rather than the more loosey-goosey "just add custom ids to each
headline"
approach that Org takes.
I don't know how feasible this is, but it would be kinda amazing to be
able to
treat Koutliner as kind of an overlay for Org content. So, for example,
I might
have a cell:
2a. Table of Material for Review
%ORGBLOCK_START%
| Date Due | Item ID |
|----------+---------|
| 1/29 | 21515 |
| 2/20 | 25155 |
| 3/19 | 29901 |
| 4/22 | 31555 |
%ORGBLOCK_END%
And have Koutliner recognize the block start/end tags and let Org do the
formatting in those places. You could then create formally structured
Koutliner
files that also include org-style headings and formatting and whatnot. I
think
that'd be awesome.
To go one step further -- some folks are working on adding Transclusion
fucionality to Org. It would be *even cooler* to be able to just include
a
chunk of another file in a Koutliner document, and truly amazing to
transclude
a block from any file into a Koutliner doc so the changes don't have to
be
tracked -- they just happen.
This would then give me all the benefits of a more rigid document type
and all
the flexibility and styling options of a system like org -- plus crazy
hypertext stuff that even the Web doesn't have.
It's also, like, the most pie-in-the-sky feature request in the
universe, haha.
Feature Idea #4: Embeddable Global Buttons
==========================================
I'm guessing this might become prohibitive from a performance
perspective if
you have a very large global button file, but -- it would be awesome if
I could
use the button file as a persistent list of buttons that I could add to
any
file. Or, more ambitiously, to combine the explicit buttons, and the
global
buttons, into a single table/database that I could then draw on to embed
buttons into my documents anywhere.
Say, for instance, that I've got a global button that jumps to a file
where I
collect extracts from the reading I do -- <(Extracts File)>. I can think
of a
number of occasions where it would be cool to drop that button into my
notes.
I also think it would be a handy way to interlink, say, a
zettelkasten-style notes
system: I would have collection of global buttons that point to the
entries in the
zettelkasten -- and I could then drop them into other notes and other
files as
appropriate. For this use case, someone will surely say: "But you can
just use
Org links for that!" But what if my notes aren't all in Org? Some are in
markdown, some are in plain text. What if I wanted to reference a Zettel
entry
in some code I'm working on? The thing that's awesome about Hyperbole is
it
works everywhere -- and unifying or globalizing the button functionality
would
be another way to have Hyperbole act as the hypertext layer for Emacs.
At any rate -- looking forward to the final release of 7.0.8!
On 30.01.2020 06:58, Robert Weiner wrote:
#2 was a change we made to the button flash time handling that did not
account for the persistence of customizable variables. It left you
with a flash time of 1000 seconds that would timeout when you pressed
an additional key. That has been reverted in the latest git repo
master if you ‘git pull’ in the Hyperbole source directory and then
restart Hyperbole/emacs. Buttons should work properly then.
We have replicated #3 and should have that fixed in another day.
Good catches.
-- Bob
On Jan 29, 2020, at 4:16 PM, address@hidden wrote:
Good afternoon,
As recommended, I'm submitting my feedback on the 7.0.8 Test Release
here -- hopefully I'm doing this correctly.
---------------------------------------------
OS: Windows 10 Home, Version 1909, Build 18363.592
GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) of 2019-08-29
Hyperbole Built following the instructions on this Reddit post:
https://www.reddit.com/r/emacs/comments/euzxmx/gnu_hyperbole_708_test_release_with_patches/
Hyperbole Config:
> ;; hyperbole
> (require 'hyperbole)
> (load "hyperbole-autoloads")
> (load "hyperbole")
---------------------------------------------
Feedback #1: Implicit Buttons are Much Improved! Action buttons are
great!
======================================================
I wanna say, first, that the implicit buttons are much improved in
this release -- both in their ability to find the buttons, and in the
options for labeling and linking. Likewise, the new Action Button
syntax is cool! I'm super excited for the final build.
Feedback #2: Possible Bug Causing Implicit Buttons Require Additional
User Input to Activate
===================================================================
Consider line 33 of the Hyperbole Demo document. It reads:
Hyperbole displays that file when you press {C-h h d a}. Hyperbole
assumes
If I want to invoke the key-sequence implicit button, I move the
cursor there, and hit M-RET or click with the mouse action button.
The expected behavior is, obviously, that the button flashes, then
activates. For me, though, activating the button causes the button to
highlight persistently -- and no action occurs until I make another
keypress. Any keypress that doesn't insert text works: ESC,
Right-Arrow, etc.
Most of the time when I press the extra key, the button then just
activates as normal, and works as expected. Sometimes when I press a
key, I get an error like:
apply: Wrong type argument: commandp, (keymap (keymap (9 .
backward-button)) ESC-prefix)
The debugger output:
Debugger entered--Lisp error: (wrong-type-argument commandp (keymap
(keymap (9 . backward-button)) ESC-prefix))
#<subr call-interactively>((keymap (keymap (9 . backward-button))
ESC-prefix))
apply(#<subr call-interactively> (keymap (keymap (9 .
backward-button)) ESC-prefix) nil)
call-interactively@ido-cr+-record-current-command(#<subr
call-interactively> (keymap (keymap (9 . backward-button))
ESC-prefix))
apply(call-interactively@ido-cr+-record-current-command #<subr
call-interactively> (keymap (keymap (9 . backward-button))
ESC-prefix))
call-interactively((keymap (keymap (9 . backward-button))
ESC-prefix))
(cond ((null binding) (if (kbd-key:special-sequence-p key-series)
(progn (setq unread-command-events (nconc unread-command-events
(mapcar (quote identity) key-series))) t))) ((memq binding (quote
(action-key action-mouse-key hkey-either))) (beep) (message
"(kbd-key:act): This key does what the Action Key does.") t) (t
(call-interactively binding) t))
(let ((binding (key-binding key-series))) (cond ((null binding)
(if (kbd-key:special-sequence-p key-series) (progn (setq
unread-command-events (nconc unread-command-events (mapcar ...
key-series))) t))) ((memq binding (quote (action-key action-mouse-key
hkey-either))) (beep) (message "(kbd-key:act): This key does what the
Action Key does.") t) (t (call-interactively binding) t)))
kbd-key:act("\033")
actypes::kbd-key("\033")
apply(actypes::kbd-key "\033")
eval((apply action args))
(if (or (symbolp action) (listp action) (hypb:emacs-byte-code-p
action) (and (stringp action) (not (integerp action)) (setq action
(key-binding action)))) (eval act) (eval action))
(or (if (or (symbolp action) (listp action)
(hypb:emacs-byte-code-p action) (and (stringp action) (not (integerp
action)) (setq action (key-binding action)))) (eval act) (eval
action)) t)
(prog1 (or (if (or (symbolp action) (listp action)
(hypb:emacs-byte-code-p action) (and (stringp action) (not (integerp
action)) (setq action (key-binding action)))) (eval act) (eval
action)) t) (hhist:add hist-elt))
(let ((hist-elt (hhist:element))) (run-hooks (quote
action-act-hook)) (prog1 (or (if (or (symbolp action) (listp action)
(hypb:emacs-byte-code-p action) (and (stringp action) (not (integerp
action)) (setq action (key-binding action)))) (eval act) (eval
action)) t) (hhist:add hist-elt)))
(if (null action) (error "(actype:act): Null action for: `%s'"
actype) (and (symbolp action) (symtable:actype-p action) (setq args
(action:path-args-abs args))) (let ((hist-elt (hhist:element)))
(run-hooks (quote action-act-hook)) (prog1 (or (if (or (symbolp
action) (listp action) (hypb:emacs-byte-code-p action) (and (stringp
action) (not ...) (setq action ...))) (eval act) (eval action)) t)
(hhist:add hist-elt))))
(let ((prefix-arg current-prefix-arg) (action (actype:action
actype)) (act (quote (apply action args)))) (if (null action) (error
"(actype:act): Null action for: `%s'" actype) (and (symbolp action)
(symtable:actype-p action) (setq args (action:path-args-abs args)))
(let ((hist-elt (hhist:element))) (run-hooks (quote action-act-hook))
(prog1 (or (if (or (symbolp action) (listp action)
(hypb:emacs-byte-code-p action) (and ... ... ...)) (eval act) (eval
action)) t) (hhist:add hist-elt)))))
actype:act(actypes::kbd-key "\033\015")
apply(actype:act actypes::kbd-key "\033\015")
(if hbut (apply hrule:action (hattr:get hbut (quote actype))
(hattr:get hbut (quote args))))
hbut:act(hbut:current)
funcall(hbut:act hbut:current)
(cond ((and (called-interactively-p (quote interactive)) (null
but)) (hypb:error "(hbut-operate): No current button to operate
upon")) ((not (hbut:is-p but)) (hypb:error "(hbut-operate): Button is
invalid; it has no attributes")) (t (or but (setq but (quote
hbut:current))) (hui:but-flash) (funcall operation but)))
hui:hbut-operate(hbut:act "execute" hbut:current)
hui:hbut-act(hbut:current)
eval((hui:hbut-act (quote hbut:current)))
(progn (if hkey-debug (hkey-debug)) (eval hkey-action))
(if (setq hkey-action (if assist-flag (cdr (cdr hkey-form)) (car
(cdr hkey-form))) pred (car hkey-form) pred-value (eval pred)) (progn
(if hkey-debug (hkey-debug)) (eval hkey-action)) (setq hkey-forms
(cdr hkey-forms)))
(while (and (null pred-value) (setq hkey-form (car hkey-forms)))
(if (setq hkey-action (if assist-flag (cdr (cdr hkey-form)) (car (cdr
hkey-form))) pred (car hkey-form) pred-value (eval pred)) (progn (if
hkey-debug (hkey-debug)) (eval hkey-action)) (setq hkey-forms (cdr
hkey-forms))))
(let ((hkey-forms hkey-alist) (pred-value) (hkey-action) hkey-form
pred) (while (and (null pred-value) (setq hkey-form (car
hkey-forms))) (if (setq hkey-action (if assist-flag (cdr (cdr
hkey-form)) (car (cdr hkey-form))) pred (car hkey-form) pred-value
(eval pred)) (progn (if hkey-debug (hkey-debug)) (eval hkey-action))
(setq hkey-forms (cdr hkey-forms)))) pred-value)
hkey-execute(nil)
(or (hkey-execute nil) (if (fboundp action-key-default-function)
(progn (funcall action-key-default-function) t)))
action-key-internal()
(prog1 (action-key-internal) (run-hooks (quote
action-key-depress-hook) (quote action-key-release-hook)))
action-key()
(if arg (assist-key) (action-key))
hkey-either(nil)
funcall-interactively(hkey-either nil)
#<subr call-interactively>(hkey-either nil nil)
apply(#<subr call-interactively> hkey-either (nil nil))
call-interactively@ido-cr+-record-current-command(#<subr
call-interactively> hkey-either nil nil)
apply(call-interactively@ido-cr+-record-current-command #<subr
call-interactively> (hkey-either nil nil))
call-interactively(hkey-either nil nil)
command-execute(hkey-either)
I get this behavior in elisp files as well. Consider the following:
;; Info-mode
(when (eq system-type 'windows-nt)
(setq Info-additional-directory-list
(quote
("~/Apps/msys2/usr/share/info" "~/Apps/msys2
/mingw64/share/info"))))
If I move to one of the paths listed, and hit the action button,
Hyperbole correctly recognizes the path as an implicit button,
highlights it, but then doesn't act upon it until I make some
additional keypress. This case does not throw an error, so I can't
provide debug information.
Feedback #3: Explicit Buttons Should Be Colored
===================================
If I have an explicit button in a file -- <(fake button)> -- it does
not display in red as intended. Examining the way this stuff is set
up, it looks like the button color is tied to the `Hbut` face, and
that the `Hbut` face defaults to
foreground: SystemWindowText
background: SystemWindow
This basically means black text on a white background, just like all
the other normal text in a file.
Modifying these faces doesn't seem to stick, either. If I go into
Hyperbole's customization {C-h h c a} then the Hyperbole Buttons
group, then the `Face Hbut` property and set it to `red` or `#ff0000`
-- Hitting `Apply and Save` creates an entry in my custom.el:
'(hbut ((t (:background "SystemWindow" :foreground "red"))) t)
and changes the button color correctly... but upon restarting Emacs,
it reverts back to `SystemWindowText`/`SystemWindow`. This is true
even when `custom.el` is loads correctly. I have also tried this
without having an external customization file -- in that case,
customizing the face adds the line above to the bottom of my init, but
there's no difference in behavior.
I was able to force the buttons to always be red by creating this hook
-- but that shouldn't be necessary, right?
(add-hook 'hyperbole-init-hook (lambda ()
(hproperty:cycle-but-color
"red")))
Thank you for all your hard work on this package. I use Hyperbole
basically every day, and I'm always excited for a new release!