Git Product home page Git Product logo

hyperbole's Introduction

GNU Hyperbole 9.0.2pre - The Everyday Hypertextual Information Manager

[We work on Hyperbole as a gift to the Emacs community and request you send us a thank you or a testimonial describing your usage if you like Hyperbole (mailto:[email protected])].

[TOC]

Hyperbole screenshot of the Koutliner, DEMO file and HyRolo

Videos

If you prefer video introductions, visit the videos linked to below; otherwise, skip to the next section.

Summary

GNU Hyperbole (pronounced Ga-new Hi-per-bo-lee), or just Hyperbole, is like Markdown for hypertext. Hyperbole automatically recognizes dozens of common, pre-existing patterns in any buffer regardless of mode and can instantly activate them as hyperbuttons with a single key: email addresses, URLs, grep -n outputs, programming backtraces, sequences of Emacs keys, programming identifiers, Texinfo and Info cross-references, Org links, Markdown links and on and on. All you do is load Hyperbole and then your text comes to life with no extra effort or complex formatting.

Hyperbole includes easy-to-use, powerful hypertextual button types without the need to learn a markup language. Hyperbole's button types are written in Lisp and can be wholly independent of the web, i.e. web links are one type of Hyperbole link, not fundamental to its link architecture. However, Hyperbole is a great assistant when editing HTML or Javascript or when browsing web pages and links.

Hyperbole comes pre-built with most of the implicit button types you will need but with a little extra effort and a few lines of code (or even just a few words), you can define your own implicit button types to recognize your specific buttons and then activate them anywhere in Emacs. You press a single key, {M-RET} by default, on any kind of Hyperbole button to activate it, so you can rely on your muscle memory and let the computer do the hard work of figuring out what to do. {C-u M-RET} shows you what any button will do in any context before you activate it, so you can always be sure of what you are doing when needed or if some emails you a button (you can do that too).

Hyperbole is something to be experienced and interacted with, not understood from reading alone. It installs normally as a single Emacs package with no dependencies outside of standard Emacs libraries. Most of Hyperbole is a single global minor mode that you can activate and deactivate at will. And it can be uninstalled quickly as well if need be, so there is no risk to giving it a spin.

Once you have it installed and activated {C-u M-x hyperbole-mode RET}, try the interactive demo with {C-h h d d}. In fact, if you have Hyperbole loaded, you can press {M-RET} inside any of the brace delimited series of keys you see in this document and it will execute them on-the-fly (easy keyboard-macro style buttons in any text).

Hyperbole can dramatically increase your productivity and greatly reduce the number of keyboard/mouse keys you'll need to work efficiently.

In short, Hyperbole lets you:

  1. Quickly create hyperlink buttons either from the keyboard or by dragging between a source and destination window with a mouse button depressed. Later, activate buttons by pressing/clicking on them or by giving the name of the button.

  2. Activate many kinds of implicit buttons recognized by context within text buffers, e.g. URLs, grep output lines, and git commits. A single key or mouse button automatically does the right thing in dozens of contexts; just press and go.

Hyperbole Animation of Action Key Contexts

  1. Build outlines with multi-level numbered outline nodes, e.g. 1.4.8.6, that all renumber automatically as any node or tree is moved in the outline. Each node also has a permanent hyperlink anchor that you can reference from any other node;

  2. Manage all your contacts or record-based, unstructured nodes quickly with hierarchical categories; each entry can have embedded hyperbuttons of any type. Or create an archive of documents with hierarchical entries and use the same search mechanism to quickly find any matching entry;

  3. Use single keys to easily manage your Emacs windows or frames and quickly retrieve saved window and frame configurations;

  4. Search for things in your current buffers, in a directory tree or across major web search engines with the touch of a few keys.

The common thread in all these features is making retrieval, management and display of information fast and easy. That is Hyperbole's purpose. It may be broad but it works amazingly well. If it is textual information, Hyperbole can work with it. In contrast to Org mode, Hyperbole works across all Emacs modes and speeds your work by turning all kinds of references into clickable hyperlinks and allowing you to create new hyperlinks by dragging between two windows. The Hyperbole wiki page explains the many ways it differs from and is complementary to Org mode. Hyperbole is designed to work with Org mode, so use them both across your tasks.

Hyperbole allows hypertext buttons to be embedded within unstructured and structured files, mail messages and news articles. It offers intuitive keyboard and mouse-based control of information display within multiple windows. It also provides point-and-click access to World-Wide Web URLs, Info manuals, ftp archives, etc.

Hyperbole works well on GNU Emacs 27.1 or above. It is designed and written by Bob Weiner. It is maintained by him and Mats Lidell. Its main distribution site is: https://www.gnu.org/software/hyperbole/. If any term in here is new or unfamiliar to you, you can look it up in the Hyperbole Glossary.

Hyperbole is available for download and installation through the GNU Emacs package manager.

Unlock the power of GNU Hyperbole to make your information work for you. One system. One language. One manual. One solution. Learn Hyperbole and start moving further, faster.

Mailing Lists

Ftp and Git Repository Downloads

To inspect the Hyperbole source code online rather than installing it for use (which will also give you the source code), open a web page to:

Alternatively, you may download a tar.gz source archive from either:

which will find the closest mirror of the GNU ftp site and show it to you.

If you want to follow along with Hyperbole development and maintain a copy/clone of the current version-controlled git tree, use a command listed here to clone the Hyperbole project tree.

Installation

Once you have Emacs set up at your site, GNU Hyperbole may be installed by using the Emacs Package Manager. If you are not familiar with it, see the Packages section of the GNU Emacs Manual, Emacs Packages.

If you have Hyperbole 5.10 or higher already installed and simply want to upgrade it, invoke the Emacs Package Manager with {M-x list-packages RET}, then use the {U} key followed by the {x} key to upgrade all out-of-date packages, Hyperbole among them. Then skip the text below and move on to the next section, Invocation.

Otherwise, to download and install the Hyperbole package, you should add several lines to your personal Emacs initialization file, typically "~/.emacs". For further details, see Emacs Init File.

Below are the lines to add:

(require 'package)
(setq package-enable-at-startup nil) ;; Prevent double loading of libraries
(package-initialize)
(unless (package-installed-p 'hyperbole)
  (package-refresh-contents)
  (package-install 'hyperbole))
(hyperbole-mode 1)

Now save the file and then restart Emacs. Hyperbole will then be downloaded and compiled for use with your version of Emacs; give it a minute or two. You may see a bunch of compilation warnings but these can be safely ignored and have no impact on Hyperbole's performance.

Invocation

Once Hyperbole has been installed for use at your site and loaded into your Emacs session, it is ready for use. You will see a Hyperbole menu on your menubar and 'Hypb' in the minor-mode section of your modeline. {C-h h} will display a Hyperbole menu in the minibuffer for quick keyboard-based selection.

You can invoke Hyperbole commands in one of three ways:

use the Hyperbole menu on your menubar;

Hyperbole Menubar Menu

type {C-h h} or {M-x hyperbole RET} to bring up the Hyperbole main menu in the minibuffer window, for fast keyboard or mouse-based selection; select an item from this menu by typing the item's first letter; use {q} to quit from the menu.

use a specific Hyperbole command such as an Action Key click {M-RET} on a pathname to display the associated file or directory.

Use {C-h h d d} for an interactive demonstration of standard Hyperbole button capabilities.

Hyperbole screenshot of the DEMO

{C-h h k e} offers an interactive demonstration of the Koutliner, Hyperbole's multi-level autonumbered hypertextual outliner.

Hyperbole screenshot of the Koutliner

To try out HyControl, Hyperbole's interactive frame and window control system, use {C-h h s w} for window control or {C-h h s f} for frame control. {t} switches between window and frame control once in one of them. Hyperbole also binds {C-c } for quick access to HyControl's window control menu if it was not already bound prior to Hyperbole's initialization. A long video demonstrating many of HyControl's features is available at https://youtu.be/M3-aMh1ccJk.

The above are the best interactive ways to learn about Hyperbole. Hyperbole also includes the Hyperbole Manual, a full reference manual, not a simple introduction. It is included in the "man/" subdirectory of the Hyperbole package directory in four forms:

hyperbole.info - online Info browser version
hyperbole.html - web HTML version
hyperbole.pdf - printable version
hyperbole.texi - source form

The Hyperbole package installation places the Info version of this manual where needed and adds an entry for Hyperbole into the Info directory under the Emacs category. {C-h h d i} will let you browse the manual. For web browsing, point your browser at "${hyperb:dir}/man/hyperbole.html", wherever the Hyperbole package directory is on your system; often this is: "~/.emacs.d/elpa/hyperbole-${hyperb:version}/".

Hyperbole Components

Hyperbole consists of five parts:

  1. Buttons and Smart Keys: A set of hyperbutton types which supply core hypertext and other behaviors. Buttons may be added to documents (explicit buttons) with a simple drag between windows, no markup language needed. Implicit buttons are patterns automatically recognized within text that perform actions, e.g. bug#24568 displays the bug status information for that bug number.

    These actions may be links or arbitrary Lisp expressions. So for example, you could create your own button type of Wikipedia searches that jumped to the named Wikipedia page whenever point was within text of the form [wp]. You define the pattern so {} might do the same thing if you preferred. And this works within any Emacs buffer you want it to, regardless of major or minor mode.

    Buttons are accessed by clicking on them or referenced by name (global buttons), so they can be activated regardless of what is on screen. Users can make simple changes to button types and those familiar with Emacs Lisp can prototype and deliver new types quickly with just a few lines of code.

    Hyperbole includes two special `Smart Keys', the Action Key and the Assist Key, that perform an extensive array of context-sensitive operations across emacs usage, including activating and showing help for Hyperbole buttons. In many popular Emacs modes, they allow you to perform common, sometimes complex operations without having to use a different key for each operation. Just press a Smart Key and the right thing happens;

  2. Contact and Text Finder: an interactive textual information management interface, including fast, flexible file and text finding commands. A powerful, hierarchical contact manager, HyRolo, which anyone can use is also included. It is easy to learn to use since it introduces only a few new mechanisms and has a menu interface, which may be operated from the keyboard or the mouse.

    HyRolo Menubar Menu

  3. Screen Control: Hyperbole includes HyControl, the fastest, easiest-to-use window and frame control available for GNU Emacs. With just a few keystrokes, you can shift from increasing a window's height by 5 lines to moving a frame by 220 pixels or immediately moving it to a screen corner. Text in each window or frame may be enlarged or shrunk (zoomed) for easy viewing, plus many other features;

    The broader vision for HyControl is to support persistent window and frame configurations as link targets. Then a user will be able to create the views of information he wants and store them as links for rapid display. Work remains to implement this feature but it helps explain the connection of HyControl to the rest of Hyperbole;

  4. The Koutliner: an advanced outliner with multi-level autonumbering and permanent ids attached to each outline node for use as hypertext link anchors, per node properties and flexible view specifications that can be embedded within links or used interactively;

  5. Programming Library: a set of programming library classes for system developers who want to integrate Hyperbole with another user interface or as a back-end to a distinct system. (All of Hyperbole is written in Emacs Lisp for ease of modification. Hyperbole has been engineered for real-world usage and is well structured).

We find Hyperbole's parts are more powerful as one package, i.e. the sum is greater than the parts, so we don't offer them separately. Hyperbole is free software, however, so you may modify it as you see fit.

Hyperbole Buttons

A Hyperbole hypertext user works with buttons; he may create, modify, move or delete buttons. Each button performs a specific action, such as linking to a file or executing a shell command.

There are three categories of Hyperbole buttons:

  1. Explicit Buttons created by Hyperbole, accessible from within a single document;

  2. Global Buttons created by Hyperbole, accessible anywhere within a user's network of documents;

  3. Implicit Buttons buttons created and managed by other programs or embedded within the structure of a document, accessible from within a single document. Hyperbole recognizes implicit buttons by contextual patterns given in their type specifications.

Hyperbole buttons may be clicked upon with a mouse to activate them or to describe their actions. Thus, a user can always check how a button will act before activating it. Buttons may also be activated from a keyboard. (In fact, virtually all Hyperbole operations, including menu usage, may be performed from any standard terminal interface, so one can use it on distant machines that provide limited display access).

Hyperbole does not enforce any particular hypertext or information management model, but instead allows you to organize your information in large or small chunks as you see fit, organizing each bit as time allows. The Hyperbole Koutliner and HyRolo tools organize textual hierarchies and may also contain links to external information sources.

Important Features

Some of Hyperbole's most important features include:

  • Buttons may link to information or may execute commands, such as computing a complex value or communicating with external programs;

  • Buttons are quick and easy to create with no programming nor markup needed. One simply drags between a button source location and a link destination to create or to modify a link button. The same result can be achieved from the keyboard.

  • Buttons may be embedded within email messages and activated from Emacs mail readers; hyperlinks may include variables so that they work at different locations where the variable settings differ;

  • Koutlines allow rapid browsing, editing and movement of chunks of information organized into trees (hierarchies) and offer links that include viewspecs which determine how documents are to be displayed, e.g. show just the first two lines of all levels in a Koutline;

  • Other hypertext and information retrieval systems may be encapsulated under a Hyperbole user interface very easily.

Hyperbole Uses

Typical Hyperbole applications include:

  • Personal Information Management
    Overlapping link paths provide a variety of views into an information space. A single key press activates buttons regardless of their types, making navigation easy.

    A search facility locates buttons in context and permits quick selection.

  • Documentation Browsing
    Embedding cross-references in a favorite documentation format.

    Addition of a point-and-click interface to existing documentation.

    Linkage of code and design documents. Jumping to the definition of an identifier from its use within code or its reference within documentation.

  • Brainstorming
    Capture of ideas and then quick reorganization with the Hyperbole Koutliner. Link to related ideas, eliminating the need to copy and paste information into a single place.

  • Help/Training Systems
    Creation of tutorials with embedded buttons that show students how things work while explaining the concepts, e.g. an introduction to UNIX commands. This technique can be much more effective than descriptions alone.

  • Archive Managers
    Supplementation of programs that manage archives from incoming information stream, having them add topic-based buttons that link to the archive holdings. Users can then search and create their own links to archive entries.

Files

See the HY-ABOUT file for a description and overview of Hyperbole.

See the HY-NEWS file for a summary of new features in this release.

See the INSTALL file for installation and invocation instructions.

See the HY-COPY and COPYING files for license information.

See the MANIFEST file for summaries of Hyperbole distribution files.

See FAST-DEMO for a demonstration of Hyperbole implicit button capabilities. This is the best way to initially interactively learn about Hyperbole after installing it.

Various forms of the Hyperbole are below the "man/" subdirectory.

Programmer Quick Reference

MANIFEST summarizes most of the files in the distribution.

See DEMO for a lengthier tutorial of standard Hyperbole button capabilities. This is the best way to go deeper into all of Hyperbole. The Hyperbole Manual is a reference manual, not a simple introduction.

Naming conventions:

  • All Hyperbole-specific code files begin with an 'h', aside from the Koutliner files which are in the kotl/ subdirectory and begin with a 'k'.

  • Hyperbole user-interface files begin with 'hui-' or 'hmouse-'.

  • Files that define implicit button types begin with 'hib-'.

  • Encapsulations of foreign systems begin with 'hsys-'.

Most of the standard Emacs user interface for Hyperbole is located in hui.el. Most of the Hyperbole application programming interface can be found in hbut.el. hbdata.el encapsulates the button attribute storage implemented by Hyperbole. hmail.el provides a basic abstract interface for integrating mail readers other than Rmail into Hyperbole.

See the Hyperbole Questions and Answers appendix in the Hyperbole manual for information on how to alter the default context-sensitive Hyperbole key bindings (Smart Keys).

User Quotes

Hyperbole is a wonderful package, I love the feeling of the deep, well-thought out, poised engineering. It may be from the 90s, but it feels like a breath of fresh air to me.

                    -- de_sonnaz on reddit  

*** MAN I love Hyperbole!!! Wow! ***

                    -- Ken Olstad  
                       Cheyenne Software, Inc.

I love koutlines.

                    -- Bob Glickstein  
                       Z-Code Software Corporation

One of the nicest things about Hyperbole is that it's available everywhere. Org-mode is a mode and its features are only available in Org files. For instance if you dropped into eshell' or ansi-term' and did `ls', you can move point to any of the directory's contents, do M-RET (or Shift-Button2) and jump to that file. And that's just one example. Note that this means that all Hyperbole functionality is available in Org files as well. To me, except for the Hyperbole outliner, that means complementary not conflicting. It's Hyperbole and org-mode, not Hyperbole vs. org-mode.

Additionally, off the bat, I found it very well documented and for me that's a proxy for the quality of a package. The maintainers are quite responsive. There's plenty more functionality that I haven't uncovered yet but due to the ease of installation and the quality of the documentation, digging into it is actually fun.

                    -- Aditya Siram  

GNU Hyperbole is a game-changer for your mental model of information management and personal productivity. Even if you don't use it you should study one or two of the modules and compare them to how you solve the same problem with your preferred tool of choice. It is subtle, and subtle is one of the hardest and post powerful things to reside in your mental landscape these days.

                    -- Grant Rettke__
                       Org2Blog Maintainer

For me, Emacs isn't Emacs without Hyperbole. I have depended on Hyperbole daily since 1992, when I first started using it to manage my development environment. It didn't take long before I could summon almost any information I needed directly from within my editing environment with an implicit button. Since I almost never have to slow down to look for things--one context-dependent button usually produces exactly what I need --I am able to maintain focus on the task I am working on and complete it more quickly. With its gestural interface, seamless integration with other Emacs packages and incredibly useful set of core features. I think that Hyperbole is one of the best designed and most easily extensible software products I have ever come across. It is certainly the one which has made the biggest improvement in my personal productivity.

My Hyperbole button file is my start page in Emacs. It's a quickly searchable index with links to countless resources. We also have a library of implicit buttons that enable rapid navigation from references in our code to our issue tracking system, so clicking a reference like Client6502 opens the relevant conversation. Hyperbole provides a really useful set of power tools. If Emacs is your preferred productivity environment, it's definitely worth getting familiar with it.

                    -- Chris Nuzum  
                       Co-founder, Traction Softwarea, Inc.

I've found Hyperbole (in conjunction with XEmacs) to be very useful for signal processing algorithm development.

For me, it has almost completely obsoleted the engineering notebook: I keep a set of files with ideas, algorithms, and results, linked together and to the implementation in C++ files. Using XEmacs' support for embedding graphics, I've written a mode that accepts image tags (formatted like HTML), and reads in GIF files to display plots. I have another program that converts the file to HTML (not perfect, but adequate), so I can put any aspect of development on our internal web for others to see.

                    -- Farzin Guilak  
                       Protocol Systems, Inc., Engineer

I am blind and have been using Hyperbole since 1992. I used to use a PC as a talking terminal attached to a UNIX system, but then I developed Emacspeak which lets me use Emacs and Hyperbole from standard UNIX workstations with an attached voice synthesizer.

My main uses are:

  1. Global and implicit buttons for jumping to ftp sites.

  2. The contact manager with Emacspeak support.

  3. Explicit buttons as part of comments made about a structured document. Each button jumps to the document section referred to by the comment. This is very, very useful.

  4. The Hyperbole Koutliner, which I find a very useful tool. I've implemented Emacspeak extensions to support it.

                  -- TV Raman  
                     Google Inc.
    

I've been a grateful Hyperbole user for a few years now. Hyperbole's flexibility and ease of use is a marvel.

Mainly, I write easy little implicit button types (and corresponding action types) to make my life easier. For example, I have an implicit button type to bury certain buffers when I click at their bottoms, one that recognizes a bug report record in various contexts and edits it, one that links pieces of test output in a log file to the corresponding test case source code (EXTREMELY helpful in interpreting test output), others that support our homegrown test framework, one that handles tree dired mode the way I'd like, one that completely handles wico menus (I've also overloaded the wconfig actions triggered by diagonal mouse drags with wicos actions), and a couple that support interaction with BBDB.

Other than that, I keep a global button file with 30 or so explicit buttons that do various little things, and I index saved mail messages by putting explicit link-to-mail buttons in an outline file.

                    -- Ken Olstad  
                       Cheyenne Software, Inc.

In general, Hyperbole is an embeddable, highly extensible hypertext tool. As such, I find it very useful. As it stands now, Hyperbole is particularly helpful for organizing ill-structured or loosely coupled information, in part because there are few tools geared for this purpose. Hyperbole also possesses a lot of potential in supporting a wider spectrum of structuredness, ranging from unstructured to highly structured environments, as well as structural changes over time.

Major Uses:

  • Menu interface to our own collaborative support environment called CoReView: This interface brings together all top-level user commands into a single partitioned screen, and allows the end user to interact with the system using simple mouse-clicking instead of the meta-x key.

  • Gateway to internet resources: this includes links to major Internet archive sites of various types of information. Links are made at both directory and file levels.

  • Alternative directory organizer: The hierarchical nature of the Unix file system sometimes makes it difficult to find things quickly and easily using directory navigational tools such as dired. Hyperbole enables me to create various "profile" views of my directory tree, with entries in these views referring to files anywhere in the hierarchy.

  • Organizing and viewing online documentation: using Hyperbole along with Hyper-man and Info makes it truly easy to look up online documentation.

  • Other desktop organization tasks: including links to various mail folders, saved newsgroup conversation threads, online note-taker, emacs-command invocations, etc.

                    -- Dadong Wan  
                       University of Hawaii
    

Hyperbole is the first hyper-link system I've run across that is actually part of the environment I use regularly, namely Emacs. The complete flexibility of the links is both impressive and expected -- the idea of making the link itself programmable is clever, and given that one assumes the full power of Emacs. Being able to send email with buttons in it is a very powerful capability. Using ange-ftp mode, one can make file references "across the world" as easily as normal file references.

                    -- Mark Eichin  
                       Cygnus Support

I just wanted to say how much I enjoy using the Hyperbole Koutliner. It is a great way to quickly construct very readable technical documents that I can pass around to others. Thanks for the great work.

                    -- Jeff Fried  
                       Informix

The Hyperbole system provides a nice interface to exploring corners of Unix that I didn't know existed before.

                    -- Craig Smith  

Why was Hyperbole developed?

Hyperbole was originally designed to aid in research aimed at Personalized Information production/retrieval Environments (PIEs). Hyperbole was a PIE Manager that provided services to PIE Tools. PIEmail, a mail reader was the only PIE Tool developed as part of this research but Hyperbole has greatly expanded since then and has long been a production quality toolset.

An examination of many hypertext environments as background research did not turn up any that seemed suitable for the research envisioned, mainly due to the lack of rich, portable programmer and user environments. We also tired of trying to manage our own distributed information pools with standard UNIX tools. And so Hyperbole was conceived and raved about until it got its name.

Since then Hyperbole has proved indispensable at improving information access and organization in daily use over many years. Why not start improving your information handling efficiency today?

-- The End --

hyperbole's People

Contributors

chookity-pokk avatar jgarte avatar monnier avatar rswgnu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

hyperbole's Issues

Issues with Java files

So this was a bit of a hard issue to pin to Hyperbole, so I am going to try and be as explicit as possible in explaining my issue so this might be a longer read.

Essentially is seems like with large Java files (500+ lines), my Emacs would freeze and max out a CPU core. I tried using the built in profiler but it always seems to give a similar output to what is below, but change newline for any other built in function. At first I thought it was an issue with Emacs itself, because this was reproducible 100% of the time. Though when dissecting my init file, I found that it only happens if I have (hyperbole-mode 1).

I've reproduced this with Hyperbole a few dozen times and also had it not happen when I comment out the above snippet from my init. Now the hard part to pin this on hyperbole is that I've had a few rare occasions where I have hyperbole active, but it takes a few minutes before my Emacs freezes. Though, about 90% of the time this happens within the time it takes to write a single function.

This very well might not be a Hyperbole issue, as the logs never mention Hyperbole. Though in my testing it seems like Hyperbole is at least playing some kind of a role in this.

Steps to reproduce:
Open a java file (500+ lines)
Scroll quickly (CTRL+ Up/Down Arrow)
After scrolling through a couple times it almost always freezes
If not just try writing or deleting any text for a bit and it freezes

       11049  61% - command-execute
       11049  61%  - call-interactively
       11046  61%   - funcall-interactively
        9983  55%    - newline
        9983  55%     - self-insert-command
        9983  55%      - c-before-change
        9983  55%       - c-laomib-invalidate-cache
        9983  55%        - c-parse-state
        9983  55%         - c-parse-state-1
        9983  55%          - c-parse-state-get-strategy
        9877  55%           - c-get-fallback-scan-pos
        8735  48%            - beginning-of-defun
        8278  46%             - beginning-of-defun-raw
        6163  34%              - syntax-ppss
          16   0%                 #<compiled -0x42ef295dad943a2>

Error running hyperbole

I've just installed hyperbole and getting the following error when running:

Debugger entered--Lisp error: (void-variable hyperbole-web-search-alist)
  hui:menu-web-search()
  hyperbole-minibuffer-menu()
  byte-code("\300 \210\301\302!\207" [hyperbole-minibuffer-menu provide hui-mini] 2)
  autoload-do-load((autoload "hui-mini" "Invokes the Hyperbole minibuffer menu when not already active.\n\\[hyperbole] runs this.  Non-interactively, returns t if a menu is\ndisplayed by this call, else nil (e.g. when already in a Hyperbole\nmini-menu).\n\nTwo optional arguments may be given to invoke alternative menus.\nMENU (a symbol) specifies the menu to invoke from MENU-LIST, (a\nHyperbole menu list structure).  MENU defaults to 'hyperbole and MENU-LIST\nto `hui:menus'.  See `hui:menus' definition for the format of the menu list\nstructure.\n\nTwo additional optional arguments may be given when documentation for\na menu item should be shown rather than display of a menu.  DOC-FLAG\nnon-nil means show documentation for any item that is selected by the\nuser.  HELP-STRING-FLAG non-nil means show only the first line of the\ndocumentation, not the full text.\n\n(fn &optional MENU MENU-LIST DOC-FLAG HELP-STRING-FLAG)" t nil) hyperbole)
  command-execute(hyperbole record)
  #f(compiled-function (cmd) #<bytecode 0x4558b61d>)("hyperbole")

Option to use different global buttons depending on directory/context.

Background:
I've noticed that I have many global buttons that I only use for specific workflows; it becomes difficult to distinguish among the buttons/actions.

While I do make use of explicit buttons in a dedicated button file, there are times when it's not ideal:

  • The action/button I'm trying to activate requires me to be in a specific buffer.
  • Increases cognitive load by having to switch between a button file and a buffer to do an action.
  • Sometimes I would prefer not to include a button as a comment in a file.

Proposal:
To provide the user with the option of using global buttons that perform different actions depending on the directory/context.

This idea draws inspiration from the projectile package that provides easy project management and navigation when working with files and buffers in a project. A project is identified by the use of .projectile.

Examples:
~/Notes Directory
For example, let's imagine I'm in the ~/Notes directory, and I open a file "2020-08-09.md". I decide to link the file in the current buffer to another file in my notes directory. In this situation, I would want to use a global button called "Link to other note," that performs the action described above.

~/Projects/client-x/ Directory
I navigate to a different directory, ~/Projects/client-X/, when I activate a global button in this directory, I'm presented with different actions related to the actions/workflow I have when working with a client on a project.

  • Create todo
  • View todos
  • Journal
  • View Journal
  • Clock-in
  • Clock-out
  • Calendar

Overtime the handful of buttons that are added to a directory will allow for a workflow to emerge that's based on these different sets of global buttons.

More than one entry in the load-path

I manage my Emacs config in a dotfiles repository and use GNU Stow to sym link to my home directory (i.e. ~/.emacs.d -> ~/dotfiles/emacs/dot-emacs.d/). I don't believe I'm unique in this approach but maybe amongst users that want to use hyperbole. When I install packages they are installed to:

/home/doolio/dotfiles/emacs/dot-emacs.d/elpa/

so for hyperbole it is:

/home/doolio/dotfiles/emacs/dot-emacs.d/elpa/hyperbole-7.0.6/

However, I then have the following entries in my load-path:

"/home/doolio/dotfiles/emacs/dot-emacs.d/elpa/hyperbole-7.0.6/kotl/" "/home/doolio/dotfiles/emacs/dot-emacs.d/elpa/hyperbole-7.0.6/" "/home/doolio/.emacs.d/elpa/hyperbole-7.0.6"

whereas for any other package only a single entry of the form exists:

"/home/doolio/.emacs.d/elpa/<package-name>"

so it seems in general the load-path uses the symbolic link paths. But you can see for hyperbole the load-path is set with the symbolic link and physical paths. There is also a physical path entry for the kotl subdirectory. I don't understand why this happens and only does so for hyperbole. I'm having issues with hyperbole (e.g. buttons not working) and I want to rule this out as the cause.

Is it expected to have the kotl subdirectory added to the load-path? I presume so and I presume it exists in the first place for your own code organisation reasons. Reading the info manual (elisp)Library Search it seems subdirectories can be automatically added to the path if a subdirs.el file exists in the parent directory but it doesn't exist for hyperbole.

Thanks for your time and hyperbole.

Edit: Correct some typesetting.

hypb:function-copy: (hypb:function-copy): ‘quit-window’ is a primitive; can’t copy body

Greetings,

Thank you for creating Hyperbole, in the past I've been able to use Hyperbole, I recently updated emacs to the latest version using the native-comp branch and now I'm unable to start Hyperbole.

Thank you for your time and support.

Bug Description
Unable to start Hyperbole, the following error is displayed.

hypb:function-copy: (hypb:function-copy): ‘quit-window’ is a primitive; can’t copy body

Used emacs -Q to start emacs.

Version
GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.17.3) of 2020-05-12

Native-Comp Branch

Keybindings

First of all, I want to express my gratitude for the incredible labor and wonderful package.

I've noticed some glitches in the application. Namely some keybindings in Koutliner are unresponsive.

C-c . does nothing. Although M-x kotl-mode:end-of-cell works fine.
C-c , - is listed in menu, but C-c . is not.

C-c C-m doesn't work too. Again M-x kotl-mode:move-before does the thing. But keybinding invokes hui-select-thing

I tested this on MacOS with Emacs 29.1 (emacs-mac) with version of Hyperbole 8.0.1 pre

Refresh the talk on spliting Hyperbole into many packages

Hello and, first of all, thank you for your work! It's amazing!

Maybe I'm just not the target for Hyperbole, or maybe it's just too much work and nobody getting paid to do it (completely understandable), but I would like to refresh the discussion around splitting Hyperbole into many packages.

I for once would love to use Koutlines and nothing else for some time. it's an amazing tool in its own right. Klinks are magical, and I would surely like to dedicate time to master its ways and incorporate its powers into my workflow. I know it would be great (the idea is brilliant), but I don't have the time right now so maybe this is something I would have to leave to a holiday or something. The other parts don't really interest me right now, but I'm sure they have the potential to.

I have tried Hyperbole many times already, and have a few kotl files hanging around, but every single time, a short time after I get amazed positively, I just to end up removing it because it changes oh so many things (it's very opinionated, which I don't think is bad per se, but adds a lot of pressure). Its much more functionality than I can handle learning at once. And I can't focus on the whole thing at a time.

Maybe, if someone is beginning a new Emacs configuration from scratch and picks it up straight away, this wouldn't be the case. But realistically, how many are still entering Emacs this way? I can only conjecture, but as far as I see, most people at least start through a pre-built configuration that, if you install Hyperbole on top, will break in unexpected ways.

The way I see it, it is clear that this is a bundle of many packages with related but disparate functionalities, and that releasing those packages separately would, I believe, increase adoption of some tools that are being hindered by other, less understood ones. Maybe this would attract new contributors to the project, give it a fresh air, and allow some of it to be easily integrated into many Emacs workflows. Allow it the glory it deserves :)

It's not only me. Every single time I try to introduce someone to the niceties of Hyperbole, they also get overwhelmed and just run away or never even try it. Especially because they don't think they need it! We have a powerful outline tool, ways of managing contacts, ways of dealing with the frame (tiling window managers for example) and the windows. We even have excellent packages that gives us on the fly overview of key-bindings available under C-c, C-x, M-s, C-h, etc. The Emacs landscape has changed a lot. Why should one install a bundle on top of all they have (and that works) and be forced to deal with the way others idealized the whole Emacs experience? In this busy world, it's unfortunately harsh.

I know this is an old topic and I hope that I'm not offending you by bringing this up again, but since the package is now available here on Github, others may come looking for answers on the subject. My hope is to better understand the reasoning behind the bundle and, if possible, to constructively think of ways to lower the barrier of entry.

Again, thank you!

Org files have HyRoloOrg as major-mode after adding them to the hyrolo-file-list

Hi,

I added all my .org files to the hyrolo-file-list like this:
(setq hyrolo-file-list (cons "~/.emacs.d/hyperb/rolo.otl" (cddr (directory-files-recursively ORGDIR "\\.org$"))))
("ORGDIR" is a variable)
This works as expected, but now when I open one of these .org files, they no longer have the org-mode major mode but they have HyRoloOrg as major mode so I lost all normal formatting. I have to invoke M-x org-mode to bring the formatting back.
I'm using Hyperbole 9.0.1

How can I keep the org-mode for these files?
Thanks, Ronald.

Poor performance for action/assist key outside of explicit buttons when `org-id-files` is large

Even in buffer containing only a single character, pressing action key takes multiple seconds before it says that no action is defined for this context. Pressing it on implicit buttons (like gh#rswgnu/hyperbole) is also slow.

Profiler output (partially excerpted below) says it's doing some org-id stuff, which doesn't seem like it should be happening. I got about 1000-long org-id-files list, so being slow is not surprising there.

Hyperbole version is fresh, 8.0.1pre.

       14217  87% - command-execute
       11138  68%  - call-interactively
        8646  53%   - funcall-interactively
        7551  46%    - hkey-either
        7551  46%     - action-key
        7551  46%      - action-key-internal
        7551  46%       - hkey-execute
        7551  46%        - eval
        7448  45%         - hbut:at-p
        7447  45%          - ibut:at-p
        7447  45%           - ibut:create
        7331  45%            - ibtypes::org-id
        7324  45%             - org-id-find
        7324  45%              - org-id-update-id-locations
        2883  17%               + abbreviate-file-name
        2240  13%               + insert-file-contents
        2010  12%               + mapcar
          54   0%               + org-entry-get
          45   0%               + org-at-property-p
          29   0%                 file-exists-p
          22   0%               + org-mode
          16   0%               + org-id-locations-save
          15   0%                 re-search-forward
           3   0%               + org-id-alist-to-hash
…

Infinite loop/hang when formatting/browsing some C/C++ code/headers

Hello,
As in the subject, I've encountered a few scenarios where it seems that hyperbole is introducing an infinite loop and hanging emacs.
I initially thought it was an lsp-bug, then was asked to send a bug to emacs itself because on the surface it looked like a cc-mode bug. I finally found the source of the weird regex and t seems that the package hooking that cc-mode callback with the regular expression is actually hyperbole in here https://github.com/rswgnu/hyperbole/blob/master/hui-select.el#L404

My original report to lsp-mode: emacs-lsp/lsp-mode#1621 (comment)

My bug report to the emacs mailing list read as follows:

Among other scenarios, when clang-format runs as a hook on file save when I make any (even noop) edit in https://github.com/pillowtrucker/mir/blob/main/src/platform/graphics/drm_formats.cpp this file, for example, emacs enters an infinite loop consuming 100% of a cpu core and all memory up to gc threshold.
It is not always the regex function on the top of the stack but it is always a call around those functions
"beginning-of-defun-raw"
"beginning-of-defun"
"c-get-fallback-scan-pos"

GDB trace: https://gist.github.com/pillowtrucker/cf61381dd95c18f72e4c7ab8df32039a

This is not the only scenario when this happens. I can also sometimes trigger the same thing by trying to jump to the definition of a symbol from a .cpp/c++-header file into a system header (all of which are on a read-only filesystem on my computer), for example one of the SDL headers. The main difference is that the buffer-switching gets mixed into the lot and emacs doesn't even respond to C-g and I have to kill -SIGUSR2 it to get it to start responding again, but I'm pretty sure it's the same bug - output from this scenario is here: https://gist.github.com/pillowtrucker/a15c4c825a9e72cde8f2a286db16b070

I'm sorry about the everywhere and lack of inlined sources, but I've already rebuilt it with nixos's enableDebugging flag, which should have enabled -Og and -g3 (I think it did do the latter but failed on the optimizations and left it at O2) and I've already spent most of my day debugging this and it would take another full day to figure out how to properly override the byzantine nixpkgs emacs infrastructure with the right optimization flag and to store the right source tree.

System info from emacs: https://gist.github.com/pillowtrucker/c93d0e9114ce11cddc48dc254b5bdbd9

Issue with hyperbole and web mode

Hi, I think this is the right place to post this,

I've been having an issue here syl20bnr/spacemacs#10724 and it seems to have come down to maybe being a hyperbole issue.

Seems more specifically an issue with web-mode-hook as talked about here syl20bnr/spacemacs#10724 (comment)

The outcome is with hyperbole installed this happens when looking at code in web-mode ...

Picture of issue on Imgur

This may also in part be related to smartparens as mentioned in the issue above. syl20bnr/spacemacs#10724 (comment)

Thanks for any help with this, I've found hyperbole is great just found this slight bug which I can't seem to fix

Thanks

can't install from GNU Elpa

M-x package-install hyperbole

Error while verifying signature hyperbole-8.0.0.tar.sig:

Command output:
gpg: Signature made Sun 01 May 2022 02:05:02 PM PDT
gpg:                using RSA key C433554766D3DDC64221BFAA066DAFCB81E42C40
gpg: Good signature from "GNU ELPA Signing Agent (2019) <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: C433 5547 66D3 DDC6 4221  BFAA 066D AFCB 81E4 2C40

I can install other packages from Elpa, like Hydra.

Many features work incorrectly in Emacs 28.1

Hello! Thank you for all your time and effort you put in Hyperbole!

I've updated from GNU Emacs 27.2 to 28.1 with native compilation recently. Suddenly, most of Hyperbole's features (mouse drags, some implicit buttons, klinks and more) stopped working. There are so many bugs that I can't report all of them properly. Plus, I don't use all of Hyperbole's features, so there must be more bugs than I encountered. Hyperbole 8.0 used to work just fine in Emacs 27.2 on my machine.

Here is the information about my system gathered via Hyperbole's reporting facilities:
I use: Editor: GNU Emacs 28.1
Hyperbole: 8.0.1pre
Sys Type: x86_64-unknown-linux-gnu
OS Type: gnu/linux
Window Sys: x
News Reader: Gnus v5.13
Install: elpa-devel, 8.0.1pre0.20220619.202654

Could native compilation break something in Hyperbole? If yes, what can I do to fix it, or at least figure out the exact cause of the problem?

Readonly Buffer for creation of Global Buttons?

I´m trying to create a global button and I am getting the following error:

Debugger entered--Lisp error: (error "(gbut-create) Read-only error in Hyperbole button buffer ’HYPB’.  Use {SPC t r} to enable edits.")
  error("(gbut-create) Read-only error in Hyperbole button buffer 'HYPB'.  Use {SPC t r} to enable edits.")
  hypb:error("(gbut-create) Read-only error in Hyperbole button buffer 'HYPB'.  Use {SPC t r} to enable edits.")
  (progn (pop-to-buffer but-buf) (hypb:error err))
  (if err (progn (pop-to-buffer but-buf) (hypb:error err)))
  (let (err) (save-current-buffer (set-buffer but-buf) (if buffer-read-only (progn (setq err (format "(%s) Read-only error in Hyperbole button buffer '%s'.  Use {%s} to enable edits." func-name (buffer-name but-buf) (hmouse-read-only-toggle-key)))))) (if err (progn (pop-to-buffer but-buf) (hypb:error err))))
  hui:buf-writable-err(#<buffer HYPB> "gbut-create")
  (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect (gbut:file))) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char (point-max)) (if (bolp) nil (insert "\n")) (hattr:set 'hbut:current 'loc (hui:key-src but-buf)) (hattr:set 'hbut:current 'dir src-dir) (hattr:set 'hbut:current 'actype actype) (hattr:set 'hbut:current 'args (hargs:actype-get actype)) (hattr:set 'hbut:current 'action (if hui:ebut-prompt-for-action (progn (hui:action actype)))) (set-buffer but-buf) (setq lbl (concat lbl (ebut:operate lbl nil))) (goto-char (point-max)) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl))
  (let (actype but-buf src-dir) (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect (gbut:file))) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char (point-max)) (if (bolp) nil (insert "\n")) (hattr:set 'hbut:current 'loc (hui:key-src but-buf)) (hattr:set 'hbut:current 'dir src-dir) (hattr:set 'hbut:current 'actype actype) (hattr:set 'hbut:current 'args (hargs:actype-get actype)) (hattr:set 'hbut:current 'action (if hui:ebut-prompt-for-action (progn (hui:action actype)))) (set-buffer but-buf) (setq lbl (concat lbl (ebut:operate lbl nil))) (goto-char (point-max)) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl)))
  (if ibut-flag (hui:gibut-create lbl (hui:hbut-label nil "gbut-create" "Implicit button text (with any delimiters): ")) (let (actype but-buf src-dir) (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect (gbut:file))) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char (point-max)) (if (bolp) nil (insert "\n")) (hattr:set 'hbut:current 'loc (hui:key-src but-buf)) (hattr:set 'hbut:current 'dir src-dir) (hattr:set 'hbut:current 'actype actype) (hattr:set 'hbut:current 'args (hargs:actype-get actype)) (hattr:set 'hbut:current 'action (if hui:ebut-prompt-for-action (progn (hui:action actype)))) (set-buffer but-buf) (setq lbl (concat lbl (ebut:operate lbl nil))) (goto-char (point-max)) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl))))
  (progn (if ibut-flag (hui:gibut-create lbl (hui:hbut-label nil "gbut-create" "Implicit button text (with any delimiters): ")) (let (actype but-buf src-dir) (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect (gbut:file))) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char (point-max)) (if (bolp) nil (insert "\n")) (hattr:set 'hbut:current 'loc (hui:key-src but-buf)) (hattr:set 'hbut:current 'dir src-dir) (hattr:set 'hbut:current 'actype actype) (hattr:set 'hbut:current 'args (hargs:actype-get actype)) (hattr:set 'hbut:current 'action (if hui:ebut-prompt-for-action (progn ...))) (set-buffer but-buf) (setq lbl (concat lbl (ebut:operate lbl nil))) (goto-char (point-max)) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl)))))
  (unwind-protect (progn (if ibut-flag (hui:gibut-create lbl (hui:hbut-label nil "gbut-create" "Implicit button text (with any delimiters): ")) (let (actype but-buf src-dir) (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect (gbut:file))) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char (point-max)) (if (bolp) nil (insert "\n")) (hattr:set 'hbut:current 'loc (hui:key-src but-buf)) (hattr:set 'hbut:current 'dir src-dir) (hattr:set 'hbut:current 'actype actype) (hattr:set 'hbut:current 'args (hargs:actype-get actype)) (hattr:set 'hbut:current 'action (if hui:ebut-prompt-for-action ...)) (set-buffer but-buf) (setq lbl (concat lbl ...)) (goto-char (point-max)) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl))))) (if (eq start-buffer (current-buffer)) nil (error "Start buffer, '%s', differs from end buffer, '%s'" start-buffer (current-buffer))) (if (buffer-live-p start-buffer) nil (error "End buffer, '%s', is not live" (current-buffer))))
  (let ((debug-on-error t) (start-buffer (current-buffer))) (if (buffer-live-p start-buffer) nil (error "Start buffer, '%s', is not live" (current-buffer))) (unwind-protect (progn (if ibut-flag (hui:gibut-create lbl (hui:hbut-label nil "gbut-create" "Implicit button text (with any delimiters): ")) (let (actype but-buf src-dir) (save-excursion (setq src-dir default-directory actype (hui:actype) but-buf (find-file-noselect ...)) (set-buffer but-buf) (hui:buf-writable-err (current-buffer) "gbut-create") (save-excursion (goto-char ...) (if ... nil ...) (hattr:set ... ... ...) (hattr:set ... ... src-dir) (hattr:set ... ... actype) (hattr:set ... ... ...) (hattr:set ... ... ...) (set-buffer but-buf) (setq lbl ...) (goto-char ...) (insert "\n") (save-buffer)) (message "`%s' global explicit button created." lbl))))) (if (eq start-buffer (current-buffer)) nil (error "Start buffer, '%s', differs from end buffer, '%s'" start-buffer (current-buffer))) (if (buffer-live-p start-buffer) nil (error "End buffer, '%s', is not live" (current-buffer)))))
  hui:gbut-create(nil nil)
  funcall-interactively(hui:gbut-create nil nil)
  call-interactively(hui:gbut-create)
  hui:menu-act(hyperbole nil nil nil)
  hyperbole(nil nil nil nil)
  funcall-interactively(hyperbole nil nil nil nil)
  command-execute(hyperbole)

It seems like it is trying to create HYPB on root.
I have tried to

(setq hbmap:dir-user '("/Users/rsff/Dropbox/org/hyperbole/"))
(setq hbmap:dir-filename '("/Users/rsff/Dropbox/org/hyperbole/HBMAP"))

However, no sucess. :-)
I am assuming I´m doing something wrong...

Donating to Hyperbole?

Hello,

I was wondering if it would be possible to donate to the hyperbole project? I remember in the past there was a link to saythanks, and it seems like that doesn't work anymore?

Thank you!

Provide the option for a user to add a custom face or minor-mode for buttons

Background

First, thank you for creating and maintaining Hyperbole all of these years. I'm grateful.

I've used Hyperbole for the past few months, and I've enjoyed the functionality that it's provided in creating an interface for my day to day information work. When working with documents that contain a lot of text or "dashboards" that I make, I find it challenging to identify and remember what a button does visually without having to dig deeper and look at the code.

Proposal:

To provide the user with the option of customizing Hyperbole's explicit/implicit buttons,
<(fake button)>, for example, through a custom face or another method.

Example

From my research, I came across linkd-mode.

When linkd-mode is activated its links which look like this: (@file :file-name "/etc/fstab":display "File System Table") are transformed to be distinguished from each other by color and shape and optionally displays an icon.

Below are examples taken from the web-archive, and here is it's source code.

Creating a wiki-like personal "hyperweb"
image

Concept-oriented navigation in lisp source code
image

Closing Thoughts

Incorporating a minor-mode for Hyperbole's buttons or providing the user the option to customize the appearance of the buttons would support the user by knowing what to do just by looking and could ease the use of embedding and using buttons in documents and the creation of a web of "interactive" documents/dashboards.

Thank you for your time.

Errors when choosing action type: exec-kbd-macro

Greetings,

First, thank you for creating hyperbole. I've had the time recently to use it, and I'm trying to incorporate it into my workflow for my information management system to reduce cognitive load. I'm enjoying the experience and looking forward to using it.

Use case:
One use-case I'm imagining is to have in my button file, buttons that execute a keyboard macro that searches for information across different locations/contexts.

Problem:
I've created a button in my button file, and the action type that I select is exec-kbd-macro.
The errors I'm getting are:

load: Cannot open load file: No such file or directory, treemacs-interface.el

After troubleshooting, I installed treemacs and then was running into other errors related to vm-autoloads, and w3.

I'm unsure of what next steps to take and was wondering if you could shed some light on this issue. I'm running emacs 27.0.50, with a new barebones .emacs.d configuration and installed hyperbole from the example given.

(require 'package)
(setq package-enable-at-startup nil) ;; Prevent double loading of libraries
(package-initialize)
(unless (package-installed-p 'hyperbole)
  (package-refresh-contents)
  (package-install 'hyperbole))
(require 'hyperbole)

Thank you for your time and continued support.

Instructions for installing with elpaca package manager? (void-variable hyperbole-run-test)

I've recently migrated from straight.el to elpaca, and unfortunately this broke my hyperbole installation. I originally had hyperbole installed using the guide provided by the manual here---I've largely tried to reproduce this in elpaca but I keep getting the following error when my config tries to load hypb-ert.el:

Eager macro-expansion failure: (void-variable hyperbole-run-test)

I feel that I'm most of the way there, but I'm just missing something basic. What I've done so far:

I'd greatly appreciate if anyone here has any insight, but also please let me know if my question is better asked over at elpaca. Thanks!

Installing hyperbole via straight package manager fails

Please refer: radian-software/straight.el#623

I tried installing hyperbole via straight.
The package got properly cloned but the compile and build step fails moving some of the required directories to straight\build\hyperbole.

straight\repos\hyperbole\kotl should be in the straight\build\hyperbole too. This missing kotl directory breaks the installation.

It could be the mistake of hyperbole package, may be it's following non-standard way of packaging its folders/files.

hyperbole-web-search not formatting search URL correctly

Bug Description

When trying to use hyperbole-web-search through the menu bar, an explicit button, or the Hyperbole minibuffer menu, the search URL for the corresponding service is not formatted correctly, resulting in a 404.

The URL sent to the browser was formatted like this:
https://www.google.com/search%3Fq%3Dtesting

When using an implicit button, i.e., twitter#emacs hyperbole-web-search works as intended.

Observations
Below is the current hyperbole-web-search function found in Hyperbole 7.1.1

(defun hyperbole-web-search (&optional service-name search-term)
  "Search web SERVICE-NAME for SEARCH-TERM.
Both arguments are optional and are prompted for when not given or when null.
Uses `hyperbole-web-search-alist' to match each service to its search url.
Uses `hyperbole-web-search-browser-function' and the `browse-url'
package to display search results."
  (interactive)
  (cl-multiple-value-bind (service-name search-term)
      (hyperbole-read-web-search-arguments service-name search-term)
    (if (assoc service-name hyperbole-web-search-alist)
	(let ((browse-url-browser-function
	       hyperbole-web-search-browser-function))
	  (browse-url (browse-url-url-encode-chars
		       (format (cdr (assoc service-name hyperbole-web-search-alist))
			       search-term)
		       "[*\"()',=;?% ]")))
      (user-error "(Hyperbole): Invalid web search service `%s'" service-name))))

When using the hyperbole-web-search from an older release of Hyperbole, hyperbole-web-search works as intended.

(defun hyperbole-web-search (&optional service-name search-term)
  "Search web SERVICE-NAME for SEARCH-TERM.
Both arguments are optional and are prompted for when not given or when null.
Uses `hyperbole-web-search-alist' to match each service to its search url.
Uses `hyperbole-web-search-browser-function' and the `browse-url'
package to display search results."
  (interactive)
  (cl-multiple-value-bind (service-name search-term)
      (hyperbole-read-web-search-arguments service-name search-term)
    (if (assoc service-name hyperbole-web-search-alist)
	(let ((browse-url-browser-function
	       hyperbole-web-search-browser-function))
	  (browse-url (format (cdr (assoc service-name hyperbole-web-search-alist))
			      search-term)))
      (user-error "(Hyperbole): Invalid web search service `%s'" service-name))))

Version
GNU Emacs 26.3 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.10) of 2019-08-29
Hyperbole 7.1.1

Thank you for your time and support.

Global Buttons Not Getting Added to the Personal File

I have setup the variable (hbmap:dir-user) for the personal file. But the Global buttons are not getting added to it. The document says that the global buttons will be appended to the personal file. I have also verified that if I open the personal file using the hyperbole menu, it goes to the ~/org/HYPB.

  #+begin_src elisp
    (global-set-key (kbd "C-x C-h") 'hkey-either)
    (setq hbmap:dir-user "~/org")
    (unless (and (featurep 'hyperbole) hyperbole-mode)
      (when (< emacs-major-version 27)
        (error "Hyperbole requires Emacs 27 or above; you are running version %d" emacs-major-version))
      (push "~/git/hyperbole" load-path)
      (require 'hyperbole)
      (hyperbole-mode 1))
  #+end_src

Implement an implicit button

I have this output from xdebug(php debugger).

step_over
17 | step_over > break/ok
17 | file:///usr/Data_2/Programming/drupal-9.0.6/core/modules/views/src/DisplayPluginCollection.php:62

The path that is showed have a number in the end, delimited with : , that indicate the row of the file, but when I trigger the Implicit button, it doesn't take into the account the line number, it's just creates a new buffer with the full path, the dots and the number at the end.
My question is, what is the correct approach to this case, should I change the Implicit button action, create a new one or maybe change the button type.

Thank you.

Not an issue, but a suggestion

I have tried to use hycontrol-frame(window).
This is a great tool.
But, perhaps vim-evil key-binds could be added as options
to the default frame-windows control.
It is a little confusing for people to think about other keys
to memorize that uses some vim letters as hycontrol movements and such.
Just a suggestion

Is it possible for hyperbole to create links to words in the org-mode?

Is it possible for hyperbole to create links it can link to words with plain text content in the org-mode file?
The new explicit link button created with {C-h h e l} links to a location in the org-mode file. The way it creates a link between two windows is very convenient and can be used with ace-window. These are amazing.If the file is modified and this location is moved, it won't link to the original location of the text? The rules of org-mode require the addition of <> to link to the text content, and the need to keep <> unique.
Another way is to create an ID attribute for the headline. But for a paragraph, splitting the headline will destroy the original content.

hyrolo-sort is broken

I think

  • hello :)
    so, Im using hyrolo to store useful commands, noticed the order broke with hyrolo-sort and investigated
    sort works with plain lists, but with multi level ones doesnt
  • to replicate:
    I removed the commands leaving only the "headers", still un-works, so:
    if you sort a .rolo.otl file with this list you will see guile being move up next to emacs, if you do it again you will see guile2 moved up too and so on
    irc also jumps next to guix
*   emacs
**   agenda
**   dired
**   geiser
**   layout
**   magit
***   forge
***   history
***   rebase
**   multicursor
**   navigation
**   orgmode
***   tangle
*   guile
*   guile2
*   guix
**   guixshell
***   guixshellkid
*   irc
*   krita
*   linux
*   lisptips
*   regex
*   screenshot
*   sound
*   unicode
*   videos
**   ffmpeg
**   mpv
**   ytdlp

using master-branch from this repo
maybe I misunderstood how sort works
anyway, thank you for hyperbole

Resolve Koutline klinks on html export

Koutline is so far as I know the only software which provides automatic legal numbering within emacs (see this unhappy question on stackexchange.) That is extremely useful functionality; and the ability to dynamically cross-reference nodes (thanks to the UID / outline-number distinction) makes it very valuable indeed.

However, hyperbole's limited export functionality restricts the utility of this function for preparing non-digital documents.

The principal problem is not the limited range of export formats - html is good enough - but that kexport:html leaves klinks unaltered. That's good enough (though imperfect) for an HTML document, but it introduces considerable friction on the path to plain-text, latex etc.

Current behaviour: klinks of the form <@ 3b=06> are transformed on export to HTML into links of the form <a href="#06"><@ 3b=06></a>.

Desired behaviour: that an option be implemented whereby klinks of the form <@ 3b=06> be transformed to a link of the form <a href="#06">3b</a>.

That should allow reasonably straightforward post-processing. Of course I can do this at the moment with helper scripts, but I think this change would be useful for everyone.

Ideal behaviour would probably be an option to export to a nicely-formatted org-buffer with org-links, so that org-export could be utilised directly.

Get hyperbole action key to recognize org =verbatim= text?

Hi,

I often use org-mode's =verbatim= markdown when mentioning filenames in org files, which is useful for text highlighting purposes when I read these files later. I was also able to get hyperbole to recognize these file paths with the action key (M-RET) by defining custom delimiters using the defil macro as follows:

(defil hy-verbatim-find-file "=" "=" ".*" "\\&")

However, this doesn't seem to be working anymore---when I try pressing an action key on a verbatim filename (e.g., =~/test.txt=), I get an error (debug below):

Debugger entered--Lisp error: (error "(ibut:to-text): ’lbl-key’ arg must be a string, not: nil")
  error("(ibut:to-text): 'lbl-key' arg must be a string, not: %S" nil)
  (if (stringp lbl-key) nil (error "(ibut:to-text): 'lbl-key' arg must be a string, not: %S" lbl-key))
  ibut:to-text(nil)
  hui:hbut-operate(hbut:act "Activate Hyperbole button: " hbut:current)
  hui:hbut-act(hbut:current)
  hkey-execute(nil)
  action-key-internal()
  action-key()
  hkey-either(nil)
  funcall-interactively(hkey-either nil)
  command-execute(hkey-either)

Notably, when trying to use the action key (M-RET) on filenames without delimiters, the action key works correctly. Moreover, when I use different custom delimiters (e.g., (defil hy-verbatim-find-file "{{" "}}" ".*" "\\&") --> {{~/test.txt}}), the action key also works correctly---so maybe it's something intrinsically wrong with using = as a delimiter?

It there some way to reconcile this? Any help would be greatly appreciated!

Compilation failure

I get a compilation failure when I try to build Hyperbole with GNU ELPA's standard build procedure:

Debugger entered--Lisp error: (void-variable hyperbole-run-test)
  byte-code("\302\10\303\"\210\302\11\304\"\207" [hyperbole-run-test hyperbole-run-tests defal "hypb-ert-run-test" "hypb-ert-run-tests"] 3)
  load("hypb-ert")
  byte-code("\301\302\303\"\210\304\305\306\307#\210\310\311!\210\312\313!\210\312\314!\210\315\316\10\"\207" [symtable:ibtypes setplist ibtypes::python-tb-previous-line (definition-name python-tb-previous-line quote (to-p nil style nil)) symset:add python-tb-previous-line ibtypes symbols run-hooks htype-create-hook load "hypb-ert" "hib-social" symtable:add org-id] 4)
  require(hibtypes)
  mapc(require (hvar hui-menu hui-mouse hypb hui hui-mini hbmap hibtypes))
  byte-code("\300\301\302\"\210\303\304!\204\20\0\305\304\306\"\210\300\207" [mapc require (hvar hui-menu hui-mouse hypb hui hui-mini hbmap hibtypes) fboundp br-in-browser defalias #f(compiled-function () #<bytecode 0x10635134bc2e6648>)] 3)
  require(hinit)
  apply(require hinit)
  byte-compile-file-form-require((require 'hinit))
  byte-compile-file-form((require 'hinit))
  #f(compiled-function (form) #<bytecode -0x1079d0ba85cdc6ff>)((require 'hinit))
  byte-compile-recurse-toplevel((require 'hinit) #f(compiled-function (form) #<bytecode -0x1079d0ba85cdc6ff>))
  byte-compile-toplevel-file-form((require 'hinit))
  #f(compiled-function (inbuffer) #<bytecode -0x3fd5a3e8a2e16f6>)(#<buffer  *Compiler Input*>)
  byte-compile-from-buffer(#<buffer  *Compiler Input*>)
  byte-compile-file("packages/hyperbole/hyperbole.el")
  batch-byte-compile-file("packages/hyperbole/hyperbole.el")
  batch-byte-compile()
  command-line-1(("--eval" "(setq package-directory-list \11\11                   ..." "-f" "package-initialize" "-L" "packages/hyperbole/" "-f" "batch-byte-compile" "packages/hyperbole/hyperbole.el"))
  command-line()
  normal-top-level()

Not sure why hibtypes would need to load hypb-tests, so that might be part of the problem.

GH seems too stuck up to let me attach the compilation log, so I put it up over there.
There are a large number of warnings, most of them should be harmless but some of them might have something to do with this problem.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.