From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jean Louis Newsgroups: gmane.emacs.devel Subject: Re: [External] : Re: A feature to go to last edit locations Date: Wed, 15 Feb 2023 08:45:19 +0300 Message-ID: References: <972bedcc-37c9-5180-ac41-90e25d854a63@yandex.ru> <83mt5hdj28.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="8448"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mutt/2.2.9+54 (af2080d) (2022-11-21) Cc: Eli Zaretskii , Dmitry Gutov , "mardani29@yahoo.es" , "emacs-devel@gnu.org" To: Drew Adams Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Wed Feb 15 06:48:19 2023 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pSAeR-0001yE-6u for ged-emacs-devel@m.gmane-mx.org; Wed, 15 Feb 2023 06:48:19 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pSAdk-0001Rm-06; Wed, 15 Feb 2023 00:47:36 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pSAdO-0001RR-NZ for emacs-devel@gnu.org; Wed, 15 Feb 2023 00:47:15 -0500 Original-Received: from stw1.rcdrun.com ([217.170.207.13]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pSAdL-0005zH-UN; Wed, 15 Feb 2023 00:47:14 -0500 Original-Received: from localhost ([::ffff:102.85.204.48]) (AUTH: PLAIN admin, TLS: TLS1.3,256bits,ECDHE_RSA_AES_256_GCM_SHA384) by stw1.rcdrun.com with ESMTPSA id 0000000000103956.0000000063EC71C1.00006096; Tue, 14 Feb 2023 22:46:40 -0700 Mail-Followup-To: Drew Adams , Eli Zaretskii , Dmitry Gutov , "mardani29@yahoo.es" , "emacs-devel@gnu.org" Content-Disposition: inline In-Reply-To: Received-SPF: pass client-ip=217.170.207.13; envelope-from=bugs@gnu.support; helo=stw1.rcdrun.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:303295 Archived-At: * Drew Adams [2023-02-14 19:24]: > > > And you can sort/access Info bookmarks that you've visited most or > > > least etc. > > > > That is good feature. I have made more stronger > > generalization and defined elementary objects. > > One could think of it as bookmarks, but they are > > not (only). Objects can be chunks of text, word, > > paragraph, PDF, PDF by page, Message-ID, Video, > > Video at time, anything which is defined by user. > > Same with bookmarks. You can bookmark anything Emacs can know or > reach. And without defining anything you can bookmark regions and > (if you use library zones.el) sets of regions (zones). I did not know. I will use it as food thought. I see it is excellent: https://www.emacswiki.org/emacs/BookmarkPlus I did not research it well, tried short, and did not research. You have done good work. Because I have not research it, I did not know it. I am following the design here: Elementary Objects: https://www.dougengelbart.org/content/view/110/460/#2a1a Then it becomes so similar to the work with "Bookmark+" library. There are several nice features that I have to duplicate to adapt for RCD Notes & Hyperscope for Emacs. The last "Emacs Points" were not meant to be bookmarks, more like a list of global and local locations which user may use to move there and forth. In general we have similar features, you call it bookmarks, I call it Hyperdocuments and objects. Purpose of our work is not same. My objects can be for example Org objects, it would be non-file database entry. I do not think that Bookmark+ has been designed to hold for example LaTeX. I like and understand your writing, like here in example: > * You can combine bookmarks, to make composite, or sequence, > bookmarks. Invoking a sequence bookmark invokes each of its component > bookmarks in turn. A component bookmark can itself be a sequence > bookmark. I have it same, I can combine, or find interesection of elementary objects, I can mark what I need or take all list of visible ones and make new object contaning all those. What is to be done with the object is decided by it's type and subtype. I understand that ideas spring up in my mind which you read and then say "Hey, that already exists in Bookmark+", but I did not know. Even then, objects are saved in the database, and related to planning, and represent themselves notes, tasks, not just bookmarks pointing to notes and tasks, they are related to people, can be shared and so I canot reuse your library, apart from reusing ideas, food for thought. I am trying to find all the 70 types, and I tried this to see it: (insert (format "%s" bmkp-types-alist))((autofile . bmkp-autofile-history) (autonamed . bmkp-autonamed-history) (bookmark-file . bmkp-bookmark-file-history) (bookmark-list . bmkp-bookmark-list-history) (desktop . bmkp-desktop-history) (dired . bmkp-dired-history) (dired-this-dir . bmkp-dired-history) (eww . bmkp-eww-history) (file . bmkp-file-history) (file-this-dir . bmkp-file-history) (gnus . bmkp-gnus-history) (image . bmkp-image-history) (info . bmkp-info-history) (local-file . bmkp-local-file-history) (man . bmkp-man-history) (non-file . bmkp-non-file-history) (region . bmkp-region-history) (remote-file . bmkp-remote-file-history) (snippet . bmkp-snippet-history) (specific-buffers . bmkp-specific-buffers-history) (specific-files . bmkp-specific-files-history) (temporary . bmkp-temporary-history) (url . bmkp-url-history) (variable-list . bmkp-variable-list-history)) I have found these 24 possible completions: autofile autonamed bookmark-file bookmark-list desktop dired dired-this-dir eww file file-this-dir gnus image info local-file man non-file region remote-file snippet specific-buffers specific-files temporary url variable-list I would like to see those 70 types. I have tried invoking function: > Bookmark+ adds over 70 types of bookmark. (You can see what they all > are by invoking function ‘bmkp-types-alist’.) But that does not seem to be the function, it is alist, but I do not see 70 types. I fully agree to the idea of bookmarks how you expanded the feature. Can you save window configuration over session? I would like to do that. That is not same as desktop which is slow and cannot narrow to window configuration. Defining user types is clear to me, though not as easy. With objects I can also change their types and subtypes at any time. And there is the notion of a set, to go inside of the set of objects, into the subtree. I believe it is possible in bookmarks+ too. The work you have done in general is easier managed by using the database. That way it could become easily collaborative Hyperdocument management. I have tagging too, so it would be trivial function to start tagging single or multiple files in Dired, as all files would be slurped automatically as Hyperdocuments or elementary objects into the Dynamic Knowledge Repository and Emacs would only ask me for tags. Those existing files in the database would be re-used. You have done great documentation and I have also to start doing it for my software. There are many similar features developed from my side. - capturing region (bookmarking) I did not do, it would be one minute to implement it. - snippet to kill ring, I have that all and use it very often. Object has name (which could be arbitrary long), description, text, report, internal report, hyperlink, arguments, and many other properties. Then many times I need name+link, or name+description+link, or name + text, or only text in kill ring, that is single key. Often I want it inserted in the side window. - I also have marking, deleting, activatig (jumping to), but my objects can be any type of markup, they are like files but in the database, but can point in different types to files on the file system - In fact file in file system is not what I remember, I work almost exclusively with the Dynamic Knowledge Repository and not with file sytem directly. - No matter what is the type or subtype, I have made function to list all bookmarks of the type where cursor is positioned. You have made all the special functions or commands in menu to jump to those types or show list of interesection. If I press C-u then I am asked for types, but otherwise I can list by types or subtypes depending where is cursor. - I strive to make automatic functions, automatic keybindings, automated menus. If thers is new type, that shall appear automatically. The key binding may be explained uniquely in the type data itself, not in Emacs Lisp program, but in the database. Database can make sure it is unique. As your thinking and design was straight forward, I have to use this page for my learning and adaptation, to make RCD Notes & Hyperscope for GNU Emacs more straight forward. Bookmark+ by Drew Adams: https://www.emacswiki.org/emacs/BookmarkPlus My personal work is rather capricious and not necessarily systematic. The system works, that is what matters, development is not for purpose of development or pleasing others but for business needs. Though one day it will come out. Features are listed here: RCD Notes & Hyperscope for GNU Emacs, The Dynamic Knowledge Repository: https://gnu.support/gnu-emacs/rcd-notes-for-gnu-emacs/index.html > > It is true that I can jump to it, I can insert it in text, or make > > reports, project documents, convert to hyperlinks and similar. > > > > How is object activated, can be also defined by user. It is not hard > > coded. Function can be inserted in the database by administrator. > > Same with bookmarks. "Jumping to" a bookmark can mean/do anything. > A bookmark is essentially a named, usually-persistent closure. Some of my often used cases: - With markup Asciidoctor or LaTeX, etc., jumping fetch the text from database, creates the PDF, and displays it. It is file which is not on file system and it's PDF or HTML is generated at each new "jump" which I call "Activation". Object get it's file name automatically, usually the UUID or ID, or user can assign file name. Another type of activation is sharing, there is sharing to related people, or those not yet related. Related people are more important. Then objects may be shared by using E-mail, XMPP, SMS, anyhow. If necessary object may be published and then it's URL shared with the related or unrelated person. Any unrelated person becomes related with tag similar to "INFORMED BY EMAIL". Then any markup can be converted any how, so it is quite possible for me to mix Asciidoctor, text, Markdown, Org, txt2tags, reStructuredText how I wish, this is because objects are separate and markup conversions can be defined in separate list. If the mixed-object Hyperdocument has LaTeX markup, all the consisting elementary objects would be converted from their markup to main LaTeX markup, as example. In general my system is used for people relationship management and business project management and planning. > > When moving between objects, I have "ring" in the database, this makes > > it possible to visually reconstruct what was done, visited, by any > > single day by which individual collaborative user. That is similar to > > "last visit" only related to any kind of object, need not be bookmark. > > Maybe (maybe not) your rings are like Bookmark+'s feature of letting > you cycle among any set of bookmarks, either direction. Cycling > usually means "jumping", but it can mean doing anything at all > to/with the bookmarks. I like to cycle through buffers or just cycling over names of objects (Hyperdocuments) with single key "." or "," for forward and backward. Because elementary objects are in their sets, the cycling becomes litle more semantic. Though the single ring point of the "cycle" has it's date creation, that means I could derive it to the list of all viewed, tackled, activating, edited Hyperdocuments of that day, or even hour. This implies that work of the day can be seen. People section is interesting and communication center, it is like call center. All the 100 last people with communication are shown and then this helps visually that they do not get lost. People are ranked too, it is easy to get list of 200 or 1000 people who matters, and initiate calls, SMS, XMPP, e-mails with them. > https://www.emacswiki.org/emacs/BookmarkPlus#BookmarkNavigationList > > > Time of last activation (visit) I keep also in a general log > > A general log is what bookmarks intentionally get away from. > > A feature of the basic design of bookmarks is that info about a > thing - or one aspect/view/set-of-info about a thing - is stored in > a record in a bookmark file, which is totally separate from whatever > might store that thing itself. And you can have any number of > bookmark files. And the same bookmark can be in any number of > bookmark files. I understand it the notion behind it. General log is used on my side for human to spot patterns and needs of a human, as that way I can see which actions are repeated or what could be integrated better. That bookmarked was activated (jumped to) is stored in the ring table, separate list of data, and also in hyperdocumentactions table, though there are many ways of tackling objects, some are edited heavily as they, some are never edited only jumped to, some are tagged, some have timestamps, people related, too many things. Those different timestamps get automatically generated in those other different tables. They can serve as information what was done in past with which object. Putting that huge information in single object would be on my side overkill. If it is only simple one like "last jumped to", it works without problem. It is of course best when everything is stored in the object. With complexities that becomes less helpful. Example is having objects with 20 different markups, 101 types, and 107 subtypes. How many combinations are those? I am using about 305 combinations, but do not believe that is a total number. And this is only one example among many others. Now if I keep that "type" stored in the same data object, that would imply that my program need to know about that type, it implies I must program the type, and work on it. Isn't it better having types, subtypes, however we call it, to be in a separate list, and then let the user define what to do based on that type. Normally it is simple function like (hyperscope-evince hs::id) which would open up PDF indexed (bookmarked). The notion comes from relational database principles, tables are related. Keeping it in single table is possible, though makes things with development rather harder, as it demands programmer to program. Instead one can make user to define user's extension, and basic program remains the same. -- Jean Take action in Free Software Foundation campaigns: https://www.fsf.org/campaigns In support of Richard M. Stallman https://stallmansupport.org/