Estimated termination date for this telecopier:
2026
autumn
[ Note: Hidden HTM comments can be viewed by saving this document and then opening it with a text editor, f.e. with Notepad or TextEdit, or Ed or Emacs. ]
I tend to favor practicing "computer wizardy" (a term from the 1900's), especially exploring my curiosity along the lines of personalizing interfaces of the computer medium.
I have pretty much no interest in more of the same. I explore my curiosity of personalizing computers when I have a computer, focusing on research and development (R&D), making notes and sharing what I learn as it emerges.
For now, I have subscribed to a telecopier service. Such a service is from a company (webhost) with its computer with a program (webserver, fileserver, or document server) responding to requests for copies of digital documents while that computer is connected to the Internet. I have also rented a domain name "l8l.info" (or "L8L.info" [ capitalization is unimportant for domain names ] ), which is sort of like a phone number for a computer instead of for a telephone.
The main document "begin.htm" (this one) has most of what I need to start over again, presuming I still have my longtime curiosity with computers if ever I have the means again (shelter, electricity, components, and so on). It is publicly accessible so I can access it from whatever computer, and so other persons can reference it or maybe be inspired in their exploration or personalization of the computer medium.
A readily accessible example from the decades of my curiosity would be the CSS stylesheet for this document you are reading (Note stylesheet), or the CSS stylesheet for CSS stylesheets (stylesheet stylesheet). Other examples can be discovered from the content listing for this document ("Content list"), f.e. the "dual-system approach" (Dual-system approach for discreet computer experiences).
What you might also hear me saying:
Endeavoring towards personalization of the computer medium by the everyday person (rather than by the computer programmer) for accessibly available: memory, information, and direct communication. In a word: freedom.
Colloquially, practicing computer wizardy might be stated as "I am a computer wiz", but that might be misconstrued as a role or job, for lack of context in the written form. I have pretty much always been beyond the roleplay (LARP and PLARP) insistence from journalism, politics, and entertainment (Personal interest). I am just me, so I am interested in health, and I have an interest in the computer medium. That seems to be all.
In fact, I have done no studying of species or of so-called races, nor religion (Terminology about culture: religion), nor science, nor sports, nor politics, nor any of the so-called "identity as" section of job applications, nor romance. That means I know nothing about those topics.
That has nothing to do with "believing" anything, as I simply have had no curiosity about those topics (nor many other topics), and have had no questions about them. Perhaps never. Yes, I am boring, as I prefer discussion of actual first-hand experiences rather than arguments about stories.
Though, I do tend to listen to others talk about such topics, as their minds are occupied with such stories. Yet, there really is no point trying to convince me, myself, of anything. With no interest, what can I possibly comprehend?
For example, nuclear physics is whatever each person knows, which might be different for each person. Yet, I have no interest in keeping up with the topic at all, so there is nothing for me to believe or disbelieve. It is just a topic in the mind of that person who is trying to work out something personally.
As aforementioned, my curiosities are simply about personal health (f.e. diet and rest; no toxins and no drugs), and about the computer medium (f.e. computer wizardy). Those were my first interests way, way, way back when I was still getting taller, and they have turned out to be the last interests I still have. With no place to store anything (and that happening so many times) I have lost all other interests I used to have, whatever they might have been. So, now it just health and computers.
At about the half-century mark, I have come to realize somewhen along the way I have lost the mindset for being a generic human resource, f.e. for "jobs". Reflecting on that, I have never really fit well into that paradigm anyway.
Being around a half-century old and without location permission for much of the past couple decades, I have accidently developed into the mindset of what apparently gets called "radical acceptance", t.i. simply accepting everything as it is. Oops, I had no idea that existed. Of course, I still have personal preferences.
Most recently, I again have been without permission from anyone to stay some place, for lack of knowing anyone able to share such responsibility and with whom I share mutual trust along those lines. Essentially, without family connections, without friends; at most mere casual associations, f.e. passersby or an occasional chatty cashier. Typically, I sleep under the overpass by Kahala Mall, very visibly, as it has seemed too noisy and busy and dusty and grimy for anyone else. (Remember that part about so-called "radical acceptance"?)
Particularly, I have no use for the problem/solution paradigm (Terminology about culture: problem), t.i. there is no such thing as problems in the world. The world is and always has been doing just fine. Nothing is broken; instead, every creature and thing and substance simply changes, mostly because each obviously is an influence to and is influenced by each other (a core principle of the Cosmos, IMHO). As such, nothing needs fixing.
Conversationally, I am open to talking about the computer medium, or about health/eating. Did I mention that already? What I mean is those are the topics where I might say something more than merely "oh", "ah", "okay", "that makes sense with what you have said so far", or similar. The content listing below has links to more info about my observations, pursuits, and other personal interests ("Content list").
Briefly, I have no income, no gadgets, essentially nothing, so no point in anyone thinking of me as a human resource. I always "just say no" to drugs, alcohol, tobacco, and other non-nutritional substances. I am comfortable with reality, I prefer fresh air and being indoors, and I try to respect personal space of people who wear masks.
At the moment, just casually reading computer documentation (f.e. GUIX, Guile, uLisp, the Kernel Programming Language (kind of LISPy), USB protocol) and historical papers (f.e. www-formal.stanford.edu/jmc/: Recursive functions of symbolic expressions and their computation by machine) and sometimes source code, but only at publicly accessible internet devices, f.e. a computer at a public library. No device or Internet access of my own, as it has proven impracticable with my lack of a permitted location (as aforementioned).
[ See the hidden HTM comment after this paragraph for my notes about the above documentation and software. ]
Trying to write up flexible plans towards an introductory Lisp-based management system (f.e. LISPy kernel access). Focusing on opportunity rather than computer science ideals, therefore a mindset bridge between the experience of everyday life and the experience of mainstream computer programming. In other words, endeavoring towards fitting the computer medium into everyday common sense.
Initially promote a text editor (something like Emacs), then a view management approach (f.e. split-view management), and eventually towards an operating-system substitute, while being approachable by the everyday person with only reading/writing skills. Plenty explanation prior to writing the code, because "code" by definition is ambiguous, thereby must be made approachable by the curious everyday person eventually using it.
A lot of prior personal exploration has already been recorded within this document, and I hope it will still be accessible for refamiliarizing myself when perchance I ever have the means to continue my pursuits and curiosity. I am unlikely to add much more to this document while without the means to maintain and use a personalized computer of my own, as it is that experience I have been recording. Regardless of my impedences, perhaps the ideas and observations might inspire others to begin personalizing computers for themselves, and share what they learn.
For example, a recipe (kitchen) and a mathematical formula (academic) and a computer program (office) are all the same thing: a set of instructions. The only significant difference is the notation.
[ Read the hidden text (t.i. HTM commented) after this paragraph for a very brief example. ]
The end of section -1, "Foreword".
__________ ........ | |----| OS 1 | | computer | ```````` | | ........ |__________|----| docs | | ```````` ......|..... ........ | programs | | OS 2 | ```````````` ````````discrete operating systems ;
Eval:
ed
with emacs
;
consistently clear CLI ;
portable Raspberry Pi
The end of "Content list".
A list of the most recent changes to this document. Previous calendar years are hidden in the alternate HTM view by means of an iframe
with zero dimension and with the attribute hidden
.
Most of current calendar year is hidden in the alternate HTM view with CSS ("Reveal/hide the change log"). Reveal the complete listing by selecting the checkbox labeled "View prior changes, too". Otherwise, only the final item, t.i. the most recent change, is shown.
Consider saving this document each time, and then using a computer program to compare the differences for a complete listing. For example, the common UNIX program known as diff
(GNU.org: GNU Diffutils). Or, perhaps the features in Emacs, which is a LISP interpreter with a built-in automatable text editor and view management of documents (GNU.org: GNU Emacs).
Added link to "More" section at end of "Content list".
Added quotes (Anita Moorjani) to "religion" (Terminology about culture: "religion").
Added quote (Anita Moorjani) to "selfishness" (Terminology about culture: "selfishness").
Added "excuse" and "reason" (General terminology).
Added "smart" (Terminology about culture: "smart").
Added more quotes (Anita Moorjani) to "selfishness" (Terminology about culture: "selfishness").
Added "selfish" (Terminology about culture: "selfish").
Added "ego" (Terminology about culture: "ego").
Elaborated "selfishness" with a reference to "selfish". (Terminology about culture: "selfishness"). Moved a quote to "ego".
Added a quote (Anita Moorjani) to the Preface section.
Added a sort of self-intro to the very beginning of the document, sort of a summary of the personal sections at the end.
Revised The realm of the Internet and its misnomers.
Also added a terminology list:
secret, privacy, permission, security, cracking, hacking.
Revised the self-intro written yesterday.
Added explanations (as HTM comments) for each stylesheet referenced by this document.
Added a list of analogies taken too far to The realm of the Internet and its misnomers:
window, WWW, website, piracy.
Revision of self-intro (prior to the "Content list").
Renamed "Terminology misused within the computer medium" to "Core concepts of everyday life for the computer medium" (The realm of the Internet and its misnomers).
Added "sneak, sneaking; sneaker" to "Core concepts of everyday life for the computer medium" (The realm of the Internet and its misnomers: concepts). Amended other terms, too.
Many changes the past week in the HTM comments at beginning of this document. Mostly notes about the documentation most recently (as of this date) read. Also some hidden notes about how to unhide the HTM comments for the alterante view of this document. Also extra info (also hidden) about myself, current circumstance.
Gradually adding list of pebbles at end of each section.
Gradually numbering (lettering?) sections.
Added a couple of paragraphs to end of "Preface". Clarifying how the phrasing and the voicing of the text emerged, particularly as a lengthy document of notes over a long period of time.
Info about chewing gum wrappers as an insulated flat wire; some extra info hidden (Personal pursuit). (From past experience with prototyping personalized buttonboards with a Raspberry Pi 4.)
Another statement for the "Last words..." section: "There is what can happen..." ( . (Last words...)).
More info about fructose from Drop acid (2023) by David Perlmutter (neurologist), about uric acid levels spiking from fructose or alcohol (triple-lane highway: Alzheimer's disease, obesity, diabetes).
More info about sugar in general from Sugar crush by Dr. Richard P. Jacoby (podiatrist), about nerve damage from eating sugar all year long (pain and numbness, organ disfunction, amputations).
For now, recorded into the sugar definition (Observations of food: sugar).
Added more to the sugar entry (Observations of food: sugar). Included Anticancer: a new way of life (2008) by Dr. David Servan-Schreiber (psychiatrist, cancer survivor).
Added the new heading "Foreword" to the notes at the very beginning of the document ("Foreword"). Updated "Content list" for that ("Content list"). Also revised some of the content of the "Foreword" (and some of its HTM comments).
Moved the hidden proposed changes from end of document (was before the "More" section) to the end of the "Change log" section. Still hidden (an iframe
).
Moved the styles for this document from the head
to "Appendix: Document style". This gets them out of the way so the content can be viewed more immediately with a plain text editor. Also serves as yet another example of how an ordinary document marked with HTM can be its own stylesheet, too.
Clarified in the very first HTM comment of this document about that HTM comment and the CSS comment marks ( /* and */ ) for enabling this document as a stylesheet, specifically as its own stylesheet.
Revised the "Foreword" section. Tried to clarify about personal interests. Tried to neutrally declare I have no other interests than personal health and the computer medium. Tried to tactfully state there is no point discussing whether I, myself, "believe" anything, as I have had no curiosity about anything else, perhaps never. *shrug*
Changed hosting plans (after about five years) to the most basic plan (still Dreamhost, of course). Especially because there is no longer (since mid 2021) a potential of developing more than one telecopier, f.e. staging sites for major changes for a telecopier other than my own.
Ultimately, the change (plus a small amount that has slowly accumulated) has extended time for one more year for both hosting and domain name, now until 2026 Autumn. Probably will be the last time changing that until then, as three years is a long time.
At this point I am just fiddling with notes about food and health, and maybe the CSS, and maybe rephrasing explanations for clarity. Just passing the time, as I stopped expecting there to be a tomorrow years ago. Also, that has merged with finally accepting there is nothing to value but opportunity as it is rather than as it might become. Nothing to lose (or care about losing), as I have already done that too many times.
Added a list of the terms for each link to subsections of "Observations and terminology". Also updated a few other terms. Changed address links for the section from names to numbers (12, 12.1, and so on).
Added two new terms, "procrastinate" and "reprioritize", for "General terminology". Also updated "stray (human, person)" with possible synonyms of "outsider", "misfit", or "leftover of the abundance of human resources".
The end of section 1, "Change log".
Some considerations to have in mind.
Rather than voicing anything below as "invective", consider "dismay" or "disappointment" or "disheartened".
Rather than interpreting as "blaming someone", consider "observation of an event" or "interpretation of a result".
Rather than conflate a role as being an actual person (t.i. stereotyping, like in journalism), consider a role as a position or location that is stepped into and out of on occasion by anyone.
It has been said by some that no one hates anyone, it is just what someone did that is hated. But, another way of considering that is: no one is ever hated, it is just whatever disruption has happened seems uninteresting as an opportunity.
[ Anita Moorjani ]The way I see it, if we were encouraged to express who we truly are, we'd all be very loving beings, each bringing our uniqueness to the world. Problems and strife come as a result of our not knowing who we are and not being able to show our inner beauty. We've created so much judgement about what's "perfect", which leads to doubt and competitiveness. Since we feel as though we're not good enough, we go around acting out. However, if each of us became aware of our magnificence and felt good about ourselves, it seems to me the only thing we'd have to share is our unique nature, expressed outwardly in a loving manner that reflects our self-care.
It follows that the problems we see in the world aren't from the judgment or hatred we have for others but for ourselves. Just as the key to my healing was unconditional self-love that eliminated fear, the key to a better world is for everyone to care for themselves [that] same way, realizing their true worth. If we stopped judging ourselves, we'd automatically find less and less need to condemn others. We'd begin to notice their true perfection. The universe is contained within us, and what we experience externally is only a reflection.
—Chapter 16: Infinite selves and universal energy. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Pages 148-149.
A stereotype is conceptual, perhaps an inspiration for a role, but nobody is a stereotype. That is taught in elementary school, the first half of public education, as every adult might recall.
For example, either "computer programmer" or "everyday person" reference a vague set of expectations about knowledge and responsibilities.
Any perceived (t.i. implied) dissatisfaction with a role, program, company, organization, government, or other set of concepts has nothing to do with any specific person. In other words, the set of concepts or expectations are likely unsatisfactory, never the person breathing life into them.
Much of the writing is quick or very concise notes gradually recorded over a long, long period of time. As such, the voicing varys greatly for different sections, even for immediate paragraphs. Mostly a reference or reminder of concepts, ideas, perspectives, and perhaps especially contrary of common expectations, hence their importance.
Additional notes have been marked with HTM comment marks, thereby are usually hidden when viewed with a computer program (f.e. a "web browser") presenting an alternate view for HTM documents. Such computer programs typically have been made without an immediate option for viewing the original document, let alone a means for revealing the hidden comments at all.
The end of section 2, "Preface".
A computer does what a person desires at the mere press of a button, but for most people that is only science fiction (Customize the buttonboard).
No one need be a book author to write a grocery list, nor be a computer programmer to write a computer instruction. Potentially, no one needs any computer programming skills for personalizing beyond computer programs. Though, notes help with gaining familiarity.
Generally, information is telegrammed amongst the components inside a computer, and to other computers. Pulses of significant amounts of electricity and insignificant amounts are the dashes and dots of machine code flowing circuitously.
Similar to a calculator, a computer accepts instructions for managing numbers and words. In essence, memory management is akin to a notepad of paper. Without memory, it would be a basic tool, at most an uncustomizable machine.
There are simply two sets of instructions for a computer:
Write to and read from "temporary memory".
Like scribbling on scratch paper. It disappears when the computer is turned off (no electricity).
Write to and read from "permanent memory".
Usually an external storage device.
All interactions with a computer comprise those two purposes: "now" and "later". The memory might be for the screen displaying drawings of text. It might be on another computer.
Most commodity computers barricade their labeled buttonboards behind an unlabeled pointer-box that must be repetitiously lifted, clunked, and slid with gymnastic precision. Ideally, writing in the computer medium would be without an obstacle course entrance, as immediate as writing on paper.
The promotion of literacy encourages sharing knowledge by writing and reading. Personal memory management and communication become possible with the ubiquitous skill of writing when the commodity software permits the buttonboard to function (Interactive curiosity: typing for actions and help).
Unique text editing software often produce unique file types, which make the documents eventually inaccessible when the software is inevitably abandoned by its company. Only plain text documents are accessible with any computer, old or new, commodity or personalized (Organizing and sharing files).
Plain text documents are so versatile that all operating systems and programs are always made from them, although sometimes only their illegible conversion to machine code are ever shared.
Computer networking bridges the gap between discrete computers and their incompatible operating systems, a compatible means of transfering plain text files for reading and editing anywhere (Dual system approach...).
The experience of pursuing personal interests is the core of personal disciplines, but is perceived externally or by self-reflection as freedom. That is, the perception of freedom is a side-effect from taking on the responsibility of following through with personal interests.
Opportunity is sometimes mistaken as freedom, as is the lack of molestation or lack of expectation from other people. Like the fantasies of security and privacy, freedom is never taken away because it is only a perception. At most, the daydream of freedom disperses when personal pursuits are disrupted.
The pre-defined instructions of computer programs are what the software developers had time to offer, likely without documentation, and hidden within a cavernous maze of non-personalizable menus. Jumping through hoops or over hurdles provides a false sense of accomplishment, a façade of freedom after the labyrinthine escape.
A "personalizable computer" (...no need to change the world) is extensible beyond its default set of computer instructions and buttons. A person adapts the computer to fit within the current flow of events, such as re-assigning buttons or composing a basic computer instruction instead of computer programming (Flow of the moment).
The end of section 3, "Introduction".
A website is a telecopier (or telecloner), a computer with software automatically responding to requests for copying memory. The copy is telegrammed to the computer that requested it, then the transmission is ceased.
Like a telephone call to a playback of a recording, f.e. press 1 for this and 2 for that, the computers of "websites" are never visited. Even the copy that is received is no visitor, though it might include a computer program (f.e. JavaScript in an HTML doc) akin to the email viruses of lore.
Best to save a document rather than depend on requesting it ever again. Best to audit any computer programs from anywhere regardless of "trust" before breathing electricity into them.
Consider keeping only what matters, or at least paring the non-repurposable.
The end of summary and motivation for section 4, "The realm of the Internet and its misnomers".
These concepts are actually the same as in everyday life. However, it is a good idea to review them, because they often get misused in articles and writings about the computer medium. Too much laziness in describing what actually happened is probably why these terms get misused.
For example, the concern of criminal activity with the computer medium is actually to do with "lack of permission" (unauthorized access) rather than the everyday experience of figuring out how something works ("cracking open a mystery"). Perhaps some day both computer technologists and computer journalists will focus on the activities and speak observationally, rather than playing a role in an event or crafting a story about an event.
A responsibility of knowing something, and the guidelines for whether and how to share that responsibility and that knowledge.
The practice of maintaining personal secrets.
Shared or delegated responsibility, often with taking care of something.
An authority is a person who is knowledgable about a particular topic. Often takes on responsibilities related to that knowledge. Might delegate permisssion to others in helping with those responsibilities.
The practice of permitting and denying access, usually to something other than secrets.
See also Terminology about culture: security.
Figure out what something means or how something works. Learning by means of personally experiencing discovery, rather than only by means of being told about something.
A detective or sleuth might crack a mystery, but a cracker is something eaten with soup.
"The mystery behind the secret-Santa gift has been cracked."
"That person is a hard nut to crack when figuring out what gift to buy for anniversaries."
"Finally cracked that chapter by jumping to its conclusion and reading it first. Re-reading the chapter made so much more sense after that."
Put something together as a temporary resolution, t.i. making due with what is available. Making a prototype is hacking; the prototype itself is a hack. The applying of knowledge; a demonstration of intelligence. Birds hack together various materials when making their nests.
Someone who coughs a lot, especially coughs up phlegm, might be said to be hacking. A cat might be said to hack (cough) up furr balls. A fireman might hack through a door with an axe. There really is no sensible use for the word "hacker".
See also Terminology about culture: intelligence.
Carefully proceed. Minimize personal influence upon the environment. Inconspicuously sleuthing.
A sleuth or detective sneaking around might be referred to as a sneaker, with or without permission from the authority of the premises or facilities.
As nouns, "sneak" is the activity, and a "sneaker" is the participant sneaking during the sneak. A sneaker or group of sneakers might offer services for discovering unexpected approaches for infiltrating the premsises, or facilities, or computer systems, and then sharing those discoveries with the authorities.
"Let us try to sneak through the forest on the hike today, without trailblazing or startling other creatures."
"Odd. Sneaking through the library seems less common than expected."
"That little sneaker! Made it past me without me noticing."
The end of section 4.1, "Core concepts of everyday life for the computer medium".
An analogy (a momentary digression in a discussion) provides an example situation for the sake of introducing a concept. Once the concept is introduced, the example provided should be dropped and forgotten. The concept is then applied to the prior topic.
There are many analogies in discussions about the computer medium that were never dropped. Those analogies obscure and unnecessarily substitute familiar everyday objects and approaches with needless originality and fantasies.
The typical words of the everyday person suffices without the false IT (Information Technology) jargon.
A view.
The term "window" leads to conversational deadends. Compare the question "What are you viewing?" with "What are you windowing?". Or consider: "I will show you another [ view | window ] of the document."
The collective computer programs of an international network (f.e. the Internet) of computers, such as telecopiers and auto-responders. Some computer programs are known as "websites" when their addresses begin with "http" or "https". Other computer programs are known as file-servers when their address begins with "ftp", "scp", "gopher", and a variety of others. Addresses beginning with "smtp" or "pop" usually lead to computer programs for email (electronic mail).
No matter what, all data transferred is simply being telegrammed from computer to computer, and any of it can be thought of as documents, whether files or email or "webpage". Most of the time it is plain text, but sometimes it might be computer instructions describing how to draw a picture (f.e. a photograph) or a motion picture (f.e. a movie).
The analogy of "web" comes from the comparison of a net with a cobweb, because of the cables connecting the computers, or of the lines drawn in a diagram representing a computer network. The term "worldwide" distinguishes the network from a local network (LAN, local area network).
On the otherhand, a web is usually associated with a spider or other death-dealing predator. That concept of danger applies to the computer programs (potential automated predators) received from other computers on the same network, such as from the Internet (international network).
As such, consider keeping in mind at least two thoughts when thinking of the Worldwide Web: (1) the WWW is a sticky net with computerized predators; and (2) never delegate privacy to strangers, which is any company that represents itself on the WWW (Core concepts: privacy).
An automated computer program that responds to requests, f.e. a file-server (telecopier).
Piracy is one of the worst analogies for the computer medium, as piracy is akin to the modern day terrorism of hijacking an automobile or airplane. That involves threatening people with murder, and often following through with the threat or at least kidnapping.
The actual concern in the computer medium has to do with proliferation of information, or of knowledge, or of ideas. Criminalizing communication seems undesirable, especially in the United States of America, but associating the means of information reduplication (what is essentially the heartbeat of cultural knowledge, f.e. teaching) with piracy is ludicrous.
How the analogy of "piracy" ever supplanted that concern, especially in the courts of law of our beloved United States of America, is perhaps the most embarassing misunderstanding of computer technology by lawyers and Justices. If the Judiciary people involved felt less embarassed (or were they blackmailed? or were their jobs threatened?), then perhaps those people (or their successors) would have felt brave enough by now to face up to that prior misunderstanding and correct the course of our culture.
The core principles of the computer medium is "work on a copy". That has always been the approach of using computers, ever since the beginning (or at least as recent as the late 1800s).
Limited computer memory back in the mid-1900s (and earlier) encouraged writing on paper what would be toggled into the machine. Whenever the machine failed, there was (hopefully) still a piece of paper with the sequence to re-apply to the machine again, after the machine was reset and prepared for input again.
Copies of data or computer instructions are present in permanent removable memory, in temporary memory (f.e. RAM), in the processors, and even in the video memory and video display. That is multiple instances of the same data, f.e. an email, a photograph, a movie or captions of its dialog, a song or its lyrics.
Copying has nothing to with hijacking or murdering, let alone copying with a computer as the tool. The computer medium as been misappropriated for practicing the business of limiting permission of copying, even though copying with a computer is as natural as arithmetic with a calculator, as much as sharing personal experiences by means of exact re-enactment is natural and even more so culturally.
Proliferation of information, or of knowledge, or of ideas includes what someone else expressed nonprivately, and should never have been associated with, let alone equated with, the hijacking and murder from "piracy".
Telling someone to grab a mouse to control a computer has never made any sense.
It is instead a remote control for maneuvering a pointer, often an arrow shape, that is drawn on a computer monitor. The remote control usually has a motion sensor, and how it is moved is coordinated with the position of the arrow on the computer monitor. In short, it is a motion remote.
Sometimes the motion remote control is referred to as a "moshie" (spoken), which has lead to the computer keyboard to be referred to as a "mashie" (as in "button mashing"). These are colloquial terms from experiencing the devices, rather than journalistic terms.
The end of section 4.2, "Analogies taken too far in the computer medium".
Paper is one of the best mediums for recording notes. Notes on a sheet of paper can be read by someone else without the need for that person to have a pad of paper.
Notes recorded in the computer medium are undeniably less accessible and less sharable. Computer documents require a computer for reading them, and the computer requires electricity.
A buttonboard with a button for each letter of the alphabet aids in writing legibly and quickly on a computer. However, the casual markings of underlining or thicker lines of text written on paper is typically beyond the limited set of symbols of a buttonboard.
Prose often has parentheses "( )" and square brackets "[ ]" distinguishing supplemental information, or quote marks specifying exact wording. Similarly for HTM, the uncommon angle brackets "< >" enclose a name for the kind of mark before its region of typed text.
The end of summary and motivation for section 5, "Notemaking with the computer medium".
Whatever is typed is "plain text" when it is compatible with any operating system of any computer, from the past to the present and into the future. No need for converting a document that has plain text markup.
Spacing before and after paragraphs, thicker lines of text, and larger text for headings help demarcate and emphasize ideas. Some text editor programs merge that formatting with the prose in a way that is illegible and uneditable with any other text editor, thereby is no longer plain text.
Instead, consider two approaches: the primary view optimized for editing the text, and a temporary alternate view optimized for perusing. That is, when editing consider marking the text when helpful for an alternate read-only view of the document.
Enclose the name of a mark within angle brackets "< >", whereby it is unmistakably distinguishable from the prose while ensuring compatibility as plain text. The alternate read-only view of a document is provided by a program hiding each mark while also modifying the appearance of the following text based on the name of the mark, without modifying the document itself.
Extra software for the alternate view is optional. Reading and editing personal or shared notes remains possible with any text editor on any computer, old or new, commodity or personalized.
The uncommon angle brackets <
and >
enclose a name for the kind of mark before its region of text. For example, thicker lines of text is known as "bold" text, therefore the mark is <b>
. The region ends similarly with a forward slash "/" in the mark, f.e. </b>
.
In other words, a region of text marked at its beginning with <b>
would have </b>
at its ending. Mnemonically, the "/" then "b" means "end b".
Normally drawn text with <b>
this text to be drawn with thicker lines</b>
and normally drawn text after it.
Sometimes the ending of a region is obvious by a mark beginning a new region after it, f.e. a paragraph after a paragraph, thereby the ending mark is conveniently optional.
<p>
A paragraph of text that is followed by another paragraph.<p>
The previous paragraph obviously ends when this paragraph begins. This one has an ending mark, though it might be unnecessary.</p>
A hypertext markup lexicon (HTML) is a list of named marks for typed regions of text. The marks evoke imagination of how the text would be drawn or spaced on paper, thereby promoting association and understanding of the content without an alternate view. The alternate view of an HTML document hides each mark and then applies its implied characteristics to its region of text.
For example, notes about some other document will often have the name of that other document for later reference. For computer documents, this more reliably also includes the filename of the document and its location.
The HTML mark for an address is <a>
and is supplemented with the href attribute for the "hyperlink reference".
<a
href=
"a-directory/document.txt">
"The name of a document"</a>
.
<a
href=
"document.txt">
"The name of a document"</a>
.
<a
href=
"http://domain.tld/document.txt">
"The name of a document"</a>
.
A hyperlink address region of text is underlined and becomes a trigger for viewing its specified document. That makes the alternate view more concise with document addresses, and enhances access to referenced documents.
A filesystem is a record of locations for documents (files) in a storage device. It tends to also be a source of the modification date and file size, but usually no special feature for comments or descriptions for files.
Commodity operating systems provide their own options for writing descriptions for a file, but those notes are inaccessible with other operating systems. The obvious compatible approach, regardless of operating system or type of filesystem, is consolidating personal descriptions of multiple files into a new document (file).
A document marked with HTML is plain text, therefore always accessible regardless of what computer. Type or copy/paste the document name and optionally mark it as a hyperlink address, perhaps followed by a description. Maybe mark each as a paragraph <p>
, or grouped into distinct lists preceded by headings.
In this way, the reason for having each document or image is available, rather than opening each and every document with many different applications and trying to remember later. Documents without descriptions, reasons, or relations to other documents become prime candidates for removal in order to reduce clutter.
Include a framed view of either an HTML document or an image by referencing its source address in the src attribute of an internal frame <iframe>
. The view of the document or image is scrollable when larger than the internal frame, which also can have width and height attributes (pixel values).
<iframe
src=
"some-other-document.html">
</iframe>
<iframe
src=
"can-be-an-image.jpg" width=
"400" height=
"300">
</iframe>
Or, add an image with the <img>
mark and optionally scale it with width or height attributes (pixel values). An <img>
mark is intended to be replaced rather than mark a region, so there is no end mark for it.
<img
src=
"an-image.jpg">
<img
src=
"another.jpg" width=
"500" height=
"375">
Perhaps establish a tiled layout (split view) for previewing a set of documents with each at 50% width [need style attribute for non-pixel values], t.i. one pair at a time. Note that 50% + the width of one space character + 50% = more than 100%, so ensure there is no space between the end of one mark and beginning of the next.
<iframe
=
"doc-1.html"
style=
"width:50%;height:30em;border-width:0">
</iframe><iframe
=
"doc-1-backup.html"
style=
"width:50%;height:30em;border-width:0">
</iframe>
<iframe
=
"doc-2.html"
style=
"width:50%;height:30em;border-width:0">
</iframe><iframe
=
"doc-3.html"
style=
"width:50%;height:30em;border-width:0">
</iframe>
No matter what operating system, even from before the turn of the century, every computer comes with a simple text editor for editing plain text and an HTML explorer (a.k.a. web browser). Thereby, the document can be viewed in any web browser on any computer, and without need for a webserver or even an internet connection.
No special programs necessary, no extra cost, and HTML is as plain as the buttons on a buttonboard.
The "language" in HyperText Markup Language (HTML) only means it is a lexicon or list of keywords. There is no communication by the means of HTML, nor any coding.
HTML marks are guidance for a temporary read-only view of a document. Sort of like proofreader marks, with a name consistently encapsulated within <
and >
. Sometimes after the name there is more describing the characteristics of the mark itself, before the >
.
The angle brackets "< >" make the occasional HTML mark unmistakably distinguished from the prose, just like parentheses or square brackets. They are often readily available on the comma and period buttons of the buttonboard.
Any text can be placed in between <
and >
. Just type whatever. Programs providing the alternate read-only view of a document with HTML marks generally ignore any unknown named marks and never show them.
The ".htm" (or ".html") at the end of the filename for a document is typically the only (artificial) requirement made by the operating system and its programs. All HTML marks are optional, as such a document declared to be HTML can be just prose without any marks.
Consider beginning a paragraph region with the <p>
mark.
Begin a heading with <h1>
followed by the text for the heading, then type the ending </h1>
mark for it. Progressively smaller headings are numbered 2–6.
An unordered list begins with <ul>
, each list item begins with <li>
, then the unordered list ends by typing the </ul>
mark. For automatic numbering in the alternate view, consider an ordered list <ol>
...</ol>
instead.
Links are "hyper" because the text is marked with an address for a location within the document or to another document. In other words, a link is an option to view some other part of the document or to view another document. A hyperlink is traditionally underlined by HTML explorers.
Mark a location in a document with an address mark and the id attribute. No need for anything within its region, merely type the marks before something interesting, like before a heading.
<a
id=
"some-name""></a>
Mark text as hypertext with a reference href in an address mark <a
href="">
before the text, then follow the text with the </a>
ending mark.
The href name begins with an octothorpe "#" when referencing a marked location of that name within the document:<a
href=
"#some-name">
descriptive text</a>
.
Provide a hypertext reference to some other document by typing its name or URL address for the href in the address mark:<a
href=
"some-other-document.html">
descriptive text</a>
.
Or, provide a reference to a marked location within some other document:<a
href=
"some-other-document.html#some-name">
descriptive text</a>
.
In essence, making a note about another document typically involves typing the title of the document, and typing the address of where to find it. In other words, that is the act of referencing a source.
A hypertext link is the same thing, with just a few more characters to type. The same information is recorded, and it will be a link in the alternate read-only HTML view.
Include a framed view of either an HTML document or an image by referencing its address in an internal frame <iframe>
. The view of the document or image is scrollable when larger than the internal frame, which also can have width and height attributes.
<iframe
src=
"some-other-document.html">
</iframe>
<iframe
src=
"can-be-an-image.jpg" width=
"400" height=
"300">
</iframe>
Specifically add an image with the <img>
mark and reference its source with the src attribute. There is no end mark for it. Optionally scale the image with its width or height attributes.
<img
src=
"an-image.jpg">
<img
src=
"another.jpg" width=
"500" height=
"375">
The same document or image can be referenced multiple times. That can be convenient for comparing side by side [perhaps each at 50% of the view width] one original version with many other versions, pairing a reference to the original version with each of the other versions.
Change the default characteristics of any mark with the style
attribute for it. A colon associates a characteristic with its value, and a semicolon separates characteristics. Optionally use spaces around the colon or semicolon for clarity.
For example, set the width of a paragraph and center it horizontally.
<p
=
"
>
For example, set the width of a paragraph and center it horizontally.
</p>
Additional color is possible with red, green, and blue hues specified as hexadecimal (X Window System and its protocol: color names).
Be wary about putting all of the eggs in the same basket. Discrete purposes with their own resources stay separate, thereby one is affected by its own needs or demise without draining other resources or damaging anything else.
In other words, rather than a large amount of memory in one container, consider smaller amounts in multiple containers. Dedicating resources sparingly minimizes corruption or loss, while freeing remaining resources for additional or simultaneous endeavors.
Everybody wants to rule the world, for the sake of personal comfort. It is possible to let everything remain as it has come to be, and move forward without bearing the wait of it all following along.
Distinct from a dual-system, either "dual-boot" or "multi-boot" are singular systems. Those "boot" approaches are for having more than one operating system on the same storage device, and thereby either is a setup for multiple losses. The operating system is chosen by the person after starting (t.i. booting) the computer.
__________ ........ | |----| OS 1 | | computer | ```````` | | ........ |__________|----| docs | | ```````` ......|..... ........ | programs | | OS 2 | ```````````` ````````
An operating system needs its own memory storage separate from other operating systems, because "operating" means automated programs are doing whatever without being monitored. They can readily corrupt anything on the remainder of the storage device.
For example, there has been one operating system (for a "hardware integrated with software" system) that replaces the partitions and filesystems of the whole storage device with its new and improved version of partitions and filesystems.
Unfortunately, any prior version of that same operating system on the same storage device was unable to properly recognize it anymore. That meant the prior versions were prone to corrupting that storage device and the new operating system on it might become unusable, too. Reliability comes from discrete use, rather than shared.
Replaceable modular units provide the means for restoration and extensibility. Simply plug or unplug for instant modifications.
Ideally, the operating system is always kept on removable storage, never permanently inside a personalizable computer. The computer is started after attaching an operating system compatible with its hardware. Keep a backup on a second external storage device, then that can be used to start the computer when the primary fails.
.......... __________ ...... | OS | | |----| OS | | backup | | | `````` `````````` | computer | ............. .......... | |----| documents | | docs | |__________| ````````````` | backup | | `````````` ......|..... ............ | programs | | programs | ```````````` | backup | ```````````` .............. | spare for | | trying out | | new OS or | | programs | ``````````````
Keep personal documents separate from the operating system, ideally on a separate storage device. Documents can be plugged into any computer, and no need to turn on a specific computer to access them.
Personal documents on external storage are never trapped inside a computer that fails to start. For example, they are easily taken to a computer located beyond a local electrical power outage, f.e. to a nearby computer that uses a battery.
One computer with two memory storage devices for an operating (or operatable) system, primary and backup. Two more storage devices for personal documents, primary and backup. Perhaps another set of storage devices for additional software.
The amount of memory per storage device can be minimized for each purpose, no need for terabtyes in one device. Operating systems tend to use only a few gigabytes, but some operating systems are only a few megabytes, f.e. TinyCore and piCore (The Core Project - Tiny Core Linux).
Never update nor upgrade an operating system, nor any software application. Instead, install the next version on a separate storage device, and try it out discretely without losing the currently working version.
Creating a new instance fits with one of the core principles of computing: make and work on a discrete copy.
The memory devices need only as much memory as required for that particular purpose, no need for terabytes. Separate memory devices for trial of updates or upgrades can be re-used for that specific purpose, discrete from personal documents and discrete from stable software.
Reliably customizing a computer requires using some other stable computer, which is how it was manufactured, too. That is, a primary computer is used to setup a secondary computer. Once the secondary computer has its new modifications stabilized, then the secondary computer is eligible as a replacement for the primary computer.
__________ ........ ___________ ........ | |----| OS 1 | | |----| OS 2 | | primary | ```````` | secondary | ```````` | computer | ........ | computer | | |----| docs | |___________| |__________| ````````
Adding another computer requires only enough (external) memory storage for an operating system compatible with its hardware. Eventually, two such memory devices: its primary storage and its backup copy.
Once again, very small amounts of memory rather than large amounts. Gigabytes or megabytes (or even less), instead of terabytes, allows for sensible and affordable personalization of computers. Separate memory provides stabilty.
A physical computer tends to have small amounts of special memory (firmware) for itself on its circuitboard. The manufacturers usually never reveal how to customize that memory, but usually provide mysterious updates or upgrades for it, potentially removing features or causing corruption.
That is why it is important to have a second computer (hardware) for customizing, isolating the aforementioned possible corruption of its circuitboard memory (firmware) by operating systems or their updates.
Ideally, the firmware memory would be physically removable, thereby replacible and securable without having to power the circuitboard. That aids in addressing incorrect or rogue programming in untested or unfamiliar firmware.
By using a primary system to customize a secondary system, whatever happens to one system (software or physical) can be assessed from the other system. Furthermore, some tasks can be off-loaded to the secondary computer (when it is stable enough) rather than stressing or slowing the priorities of the primary computer.
Almost any computer can be repurposed as a personalizable computer, just as long as the operating (or operatable) system needed for personalization can be installed on it.
Explicitly, a computer that has its operating system integrated with its hardware is less likely to be repurposable. Be aware of that about integrated computer systems or computerized appliances, f.e. pocket gadgets marketed as cellular telephones.
Personalize a computer by customizing the commands invoked with the buttonboard, f.e. rebinding keys (Customize the buttonboard). Or, enable the computer with special software to repeat any sequence of actions, a peculiarly uncommon ability of commodity computers.
Use a program for enabling the personalizable computer as a VNC "client" or RDP "client" in order to control any other non-customizable computer. Many operating systems already have VNC "host" or RDP "host" capabilities, so it is only a matter of having that feature activated on the other computer.
<-- video .:::::::::::::::::::. ________ :: button :: ________ | | :: presses --> :: | | | | :: :: | | | |:::/ \:::| | |________| |________| | /__\ /__\ | |.............. | buttonboard | ``````````````` personalizable non-personalizable computer as computer as VNC or RDP "client" VNC or RDP "host"
There is no need to replace the operating systems of all other computers on the planet. There is no need for a computer program to work on all operating systems. Simply connect with remote control software to the other computer, even on the same desk.
In other words, there is no need for a personalizable computer to have the fastest processor or lots of RAM (temporary memory) or recent hardware. It needs only just enough to personalize it, and to use the VNC "client" or RDP "client" computer program. Anything more is gravy.
cdr
and car
;
consistently half-paired ;
abbr. dextral half ;
contrary formation
defun
;
friendlier cons
Lisp is "lis-t p-rocessing", a means for instructing a computer for handling lists, f.e. a list of instructions.
Lisp itself is programmable, meaning its notation can be customized. In other words, Lisp is a "programmable programming language", and is partly why Lisp is said to have no syntax, unlike other computer languages.
Lisp is experienced in a interpreter program rather than with a compiler program. As such, Lisp itself can be programmed before, during, and after a computer program is written with Lisp.
A list of letters is a word, a list of words is a sentence, a list of sentences is a paragraph. Or, a paragraph is a list of sentences, a sentence is a list of words, a word is a list of letters. A number is a list of digits, a list of digits is a number.
For Lisp, text is listed within a pair of "double-quotes". A number can be prefixed with its radix, f.e. the binary #2r
10000 (which is 2^4) or the hexadecimal #16r
10 (which is 16^1) for the decimal 16 (which is 6 + 10^1). Alternatively, #b
is #2r
and #x
is #16r
, and decimal can be explicitly declared with #10r
.
Temporarily store anything in memory by naming it with the setf
, and reference or re-set that named memory any time later (An intro for Lisp with StumpWM). A list of items within parentheses ( ) is actually only a list of references to memory for each item, with no need for a name for each (Re-listing rather than re-arranging).
Constructing a list with the cons
is pairing an item with another item, even when an item is already a list (Lisp lists are pairs).
An instruction is a list with the leftmost item as the name of a function. A function is defined with the defun
as a named list of instructions. A list is often quoted with the quote
[ or more briefly preceded by an apostrophe ] to prevent its evaluation as an instruction.
A pair of parentheses ( ) with nothing in the list is known as an "empty list". Alternatively, an empty pair of parentheses is represented by the word nil, implying nil or nothing is a list (Lisp and NIL: No Items in List).
cdr
and
car
As a single item has no associates, a list of items conceptually begins when an item is paired with another (Dotted-pair notation). Written horizontally, one item is the left half and one item is the right half (Dexter and abdexter).
No need for first then last. Instead, access either half immediately (Reference a half).
Consistently pairing a new item right of a list forms a stream of half-pairs rightwardly, or when left of a list forms a stream of half-pairs leftwardly (Consistently half-paired lists).
A Lisp instruction is a list. Piece together an instruction either forwards or backwards or inside-out (Contrary formation and Lisp instructions).
For Lisp, a list is constructed parenthetically one pair at a time, and notated with a space-separated-dot, t.i. a period with spacing before and after. The spacing is important because numbers can have decimal points, and Common Lisp allows a period as a character in the name of a symbol (CLHS 22.1.3.5 examples).
("A message for later." . a-lisp-symbol) (one.symbol . 3.141592)
A parenthesis has no actual need for spacing on either side of it, neither "(" nor ")".
( ( ( ( 1 . 2 ) . 3 ) . 4 ) . 5 ) ((((1 . 2). 3). 4). 5) (5 .(4 .(3 .(2 . 1))))
The cons
function constructs a new list by pairing the two Lisp forms it is given, perhaps quoted (An intro for Lisp).
(cons
(quote
left)'
right) -> (left . right)
In essence, a list is itself a single item. Therefore, lists are constructed further by pairing the next item with a prior list. As a left or right half, an item is readily referenced by its position within a sub-list, t.i. from inside to outside.
(left . right) (L . R) ((LL . RL) . R) (L . (LR . RR)) ((LL . RL) . (LR . RR))
For example, "the left half of the right half" references the left item of a sub-list, and that sub-list is the right half of another list. That describes the position (which side of the dot) from the inside list to the outside list, with this example succintly described as the "LR".
However, multiple "l" and "r" sounds smoothly slur together ambiguously when spoken. Another term for the right side is the dexter, or adjectively as "dextral" for the dextral half. Traditionally, left of dexter is "sinister", perhaps fitting with the Scheme dialect of Lisp.
The aspiration of the "s" contrasts distinctly with the explosive "d", even for a lengthy series spoken quickly or slurred. Their blending potentially invokes a lisp when spoken quickly enough, thus giving an onomatopoeia characteristic to Lisp discussions.
Alternatively, abdexter also applies as an alternate to dexter. The "ab" prefix means "away from", f.e. abduct contrasted with adduct.
The vowel "a" of abdexter (left) pronounced with a glottal stop of the throat contrasts with the dental consonant "d" of dexter (right) at the front of the mouth. A vowel other than "a" can be chosen for supporting the consistent pronunciation of the "d" itself, regardless of personal dialect or length of series.
Therefore, "abdexter" and "dexter" provide sequences of sub-lists succinctly written and clearly spoken with either one letter or one syllable per sub-list. The written letters contrast with each other, with numbers, and with symbols on the buttonboard, either when lowercase "ad" or when uppercase "AD" or when mixed "cADr".
(abdexter . dexter) (a . d) ((aa . da) d) (a . (ad . dd)) ((aa . da) . (ad . dd))
From inside to outside, "the left half of the right half" is the same as "the abdexter of the dexter", or the "ad" which is pronounced individually as "a-d". Visually, it is the item left of its dot within the sub-list right of its own dot.
Though a sequence of references is from inside to outside, it is readily understood from outside to inside by reading it reversely. Therefore, the prior example of "ad" also refers to the dexter (right half) of the outer list and then the abdexter (left half) of the sub-list. Dexter remains dexter, and abdexter remains abdexter, so it is the same follow-the-dot approach either way.
cdr
and car
For the pair of items in a list, call for its dexter reference with the cdr
function, and call for its abdexter reference with the car
function (An intro for Lisp).
(cdr
'
(a . d)) -> D (car
'
(a . d)) -> A
Chaining multiple references accesses a list initially from its outside then gradually towards its inside.
(car
(car
'
((aa . da) . d))) == (car
'
(aa . da)) -> AA (cdr
(car
'
((aa . da) . d))) == (cdr
'
(aa . da)) -> DA
Multiple car and cdr references can be consolidated by functions named with the concise sequences. Common Lisp provides functions for up to four places, f.e. cddddr
. It is a bit like simply removing the "r(c" of consecutive functions, and their corresponding ")".
(car
(cdr
'
((aa . da) . (ad . dd)))) == (cadr
'
((aa . da) . (ad . dd)))
The resulting inside-out sequence of references from the abdextrally half-paired Lisp instructions is least to greatest. This is in contrast to the greatest to least approach with digits in numbers (Pairs of pairs accessed sequentially).
Besides the purposful construction of a list, there are a couple of obvious approaches for consistently constructing a list of arbitrary content.
((((1 . 2). 3). 4). 5) (5 .(4 .(3 .(2 . 1))))
Consistently pairing a new item right of a list forms a stream of half-pairs dextrally, ensuring the final item added is readily accessible with merely the cdr
function.
(1 . 2 ) (a . d ) ((1 . 2 ). 3 ) ((aa . da ). d ) (((1 . 2 ). 3 ). 4 ) (((aaa . daa ). da ). d ) ((((1 . 2 ). 3 ). 4 ). 5) ((((aaaa . daaa). daa). da). d)
Consistently pairing a new item left of a list forms a stream of half-pairs abdextrally, meaning the final item added is readily accessible with the car
function instead.
(2 . 1) (a . d) (3 .(2 . 1 )) (a .(ad . dd)) (4 .(3 .(2 . 1 ))) (a .(ad .(add . ddd))) (5 .(4 .(3 .(2 . 1 )))) (a .(ad .(add .(addd . dddd))))
A half-paired list of n items bypasses most its potential of 2^(n-1) items. For example, a 10 item half-paired list has 9 pairings wherewith it has 2^9 or 512 total possible positions. However, its other 502 locations are open for potential expansion.
Perhaps meaningfully pair each current item with an additional shorter half-paired stream or a chunk of pairs of pairs. Similarly for the 256 potential positions in the other half, perhaps as complementary information.
A space separated dot before a parenthetical list, t.i. the dextral half, can be abbreviated by removing both that prior dot and the parentheses for that next list. Notably, the Lisp interpreter favors this abbreviation for the dextral half, such as in abdextrally half-paired lists, when printing Lisp forms in messages.
(a .(ad .(add .(addd . dddd)))) == (a ad .(add .(addd . dddd))) == (a ad add .(addd . dddd)) == (a ad add addd . dddd) Or: (a .(ad .(add .(addd . dddd)))) == (a .(ad .(add addd . dddd ))) == (a .(ad add addd . dddd )) == (a ad add addd . dddd )
One way of reversing that abbreviated notation is by pairing items from left to right, t.i. explicit dotted-pair notation of the car with the cdr.
(a ad add addd . dddd) == (a .(ad add addd . dddd)) == (a .(ad .(add addd . dddd))) == (a .(ad .(add .(addd . dddd))))
In other words, two items in a list without a dot between them means everything on the right half is actually another list. A Lisp list is truly a pair.
A list with nil as its dextral half, an empty list (Lisp and NIL), has only its abdextral half to show for itself.
(a . nil)
== (a .())
== (a)
(a ad . nil
)
== (a ad .())
== (a ad)
== (a .(ad))
== (a .(ad .()))
== (a .(ad . nil))
A Lisp function is used in an abdextrally half-paired list with the function name conveniently as the outermost abdexter. This also fits well with typing text from left-to-right, but that is contrary to the natural leftward formation of abdextrally half-paired lists.
(setf
abbi-list (cons
3 nil)) -> (3) (setf
abbi-list (cons
2 abbi-list)) -> (2 3) (setf
abbi-list (cons
1 abbi-list)) -> (1 2 3) (setf
abbi-list (cons
'
+ abbi-list)) -> (+ 1 2 3) (eval
abbi-list) -> 6 abbi-list -> (+ 1 2 3)
Contrary formation either dextrally or abdextrally is simple with setf
(An intro for Lisp) by pairing the new content with the innermost item.
(setf
dex-list'
((2 . 3). 4)) -> ((2 . 3). 4) (setf
(caar
dex-list) (cons
1 (caar
dex-list))) -> (1 . 2) dex-list -> (((1 . 2). 3). 4)
A list as a Lisp instruction, such as for a Lisp function, is an abdextrally half-paired list that started with nil as its dextral half. That nil is the innermost item of the list. Simply substitute it with a pairing of the desired content and nil for maintaining that integrity.
(setf
do-it-later (quote
(setf one 1 . nil))) -> (SETF ONE 1) (setf
(cdddr
do-it-later) (cons
'
two nil)) -> (TWO) do-it-later -> (SETF ONE 1 TWO) (setf
(cddddr
do-it-later) (cons
2 nil)) -> (2) do-it-later -> (SETF ONE 1 TWO 2) (setf
(cdr
(cddddr
do-it-later)) (cons
'
three (cons
3 nil))) -> (three 3) do-it-later -> (SETF ONE 1 TWO 2 THREE 3) == (SETF ONE 1 TWO 2 THREE 3 . nil)
Unwinding an abdextrally half-paired list (Exploring a half-paired list) exposes the middle items, and eventually the innermost item.
(setf
later.too (quote
(setf one 1 . nil))) -> (SETF ONE 1) (setf
later.too (cons
(cons
(cADr
later.too) (cAr
later.too)) (cDDr
later.too))) -> ((ONE . SETF) 1) Once more... -> ((1 ONE . SETF)) (setf
(car
later.too) (cons
'
two (car
later.too))) -> (TWO 1 ONE . SETF) later.too -> ((TWO 1 ONE . SETF)) (setf
(cdr
later.too)'
(2 three 3 . nil)) -> (2 THREE 3) later.too -> ((TWO 1 ONE . SETF) 2 THREE 3) (setf
later.too (cons
(cDAr
later.too) (cons
(cAAr
later.too) (cDr
later.too)))) -> ((1 ONE . SETF) TWO 2 THREE 3) Twice more... -> (SETF ONE 1 TWO 2 THREE 3)
A Lisp list is constructed as a pair with cons
, and the car
and cdr
reference its left and right halves (Lisp lists are pairs). This provides an opportunity for pairs of pairs, as well as sequentially formed (t.i. half-paired) lists either abdextrally or dextrally.
Multiple pairs of pairs exponentially increase the potential storage of items: 2 from one pair, 2*2 from two, 2*2*2 from three, 2*2*2*2 from four, and so forth. Therein, an item is efficiently accessed by halving.
Positionally reference one half the list, either left or right, for each pairing: once for any item of 2, twice for any item of 2*2, thrice for any item of 2*2*2, and so forth.
Abbreviated functions consolidate two, three, or four car
and cdr
references, f.e. cadddr
or cddddr
. Access any of 2^4 or 16 halves with a single function, or any of 2^(4+4) or 256 items with two functions, or any of 2^(4+4+4) or 4096 with three functions, and so forth.
A pair is 2 items, a pair of pairs is 4 items, a pair of pairs of pairs is 8 items, and so forth exponentially. An item in an exponentially paired list is referenced by gradually halving the list towards its position and noting each half leading to it.
The sequence of bisecting directions from outside to inside is also a binary description, thereby a binary number for each item. Assigning "left" as 0 and "right" as 1 reveals the sequence of binary digits for each item.
However, the abdextrally half-pairing of Lisp instructions leads to an inside-out consolidated reference. The binary digits are reversed as least to greatest for each number. This has no effect for percieving the sequence, only for interpreting the number.
Paired once: 2^1 = 2 itemscar cdr
(a . d) 0 1 Paired twice: 2^2 = 4 itemscaar cdar cadr cddr
((aa . da) . (ad . dd)) 00 10 01 11 0 1 2 3 Paired thrice: 2^3 = 8 itemscaaar cdaar cadar cddar caadr cdadr caddr cdddr
(((aaa . daa) . (ada . dda)) . ((aad . dad) . (add . ddd))) 000 100 010 110 001 101 011 111 0 1 2 3 4 5 6 7
The numbers sequentially increase from left to right starting from zero, the equivalent of the rightward displacement of each item from the left end. The first item from the left has 0 items before it so skip zero items, the second item from the left has 1 item before it so skip one item, and so forth.
Therefore, the consecutive references with car
and cdr
describing the traversal from inside to outside for an item is equivalently the reversed binary digits for the rightward displacement of an item.
Access an item by noting its perceived sequential displacement as a reversed binary number. It has the same number of digits as the number of times an item is paired within the list, or the number of parentheses at the beginning or ending of the list.
For example, each item in a list of 16 items is paired four times (2 * 2 * 2 * 2 = 16), so consider the binary number for a position as four digits. The sixth item is displaced by 5 others, 5 is #b
0101, reversed is 1010: use cDADAr
.
Recall, only one function is needed for referencing any of 16 halves, two functions for any of 2^(4+4) or 256, three for any of 2^(4+4+4) or 4096, and so forth. For example, the cDAAr
of the cDADAr
is the 42nd item of 128 (t.i. 2^7), but so is the cDAADr
of cADAr
, because it is the "daadada". (But, within 64 items the 42nd is only "daadad".)
Consider using the Lisp interpreter for revealing binary numbers. The format
(CLHS) prints a number as binary with ~b
(CLHS 22.3.2.3). Or, also give the number of desired digits and a zero (preceded by an apostrophe ') (CLHS 22.3.2.1) for padding empty places. Then use the reverse
(CLHS).
(format
nil "~b" 41) -> "101001" (format
nil "~7b" 41) -> " 101001" (format
nil "~7,'0b" 41) -> "0101001" (reverse
(format
nil "~7,'0b" 41)) -> "1001010" Hence: daadada
A half-paired list is a singular item paired with another list, perhaps by first pairing with an empty list, t.i. nil. Access the singular item of an abdextrally half-paired list with car
, or of a dextrally half-paired list with cdr
.
A consistently half-paired list is continuously deconstructable by referencing its inner list, with cdr
for an abdextrally half-paired list or car
for an dextrally half-paired list. Setting aside the singular items by constructing a new half-paired list opportunes reconstruction of the original list.
(setf
dexi nil abbi'
(1 .(2 .(3 .(4 . nil))))) Dextrally cons De-cons the a half-paired list. abdextrally half-paired list. (cons
dexi (car
abbi)) (cdr
abbi) (nil . 1) (2 .(3 .(4 . nil))) | |cdr car
The foremost item of the inspected half-paired list is set aside as the former middle item. The inspected half-paired list is then deconstructed to its inner list, thereby exposing the next middle item.
Gradual unwinding exposes the middle items of the inspected list consistently with cdr
or car
from either replacement list. Pairing both lists into a new list would maintain that point of introspection. The order of the pairing is only a matter of preference because both halves are equally accessible.
#7.2.2.1 Dexi-abbi introspection.
Consider constructing dextrally half-paired lists from items of an abdextrally half-paired list while deconstructing it. Forming the dextrally half-paired list in the abdextral half maintains the visual appearance of the sequence order when printed.
(setf
coil'
(1 .(2 .(3 . 4)))) -> (1 2 3 . 4) Introspection: (setf
coil (cons
(cons
(cAr
coil) (cADr
coil)) (cDDr
coil)))cADr
| (1 .(2 .(3 . 4))) | -> ((1 . 2).(3 . 4)) | -> (((1 . 2). 3). 4) |cDAr
Reversal: (setf
coil (cons
(cAAr
coil) (cons
(cDAr
coil) (cDr
coil)))) Default Lisp printer: (((1 . 2). 3). 4) == (((1 . 2) . 3) . 4) -> ((1 . 2).(3 . 4)) == ((1 . 2) 3 . 4) -> (1 .(2 .(3 . 4))) == (1 2 3 . 4)
#7.2.2.2 Abbi-abbi introspection.
A Lisp instruction is an abdextrally half-paired list that began with nil (Contrary formation and Lisp instructions). The Lisp printer favors the abbreviation for when a list is the dextral half of a pair (Abbreviated notation for a dextral half).
Consider constructing abdextrally half-paired lists from items of another abdextrally half-paired list (f.e. a Lisp instruction) while deconstructing it. A pair of abdextrally half-paired lists is printed more compactly than with a dextrally half-paired list (Dexi-abbi introspection).
(setf
abbi-abbi (cons
nil'
(1 2 3 4 . nil))) -> (NIL 1 2 3 4) Introspection: (setf
abbi-abbi (cons
(cons
(cADr
abbi-abbi) (cAr
abbi-abbi)) (cDDr
abbi-abbi)))cAAr cADr
Lisp printer: | | (nil . (1 2 3 4 . nil)) == (NIL 1 2 3 4) -> ((1 . nil) . (2 3 4 . nil)) == ((1) 2 3 4) -> ((2 1 . nil) . (3 4 . nil)) == ((2 1) 3 4) -> ((3 2 1 . nil) . (4 . nil)) == ((3 2 1) 4) -> ((4 3 2 1 . nil) . nil) == ((4 3 2 1)) Reversal: (setf
abbi-abbi (cons
(cDAr
abbi-abbi) (cons
(cAAr
abbi-abbi) (cDr
abbi-abbi))))
Of course, there was no need for prepending nil other than for slightly more compact printing. Without it, the reversal of the introspection results in the original abdextrally half-paired list without further ado.
Alternatively, reversal of an abbi-abbi introspection is as convenient as re-pairing the cdr
with the car
, then using the exact same introspection. Afterwards, the original first item is the cdr
, so re-pair them once again.
(setf
abbi-abbi (cons
(cdr
abbi-abbi) (car
abbi-abbi)))
[ ...describe using introspection for gradually constructing a Lisp form (which is an abdextrally half-paired list that began with nil). Also consider revising the examples in StumpWM section, promoting defining buttons for introspecting forwards and backwards, which now makes it easier to append to the innermost contrary position of a half-paired list (Contrary formation and Lisp instructions) with just cdr
after unwinding the list all the way to nil... ]
Consider associating each instruction to a button on the buttonboard (Introspect a referenced half-paired list), one for the next list item and one for the prior list item. Associate the placeholder name to another list for modifying it with introspection (Re-listing rather than re-arranging). Afterwards, rewind it completely and then set the placeholder name to nil to detach the association.
Consider copy-list
or copy-tree
.
[ ...describe including the nifty (+
1(length
(car
coil.my))) for position of introspected item for each evaluation by means of each defined key. For example, consider the cons
for pairing the introspected item (as dexter) with its position for evaluation with stumpwm:eval-line
, like when introspecting keysyms for keycodes listing (but that would be without the plus one because the keycodes were matched with the default zero indexing of arrays)... ]
[ ...need to revise... ...trying to get across the notion of referencing memory and clarify how to ensure duplication when desired... ...referring to something in memory actually means referring to the memory itself... ...changing what is in the memory means whatever referred to the memory also refers to whatever happened to the memory... ...working on a copy requires duplicating what is in memory rather than referencing the memory... ...named memory is a reference to memory... ...car
andcdr
reference memory... ...usingformat
with named memory results in "double-quoted text"... ...usingread-from-string
with "double-quoted text" results in a Lisp form... ...combining both results in a duplication of named memory... ...inserting text into a prompt is new or duplicated, f.e. invokingcopy-last-message
then invoking a prompt then using "Control-y"... ... ]
Realize the difference between a list of items and the items themselves, for it is the same difference between a grocery list and the groceries themselves. Similarly, the cdr
and car
call forth the references from a list, each a reference to memory for an item.
The cons
constructs a new list, and the setf
replaces a reference at a position in a list with another rather than modifying the content (An intro for Lisp with StumpWM). List items are never moved, neither within a list nor from one list to another, but instead a new list of references is made in the preferred order, thereby the same memory.
The Lisp interpreter uses the content of memory (an item), and also conveniently prints a copy of the actual item rather than the memory address. However, that obscures whether a placeholder name has the original or only a reference.
Consider preventing ambiguity by naming a placeholder with intent when using setf
.
(setf
list.1'
(one two three four)) -> (ONE TWO THREE FOUR) (setf
part.1 (cdr
list.1)) -> (TWO THREE FOUR) (setf
part.1.ref (cdr
list.1)) -> (TWO THREE FOUR) (cadr
list.1) -> TWO (setf
(cadr
list.1)'
five) -> FIVE (cadr
part.1) -> THREE (setf
(cadr
part.1)'
six) -> SIX (caddr
part.1.ref) -> FOUR (setf
(caddr
part.1.ref)'
seven) -> SEVEN list.1 -> (ONE FIVE SIX SEVEN) part.1 -> (FIVE SIX SEVEN) part.1.ref -> (FIVE SIX SEVEN);;
Consing references. (setf
list.2 (cons
list.1 part.1.ref)) -> ((ONE FIVE SIX SEVEN) FIVE SIX SEVEN);;
Setting placeholder. (setf
part.1.ref'
eight) -> EIGHT;;
Changing reference. (setf
(cdr
part.1)'
nine) -> NINE list.1 -> (ONE FIVE . NINE) part.1 -> (FIVE . NINE) part.1.ref -> EIGHT;;
No surprise, maybe. list.2 -> ((ONE FIVE . NINE) FIVE . NINE)
The format
(CLHS) results in "double-quoted text", and the read-from-string
(CLHS) results in a Lisp form from reading "double-quoted text". Combine both in order to duplicate any Lisp form, such as from named memory.
(setf
thing.1'
(cons a d)) -> (CONS A D) (setf
thing.2 (read-from-string
(format
nil "~s" thing.1))) -> (CONS A D) (setf
thing.3 (read-from-string
(format
nil "'(~s~s)" thing.1 thing.2))) -> ((CONS A D) (CONS A D))
Consider copy-list
(CLHS) to copy the structure of a list without copying the content. Consider copy-tree
(CLHS) for a list of pairs of pairs. Consider copy-seq
(CLHS). Consider concatenate
(CLHS) for an actual copy.
... ]
...extract the cADr from abbi-abbi introspection, by reference (Abbi-abbi introspection)...
(setf
abbi.extracted (cons
(cADr
abbi.inspect) abbi.extracted)) (setf
(cdr
abbi.inspect) (cddr
abbi.inspect))
...insert an extracted item as the cADr for abbi-abbi introspection, by reference...
...t.i. pair the extracted item with the cDr of the list...
(setf
(cdr
abbi.inspect) (cons
(car
abbi.extracted) (cDr
abbi.inspect))) (setf
abbi.extracted (cdr
abbi.extracted))
...name leftward introspection as "abbi<", rightward as "abbi>", and display the list with "abbi.inspect"...
...combine introspection by either "abbi<" or "abbi>" with the "abbi.inspect" for displaying the list as result after shifting the list,
then the cdr
can ensure only the list is shown, t.i. without the partial list that is returned when shifting...
(cdr
(cons
(eval
abbi>) abbi.inspect)) (cdr
(cons
(eval
abbi.extract) abbi.inspect))
Embracing items with parentheses acknowledges those items are associated with each other. Nil is an empty list, as in "nothing in list". But that also asserts "Nil Is a List" rather than nothingness itself. It has become the mnemonic name for an empty set of parentheses. nil == () =='
();
quoted Lisp form A list of one item is never notated as a list, t.i. it has no parentheses. It is written simply as the item itself, for there are no other items associated. A list of more than one item is notated as a dotted list, with a spaced separated period before its final item.'
(one two . three) A list with nil as its final item is commonly abbreviated without dotting with nil.'
(one . nil) =='
(one) A list of items without a dotted final item has visually consistent delimitation, thereby is a "proper list". But as a list without a dotted final item, a proper list is merely the abbreviated form for its items dotted with nil as the final item.'
(one) =='
(one . nil) As such, a proper list with only nil is a list with an empty list:'
(nil) =='
(()) but is also the abbreviated form for a list of items dotted with nil as its final item:'
(nil) =='
(nil . nil) which is a dotted list of two lists, or the egregious enlightenment emoticon for "I am become nil":'
(nil) =='
(() . ()) -------- Consing constructs a dotted list. (cons
'
one'
two) ->'
(one . two) Multiple consing results in the last item added becoming the first. (cons
'
three;
second cons (cons
'
one'
two));
first cons ->'
(three one . two) Consing an item with nil results in a proper list, because a proper list is the abbreviated form for its items dotted with nil as its final item. (cons
'
three;
third cons (cons
'
two;
second cons (cons
'
one nil)));
first cons ->'
(three two one . nil) =='
(three two one . ()) =='
(three two one) A proper list beginning with nil begins and ends with a list. (cons
nil'
(one)) ->'
(nil one) =='
(nil one . nil) =='
(() one . ())
defun
cons
It seems like introspection of computer processing has always been ignored by computer programmers and hardware manufacturers. Nothing made explorable, or exploration of instructions written personally is buried within what was supplied by default.
The SBCL interpreter seems about as unfriendly with its feedback as any other Lisp or shell interpreter or computer program compiler. The "restarts" and whatnot of Common Lisp seem almost completely unusable and unreliable when compared to the pause/continue/step half-baked approaches of other systems.
Despite such disheartening contrary interests, Lisp interpreters tend to be personalizable. Changes can be made, for the moment or for longer.
defun
According to the description for defun
(CLHS), there seems to be no access to the definition of a Lisp function from its results.
In particular, defun
does not make the function definition available at compile time. An implementation may choose to store information about the function for the purposes of compile-time error-checking (such as checking the number of arguments on calls), or to enable the function to be expanded inline.
Consider constructing the replacement for a function with setf
and the same name as that function (Assigning to named memory from collections). The instruction can be modified later and re-evaluated to replace again.
Describe Function: stumpwm::print-key
function:print-key
(print-key
key)
Eval: stumpwm::print-key
The variable STUMPWM::PRINT-KEY is unbound.Backtrace...
Eval: (setf
stumpwm::print-key'
(defun stumpwm::print-key ...yadda yadda yadda...))
Eval: (eval
stumpwm::print-key)
STUMPWM::PRINT-KEY
Consider pairing the original definition of the function with the replacement, for restoring either one as neeeded.
Eval: (setf
stumpwm::print-key (cons
stumpwm::print-key nil))
Eval: (setf
stumpwm::print-key (cons
'
(defun stumpwm::print-key ...yoda yoda yoda...) stumpwm::print-key))
Consider pairing a description with each version to identify which is the replacement.
Eval: (setf
(car
stumpwm::print-key) (cons
"original" (car
stumpwm::print-key)))
Eval: (setf
(cdr
stumpwm::print-key) (cons
"replacement" (cdr
stumpwm::print-key)))
[ ...describe (or revise and reference section Reading and writing to external memory) about writing to external storage for later re-use ... ]
cons
The cons
(CLHS) constructs a list of two items (Dexter and abdexter) regardless of whether either item is nil (Lisp and NIL), yet it requires both items are specified. Consider making both items optional, wherewith each item defaults to nil.
The COMMON-LISP package might be locked by default in SBCL (SBCL 12.1.1 Package Locks). Consider temporarily unlocking it with sb-ext:unlock-package
(SBCL 12.2) in order to redefine the cons
name with defun
(CLHS), or pick a different name than "cons".
Eval: (defun
cons (&optional Fabdexter Fdexter) (cl:cons
Fabdexter Fdexter))
Lock on package COMMON-LISP violated when setting fdefinition of CONS while in package STUMPWM-USER. See also: The SBCL Manual, Node "Package Locks" The ANSI Standard, Section 11.1.2.1.2Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {0123456789}> 0: (STUMPWM::BACKTRACE-STRING) ...
Eval: (sb-ext:unlock-package
'
cl)
T
Eval: (defun
cons (&optional Fabdexter Fdexter) (cl:cons
Fabdexter Fdexter))
CONS
Eval: (sb-ext:lock-package
'
cl)
T
Beginning the construction of an abdextrally half-paired list with nil for a Lisp instruction matches with the abbreviated results themselves. No more typing for nothing.
(setf
abbi-list (cons
3)) -> (3) == (3 . NIL) (cons
) -> (NIL) == (NIL .()) == (NIL . NIL)
eval-line
;
naming memory ;
Lisp instructions ;
excitement with boring errors ;
the ":" in names ;
multiple instructions as one
quote
; cons
; car
; cdr
; eval
; setf
send-escape
;
change the button
stumpwm:eval-line
;
"Backtrace..." on a new line ;
secret passage to
stumpwm:*input-map* ;
more characters with
Mode_switch
[ ...this is supposed to sound comfortable and nice... ...but it seems like the initial observations are pointing out inconveniences of the typical marketed computer... ...trying to think of some phrases for familiar experiences of the everyday person with a computer that sound comfortable... ...might still be feeling a little bit jaded by the dead-end products of computer companies... ...*sigh* or maybe a lot... ...need a break... ]
...as the computer is currently known...as a mere appliance instead of an ingredient...
The manual for "Might and Magic VI: the Mandate of Heaven" (1998) more inspiringly refers to the computer "mouse" as the "Rodent of Parc [ Palo Alto Research Center, Palo Alto, California ] " on page 17 (GOG.com: "Might and Magic 6-pack: Limited Edition"). However, it is a box for positioning the pointer drawn on the computer monitor, a motion remote control.
The observational term "pointer box" might have inspired a "pointer stick" to emerge for touchscreen computer monitors prior the turn of the century, a long light-weight stylus much like using a pointer for a chalkboard. Instead, rodents are still marketed and shipped with computers two decades beyond the century mark.
^reference[ ...relate prior section about familiar ways of the computer with the means of StumpWM... ...probably need to complete that section first... ...this is introductory rather than promotion... ...how to relate and realize there is really nothing new to learn... ]
...merely view management (StumpWM)...
...plus a means for instructing the computer instead of programming it (Lisp)...
...sort of like jotting down a quick
grocery list (a couple of instructions)
for the computer to do,
instead of writing a book (a program)...
commands
command...
copy-last-message
;
*x-selection*
StumpWM provides various prompts for typing computer instructions, or the name of a StumpWM command, or for help.
Call forth a specific prompt by invisibly typing the abbreviated button sequence for it, f.e. "Control-t :" for the "Eval: " prompt. Use the Control button in the same manner as the Shift button, t.i. hold the Control button before typing a letter (skip the hyphen), then afterwards let go of it.
Or, visibly type the command name for a prompt at the ": " prompt (Invoke a StumpWM command by its name).
Move the text cursor anywhere within the single line of text as needed (Typing within a line of text). Type the Return button or Enter button to complete the invocation, regardless of where the text cursor is located. Or, type the ESC button to escape from the prompt without invoking.
Consider assigning a single button for any commonly invoked prompt (Make a StumpWM keymap and pair a button).
Invoke a command by visibly typing its name and then typing either the Enter button or the Return button. While typing, a list of command names beginning with those letters are immediately shown below the prompt.
Type the TAB button to choose the name at the top of the list and the list is hidden. Type the TAB button to cycle through the other hidden choices, or hold the Shift button and type the TAB button to cycle in reverse.
List all commands with the commands
command.
Invoke a StumpWM command by its name.
:
"Control-t ;" (a semi-colon)
colon
A couple of related prompts help with learning about commands, or discovering a button name and its assigned command. Consider a more convenient button for the set of Help commands (StumpWM keymap: *help-map*).
Type the name of a StumpWM command for its description.
Describe Command:
"Control-t h c"
describe-command
Type the name of a StumpWM command for a list of the buttons paired to it (Find commands and buttons).
Where is command:
"Control-t h w"
where-is
Type a button or button sequence for a description of the command or Lisp instruction assigned to a it, and reveal the actual button names (Find commands and buttons).
Describe Key:
"Control-t h k"
describe-key
Type the name of a program to start it. While typing, a list of program names beginning with those letters are shown below the prompt.
Type the TAB button to choose the name at the top of the list and the list is hidden. Type the TAB button to cycle through the other hidden choices, or hold the Shift button and type the TAB button to cycle in reverse.
Type the name of a program to start it.
/bin/sh -c
"Control-t !"
exec
Starting a program displaces the current document or program from the current frame (or full screen). The prior program or document is only hidden. Consider commands for switching to a hidden program, or splitting the screen (Essential split-view commands).
Note this is an alias for run-shell-command
which actually accepts a "shell command", a computer instruction for the operating system rather than StumpWM. Thereby, the results for a shell command (instead of a program name) will appear in the console whence StumpWM was started, rather than with the StumpWM messages.
Change the appearance of the prompts and messages (Customize prompts and messages). Pair a button on the buttonboard with a StumpWM command or a custom Lisp instruction (Customize the buttonboard). Place the pointer anywhere on the screen and select with it, and without using the pointer-box (Pointer placement and activation).
Numbers and "double-quoted text" are the most basic forms of Lisp, and parentheses embrace items for a Lisp list. There are about a half-dozen Lisp instructions for naming memory, referencing an item in a list, and constructing or re-listing a list (An intro for Lisp).
Compose a line of instruction with Lisp (The Lisp instruction prompt: an outlet for ingenuity).
Eval:
"Control-t :" (a colon)
eval-line
A couple of related prompts help with learning about or verifying named memory, or names for Lisp instructions. Consider a more convenient button for the set of Help commands (StumpWM keymap: *help-map*).
Type a known name for memory, t.i. a Lisp symbol or variable.
Describe Variable:
"Control-t h v"
describe-variable
Type the name of a Lisp instruction or function for its description.
Describe Function:
Might have same name as named memory.
describe-function
The stumpwm:*input-map* keymap displaces the *top-map* while typing in a prompt (StumpWM 4.2 Using the Input Bar).
After typing text within a prompt, the left/right arrow buttons move the text cursor within the line of text.
The up/down arrow buttons bring forth prior/later typed text for editing and re-using, thereby less re-typing.
Type the Return button or Enter button to complete the invocation, regardless of where the text cursor is located within the line of text. Or, type the ESC button to escape from the prompt without invoking.
Other button sequences for moving the text cursor are described with "C-" for the Control button and "M-" for the Meta button (StumpWM 4.2 Using the Input Bar), and are similar to the text editing commands in the prompts of Emacs (GNU). The Alt button is usually the substitute for the Meta button.
Either the Home button or "Control-a" moves the text cursor to the beginning of the line. Either the End button or "Control-e" moves the text cursor to the end of the line.
Either "Meta-f" or "Alt-f" moves the text cursor forward one word, and "Meta-b" or "Alt-b" moves the text cursor backward one word.
The stumpwm:*input-map* keymap has no button for listing the command abbreviations for editing text in a prompt. Either consult the manual for the full listing (StumpWM 4.2 Using the Input Bar), or consider enabling the listing (The button list for text editing).
Prefix: F12
DEL INPUT-DELETE-BACKWARD-CHAR
M-DEL INPUT-BACKWARD-KILL-WORD
C-d INPUT-DELETE-FORWARD-CHAR
M-d INPUT-FORWARD-KILL-WORD
Delete INPUT-DELETE-FORWARD-CHAR
C-f INPUT-FORWARD-CHAR
Right INPUT-FORWARD-CHAR
M-f INPUT-FORWARD-WORD
C-b INPUT-BACKWARD-CHAR
Left INPUT-BACKWARD-CHAR
M-b INPUT-BACKWARD-WORD
C-a INPUT-MOVE-BEGINNING-OF-LINE
Home INPUT-MOVE-BEGINNING-OF-LINE
C-e INPUT-MOVE-END-OF-LINE
End INPUT-MOVE-END-OF-LINE
C-k INPUT-KILL-LINE
C-u INPUT-KILL-TO-BEGINNING
C-p INPUT-HISTORY-BACK
Up INPUT-HISTORY-BACK
C-n INPUT-HISTORY-FORWARD
Down INPUT-HISTORY-FORWARD
RET INPUT-SUBMIT
C-g INPUT-ABORT
ESC INPUT-ABORT
C-y INPUT-YANK-SELECTION
C-Y INPUT-YANK-CLIPBOARD
TAB INPUT-COMPLETE-FORWARD
ISO_LEFT_TAB INPUT-COMPLETE-BACKWARD
All else INPUT-SELF-INSERT
The full listing reveals many duplicates, but they can be unassigned by re-defining a button to nil (Make a StumpWM keymap and pair a button). There is a sort of mysterious command stumpwm:input-yank-clipboard
(Insert text into a prompt) invoked with "Control-Y" (a capital y, t.i. Shift-y), as it seems to be undocumented in the manual.
Peculiarly, pairing a button with an existing input command for the stumpwm:*input-map* keymap requires using the quote
for the command name instead of double-quoting it. That is because the input "commands" are actually just functions, defined with defun
rather than stumpwm:defcommand
(StumpWM version 1.0.1, "input.lisp").
Any new function for the stumpwm:*input-map* must be defined with defun
to accept two Lisp forms: a reference to the current prompt, and the button that invoked the command (StumpWM 4.4 Programming the Input Bar). Most input functions never use the button itself, but they must still be able to receive it.
As a StumpWM keymap, the stumpwm:*input-map* itself can be assigned to a button (StumpWM keymap: *help-map*).
: describe-key
F12 is not bound.
Eval: (define-key
*top-map* (kbd
"F12")'
*input-map*)
While the commands are obviously useless outside of a prompt, typing its newly assigned button followed by a question mark "?" could reveal the button list with no need for the manual (Make a StumpWM keymap and pair a button). Instead, a boring error excitingly appears (Named, memory, Lisp instructions, and errors).
StumpWM Crashed With An Unhandled Error!
Copy the error to the clipboard with the 'copy-unhandled-error' command.
The value
T
is not of type
STUMPWM::KEY
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {0123456789}>
0: (STUMPWM::PRINT-MODS T)
1: (STUMPWM::PRINT-KEY T)
2: (STUMPWM::DISPLAY-BINDINGS-FOR-KEYMAPS ...)
...
Consider replacing stumpwm::print-key
with a minor modification (Replacement for stumpwm::print-key
).
The default abbreviations "Control-y" and "Control-Y" are for inserting text at a prompt, from the :primary and :clipboard of the stumpwm:*x-selection* (The button list for text editing). As "double-quoted text", each can be partial Lisp forms.
The term "yank" (copy from storage and insert into the text) is complementary to "kill" (extract from the text and put into storage), an ancient capitulation [ Long, long ago in another century, the first letter of other terms were already being used for other Emacs commands. ] familiarized in Emacs (Emacs 12. Killing and moving text).
Initially, the stumpwm:*x-selection* starts as only nil. Eventually, it might have :primary or :clipboard.
Eval: *x-selection*
NIL
The stumpwm:input-yank-selection
inserts into the prompt a copy of whatever is listed immediately after :primary within *x-selection*. The stumpwm:input-yank-clipboard
inserts a copy of whatever is listed immediately after :clipboard.
# Extract part of the line in a prompt
Invoking either stumpwm:input-kill-line
with "Control-k" or stumpwm:input-kill-to-beginning
with "Control-u" will add what is removed from the prompt into stumpwm:*x-selection* immediately after :primary as "double-quoted text".
Eval: *x-selection*
(:PRIMARY "(cons 'something 'from-prompt)")
The stumpwm:input-kill-line
extracts rightwardly, starting at the text cursor until the end of the line. The stumpwm:input-kill-to-beginning
extracts leftwardly, starting at the text cursor until the beginning of the line.
As such, the description for stumpwm:input-kill-to-beginning
as "Control-u" is incorrect (StumpWM 4.2 Using the Input Bar).
C-u
Kill to the beginning of the line (kill-to-beginning), the same as C-a C-k.
The "C-a" invokes input-move-beginning-of-line
, which moves the text cursor to the beginning of the line. Invoking stumpwm:input-kill-line
with "C-k" afterwards extracts to the end of line, therefore the whole line rather than only from the text cursor to the beginning of line.
The commands input-backward-kill-word
as "M-DEL" [ Hold the Meta modifier button (often the same as the Alt button), then type the delete button. ] and input-backward-kill-word
as "M-d" are misnomered (The button list for text editing). They delete rather than extract from the prompt. The *x-selection* remains unchanged, and the deleted text is lost.
# Copy the last message
...the copy-last-message
command...then yank into the prompt...
# Set stumpwm:*x-selection* directly
Consider using setf
(An intro for Lisp) to replace the "double-quoted text" in stumpwm:*x-selection*.
Eval: (setf
(cadr
*x-selection*) "'(the-first-part of-something")
Eval: *x-selection*
(:PRIMARY "'(the-first-part of-something")
Similarly, the stumpwm:input-yank-clipboard
accesses the info after :clipboard within the stumpwm:*x-selection*. When :clipboard is missing, just add it along with the new "double-quoted text".
Eval: (setf
(cddr
*x-selection*)'
(:clipboard " the-last-part)"))
Eval: *x-selection*
(:PRIMARY "'(the-first-part of-something" :CLIPBOARD " the-last-part)")
Eval: (setf
(cadddr
*x-selection*) " the-sequel)"))
Eval:
StumpWM provides the Lisp instruction prompt "Eval: " by means of "Control-t :" for evaluating a single line of Lisp instruction after the Return button or Enter button is typed (Compose a line of instruction).
Numbers and "double-quoted text" essentially remain the same. Named memory is referenced for its content. A Lisp list is evaluated as an instruction.
Using quote
for named memory prevents referencing the memory at that moment. Using quote
for a Lisp list prevents evaluation of it as an instruction at that moment. There are about a half dozen essential Lisp instructions (An intro for Lisp).
The setf
(An intro for Lisp) associates a name with a memory location in the computer, and anything can be stored in that memory. A Lisp instruction is a pair of parentheses with the instruction name as the leftmost list item.
Type a name to find out whether there is information associated with it yet, or type a Lisp instruction for the computer. A message with successful results appears on the screen for a few seconds, and then conveniently disappears.
Eval: stumpwm:*input-window-gravity*
:TOP-LEFT
Eval: (setf
stumpwm:*input-window-gravity* :center)
:CENTER
The delay is the number of seconds set in stumpwm:*timeout-wait* (StumpWM 4.1). However, it can also be paused by typing the button for a keymap prefix, such as the stumpwm::*escape-key* button, because StumpWM is waiting for the remainder of the sequence (Make a StumpWM keymap and pair a button). Finish typing the sequence and the message will likely be removed as the next command is invoked.
Otherwise, when the name has yet to be set or the Lisp instruction is mistyped, a boring description of an error will excitingly appear and stay visible.
Forever.
Almost. The error message will disappear when the next StumpWM command is invoked (Remove the message from the screen), f.e. when invoking the prompt again.
Eval: something
The variable SOMETHING is unbound.Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING> {1234567890}>
0: (STUMPWM::BACKTRACE-STRING) 1: (ERR "~A" #<UNBOUND-VARIABLE SOMETHING {2345678901}>) 2: (EVAL-LINE "something") 3: (STUMPWM::CALL-INTERACTIVELY "eval" #S(STUMPWM::ARGUMENT-LINE :STRING "eval" :START 5)) 4: (STUMPWM::EVAL-COMMAND "eval" T) 5: ((LAMBDA (&REST #:GO &KEY :CODE :STATE &ALLOW-OTHER-KEYS) :IN "/tmp/stumpwm-20.11/events.lisp") :CODE 66 :STATE 0) 6: (STUMPWM::HANDLE-EVENT :DISPLAY #<XLIB:DISPLAY :0 (The X.Org Foundation R12008000)> ...)
[ ...Pretty much the same hereafter for every error message, except maybe different line counting. Usually only terribly important, hence perfectly ignorable... ]
17: (STUMPWM ":0") 18: ((LAMBDA NIL :IN "/tmp/stumpwm-20.11/make-image.lisp")) 19: ((FLET SB-UNIX::BODY :IN SB-IMPL::START-LISP)) 20: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-IMPL::START-LISP)) 21: (SB-IMPL::START-LISP)
The very top line above line count zero is probably the most revealing, and probably enough to realize why the error happened.
The "Backtrace" is abruptly tacked onto the end of the first line, but can be made to start on a newline if desired (Replacement for stumpwm:err
).
That "Backtrace" bores into the processing depths of the Lisp interpreter. Likely only about the first half-dozen lines of the error, line count zero through maybe five or so, will be relevant.
Afterwards is essentially the same for every error message. The middle reveals the constant looping that waits for typed buttons, the core of StumpWM. The very end is actually how the StumpWM program itself began, as a "Lisp image".
Consider trying again with the Lisp instruction prompt "Control-t :", then using the up arrow button to show the previous typed line, and then editing it to get a different result (Typing within a line of text).
With Common Lisp, both a function from defun
(CLHS) and any other Lisp form from setf
(CLHS) can be associated with the same symbol, t.i. named memory, at the same time. Consider this as a convenience when replacing functions (An introspective approach for defun
).
The pecularity of packages in Common Lisp means extra care is needed when querying named memory for ascertaining prior use of a name, especially with the misleading feedback from symbol-package
and the package locks of SBCL.
Eval: (symbol-package
'
print-key)
#<PACKAGE "STUMPWM-USER">
Eval: print-key
The variable PRINT-KEY is unbound.Backtrace...
Eval: (setf
print-key'
(something))
(SOMETHING)
Eval: print-key
(SOMETHING)
Query the named memory with its known package name and two colons "::" just to be sure. Consider "Control-t h f" for stumpwm:describe-function
(StumpWM keymap: *help-map*).
Eval: stumpwm:print-key
The symbol "PRINT-KEY" is not external in the STUMPWM package. Stream: #<dynamic-extent STRING-INPUT-STREAM (unavailable) from "stumpwm:...">Backtrace...
Eval: stumpwm::print-key
The variable STUMPWM::PRINT-KEY is unbound.Backtrace...
Describe Function: print-key
The symbol STUMPWM-USER::PRINT-KEY is not bound to any function.
Describe Function: stumpwm::print-key
function:print-key
(print-key
key)
An error message claiming a (known) name is undefined is a clue that the collection name is needed.
Eval: (global-pointer-position
stumpwm:*display*)
The function STUMPWM-USER::GLOBAL-POINTER-POSITION is undefined.Backtrace...
Friendlier feedback is given by "Control-t h f" for stumpwm:describe-function
for querying about a instruction name, or "Control-t h v" for stumpwm:describe-variable
for querying about a placeholder name (StumpWM keymap: *help-map*). Though their responses never reveal the package name, they do confirm or deny the existence of a name in a package.
Describe Function: stumpwm:global-pointer-position
No such symbol: STUMPWM::GLOBAL-POINTER-POSITION.
Describe Function: xlib:global-pointer-position
function:global-pointer-position
(global-pointer-position
DISPLAY)
Eval: (xlib:global-pointer-position
stumpwm:*display*)
1050 787 #<XLIB:WINDOW :0 389>
Describe Variable: stumpwm:*display*
variable: *DISPLAY* The display for the X server Its value is: #<DISPLAY :0 (The X.Org Foundation R12008000)>.
Eval: (xlib:global-pointer-position
*display*)
1050 787 #<XLIB:WINDOW :0 389>
The feedback from the function or variable queries is a little misleading. It might print two colons when declaring the name as undefined, even when only one colon was used during a query.
Otherwise, consider trying another query with two colons whenever it says it did try only one colon and failed to find anything. Also, a successful message leaves off the collection name even when it is required.
Many StumpWM names for placeholders or Lisp instructions have no need for the "stumpwm:" collection name, f.e. *top-map* or define-key
. Try it and find out. However, the collection name does make obvious where to personally seek documentation.
When the collection name is required, sometimes an extra colon is also needed, f.e. stumpwm::read-key
. That is usually because the placeholder or Lisp instruction is probably unintended for common use. The documentation for it is likely in the source file, if at all.
The StumpWM names for placeholders usually include an asterisk "*" before and after the name, f.e. stumpwm:*top-map*. That is only a convention when creating a placeholder with the defvar
(CLHS). (The intended effect of defvar
is essentially useless from the Lisp instruction prompt, its intended use is for within files.) Consider a different approach for new names, distinctive for certainty.
Only one Lisp form is evaluated by stumpwm:eval-line
, either at its prompt or given to it as a command for a button. Later forms on the line are simply ignored by it.
The cons
pairs the results of two Lisp forms. The format
(CLHS) constructs "double-quoted text", typically from the evaluation results of any number of Lisp forms.
# Two instructions at once.
Consider using cons
for pairing two instructions for evaluation by eval-line
.
For example, define a button on the buttonboard to press and release the primary button for the pointer (Alternative for pointer activation and drag'n drop).
Eval: (setf
press.1'
(xlib/xtest:fake-button-event *display* 1 t))
Eval: (setf
release.1'
(xlib/xtest:fake-button-event *display* 1 nil))
: describe-key
F10 is not bound.
Eval: (define-key
*top-map* (kbd
"F10") "eval-line (cons (eval press.1) (eval release.1))")
# Multiple instructions at once.
The format
(CLHS) is a way of having the computer write the results of any number of Lisp instructions, and formatted with additional text described within double-quotes. No additional text is required, and in fact an empty set of double-quotes is fine.
Consider using format
for combining multiple instructions for evaluation by eval-line
. Consider storing the format
instruction to avoid the conflict of its double-quotes within the double-quotes for define-key
.
For example, place the pointer at a specific location on the screen with xlib:warp-pointer
(Alternative for pointer placement), then press and release the primary button for it.
Eval: do-point.a
The variable DO-POINT.A is unbound.Backtrace...
Eval: (setf
do-point.a'
(format nil "" (eval point.a) (eval press.1) (eval release.1)))
: describe-key
F11 is not bound.
Eval: (define-key
*top-map* (kbd
"F11") "eval-line (eval do-point.a)")
Eval: point.a
The variable POINT.A is unbound.Backtrace...
Eval: (setf
point.a'
(xlib:warp-pointer (screen-root(current-screen)) 600 450))
Essentially, the format
begins with three parts:
format nil ""
Consider using cons
to add each part to the left end of any list of instructions.
Eval: press-release.1
The variable PRESS-RELEASE.1 is unbound.Backtrace...
Eval: (setf
press-release.1'
((eval press.1) (eval release.1)))
Eval: do-point.b
The variable DO-POINT.B is unbound.Backtrace...
Eval: (setf
do-point.b (cons
'
(eval point.b) press-release.1))
Eval: do-point.b
((EVAL POINT.B) (EVAL PRESS.1) (EVAL RELEASE.1))
Eval: (setf
do-point.b (cons
"" do-point.b))
Eval: (setf
do-point.b (cons
nil do-point.b))
Eval: (setf
do-point.b (cons
'
format do-point.b))
Eval: do-point.b
(FORMAT NIL "" (EVAL POINT.B) (EVAL PRESS.1) (EVAL RELEASE.1))
Eval: (eval
do-point.b)
Optionally, use "~s" for the result of each instruction. The "~%" provides a blank line, but StumpWM consolidates a series of blank lines into only one for its messages.
Eval: (setf
d.1'
(format nil "~s~%~s~%~s" (eval a.1) (eval b.1) (eval c.1)))
[ ...at the very least, connect the dots by outlining this, then fill it in with whatever time remains... ...ideally, connect with the core impetus of everyday life activities as a bridge to the computer medium as an occasional tool, much like a notepad of paper is occasional... ... ]
cons
: pairing in reverse ;
everything within parentheses ;
instructions within an instruction
setf
: assign a name ;
define-key
: assign a button
setf
abdexter or dexter ;
insert text from another list
cons
: pair a description ;
cons
: pair an instruction ;
setf
: re-list a list
cons
: pair a description ;
with-open-file
and pprint
with-open-file
and read
An extensible computing environment, like the Lisp image with StumpWM, can be adjusted as needed for the moment. Modify with basic instructions for the moment rather than making permanent changes.
Consider making notes on what and how to modify, perhaps on paper. Note successes, possibilities, interests, and contradictions. Group a collection of changes that have been typed in for a session, and consider saving it to an external storage device for less re-typing later.
Only the changes that have been added for the moment need consideration. Rebooting is a fresh restart, a new beginning. Instructions are restorable from external storage as needed, and retain adaptability.
As a list, any part of such a collection can be modified, or re-stored into named memory, or simply referenced in place. Any part can be evaluated, or the parts can be coordinated for applying all at once.
[ ...outline briefly various basic approaches, and link to relevant sections... ]
[ ...see "insert text from introspected list into prompt" in notepad
(also the page in notepad named "Beyond the Lisp evaluation prompt",
section beginning with stumpwm:read-one-line
,
specifically "For example, (defun insert.cadr (input key)..."),
as it is the final dot to connect
(as it obviates copy/paste, and maybe text editors),
so must prioritize and complete this before reaching final meal... ]
[ ...partial description for introspection already (Abbi-abbi introspection),
but reference the description for buttons when its description is added
(but new from notes, for assigning to stumpwm:*input-map*)... ]
Consider naming an instruction and then assigning a button to evaluate the name. In that way, the instruction can be modified later by means of its name. There also is no need to re-assign the button.
Any part of named instruction is readily modified with setf
by referencing an abdexter or a dexter within it. No need to re-assign a button to a modified instruction.
setf
.
At the core of Lisp is a paragon of lists, either empty or efficiently multi-dimensional, because Lisp is "LISt Processing".
Lists are notated parenthetically: ( ). There are also computer actions for constructing a list from a pair of items, for referencing an item in a list, and for associating a name to a list.
There are about a half-dozen important Lisp functions, t.i. named instructions.
quote
for writing a Lisp form without evaluating it.
cons
for constructing a new list from a pair of Lisp forms.
For example, (left-half . right-half) as described in Lisp lists are pairs.
car
for calling up the abdexter reference of a list, its left (abbi, or ab, or a) half.
cdr
for calling up the dexter reference of a list, its right (dexi, dex, or d) half.
eval
for requesting the Lisp interpreter to evaluate the contents of named memory or an instruction.
setf
for memorizing "double-quoted text", a number, or a list, or for replacing half of a list, t.i. its car or cdr.
An instruction for the computer is written as a parenthetical list beginning with a name for a computer action. That name is followed by any additional info needed for functioning in that manner.
Technically, a "Lisp form" is text formatted in a way that is readable by the Lisp interpreter. It can be as plain as a number, or "double-quoted text" such as for messages, or merely a name for a Lisp symbol associated with another Lisp form. It can also be a quoted symbol or list (with quote
).
"Double-quoted text."
an-unquoted-symbol
(quote
a-quoted-symbol)
or '
a-quoted-symbol
(quote
(a-quoted . lisp-list))
or '
(a-quoted . lisp-list)
Decimal system numbers can begin with a - or +. A hexadecimal number begins with #x
, then can have a - or +, then is followed by a group of 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f; capitalized is okay. A binary number begins with #b
, then can have - or +, then is followed by a group of 0 or 1.
The Lisp interpreter prints a number as a decimal number, and without a +. For example, either 12 or #x
C or #b
+1100 is shown as 12.
A calculation with a number as a fraction, f.e. 4/3 or #b100/11 or #x4/3, produces a fraction when appropriate. For example, 4/3 subtracted from 2 results in 2/3, and #b
100/11 subtracted from 2 also results in 2/3.
Basic calculations are with the +
, -
, *
, and /
Lisp functions (CLHS 12.2 The Numbers Dictionary). For example, (-
2 #b
100/11) is 2/3. Notably (/
4 3) is 4/3, but (/
4.0 3) is 1.3333334 instead. The expt
is for exponentials, f.e. 2^3 is (expt
2 3) is 8, though 2.0 results from the reverse (expt
8 1/3).
The "Eval: " prompt for Lisp instructions is from the stumpwm:eval-line
command with "Control-t :" (The Lisp instruction prompt: an outlet for ingenuity). Type the name of a Lisp symbol to reveal whether it is associated with anything, or type a Lisp instruction for the computer.
Eval: something
The variable SOMETHING is unbound.Backtrace...
Eval: (quote
something)
SOMETHING
quote
(CLHS):
Suppress immediate evaluation of a legitimate Lisp form. Commonly abbreviated to one single quote mark '
instead, especially in messages with results or feedback from the Lisp interpreter.
Though evaluation is suppresed, the quoted item is expected to be a legit Lisp form, otherwise the Lisp interpreter (SBCL) complains. A quoted legit placeholder name is acceptable even when yet to be used.
However, a colon in the middle of a placeholder name (Optional or required collection names) indicates it is from a collection and it must already exist, otherwise an error is shown.
Eval: something
The variable SOMETHING is unbound.Backtrace...
Eval: (quote
something)
SOMETHING
Eval: '
something
SOMETHING
Eval: (quote
(quote something))
'SOMETHING
Eval: (quote
cl:something)
Symbol "SOMETHING" not found in the COMMON-LISP package. Stream: #<dynamic-extent STRING-INPUT-STREAM (unavailable) from "'cl:some...">Backtrace...
cons
(CLHS):
Construct a new list by pairing two Lisp forms (Lisp lists are pairs).
Keep in mind the Lisp interpreter messages abbreviate the dextral half of a list (Abbreviated notation for the dextral half), and nil when it is the dexter because nil is treated as an empty list (Lisp and NIL: No Items in List).
Eval: (cons
"Two words." (quote
a-name))
("Two words." . A-NAME)
Eval: (cons
3'
("Two words." . a-name))
(3 "Two words." . A-NAME)
Eval: (cons
'
something nil)
(SOMETHING)
Eval: (cons
( )'
something)
(NIL . SOMETHING)
Eval: (quote
(cons 'something 'more))
(CONS 'SOMETHING 'MORE)
Eval: (quote
(something . more))
(SOMETHING . MORE)
car
(CLHS):
Call up the abdexter reference of a list, t.i. its left half.
The left half of a list is often referred to as "the car", or "the abdexter", or "the abbi". Especially for a series of list halves, t.i. sublevels of a data matrix, it is more simply spoken as "ab" or "a", or just "a" when written.
For example, in the list "((1 . 2) . (3 . 4))" the number 3 is the abdexter of the dexter, or the "ab-dex". Written briefly as the "ad" but spoken individually as "a d".
Eval: (car
(quote
((1 . 2) . (3 . 4))))
(1 . 2)
Eval: (car
(cdr
'
((1 . 2) . (3 . 4))))
3
cdr
(CLHS): [just say "c-d-r", or "dexter"]
Call up the dexter reference of a list, t.i. its right half.
The left half of a list is often referred to as "the c-d-r", or "the dexter", or "the dexi". Especially for a series of list halves, t.i. sublevels of a data matrix, it is more simply spoken as "dex" or "d", or just "d" when written.
For example, in the list "((1 . 2) . (3 . 4))" the number 2 is the dexter of the abdexter, or the "dex-ab". Written briefly as the "da" but spoken individually as "d a".
Eval: (cdr
'
((1 . 2) . (3 . 4)))
(3 . 4)
Eval: (cdr
(car
'
((1 . 2) . (3 . 4))))
2
eval
(CLHS):
Evaluating the contents of named memory will return the results. Evaluating a list quoted with quote
(or preceded with an apostrophe) requires the list is an instruction, t.i. the leftmost item is the name of a function.
Eval: '
(cons 1 2)
(CONS 1 2)
Eval: (eval
'
(cons 1 2))
(1 . 2)
Eval: (setf
later.test'
(cons 1 2))
(CONS 1 2)
Eval: later.test
(CONS 1 2)
Eval: (eval
later.test)
(1 . 2)
setf
(CLHS):
Assign the temporary memory of the Lisp interpreter.
Associate a name with "double-quoted text", a number, the evaluated results of a Lisp instruction, or a quoted Lisp instruction for later evaluation. Or, associate one of the references within a list with anything, such as setting the car
of the list.
Eval: prose
The variable PROSE is unbound.Backtrace...
Eval: (setf
prose "A list of characters." a-list'
(10 . 9))
(10 . 9)
Eval: prose
"A list of characters."
Eval: a-list
(10 . 9)
Eval: (setf
(cdr
a-list) 4)
4
Eval: a-list
(10 . 4)
Eval: (setf
do-it (quote
(setf (car a-list) 15)))
(SETF (CAR A-LIST) 15)
Eval: do-it
(SETF (CAR A-LIST) 15)
Eval: a-list
(10 . 4)
Eval: (eval
do-it)
15
Eval: a-list
(15 . 4)
Eval: do-it
(SETF (CAR A-LIST) 15)
[ ...need to revise, essentially as "Naming and writing memos"... ]
The means for associating a nickname with information on a computer has generally been obscure with the software pre-installed on it. However, a Lisp interpreter such as SBCL used by StumpWM makes it straightforward with the Common Lisp setf
macro (CLHS). Any information can be noted within the Lisp interpreter by associating a label with it.
(setf
remember "Something to remember."
a-name "And one more thing.")
Nonetheless, that, too, is obscured as Common Lisp has 978 symbols of its own, including variables, functions, and macros. For whatever reasons, many implementations of Common Lisp (such as SBCL) have implemented everything as if the Common Lisp specification was an assignment.
As aforementioned, the evaluation prompt provided by "Control-t :" in StumpWM waits for only a single line, suitable for a quick short note (The Lisp instruction prompt: an outlet for ingenuity).
Eval: (setf
a-symbol "A name is a Lisp symbol.")
"A name is a Lisp symbol."
To see the information again, simply type the name in the evaluation prompt again and type the Return button or Enter button. The name, a Lisp symbol, will be evaluated and once again a message with the result will be displayed for a few seconds, then disappear again.
Eval: a-symbol
"A name is a Lisp symbol."
As noted about Lisp and NIL, the final item in every parenthetical list is denoted by a space-separated dot, t.i. a period. The final list item is typically nil, so for brevity such lists are typed or printed without it, as mentioned in Lisp lists are pairs. Therefore, a list without a dotted final item actually does have one, and in that case it is nil.
Therefore, a straightforward way of converting a named symbol with a single item into a list for itself is pairing it with nil, and re-using its name. Notice from the message that the Lisp interpreter favors printing the abbreviated form, without the dotted nil.
Eval: remember
"Something to remember."
Eval: (setf
remember (cons
remember nil))
("Something to remember.")
Eval: remember
("Something to remember.")
Replace with a new list from the cons
function by pairing the new information with the list itself.
Eval: (setf
remember (cons
"Curiosity more than expectations." remember))
("Curiosity more than expectations." "Something to remember.")
Eval: (setf
remember (cons
a-name remember))
("And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: (setf
remember (cons
a-symbol remember))
("A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: (setf
remember (cons
"A quick note: write questions on paper." remember))
("A quick note: write questions on paper." "A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: remember
("A quick note: write questions on paper." "A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Multiple car and cdr references can be abbreviated up to four places, as mentioned in Lisp lists are pairs. For example, a reference to the car of the cdr of a list can be from the abbreviated cadr
function, t.i. the "a-d" of the list. As noted about Lisp and NIL, a list without a dotted final item actually does have one, and in that case it is nil.
Eval: (car
remember)
"A quick note: write questions on paper."
Eval: (cdr
remember)
("A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: (car
(cdr
remember))
"A name is a Lisp symbol."
Eval: (cadr
remember)
"A name is a Lisp symbol."
Eval: remember
("A quick note: write questions on paper." "A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: (cddddr
remember)
("Something to remember.")
Eval: (car
(cddddr
remember))
"Something to remember."
Eval: (cdr
(cddddr
remember))
NIL
The information is accessible only while the Lisp interpreter exists, so it will be gone after quitting StumpWM or turning off the computer. On the other hand, there are ways of removing parts of a list, and without turning off the computer.
Recall the setf
instruction can set the value for a position in a list (An intro for Lisp), t.i. either the car or the cdr of the list. That makes leaving out an item simple, which is the same as removing it.
Eval: remember
("A quick note: write questions on paper." "A name is a Lisp symbol." "And one more thing." "Curiosity more than expectations." "Something to remember.")
Eval: (car
(cdr
(cdr
remember)))
"And one more thing."
Eval: (cdr
(cdr
(cdr
remember)))
("Curiosity more than expectations." "Something to remember.")
Eval: (setf
(caddr
remember) (cdddr
remember))
("Curiosity more than expectations." "Something to remember.")
Eval: remember
("A quick note: write questions on paper." "A name is a Lisp symbol." "Curiosity more than expectations." "Something to remember.")
[ ...need to revise, probably "...Long-term storage of memos"... ]
Write information to a document in computer memory so it will be available the next time the computer is turned on (if it successfully restarts) by using with-open-file
(CLHS) along with pprint
(CLHS) for "pretty printing".
The with-open-file
instruction has a plethora of options because it uses open
(CLHS), so focus on what is desired. For example: write to a document; create the document when non-existent; append to the document when it does exist.
(with-open-file
(to-the-doc-from-WOF "/actual/name/for/document" :direction :output :if-does-not-exist :create :if-exists :append)
(pprint
"What you can do, while weeping."
to-the-doc-from-WOF))
It turns out this makes the eyes water, as it is a bit much to be typing into the Lisp interpreter every single time, and the StumpWM evaluation prompt handles only one line at a time. However, a Lisp instruction is an abdextrally half-paired list (Lisp lists are pairs).
Consider writing on paper a list of instructions for writing to a document, then noting the parts.
That list of Lisp instructions is essentially a list of three items.
The name of the function for the instruction list: with-open-file
.
A list of options for with-open-file
. First, a placeholder for when the document is opened successfully, followed by the location and document name, which is required. After those two, an option name is associated with an option, as many as needed. (Therefore, there will be an even number of list items.)
The pprint
instruction list. It prints any quoted Lisp form, such as "double-quoted text" or the results of Lisp instructions. After that is the reference to the opened file provided by the aforementioned placeholder declared in the list of options for with-open-file
.
One approach is by constructing each sublist separately using quote
(An intro for Lisp), or its abbreviated form as one single quote mark '
, to write as much as comfortably possible at the evaluation prompt. Associate a placeholder name for each with setf
.
Eval: (setf
wof-options'
(WOFdoc "/actual/name/of/doc" :direction :output :if-does-not-exist :create :if-exists :append))
(WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND)
Eval: (setf
the-printer'
(pprint "Divide and concoct." WOFdoc))
(PPRINT "Divide and concoct." WOFDOC)
A confirmation message from the Lisp interpreter prints the names of Lisp symbols with all uppercase letters. That is partially because the Lisp interpreter acknowledges only one case for letters in symbol names, and the convention of the Lisp interpreter is to reveal that by printing Lisp symbols as having uppercase letters.
Of course, that means symbol names varying only by case all reference the same symbol assigned to the same information. For example, the Common Lisp instruction names can be typed with whatever case desired and the Lisp interpreter will be fine with that, such as Format or FORMAT or fOrMat, and so on.
A Lisp instruction is an abdextrally half-paired list (Contrary formation and Lisp instructions) that begins with nil as its dexter. As it is leftwardly constructed, each additional part is the left half of the pair and the gradually forming list is always the right half.
Remember, using the up/down arrow buttons within the evaluation prompt brings forth prior/later typed text for editing and re-using, thereby less re-typing (The Lisp instruction prompt: an outlet for ingenuity).
Eval: (setf
write-to-doc-recipe (cons
the-printer nil))
((PPRINT "Divide and concoct." WOFDOC))
Eval: (setf
write-to-doc-recipe (cons
wof-options write-to-doc-recipe))
((WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT "Divide and concoct." WOFDOC))
Eval: (setf
write-to-doc-recipe (cons
(quote
with-open-file) write-to-doc-recipe))
(WITH-OPEN-FILE (WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT "Divide and concoct." WOFDOC))
The name is just a placeholder for the list of Lisp instructions, so the name by itself just reveals what it references.
Eval: write-to-doc-recipe
(WITH-OPEN-FILE (WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT "Divide and concoct." WOFDOC))
Evaluate what the placeholder references by placing it in an instruction list using eval
(An intro for Lisp). The "double-quoted text" listed with the pprint
instruction will be written to the document named with the overall with-open-file
instruction.
Eval: (eval
write-to-doc-recipe)
[ ...describe the Lisp instructions for reading from a document, perhaps with read
(CLHS), though it is a little bit tricky to view a whole document... ]
[ ...describe the delete-file
(CLHS) instruction for deleting the files... ]
(delete-file
"/name/of/file")
Whenever desired, either change what to write to the document or change the document name with setf
(An intro for Lisp). Query the parts of the recipe for confirmation of the correct place to change before changing it.
Eval: write-to-doc-recipe
(WITH-OPEN-FILE (WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT "Divide and concoct." WOFDOC))
Eval: (car
(cdr
write-to-doc-recipe))
(WOFDOC "/actual/name/of/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND)
Eval: (cadr
(cadr
write-to-doc-recipe))
"/actual/name/of/doc"
Eval: (setf
(cadr
(cadr
write-to-doc-recipe)) "/another/doc")
"/another/doc"
Eval: (caddr
write-to-doc-recipe)
(PPRINT "Divide and concoct." WOFDOC)
Eval: (cadr
(caddr
write-to-doc-recipe)))
"Divide and concoct."
Eval: (setf
(cadr
(caddr
write-to-doc-recipe)) "This is something else.")
"This is something else."
Eval: write-to-doc-recipe
(WITH-OPEN-FILE (WOFDOC "/another/doc" :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT "This is something else." WOFDOC))
Optionally, use setf
to replace the text in the instructions with a placeholder. Thereon, use setf
to change the placeholder instead of the Lisp instructions. Optionally, insert a placeholder in the instructions for the document name, too.
Eval: (setf
(cadr
(cadr
write-to-doc-recipe)) (quote doc-for-writing))
DOC-FOR-WRITING
Eval: (setf
(cadr
(caddr
write-to-doc-recipe)) (quote text-to-write))
TEXT-TO-WRITE
Eval: write-to-doc-recipe
(WITH-OPEN-FILE (WOFDOC DOC-FOR-WRITING :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT TEXT-TO-WRITE WOFDOC))
Eval: (setf
doc-for-writing "/and/another/doc")
"/and/another/doc"
Eval: (setf
text-to-write "Something for another document.")
"Something for another document."
Eval: (eval
write-to-doc-recipe)
Eval: (setf
text-to-write "And some more.")
"And some more."
Eval: (eval
write-to-doc-recipe)
[ ...describe a setf
instruction that will set the contents of the recipe to a placeholder write-to-doc... ]
(setf recipe-for-later (cons write-to-doc-recipe nil)) (setf recipe-for-later (cons 'write-to-doc recipe-for-later)) (setf recipe-for-later (cons 'setf recipe-for-later))
[ ...Therefore that instruction sets a placeholder named write-to-doc to the contents of the recipe. Write that setf
instruction to a document, then it can be read by the Lisp interpreter later with the load
instruction. No need to type the recipe again and it is readily used with eval
. ... ]
[ ...Typing the name in the evaluation prompt reveals the recipe. That shows the document name and text to write both have placeholders in the recipe for easily changing without needing to modify the recipe. ... ]
Ultimately, choose a new document name for writing these Lisp instructions. [ ...refer to the previously described new symbol with new instructions... ] Evaluate the instructions again and this recipe is written to that chosen document.
Eval: (setf
doc-for-writing "/doc/for/this/recipe")
"/doc/for/this/recipe"
Eval: (setf
text-to-write recipe-for-later)
(SETF WRITE-TO-DOC (WITH-OPEN-FILE (WOFDOC DOC-FOR-WRITING :DIRECTION :OUTPUT :IF-DOES-NOT-EXIST :CREATE :IF-EXISTS :APPEND) (PPRINT TEXT-TO-WRITE WOFDOC)))
Eval: (eval
write-to-doc-recipe)
[ ...describe using load
for reading it from the document. Or, maybe with read
then eval
... ]
[ ...eventually assign buttons to the instructions, and demonstrate on a common Lisp instruction or arbitrary abdextrally half-paired list... ]
[ ...eventually assign buttons to the instructions, and demonstrate on a common Lisp instruction or arbitrary abdextrally half-paired list... ]
Ensure nil at both ends. A lisp instruction already has nil at its rightmost end.
(setf abbi.inspect (cons nil a.lisp.instruction))
Shift the cDAr rightward by shifting the cADr leftward. Work on a copy by setting the results to the name, instead of setting each half of car and cdr by reference.
(setf abbi.inspect (cons (cons (cons (caar abbi.inspect) (cADr abbi.inspect)) (cDAr abbi.inspect)) (cddr abbi.inspect)))
Shift the cADr leftward by shifting the cDAr rightward. Work on a copy by setting the results to the name, instead of setting each half of car and cdr by reference.
(setf abbi.inspect (cons (caar abbi.inspect) (cons (cADr abbi.inspect) (cons (cDAr abbi.inspect) (cddr abbi.inspect)))))
An actual swap is its own inverse, hence can reverse itself. Work on a copy by setting the results to the name, instead of setting each half of car and cdr by reference.
(setf abbi.inspect (cons (cons (caar abbi.inspect) (cADr abbi.inspect)) (cons (cDAr abbi.inspect) (cddr abbi.inspect))))
[ ...eventually assign buttons to the instructions, and demonstrate on a common Lisp instruction or arbitrary abdextrally half-paired list... ]
([ ...extract and insert... ])
The messages and prompts from StumpWM appear when needed, each at pre-specified locations on the screen. The characteristics of text color, background color, and the border are generally shared by both messages and prompts (StumpWM 4.1).
As expected, those characteristics are adjustable with the Lisp instruction prompt (...an outlet for ingenuity).
set-msg-border-width
set-border-color
stumpwm:set-bg-color
stumpwm:set-fg-color
stumpwm:update-color-map
Use setf
(An intro for Lisp) to set the location of prompts and the location of messages.
Eval: (setf
stumpwm:*input-window-gravity* :center)
Eval: (setf
stumpwm:*message-window-gravity* :bottom)
stumpwm:*input-window-gravity*
Placement on screen for prompts from StumpWM (Interactive curiosity). This includes the Lisp instruction prompt "Eval: " from the Control-t : binding for the eval-line
command.
stumpwm:*message-window-gravity*
Placement on screen for messages from StumpWM.
Possible gravity names for the messages or prompts begin with a colon ":".
_______________________________________________ | :top-left | | :top | | :top-right | |___________| |_________| |____________| | | | | |-------- ----------- ---------| | :left | | :center | | :right | |-------- ----------- ---------| | | |______________ _________ _______________| | :bottom-left | | :bottom | | :bottom-right | |______________|___|_________|__|_______________|
The border width from stumpwm:set-msg-border-width
and its color (X Window System color) from stumpwm:set-border-color
are absolutely consistent for prompts and all types of messages. Use setf
for the padding around messages and prompts.
Eval: (stumpwm:set-msg-border-width
3)
Eval: (stumpwm:set-border-color
"CornflowerBlue")
Eval: (setf
stumpwm:*message-window-padding* 7)
Eval: (setf
stumpwm:*message-window-y-padding* 5)
stumpwm:set-msg-border-width
Set the number of pixels for the border thickness of prompts and all types of messages.
stumpwm:set-border-color
Set the border color for prompts and all types of messages. Either a color name or hexadecimal styled number as "double-quoted text", f.e. "red" or "#f00".
stumpwm:*message-window-padding*
The number of pixels for empty space at the left and right sides of the text for both messages and prompts.
stumpwm:*message-window-y-padding*
The number of pixels for empty space at the top and bottom sides of the text for both messages and prompts.
The prompts use the background color from stumpwm:set-bg-color
and the text color (foreground) from stumpwm:set-fg-color
. Any standard X Window System color.
Eval: (stumpwm:set-bg-color
"DarkOrchid4")
Eval: (stumpwm:set-fg-color
"Thistle1")
stumpwm:set-bg-color
Set the background color for prompts, documentation messages, error messages, and the padding around messages for Lisp results. Either a color name or hexadecimal styled number as "double-quoted text", f.e. "blue" or "#00f".
stumpwm:set-fg-color
Set the text color (foreground) for prompts and documentation messages. Either a color name or hexadecimal styled number as "double-quoted text", f.e. "white" or "#FFF".
The colors get messy in StumpWM when it comes to its messages. There are at least three types: documentation messages, error messages, and messages with Lisp results. They use some of the eight colors listed in stumpwm:*colors*.
Documentation messages come from the help commands describe-command
, describe-key
, where-is
, describe-variable
, and describe-function
. The default buttons that invoke them are listed by "Control-t h ?" (StumpWM keymap: *help-map*).
Documentation messages use the same background and text colors as the prompt, t.i. stumpwm:set-bg-color
and stumpwm:set-fg-color
. They also emphasize some text with the sixth color (darker and brighter) from stumpwm:*colors*. Technically, that means four colors must be coordinated legibly.
Eval: (setf
(cADr
(cDDDDr
stumpwm:*colors*)) "LightSkyBlue1")
Eval: (stumpwm:update-color-map
(stumpwm:current-screen
))
Error messages use the background color from stumpwm:set-bg-color
, but for the text they use the second color (its lighter version) in stumpwm:*colors*, t.i. its cadr
.
Eval: (setf
(cADr
stumpwm:*colors*) "DeepSkyBlue3")
Eval: (stumpwm:update-color-map
(stumpwm:current-screen
))
Messages from Lisp results are temporarily displayed after using the Lisp instruction prompt (...an outlet for ingenuity). Those messages use the background color from stumpwm:set-bg-color
only for the padding around the message. The background and text colors are the darker versions of the car
and caddr
colors from stumpwm:*colors*.
Eval: (setf
(cAr
stumpwm:*colors*) "DarkOrchid4")
Eval: (setf
(cADDr
stumpwm:*colors*) "Thistle1")
Eval: (stumpwm:update-color-map
(stumpwm:current-screen
))
stumpwm:*colors* (StumpWM 14. Colors)
A list of about eight colors intended for coloring messages.
Either replace the whole list, or consider using setf
with car
and cdr
(Lisp lists are pairs) for changing individual colors in the list. Any standard X Window System color.
Note after changing the colors, make the colors effective by using the stumpwm:update-color-map
instruction.
Note the colors are only a guide for stumpwm:update-color-map
, because it fabricates a list of darker colors and a list of brighter colors instead. That is why the various messages will seem colored differently than chosen.
stumpwm:update-color-map
(StumpWM 14.1)
Update the colors for messages with new colors from the stumpwm:*colors* list.
Requires a specified screen such as provided by the stumpwm:current-screen
instruction.
Eval: (update-color-map
(current-screen
))
Note two color lists are fabricated from stumpwm:*colors*. One is a list of slightly darker colors, and one is a list of slightly brighter colors. That means the list in stumpwm:*colors* is only a guide.
Consider using a substitute for update-color-map
(github.com) that respects the colors of stumpwm:*colors*. Just copy into a new file and modify it, then load the file with load
and use the new instruction. Note some names within it will need "stumpwm::" (two colons).
For example, simply changing the -0.25 to 0 ensures the first fabricated list is the exact colors specified rather than darker. Maybe drop the brightener to 0.2 for the second fabricated list, or perhaps accept more colors in an &optional additional list.
stumpwm::make-kmap
;
define-key
;
unpair a button
A computer does what a person desires at the mere press of a button, but for most people that is only science fiction (Any instruction at the press of a button).
The default response of a computer for a button pressed on a buttonboard is either invoking a command, or simply ignored. Typical computer commands store info into computer memory, or maybe draw a symbol on the screen.
A list of buttons paired with command names or specific instructions is a "keymap". The Xserver provides the default keymaps for any buttonboard attached to the computer, pairing the location of each button to the symbol name presumed to be written on it.
The Xserver observes all button presses from all buttonboards or other devices attached to the computer (Discover keycodes for buttons), then informs the relevant computer program. StumpWM is a computer program that insists on managing specific or sometimes all button presses from the Xserver.
StumpWM uses its own keymaps for matching a button pressed on the buttonboard to one of its own commands. When there is no match, the Xserver passes it on to the next relevant computer program, if any.
buttonboard \/ Xserver \/ \/ matched StumpWM keymap >>> StumpWM command no match \/ Xserver \/ \/ matched computer program >>> command keymap no match \/ typed or ignored
That computer program matches the button to one of its own commands. Otherwise, the program might request the relevant Xserver keymap (based on pressed modifier buttons like Shift) and match the button with it. Typically, that results in typing a symbol, if it is that kind of computer program.
All of the buttons on a buttonboard are essentially the same, and their symbols are only suggestions. Swapping the button caps does nothing to change what the computer does when a button is pressed, because the buttonboard itself remains unchanged.
The computer is usually given a list of buttonboard locations associated with an instruction for each, a mapping of buttons known as a "keymap". An instruction might draw something on the screen, or maybe it changes the keymap for the buttonboard thereby enabling a different list of instructions from the buttons.
There are usually at least two keymaps with instructions for entering letters, numbers, and punctuation, and a few other keymaps for invoking commands. For example, perhaps lowercase letters are from one keymap, and uppercase from another.
..:___:___:___:.. ..:___:___:___:.. | | | | hold | | | | | q | w | e | Shift | Q | W | E | ..|___|___|___|.. button ..|___|___|___|.. | | | | --> | | | | | a | s | d | | A | S | D | ..|___|___|___|.. ..|___|___|___|.. : : : : : : : :
The Shift button is a "modifier" button, a button whose instruction swaps out the default keymap for an alternate keymap. The traditional modifier buttons have been Shift, Control, Alt, Hyper, Meta, Super, Command, Option, and many others.
For example, hold the Shift button and the computer references a different list of button instructions, t.i. a different keymap, while that modifier button is held. Release the Shift button and the default keymap is active again.
The Shift Lock or Caps Lock modifier buttons provide a similar effect, but without needing to hold either one. Instead, press and release one of them to make that alternate keymap active, then press and release again to make the default keymap active.
StumpWM makes use of invisible typing, partly because it lacks its own manufactured buttonboard with dedicated buttons for itself. StumpWM re-assigns buttons despite what is already written on them, initially for invoking specific prompts and other commands (Interactive curiosity: typing for actions and help).
Many commands are bound to a sequence of buttons, with the first button as "Control-t". Each button in the sequence is bound to a keymap (), except the final button which invokes its command.
Typing a button for a keymap and then a question mark "?" reveals its list of commands and sub-keymaps (). That also makes the question mark "?" an innocuous means for canceling a button sequence.
Invoke the which-key-mode
command and then from that moment on each keymap is automatically revealed while typing any button sequence (Invoke a StumpWM command by its name). Invoking the which-key-mode
command a second time cancels the effect.
The stumpwm:describe-key
command reveals the command associated with a button or a sequence of buttons (Invoke a StumpWM command by its name).
: describe-key Describe Key:
C-t h k is bound to "describe-key". DESCRIBE-KEY KEYS Either interactively type the key sequence or supply it as text. This command prints the command bound to the specified key sequence.
Describe Key:
ESC is not bound.
That also reveals the actual name of a button, which might be different than what is written on it. Capital letters matter. For example, the "delete" button is actually named "DEL" and the "forward delete" button is actually named "Delete".
The Control button is abbreviated "C-". The Meta button is "M-", but might also imply the Alt button or Option button instead when it is unavailable. The Shift button is merely implied by punctuation or a capital letter needing it.
The stumpwm:where-is
command provides a comma-separated list of all the buttons paired to a command (Invoke a StumpWM command by its name). Space-separated buttons means it is a sequence with its initial buttons paired to keymaps before its final button.
: where-is Where is command: where-is
"where-is" is on C-t h w.
Where is command: time
"time" is on C-t a, C-t C-a.
[ ...describe revealing the button list for a keymap... ...likely include the stumpwm::*escape-key* button... ... ]
Press and release the button paired with a keymap, t.i. its "Prefix", then type a question mark "?" to reveal the buttons defined in it.
The stumpwm:define-key
is for pairing a button with either a StumpWM command or with a StumpWM keymap.
Press and release a button that has been paired with a command, then that command is invoked. Press and release a button that has been paired with a keymap, then that keymap temporarily replaces the *top-map* keymap (StumpWM keymap: *top-map*) until the next button is pressed.
A command or keymap can be paired multiple times, even within the same keymap. However, a button can be defined only once within a keymap. Defining the same button again within the same keymap simply replaces its previous definition.
# Make a blank StumpWM keymap.
The stumpwm::make-kmap
instruction makes a new empty keymap. Use the setf
(An intro for Lisp) to assign a name to the new keymap.
Eval: a-new.keymap
The variable A-NEW.KEYMAP is unbound.Backtrace...
Eval: (setf
a-new.keymap (stumpwm::make-kmap
))
#S(STUMPWM::KMAP :BINDINGS NIL)
# Pair a button with a command or keymap.
The stumpwm:define-key
instruction adds to a specified keymap a button name paired with either a double-quoted StumpWM command or the quote
(An intro for Lisp) of a StumpWM keymap. The stumpwm:kbd
instruction converts a button name to a StumpWM key description.
: describe-command Describe Command: colon
COLON &OPTIONAL INITIAL-INPUT Read a command...
Eval: (define-key
a-new.keymap (kbd
"F1") "colon")
: describe-key Describe Key:
ESC is not bound.
Eval: (define-key
*top-map* (kbd
"ESC")'
a-new.keymap)
: describe-key
F1 is not bound.
: describe-key
ESC F1 is bound to "colon". COLON &OPTIONAL INITIAL-INPUT Read a command...
Prefix: ESC
F1 colon
Pairing a button with a keymap might also automatically assign to that keymap the question mark "?" button for conveniently revealing its list of buttons (Find commands and buttons). The question mark for that is never listed.
When the question mark "?" button is already assigned in the keymap, then there is no default way of revealing the whole listing until its question mark is unpaired. Instead, consider the describe-key
or the where-is
commands (Find commands and buttons).
# Unpair a button.
Prefix: ESC
(EMPTY MAP)
Pair a button with nil to return it to normal for a specific keymap.
Eval: (define-key
a-new.keymap (kbd
"F1") nil)
: describe-key
ESC F1 is not bound.
[ ...repurpose a former section into a new example forstumpwm::fill-keymap
... ...notestumpwm::fill-keymap
requires the name is set to nil rather than to a keymap... ...simply reset a named keymap to NIL before filling it, or fill for a newly assigned name and thensetf
the stored results to the name of a prior keymap... ... ]
Think of an unused name for a new keymap, then assign nil to it with setf
. That name is for referencing the memory that has the keymap, such as setting it to nil before filling it, or setting it to a prior keymap.
Eval: buttons.my
The variable BUTTONS.MY is unbound.Backtrace...
Eval: (setf
buttons.my nil)
Choose buttons that personally make sense for each command, and fit comfortably with the workflow of the day or hour.
Eval: (stumpwm::fill-keymap
buttons.my (kbd
"c")"pull-hidden-other" (kbd
"f")"pull-hidden-previous" (kbd
"j")"pull-hidden-next" (kbd
"m")"run-shell-command" (kbd
"x")"gother" (kbd
"d")"gprev" (kbd
"k")"gnext" (kbd
",")"gnew")
Assign the keymap to a button either before or after filling it for the first time. No need to do it again after changing the keymap. Use the quote
for the keymap name rather than double-quotes with stumpwm:define-key
(Pair a button with a command or keymap).
: describe-key
F20 is not bound.
Eval: (define-key
*top-map* (kbd
"F20")'
buttons.my)
Prefix: F20
c pull-hidden-other
f pull-hidden-previous
j pull-hidden-next
m run-shell-command
x gother
d gprev
k gnext
, gnew
Type the button for the keymap and then a question mark "?" to get a listing of the abbreviations. They are listed in the order they were added.
Modify the new keymap at any time as usual. Add another button and command (Pair a button with a command or keymap), or remove a button (Unpair a button).
Consider storing the original instruction for filling that named keymap with the setf
and the quote
, by using the up/down arrows for bringing forth the prior/next lines for less re-typing (Typing within a line of text).
Eval: fill.buttons.my
The variable FILL.BUTTONS.MY is unbound.Backtrace...
Eval: (setf
fill.buttons.my'
(stumpwm::fill-keymap buttons.my (kbd "c")"pull-hidden-other" (kbd "f")"pull-hidden-previous" (kbd "j")"pull-hidden-next" (kbd "m")"run-shell-command" (kbd"x")"gother" (kbd"d")"gprev" (kbd"k")"gnext" (kbd",")"gnew")
Modify it at any time, perhaps with introspection (Abbi-abbi introspection). Add another button and command to the list, or just change the order for a different ordered listing from the question mark "?".
Reset the keymap to nil before evaluating the instruction to refill the keymap again, because stumpwm::fill-keymap
refuses to replace a keymap. Consider storing the current keymap to another name before resetting it, for restoring that version of the keymap later.
Eval: prior.buttons.my
The variable PRIOR.BUTTONS.MY is unbound.Backtrace...
Eval: (setf
prior.buttons.my buttons.my)
Eval: (setf
buttons.my nil)
Eval: (eval
fill.buttons.my)
Eval: (setf
buttons.my prior.buttons.my)
Assigning a button to Lisp instructions for StumpWM requires the instructions are a StumpWM command.
Conveniently, eval-line
is a StumpWM command that evaluates a Lisp instruction given to it. It optionally accepts info immediately without need for the prompt.
The stumpwm:define-key
allows for giving such info to a command within the double-quotes, but there must be a space after the command.
No need to create a new command for every set of Lisp instructions. Just pick a button on the button board and associate with any keymap (Make a StumpWM keymap and pair a button).
# Any instruction at the press of a button.
Consider storing an instruction in named memory, then use the eval
Lisp instruction to evaluate the named memory. Coincidentally, the "double-quoted text" prevents the need for named memory to already exist.
: describe-key
F14 is not bound.
Eval: (define-key
*top-map* (kbd
"F14") "eval-line (eval do.it)")
Change the instruction in the named memory whenever desired. No need to redefine the button, it will evaluate whatever is currently in the named memory.
# Introspect a duplicated half-paired list.
Consider defining buttons for introspection of a half-paired list, f.e. perhaps a Lisp instruction (Contrary formation and Lisp instructions). Specifically, consider abbi-abbi introspection (Abbi-abbi introspection), and ensure working on a copy.
Introspect its cADr
rightwardly by continuously associating the cADr
with the cAr
. Note the name is assigned to the memory that has the new result, thereby no longer referencing the original list.
(setf
abbi-abbi.inspect (cons
(cons
(cADr
abbi-abbi.inspect) (cAr
abbi-abbi.inspect)) (cDDr
abbi-abbi.inspect)))
: describe-key
F17 is not bound.
Eval: (define-key
*top-map* (kbd
"F17") "eval-line (setf abbi-abbi.inspect (cons (cons (cADr abbi-abbi.inspect) (cAr abbi-abbi.inspect)) (cDDr abbi-abbi.inspect)))")
Introspect its cADr
leftwardly by continuously associating the cAAr
with the cDr
. Note the name is assigned to the memory that has the new result, thereby no longer referencing the original list.
(setf
abbi-abbi.inspect (cons
(cDAr
abbi-abbi.inspect) (cons
(cAAr
abbi-abbi.inspect) (cDr
abbi-abbi.inspect))))
: describe-key
F16 is not bound.
Eval: (define-key
*top-map* (kbd
"F16") "eval-line (setf abbi-abbi.inspect (cons (cDAr abbi-abbi.inspect) (cons (cAAr abbi-abbi.inspect) (cDr abbi-abbi.inspect))))")
Use the setf
to associate a list with the introspection name, t.i. the name used with setf
in the instructions assigned to the buttons. Initially, that will be a reference to the memory (Re-listing rather than re-arranging).
Use the buttons until the StumpWM message reveals the desired sublist as the cADr
. The instructions assigned to the buttons associate the name to the memory that has the new results, thereby no longer referencing the memory of the original list.
Easily assign a new cADr
with the setf
in the Lisp instruction prompt.
Eval: (setf
(cadr
abbi-abbi.inspect)'
something.new)
Prepend a new item to the cDr
by pairing it with cDr
. Nothing is eliminated.
Eval: (setf
(cdr
abbi-abbi.inspect) (cons
'
something.new (cdr
abbi-abbi.inspect)))
Displace the cADr
is by setting it to a reference of the cDDr
, thereby eliminating the cADr
.
Eval: (setf
(cadr
abbi-abbi.inspect) (cddr
abbi-abbi.inspect))
Use the buttons to rewind to the beginning to restore the new list. Use setf
to associate the new list with a new name, or with the name of the original list to replace it.
# Introspect a referenced half-paired list.
Consider defining buttons for introspection of a half-paired list by reference, f.e. perhaps a Lisp instruction (Contrary formation and Lisp instructions). Specifically, consider abbi-abbi introspection (Abbi-abbi introspection), and maintain the reference to the orginal list.
Introspect its cADr
rightwardly by continuously associating the cADr
with the cAr
. Note references to the car
and cdr
of the named memory are assigned individually rather than assigning the name itself to new memory.
(setf
(cAr
abbi-abbi.inspect) (cons
(cADr
abbi-abbi.inspect) (cAr
abbi-abbi.inspect))) (setf
(cDr
abbi-abbi.inspect) (cDDr
abbi-abbi.inspect))
Consider using cons
with the eval-line
command in order to evaluate a pair of instructions (Two instructions at once).
: describe-key
F17 is not bound.
Eval: (define-key
*top-map* (kbd
"F17") "eval-line (cons (setf(cAr abbi-abbi.inspect) (cons(cADr abbi-abbi.inspect)(cAr abbi-abbi.inspect))) (setf(cDr abbi-abbi.inspect) (cDDr abbi-abbi.inspect)))")
Introspect its cADr
leftwardly by continuously associating the cAAr
with the cDr
. Note references to the car
and cdr
of the named memory are assigned individually rather than assigning the name itself to new memory.
(setf
(cDr
abbi-abbi.inspect) (cons
(cAAr
abbi-abbi.inspect) (cDr
abbi-abbi.inspect))) (setf
(cAr
abbi-abbi.inspect) (cDAr
abbi-abbi.inspect))
: describe-key
F16 is not bound.
Eval: (define-key
*top-map* (kbd
"F16") "eval-line (cons (setf(cDr abbi-abbi.inspect) (cons(cAAr abbi-abbi.inspect)(cDr abbi-abbi.inspect))) (setf(cAr abbi-abbi.inspect)(cDAr abbi-abbi.inspect)))")
Use the setf
to associate a list from named memory with the introspection name, t.i. the name used with setf
in the instructions assigned to the buttons. Initially, that will be a reference to the memory (Re-listing rather than re-arranging).
Use the buttons until the StumpWM message reveals the desired sublist as the cADr
. Remember, these instructions assigned to the buttons associate results with individual references to the car
and cdr
of the list, t.i within the named memory, rather than reassigning the name itself to new memory.
Easily substitute the cADr
using the setf
, t.i. eliminate the current cADr
and provide a new one.
Eval: (setf
(cadr
abbi-abbi.inspect)'
something.new)
Prepend a new item to the cDr
by pairing it with cDr
. Nothing is eliminated.
Eval: (setf
(cdr
abbi-abbi.inspect) (cons
'
something.new (cdr
abbi-abbi.inspect)))
Displace the cADr
is by setting it to a reference of the cDDr
, thereby eliminating the cADr
.
Eval: (setf
(cadr
abbi-abbi.inspect) (cddr
abbi-abbi.inspect))
Use the buttons to rewind to the beginning to restore the list, thereby also for the named memory it referenced.
Optionally use setf
to assign nil to the introspection name in order to disassociate it from the list of the named memory it referenced, or to another list for another introspection.
A computer does what a person desires at the mere press of a button, but for most people that is only science fiction.
Neural-scan interfaces, such as buttonboards and motionboxes, transcend operating systems by means of virtual network computing (VNC). Personalizing their operation on the client computer overcomes the inadequate options of a host computer.
A personalizable computer (...no need to change the world) shares its neural-scan interfaces by connecting to the VNC host on another computer on the same desk, then the latter has no need of its own. The common desire of "rebinding keys" for any software becomes consistent and steadfast, regardless of software upgrades on other computers.
Marking relevant starting points for the pointer (Make a point...) and consistently maneuvering it (Efficient pointer jumping) effectively supplants the arbitrary approach of the motionbox with a never-miss selection-based interface. This helps open the door to repeatability by the computer of a sequence of actions.
[ ...an interactive keymap is less flexible than a "sparse keymap" because it is impossible to change the buttons afterwards for an interactive keymap (kinda contradictory), and the *root-map* is unavailable unless specifically assigned which means no buttons for Help or for prompts likeeval-line
unless specifically assigned... ...consider usingstumpwm:push-top-map
with a new keymap, thenstumpwm:pop-top-map
to restore prior keymap... ...But...those simply assign another keymap to *top-map* then they use thestumpwm:sync-keys
function. Though those push/pop functions also save and restore the prior buttons assigned in *top-map*, that is nothing special because the assigned buttons could simply be already in another keymap. Just switch between various keymaps for *top-map* instead... In other words, consider from the Lisp instruction prompt: (cons
(setf
*top-map* another-keymap) (stumpwm:sync-keys
)) ... ] [ ... ...the stumpwm:*root-map* is separate. so consider assigning the StumpWM prefix or any other preferred button to the *root-map* for its command buttons (such as for the various prompts likeeval-line
)... ... ]
The StumpWM prefix button is always available, by default as "C-t". The StumpWM prefix is reliably referenced as stumpwm:*escape-key*. It is reliably re-assignable with set-prefix-key
. Use the stumpwm:*escape-key* reference when wanting to assign the StumpWM prefix button to a button, such as for a command or to a keymap.
[ ...all info about "interactive keymaps" will likely be removed soon... ]
Evoking an interactive keymap temporarily enables its assigned buttons without need of a prefix button for each. That is very similar to using Shift Lock or Caps Lock in order to get capital letters, but in this case each assigned button instantly invokes a command instead.
The stumpwm:define-interactive-keymap
(StumpWM 3.2) accepts a list of options after the chosen name for the interactive keymap, but an empty list or nil means apply the defaults. Next, each button and its desired command is grouped within parentheses, distinct from the others.
;;
Consider rebinding the pointer-halving commands. (stumpwm:define-interactive-keymap
halving.map () ((stumpwm:kbd
"i") "pointer-halving-up.nu") ((kbd
"j")"pointer-halving-left.nu") ((kbd
"k")"pointer-halving-down.nu") ((kbd
"l")"pointer-halving-right.nu") ((kbd
";")"pointer-halving-toggle.nu") ((kbd
"m")"pointer-halving-back.nu") ((kbd
",")"pointer-halving-begin.nu") ((kbd
".")"pointer-halving-recenter.nu") ((kbd
"h")"pointer-button-activate.nu 1") ((kbd
"u")"pointer-button-toggle.nu 1") ((kbd
"n")"pointer-button-activate.nu 3"))
Use define-key
to assign the button for activating the interactive keymap. Double-quote the chosen name because an interactive keymap is actually a command, unlike a sparse keymap (Make a list of command buttons).
(stumpwm:define-key
stumpwm:*top-map* (stumpwm:kbd
"F7") "halving.map"))
By default, the ESC button, or the Return button, or "Control-g" disables the interactive keymap. As a command, the interactive keymap can be invoked by its chosen name with the commands prompt (Invoke a StumpWM command by its name) of "Control-t ;" (a semicolon), too.
[ ...describe at least the :exit-on option for changing the default buttons for exiting the interactive keymap. For example, set it to be the same as the button defined to start, so then it feels like an on/off toggle button for the interactive keymap. Probably something like:
(:exit-on ((kbd
"F7")))
Or, also include "Control-g":
(:exit-on ((kbd
"F7") (kbd
"C-g")))
for the same familiarity of other StumpWM commands
... ]
[ ...describe defining an interactive keymap with the evaluation prompt (The Lisp instruction prompt) using list introspection (Exploring a half-paired list)...
Though, already described that for pointer jumping (Efficient pointer jumping for any grid of options)... ]
The most immediate change to StumpWM is applied with the eval-line
command, available with Control-t then colon, usually notated as "C-t :" (The Lisp instruction prompt: an outlet for ingenuity).
The basic pointer activation in StumpWM (the Xwindow manager formerly known as "ratpoison") depends on a legacy function named ratclick
. That might fail when the CLX library is without support for the XTEST extension for the Xserver, especially when the XTEST extension is undetected.
The StumpWM functions expect xlib:fake-button-event
from a CLX library, but it has been known to be named xlib/xtest:fake-button-event
(CLX "extensions/xtest.lisp": 13 and 117–128). Therefore, confirm the name and requirements in the sources when needed.
The xlib/xtest:fake-button-event
requires a display like stumpwm:*display*, the number of the pointer-box button, and either t or nil for either pressing or releasing the button.
The primary button is usually 1 and the secondary button is traditionally 3, because the middle button is usually presumed even when nonexistent. Pressing a button on the pointer-box is one event, and releasing the same button is another event.
Eval: (setf
press.1'
(xlib/xtest:fake-button-event stumpwm:*display* 1 t))
Eval: (setf
release.1'
(xlib/xtest:fake-button-event stumpwm:*display* 1 nil))
Consider defining a separate buttonboard button (Any instruction at the press of a button) for each event, then drag'n'drop can be done without disaster.
: describe-key
F7 is not bound.
Eval: (stumpwm:define-key
stumpwm:*top-map* (stumpwm:kbd
"F7") "eval-line (eval press.1)")
: describe-key
F8 is not bound.
Eval: (stumpwm:define-key
stumpwm:*top-map* (stumpwm:kbd
"F8") "eval-line (eval release.1)")
Consider combining both events for a single buttonboard button, for when the pointer is already in the perfect location. The eval-line
evaluates only one Lisp form (The Lisp instruction prompt: an outlet for ingenuity), but cons
is a single instruction that accepts two Lisp forms (There can be only one instruction).
Eval: (cons
(eval
press.1) (eval
release.1))
Drag'n'drop involves moving the pointer. A press of the button at the drop location is probably innocuous. Consider repurposing the buttonboard button assigned to releasing the pointer-box button, as the press/release combo event likely suffices. Otherwise, choose another buttonboard button.
Eval: (define-key
*top-map* (kbd
"F8") "eval-line (cons (eval press.1) (eval release.1))")
Consider adding the actions to an interactive keymap (...custom buttonboard layouts), such as with pointer jumping (Efficient pointer jumping) or pointer halving (Mathemagical pointer and cursor placement).
A dragon would probably drop what a bird typically drops, as they both have a cloaca, but likely a bit more biohazardous for anyone underneath it. Similarly, accidentally letting go of the button on a pointer-box while trying to reposition the cursor might be disasterous, or at least lead to extra work to undo the accident.
The Xserver keeps track of whether a "pointer button" has been pressed, as well as any pressed modifier buttons on the buttonboard intended for that pointer button. As such, it is possible to toggle a button press and a button release individually with the same command bound to a single button on the buttonboard instead.
The Common Lisp X Interface function xlib:query-pointer
(CLX 13.5 Pointer Position) reveals what pointer buttons are pressed, by means of the fifth element it returns.
(car
(cddddr
(multiple-value-call '
list (xlib:query-pointer
(stumpwm:screen-root
(stumpwm:current-screen
))))))
For example, when button 1 is pressed, the result from it is 256, because it is actually the binary mask: 00000001 00000000. The first part (from right to left, just like decimal numbers) indicates the modifier buttons pressed on the buttonboard, with zero meaning nothing pressed. While 2^8 is 256 (t.i. 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2), the eight bits include zero, therefore the first byte is 0–255. A ninth bit is required to begin the next range for 256–511 (instead of 512 for 2^9), which is why the ninth bit is 1 and represents 256.
A decimal number can be used as a mask, which is why the results of xlib:query-pointer
returns "256". The binary "1 00000000" is merely a different way of writing the number, rather than a different number. Specifically, in Common Lisp #b
100000000 means that is a binary number, which is 1 with eight zeros, the aforementioned "256".
The Xserver seems to track only five pointer buttons, so only the first five bits are used of the second 8-bit byte. That means when there are five buttons on a pointer-box and all are pressed (and held), and with no modifier buttons pressed, then the Xserver would return the number known in binary as: 00011111 00000000.
One way to programmatically determine from the bits of such a number which button is pressed is with Common Lisp logic functions (CLHS 12.2 The Numbers Dictionary). For example, logand
can compare each bit from two numbers and return a new number. Only the bits for the positions that are 1 in both numbers will be 1 in the new number, otherwise a bit will be zero. Order of the numbers for logand
is of no matter because it is only a comparison.
(logand
#b
00011111#b
00000100) means: 00011111 - all five buttons are pressed 00000100 - mask representing button 3 -------- 00000100 - this figured out button 3 is pressed (logand
#b
00000001#b
00000100) means: 00000001 - only button 1 is pressed 00000100 - mask representing button 3 -------- 00000000 - this figured out button 3 is released
A number can be manipulated like a mask by using "arithmetic shift" to shift the bits to the left or right, by means of the function ash
. That means "00000001" (binary for 2) shifted by 3 becomes "00001000" (binary for 8), because a positive shift is leftwards. In other words: 1 * 2^3.
(ash
1 3)
=> 8
Since buttons 1–5 are positions 1–5 in the 8-bit byte, then the mask for a button can be made by shifting a "1" until it is in the same position. For example, "00000001" to "00000100" for button 3 would be a shift of 2, which is one less than the button number.
(setf
button 3) (ash
1 (-
button 1)) => 4
Therefore, a command can be written to inform the Xserver a pointer button has been pressed, and the same command can be used for releasing the pointer button by confirming the button with the mask the Xserver returns when the pointer is queried.
Toggle primary button for "press" or "release", f.e. text selection, drag'n drop without accidental drop, or anything else distinguishing a button press from a button release event.
The Common Lisp X Interface function xlib:warp-pointer
(CLX 13.5 Pointer Position) when given an Xwindow and coordinates will place the pointer at those coordinates within the area of that Xwindow.
The function xlib:pointer-position
(CLX 13.5) when given a specified Xwindow returns the coordinates of the pointer (and some more data).
Alternatively, the function xlib:global-pointer-position
(CLX 13.5) when given a display (like stumpwm:*display*) returns the individual coordinates of the pointer and the root Xwindow.
Eval: (xlib:global-pointer-position
stumpwm:*display*)
600 450 #<XLIB:WINDOW :0 123>
These functions make use of the Common Lisp peculiarity (contrary to other Lisps) of "returning multiple values", t.i. returning a series instead of a list.
Eval: (cadr
(xlib:global-pointer-position
stumpwm:*display*))
The value 600 is not of type LIST when binding LISTBacktrace for: #<SB-THREAD:THREAD "main thread" RUNNING {0123456789}> 0: (STUMPWM::BACKTRACE-STRING) 1: (ERR "~A" #<TYPE-ERROR expected-type: LIST datum: 1050>) ...
Only the "primary value" gets noticed by other Lisp functions. All other values after the first are lost, by default.
Eval: point.test
The variable POINT.TEST is unbound.Backtrace...
Eval: (setf
point.test (xlib:global-pointer-position
stumpwm:*display*))
600
Eval: point.test
600
The Common Lisp special operator multiple-value-call
(CLHS 5.3 The data and control flow dictionary) or a similar "multiple-value-" macro must be used for accessing all the values, f.e. as an actual list.
Eval: (multiple-value-call
'
list (xlib:global-pointer-position
stumpwm:*display*))
(600 450 #<XLIB:WINDOW :0 123>)
Eval: (multiple-value-list
(xlib:global-pointer-position
stumpwm:*display*))
(600 450 #<XLIB:WINDOW :0 123>)
Eval: (reverse
(cdr
(reverse
(multiple-value-list
(xlib:global-pointer-position
stumpwm:*display*)))))
(600 450)
Eval: (multiple-value-call
'
cons (xlib:global-pointer-position
stumpwm:*display*))
invalid number of arguments: 3Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {0123456789}> 0: (STUMPWM::BACKTRACE-STRING) 1: (ERR "~A" #<SB-INT:SIMPLE-PROGRAM-ERROR "invalid number of arguments: ~S" {9012345678}>) ...
Eval: (multiple-value-bind
(x y) (xlib:global-pointer-position
stumpwm:*display*) (cons
x y))
(600 . 450)
Experience with the pointer a selection-based interface from a consistent grid layout of commands or options, often presented as icons.
____ ____ ____ ____ | || || || | | || * || || | |____||____||____||____| ____ ____ ____ ____ | || || || | | || || || | |____||____||____||____|
Start with the pointer placed within the region of one of the options. Displace the pointer either leftward or rightward approximately the same distance as the width of the columns, or either upward or downward approximately the same distance as the height of the rows.
The xlib:warp-pointer-relative
(CLX 13.5) displaces the pointer from its current coordinates. It requires a display like stumpwm:*display*, then the offset for the x-axis (horizontal) and the offset for the y-axis (vertical).
The origin (0, 0) is left-top corner, so downward and rightward are positive offsets, and upward and leftward are negative offsets. The pointer is automatically kept within the bounds of the screen by xlib:warp-pointer-relative
, despite any requests beyond.
Eval: (xlib:global-pointer-position
stumpwm:*display*)
600 450 #<XLIB:WINDOW :0 123>
Eval: (xlib:warp-pointer-relative
stumpwm:*display* -64 0)
Eval: (xlib:global-pointer-position
stumpwm:*display*)
536 450 #<XLIB:WINDOW :0 123>
Eval: jump.offset
The variable JUMP.OFFSET is unbound.Backtrace...
Eval: (setf
jump.offset 64)
64
Eval: (xlib:warp-pointer-relative
*display* jump.offset 0)
Eval: (xlib:global-pointer-position
*display*)
600 450 #<XLIB:WINDOW :0 123>
Consider stumpwm:define-interactive-keymap
for defining an interactive keymap (...custom buttonboard layouts) with buttons for displacing the pointer each direction, perhaps r-d-s-f for up-down-left-right (for an ASDF buttonboard layout).
Gradually construct the Lisp instruction (Contrary formation and Lisp instructions) as a quoted Lisp form for later evaluation. One way is by beginning with a dextrally half-paired list for everything before all of the button/command pairs: function name, chosen name, and list of options (or nil when none).
Eval: jump.map
The variable JUMP.MAP is unbound.Backtrace...
Eval: make.jump.map
The variable MAKE.JUMP.MAP is unbound.Backtrace...
Eval: (setf
make.jump.map'
((define-interactive-keymap . jump.map) . (:exit-on ((kbd "F7")))))
((DEFINE-INTERACTIVE-KEYMAP . JUMP.MAP). (:EXIT-ON ((KBD "F7"))))
Then, cons
each button/command list item abdextrally to a second half-paired list beginning with nil (required by a Lisp instruction). Recall, the up/down arrow buttons in the evaluation prompt reveal the prior/later typed instructions for editing and re-using (The Lisp instruction prompt: an outlet for ingenuity).
Eval: (setf
make.jump.map (cons
make.jump.map nil))
(((DEFINE-INTERACTIVE-KEYMAP . JUMP.MAP) . (:EXIT-ON ((KBD "F7")))))
Eval: (setf
(cdr
make.jump.map) (cons
'
((kbd "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))") (cdr
make.jump.map)))
Eval: (setf
(cdr
make.jump.map) (cons
'
((kbd "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") (cdr
make.jump.map)))
Eval: (setf
(cdr
make.jump.map) (cons
'
((kbd "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") (cdr
make.jump.map)))
Eval: (setf
(cdr
make.jump.map) (cons
'
((kbd "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") (cdr
make.jump.map)))
Penultimately, unwind the dextrally half-paired list and cons each of its items with the abdextrally half-paired list (Exploring a half-paired list). There are three items in it, so only two need be addressed.
Eval: make.jump.map
(((DEFINE-INTERACTIVE-KEYMAP . JUMP.MAP) . (:EXIT-ON ((KBD "F7")))) ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Eval: (setf
make.jump.map (cons
(caar
make.jump.map) (cons
(cdar
make.jump.map) (cdr
make.jump.map))))
((DEFINE-INTERACTIVE-KEYMAP . JUMP.MAP) (:EXIT-ON ((KBD "F7"))) ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Eval: (setf
make.jump.map (cons
(caar
make.jump.map) (cons
(cdar
make.jump.map) (cdr
make.jump.map))))
(DEFINE-INTERACTIVE-KEYMAP JUMP.MAP (:EXIT-ON ((KBD "F7"))) ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Finally, evaluate the instruction and a new command is made (t.i. the chosen name) for evoking the interactive keymap. Assign a button to that command name.
Eval: (eval
make.jump.map)
#S(STUMPWM::COMMAND :NAME EXIT-JUMP.MAP :CLASS T :ARGS NIL)
: describe-key
F7 is not bound.
Eval: (define-key
*top-map* (kbd
"F7") "jump.map")
NIL
By default, the ESC button, or the Return button, or "Control-g" disables the interactive keymap, unless :exit-on was assigned in its options.
Consider a couple of instructions for larger or smaller jumps with +
and -
(CLHS 12.1.1 Numeric Operations).
Eval: make.jump.bigger
The variable MAKE.JUMP.BIGGER is unbound.Backtrace...
Eval: make.jump.littler
The variable MAKE.JUMP.LITTLER is unbound.Backtrace...
Eval: (setf
make.jump.bigger'
(setf jump.offset (+ jump.offset 16)))
Eval: (setf
make.jump.littler'
(setf jump.offset (- jump.offset 16)))
Eval: jump.offset
64
Eval: (eval
make.jump.bigger)
80
Eval: jump.offset
80
Eval: (eval
make.jump.littler)
64
Eval: jump.offset
64
Consider assigning a couple more buttons for those instructions. Either unwind the Lisp instruction for that interactive keymap until the button/command pairs are exposed, or simply reference the cDDDr
. Abdextrally cons the additional button/command pairs.
Eval: (cdddr
make.jump.map)
(((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd "g") "eval-line (eval make.jump.bigger)") (cdddr
make.jump.map)))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd "a") "eval-line (setf jump.offset (- jump.offset 16))") (cdddr
make.jump.map)))
Eval: make.jump.map
(DEFINE-INTERACTIVE-KEYMAP JUMP.MAP (:EXIT-ON ((KBD "F7"))) ((KBD "a") "eval-line (setf jump.offset (- jump.offset 16))") ((KBD "g") "eval-line (eval make.jump.bigger)") ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Rewind if necessary, then use eval
again. No need to re-assign the same button, because it is the same command name.
Eval: (eval
make.jump.map)
#S(STUMPWM::COMMAND :NAME EXIT-JUMP.MAP :CLASS T :ARGS NIL)
Consider including buttons for pointer activation and drag'n drop (Alternative for pointer activation and drag'n drop). Perhaps "h" for the primary button, with "u" for press and "m" for release.
Eval: press.1
The variable PRESS.1 is unbound.Backtrace...
Eval: release.1
The variable RELEASE.1 is unbound.Backtrace...
Eval: (setf
press.1'
(xlib/xtest:fake-button-event *display* 1 t))
Eval: (setf
release.1'
(xlib/xtest:fake-button-event *display* 1 nil))
Eval: (cdddr
make.jump.map)
(((KBD "a") "eval-line (setf jump.offset (- jump.offset 16))") ((KBD "g") "eval-line (eval make.jump.bigger)") ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd "u") "eval-line (eval press.1)") (cdddr
make.jump.map)))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd "m") "eval-line (eval release.1)") (cdddr
make.jump.map)))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd "h") "eval-line (cons(eval press.1)(eval release.1))") (cdddr
make.jump.map)))
Maybe ";" for the secondary button.
Eval: press.3
The variable PRESS.3 is unbound.Backtrace...
Eval: release.3
The variable RELEASE.3 is unbound.Backtrace...
Eval: (setf
press.3'
(xlib/xtest:fake-button-event *display* 3 t))
Eval: (setf
release.3'
(xlib/xtest:fake-button-event *display* 3 nil))
Eval: (setf
(cdddr
make.jump.map) (cons
'
((kbd ";") "eval-line (cons(eval press.3)(eval release.3))") (cdddr
make.jump.map)))
Confirm and re-evalutate.
Eval: make.jump.map
(DEFINE-INTERACTIVE-KEYMAP JUMP.MAP (:EXIT-ON ((KBD "F7"))) ((KBD ";") "eval-line (cons(eval press.3)(eval release.3))") ((KBD "h") "eval-line (cons(eval press.1)(eval release.1))") ((KBD "m") "eval-line (eval release.1)") ((KBD "u") "eval-line (eval press.1)") ((KBD "a") "eval-line (setf jump.offset (- jump.offset 16))") ((KBD "g") "eval-line (eval make.jump.bigger)") ((KBD "f") "eval-line (xlib:warp-pointer-relative *display* jump.offset 0)") ((KBD "s") "eval-line (xlib:warp-pointer-relative *display* (- jump.offset) 0)") ((KBD "d") "eval-line (xlib:warp-pointer-relative *display* 0 jump.offset)") ((KBD "r") "eval-line (xlib:warp-pointer-relative *display* 0 (- jump.offset))"))
Eval: (eval
make.jump.map)
#S(STUMPWM::COMMAND :NAME EXIT-JUMP.MAP :CLASS T :ARGS NIL)
bind
; unbind
A set of defined buttons are always available (except when typing in prompts) by means of the list of keymaps in *group-top-maps*, though indirectly.
By default, the *top-map* keymap has a button paired with the *root-map* keymap (StumpWM keymap: *top-map*). By default, the *root-map* keymap has the buttons for invoking prompts and querying for help (StumpWM keymap: *root-map*).
Invoking a command that provides an "interactive keymap" (StumpWM 3.2 Interactive Keymaps), f.e. the iresize
StumpWM command, displaces the *top-map* keymap with the keymap for the command [ The button listing for an "interactive keymap" itself has no name of its own (StumpWM version 1.0.1, "interactive-keymap.lisp": let
at 71, then 89). ] . There is no persistent indication what keymap is currently active, nor a default means for querying the button list of the *top-map* (Reveal buttons for stumpwm:*top-map*).
That means no access to the *root-map* keymap, thereby no access to prompts or Help documentation.
Experience steadfast access to a personally refined and fully-equipped keymap (Make a StumpWM keymap and pair a button), even during an "interactive keymap" as long as the stumpwm::*escape-key* is never paired to a command (There can be only one command).
A separate "top map" keymap with the stumpwm::*escape-key* assigned to the name of the new "root map" keymap that is desired to be always accessible. No need for the "root map" to exist yet.
Eval: resilient.top-map
The variable RESILIENT.TOP-MAP is unbound.Backtrace...
Eval: (setf
resilient.top-map (stumpwm::make-kmap
))
Eval: resilient.root-map
The variable RESILIENT.ROOT-MAP is unbound.Backtrace...
Eval: (define-key
resilient.top-map stumpwm::*escape-key*'
resilient.root-map)
Modify the list of "top map" keymaps listed within stumpwm:*group-top-maps* either before or after its new "root map" keymap is ready (Requirement #1: "top map" + "root map"). Either add another "top map" to the list, or remove any that are undesired, or replace the whole list.
Eval: *group-top-maps*
((STUMPWM::FLOAT-GROUP STUMPWM::*FLOAT-GROUP-TOP-MAP*) (STUMPWM::TILE-GROUP STUMPWM::*TILE-GROUP-TOP-MAP*) (GROUP STUMPWM::*GROUP-TOP-MAP*))
Eval: (setf
*group-top-maps*'
((group resilient.top-map)))
((GROUP RESILIENT.TOP-MAP))
A group-type must precede each "top map", f.e. group, and the same type is fine. Each specified "top map" keymap must exist at least as a blank keymap, but never unbound nor nil [ Otherwise, the screen becomes blank and the buttonboard unresponsive. However, disconnecting and reconnecting the power to the computer has worked for restarting it, so far. ] . The leftmost "top map" in *group-top-maps* will have its buttons listed first when queried with "?", and its assigned buttons favored over the same buttons in later keymaps.
Eliminating the three default "top map" keymaps reduces the "Control-t" menu to only the stumpwm:*root-map*. That is fine because that has the command abbreviations for all the prompts (Interactive curiosity), as well as the Help keymap "Control-t h" abbreviations.
Ensure desired commands are available from *group-top-maps*, then undefine from the *top-map* the stumpwm::*escape-key* for the *root-map*.
The setf
can set multiple memos at once (An intro for Lisp with StumpWM).
A "top map" must exist as a keymap before adding it to *group-top-maps* (Requirement #2: stumpwm::*group-top-maps*). The stumpwm::fill-keymap
needs named memory that references only nil (Fill a StumpWM keymap).
Eval: (setf
sturdy.top (stumpwm::make-kmap
) *group-top-maps*'
((group sturdy.top)) sturdy.root nil)
Provide a substitute keymap for the "root map" of the new "top map", perhaps filling a new keymap (Examples of custom keymaps).
Eval: (stumpwm::fill-keymap
sturdy.root (kbd
";") "colon")
Ensure the new "root map" is associated with its "top map" before undefining the *root-map* from *top-map*.
Otherwise, the only commands available will be whatever is still defined in the *top-map* (usually none), and the "root map" associated with each "top map" listed in *group-top-maps* (Requirement #2: stumpwm::*group-top-maps*).
Eval: (define-key
sturdy.top stumpwm::*escape-key*'
sturdy.root)
Eval: (define-key
*top-map* stumpwm::*escape-key* nil)
Thereon, define additional buttons for the "root map" of any "top map" of *group-top-maps* with the define-key
.
Prefix: C-t
b bind
StumpWM provides two conveniences for defining and undefining buttons specifically in the *root-map*: bind
and unbind
.
In contrast to define-key
, no need to specify the *root-map* and no need for the kbd
. Additionally, no need for double-quotes when invoking them as commands with colon
(StumpWM keymap: *root-map*).
As aforementioned, availability of the *root-map* is unreliable by default (Steadfast and resilient: escape key to pursuit or curiosity). Consider adding the *root-map* to the *group-top-maps* list, thereby having bind
and unbind
for convenient button changing.
A "top map" is needed for the *root-map* when adding it to *group-top-maps* (Requirement #2: stumpwm::*group-top-maps*). Either name a new "top map" with the setf
and add it to *group-top-maps* list, or repurpose an undesired one in *group-top-maps*.
Then, undefine from the *top-map* the stumpwm::*escape-key* for the *root-map*.
Eval: *group-top-maps*
((STUMPWM::FLOAT-GROUP STUMPWM::*FLOAT-GROUP-TOP-MAP*) (STUMPWM::TILE-GROUP STUMPWM::*TILE-GROUP-TOP-MAP*) (GROUP STUMPWM::*GROUP-TOP-MAP*))
Eval: (setf
*group-top-maps* (cddr
*group-top-maps*))
((GROUP STUMPWM::*GROUP-TOP-MAP*))
Eval: (define-key
*group-top-map* stumpwm::*escape-key*'
*root-map*)
Eval: (define-key
*top-map* stumpwm::*escape-key* nil)
Ensure the *root map* is associated with its new "top map" before undefining the *root-map* from *top-map*.
Otherwise, the only commands available will be whatever is still defined in the *top-map* (usually none), and the "root map" associated with each "top map" listed in *group-top-maps* (Requirement #2: stumpwm::*group-top-maps*).
Consider replacing the contents of *root-map* with a new personalized keymap (Examples of custom keymaps). Perhaps start over with only the bind
command, then add additional buttons easily by invoking the bind
command.
Eval: (setf
new.map nil)
Eval: (stumpwm::fill-keymap
new.map (kbd"b") "bind")
Eval: (setf
*root-map* new.map)
Immediately setting the *root-map* to a blank keymap is more direct, but that would eliminate all of its buttons, therefore the prompts would be unavailable. In that case, consider defining at least the bind
command in it at the same time (Multiple instructions at once).
Eval: (cons
(setf
*root-map* (stumpwm::make-kmap
)) (bind
"b" "bind"))
Prefix: C-t
b bind
; colon
Then, invoke the bind
and consider adding the colon
command immediately for access to all commands (Invoke a StumpWM command by its name), and anything else gradually.
Key Chord: ;
Command: colon
Prefix:
ESC colon
The smallest keymap is only one button, therefore only one command. A truly single button has no modifiers, f.e. no Control button.
Assign the command to the stumpwm::*escape-key* button of the *top-map* keymap, then all the default keymaps become unavailable (Just one command from the stumpwm::*escape-key* button).
Change the stumpwm::*escape-key* from its default "C-t" by invoking the set-prefix-key
(Invoke a StumpWM command by its name). Type the name of an unmodified button, f.e. ESC for the ESC button, or F12 for the F12 button, or any letter or number (Type the stumpwm::*escape-key* button).
Key: ESC
The colon
command does everything, because it provides the prompt for invoking any StumpWM command (Invoke a StumpWM command by its name). Define for the *top-map* keymap the stumpwm::*escape-key* button with the colon
command.
Eval: (define-key
*top-map* stumpwm::*escape-key* "colon")
Invoke the commands
command for a list of all StumpWM commands (Invoke a StumpWM command by its name). Invoke the eval-line
and evaluate define-key
for the *top-map* keymap for pairing other buttons with commands as desired (Pair a button with a command or keymap).
Consider enabling the button list for the *top-map* (Reveal buttons for stumpwm:*top-map*).
Prefix: j
b bind
Beginning from scratch means everything desired emerges when it is desired.
Eliminate or displace all default StumpWM keymaps. Repurpose the *root-map* as the sole keymap. Begin with only the bind
command for pairing additional buttons with commands when desired.
The set-prefix-key
is a command (Invoke a StumpWM command by its name). It prompts with "Key: " for the name of the button to set as the stumpwm::*escape-key* (The stumpwm::*escape-key* button).
Key: j
The *root-map* keymap is modifiable with the convenience commands bind
and unbind
. Repurposing it and eliminating all other default keymaps leaves only the *root-map* keymap (Example #2: repurpose default StumpWM keymaps).
Eval: (define-key
*group-top-map* stumpwm::*escape-key*'
*root-map*)
Eval: (define-key
*top-map* stumpwm::*escape-key* nil)
Eval: (setf
*group-top-maps* (cddr
*group-top-maps*))
((GROUP STUMPWM::*GROUP-TOP-MAP*))
Replace the *root-map* keymap with a blank keymap, and add the bind
command for adding additional buttons gradually as needed. Must do both within the same invocation of the eval-line
(Multiple instructions at once).
Eval: (cons
(setf
*root-map* (stumpwm::make-kmap
)) (bind
"b" "bind"))
Prefix: j
j send-escape
o pull-hidden-other
l windowlist
; colon
e eval-line
r run-shell-command
t echo-date
[ ...describe... ]
Prefix: C-t
; colon
m lastmsg
g *GROUPS-MAP*
h *HELP-MAP*
b bind
u unbind
e eval-line
r run-shell-command
t time
o pull-hidden-other
l windowlist
h hsplit
v vsplit
R remove-split
f fselect
= balance-frames
C-t send-escape
There are a lot of duplicate commands in the default *root-map* keymap (Stumpwm keymap: *root-map*).
It is also perhaps a bit over prepared for managing groups of frames. Similar commands are already being kept in the stumpwm::*group-root-map* keymap and the *groups-map* keymap.
The bind
and the unbind
commands make modifying the *root-map* very convenient. Either invoke them by name (Invoke a StumpWM command by its name) each time, or add them to the *root-map*, at least temporarily.
: bind
Key Chord: b
Command: bind
Key Chord: u
Command: unbind
Eliminate the duplicates with the unbind
by typing the name (no need for "double-quotes"), and perhaps unbind the extra commands for groups, too.
Key Chord: C-c
Key Chord: C-e
...
Key Chord: F1
...
The *root-map* already has the commands for the basic prompts (Interactive curiosity: typing for actions and help), but maybe rebind them to more familiar buttons. Consider adding or rebinding some basic view management commands with the bind
, too (Essential split-view commands).
Key Chord: o
Command: pull-hidden-other
Key Chord: l
Command: windowlist
Key Chord: h
Command: hsplit
Key Chord: v
Command: vsplit
...
Consider making the send-escape
more convenient (Typing the stumpwm::*escape-key* button).
Eval: (define-key
*root-map* stumpwm::*escape-key* "send-escape")
Prefix: ESC
ESC send-escape
F1 pull-hidden-other
F2 windowlist
F3 echo-date
1 colon
2 eval-line
3 run-shell-command
w where-is
d describe-command
f describe-function
v describe-variable
k describe-key
z lastmsg
x remove.message
c copy-last-message
/ help.top-map
Prepare a list of some basic needs. Consider buttons near the ESC button the stumpwm::*escape-key*.
_____ _____ _____ _____ .. | | | | | | ESC | F1 | F2 | F3 | |_____|_____|_____|_____|.. | | | | | | ` | 1 | 2 | 3 | |_____|_____|_____|_____|.. : : : : :
A way to type the stumpwm::*escape-key* button.
stumpwm::*escape-key* "send-escape"
The pull-hidden-other
command is for quickly switching back and forth between the current program and the previously viewed program. The windowlist
command provides a list of all programs for choosing one with the arrow buttons.
(kbd"F1") "pull-hidden-other" (kbd"F2") "windowlist"
A button for the stumpwm:echo-date
command.
(kbd "F3") "echo-date"
The colon
commmand is perhaps the only command needed, as it provides the prompt for all StumpWM commands. It also lists all commands with the commands
command (Invoke a StumpWM command by its name).
Otherwise, consider assigning buttons for the other various prompts, too, and the Help commands for them (Interactive curiosity).
(kbd "1") "colon" (kbd "2") "eval-line" (kbd "3") "run-shell-command" (kbd "w") "where-is" (kbd "d") "describe-command" (kbd "f") "describe-function" (kbd "v") "describe-variable" (kbd "k") "describe-key"
Remove from the screen an error message or the Help message from the "describe" commands (Remove the message from the screen). Temporarily re-view the last message, or the message prior the most recently re-viewed. Copy the message most recently viewed or re-viewed (Insert text into a prompt).
(kbd "z") "lastmsg" (kbd "x") "remove.message" (kbd "c") "copy-last-message"
A new command for revealing the buttons defined for the stumpwm:*top-map* (Reveal buttons for stumpwm:*top-map*).
(kbd "/") "help.top-map"
Either add each to the beginner keymap with the bind
(The beginner keymap), or create a new keymap with stumpwm::fill-keymap
as a replacement "root map".
Eval: (setf
personal.map nil)
Eval: (stumpwm::fill-keymap
personal.map stumpwm::*escape-key* "send-escape" (kbd
"F1")"pull-hidden-other" (kbd
"F2")"windowlist" (kbd
"F3")"echo-date" (kbd
"1")"colon" (kbd
"2")"eval-line" (kbd
"3")"run-shell-command" (kbd
"w")"where-is" (kbd
"d")"describe-command" (kbd
"f")"describe-function" (kbd
"v")"describe-variable" (kbd
"k")"describe-key" (kbd
"z")"lastmsg" (kbd
"x")"remove.message" (kbd
"c")"copy-last-message" (kbd
"/")"display.top-map")
Either gently disassociate the stumpwm:*root-map* from the stumpwm:*top-map* by assigning the stumpwm::*escape-key* to the replacement keymap, or obliterate the stumpwm:*root-map* by setting it to the new keymap with setf
.
Eval: (define-key
*top-map* stumpwm::*escape-key*'
personal.map)
Change the stumpwm::*escape-key* to the ESC button (Change the stumpwm::*escape-key* button). Simply invoke the set-prefix-key
by its name (Invoke a StumpWM command by its name), then type the three letters of the name of the
Key: ESC
Consider creating a new "top map" for *group-top-maps* with access to this keymap (Steadfast and resilient: escape key for pursuit or curiosity).
Consider buttons for setting and syncing the *top-map* with custom keymaps. Perhaps use the numbers zero through nine.
(setf
replace.top-map'
(defun replace.top-map (Fnew-map) "Replace the *top-map* with the Fnew-map keymap." (setf *top-map* Fnew-map) (stumpwm::sync-keys)))
Consider a blank keymap for resetting the stumpwm:*top-map* keymap.
(kbd "0") "eval-line (replace.top-map (stumpwm::make-kmap))"
define-key
stumpwm::print-key
set-prefix-key
send-escape
;
stumpwm::*escape-fake-key*
Outside of the StumpWM prompts, the stumpwm::*escape-key* button is the first button for any abbreviation in the default StumpWM keymaps (A resilient set of keymaps).
The stumpwm::*escape-key* button is the only button StumpWM persistently intercepts from the Xserver. It is the reliable entry point for accessing a StumpWM command regardless of what happens to the *top-map* keymap (StumpWM keymap: *top-map*).
In other words, typing the stumpwm::*escape-key* button is meant to temporarily change the layout for the buttonboard for the next typed button (Understanding buttonboard keymaps), but with no need to hold the button. That very next button typed invokes the command associated with it, or temporarily changes the layout to yet another keymap for the next typed button.
It can be defined in the *top-map* for a command instead (There can be only one command), in which case that command will be invoked instead of changing the buttonboard layout to the keymaps of *group-top-maps* (A resilient set of keymaps). That might happen unintentionally when replacing the *top-map* with another keymap [ Any changes to *top-map* by means of setf
should be immediately followed by the sync-keys
instruction. ] , such as the interactive keymap from the iresize
.
It is "C-t" by default, which means hold the Control button before typing the letter t.
Eval: (stumpwm::print-key
stumpwm::*escape-key*)
"C-t"
Consider changing the stumpwm::*escape-key* to another button, perhaps without need for a modifier button like Control or Alt (Change the stumpwm::*escape-key* button). For example, the very convenient "j" might be rather uncommonly typed, or perhaps "q" or "z".
When typing in other programs, the stumpwm:send-escape
command enables typing whatever the stumpwm::*escape-key* button itself would be normally, instead of the keymap or command paired to the button (Type the stumpwm::*escape-key* button).
Pair the stumpwm::*escape-key* with a command in the*top-map*, then that is the only StumpWM command that can be invoked with it.
Most useful is the stumpwm:colon
command (Invoke a StumpWM command by name), because any command can be invoked by name. The next time, use the up arrow button once in the prompt to recall the name previously typed (Typing within a line of text).
Eval: (define-key
*top-map* stumpwm::*escape-key* "colon")
Invoke the stumpwm:send-escape
command to type the stumpwm::*escape-key* button itself normally. Just type "sen" in the prompt and then the TAB button to automaticaly complete the name. Compare that to its default abbreviation "Control-t t" which uses a sequence of buttons unrelated to the name, and is typed invisibly.
: send-escape
Easily restore the *root-map* keymap, or any other keymap, whenever desired (Merge any keymap with the resilient keymaps).
: eval-line
Eval: (define-key
*top-map* stumpwm::*escape-key*'
*root-map*)
Never pair the stumpwm::*escape-key* with anything in the*top-map*, then the set of StumpWM keymaps specified in *group-top-maps* is immediately accessible with it (Requirement #2: stumpwm:*group-top-maps*).
Eval: *group-top-maps*
((STUMPWM::FLOAT-GROUP STUMPWM::*FLOAT-GROUP-TOP-MAP*) (STUMPWM::TILE-GROUP STUMPWM::*TILE-GROUP-TOP-MAP*) (GROUP STUMPWM::*GROUP-TOP-MAP*))
By default, they include commands for groups of framed views in StumpWM.
Type the stumpwm::*escape-key* button and then a question mark "?" to reveal their combined list of buttons (Make a StumpWM keymap and pair a button). Or, pair a button to one of the keymaps, and then use that button with a question mark to reveal its listing separately.
Modify any of the default keymaps with the define-key
, or replace any with the setf
and the stumpwm::make-kmap
(Make a StumpWM keymap and pair a button). Consider supplanting them with a different set of keymaps, or simply one keymap (Steadfast and resilient: escape key for pursuit or curiosity).
Pair the stumpwm::*escape-key* with a keymap in the*top-map* and the buttons of that keymap are grouped with buttons from the *group-top-maps* keymaps (A resilient set of keymaps for the stumpwm::*escape-key* button).
For example, the stumpwm:*root-map* is paired the stumpwm::*escape-key* in the *top-map* by default (StumpWM keymap: *top-map*).
Eval: (define-key
*top-map* stumpwm::*escape-key*'
*root-map*)
The stumpwm::*escape-key* is actually a key description. Reveal the button name with the stumpwm::print-key
instruction.
Eval: stumpwm::*escape-key*
#S(STUMPWM::KEY :KEYSYM 116 :SHIFT NIL :CONTROL T :META NIL :ALT NIL :HYPER NIL :SUPER NIL)
Eval: (stumpwm::print-key
stumpwm::*escape-key*)
"C-t"
The stumpwm:set-prefix-key
instruction is for changing the stumpwm::*escape-key* button. It also changes the stumpwm::*escape-fake-key* button, which is paired with send-escape
in the *root-map* by default (StumpWM keymap: *root-map*).
For example, the default "C-t" for the stumpwm::*escape-key* means the stumpwm::*escape-fake-key* is "t", therefore the send-escape
is invoked by "Control-t t". Changing to "C-s" with the set-prefix-key
automatically re-assigns the stumpwm::*escape-fake-key* to "s", therefore the send-escape
becomes "Control-s s".
Eval: (set-prefix-key
(kbd
"C-s"))
Eval: stumpwm::*escape-key*
#S(STUMPWM::KEY :KEYSYM 115 :SHIFT NIL :CONTROL T :META NIL :ALT NIL :HYPER NIL :SUPER NIL)
Eval: (stumpwm::print-key
stumpwm::*escape-key*)
"C-s"
Eval: (stumpwm::print-key
stumpwm::*escape-fake-key*)
"s"
: where-is Where is command: send-escape
"send-escape" is on C-s s.
Specifically, the set-prefix-key
ensures when the stumpwm::*escape-key* is assigned a button needing modifier buttons such as Control or Meta, that the stumpwm::*escape-fake-key* is without such modifier buttons.
Interestingly, even a single alphabetic or numeric button can be assigned as the stumpwm::*escape-key* button. As a lowercase letter, the uppercase can be typed without the send-escape
command, and the reverse is also true [ However, be sure to assign the capital letter as is rather than with "S-", f.e. "J" rather than "S-j". The latter has seemed untypable or unnoticible by StumpWM. ].
Eval: (set-prefix-key
(kbd
"j"))
: where-is Where is command: send-escape
"send-escape" is on j NIL.
Unfortunately, the set-prefix-key
will assign the untypable "NIL" [ "Control-@" or ^@ is NUL ] as a button to stumpwm::*escape-fake-key* when the stumpwm::*escape-key* is set to a button without modifiers such as Control or Meta.
In that case, it is impossible to use the send-escape
from the default keymap. On the other hand, including such modifier buttons the next time set-prefix-key
is invoked will enable the stumpwm::*escape-fake-key* again, thereby the button for the send-escape
, too.
Otherwise, simply assign a different button directly for the send-escape
(Pair a button with a command or keymap), or even invoke it by name (Invoke a StumpWM command by its name).
Rest assured, it is always possible to type normally in a StumpWM prompt. Neither the stumpwm::*escape-key* button nor the *top-map* is ever in effect in the StumpWM prompts (Typing within a line of text).
When typing in other programs, the stumpwm:send-escape
command enables typing whatever the stumpwm::*escape-key* button itself would be normally, instead of the keymap or command paired to the button.
That means the stumpwm::*escape-key* button can be a letter or number, because it can still be typed normally when needed (Change the stumpwm::*escape-key* button).
For example, after defining the stumpwm::*escape-key* as the "j" button, typing the "j" button either temporarily activates the collection of keymaps from the *group-top-maps*
list (A resilient set of keymaps), or it invokes a command that has been paired either to the stumpwm::*escape-key* or to "j" in the *top-map* (There can be only one command). Invoking the send-escape
command types an actual "j", but no need for it when simply typing a capital "J" (Change the stumpwm::*escape-key* button).
The stumpwm::*escape-fake-key* button is paired with the send-escape
in the *root-map* by default. The stumpwm:where-is
command reveals the abbreviation for send-escape
(Invoke a StumpWM command by its name).
Eval: (stumpwm::print-key
stumpwm::*escape-key*)
"C-t"
Eval: (stumpwm::print-key
stumpwm::*escape-fake-key*)
"t"
: where-is Where is command: send-escape
"send-escape" is on C-t t.
The button for the stumpwm::*escape-key* is probably easiest to type when send-escape
is the same button, with or without a modifier button like Control. However, the pull-hidden-other
command has been favored instead for that sameness in the *root-map* by default (StumpWM keymap: *root-map*).
Consider swapping the two buttons for those two commands.
Eval: (define-key
*root-map* stumpwm::*escape-key* "send-escape")
Eval: (define-key
*root-map* stumpwm::*escape-fake-key* "pull-hidden-other")
Or, choose an entirely different button, and undefine stumpwm::*escape-key* and/or stumpwm::*escape-fake-key* in the *root-map*.
Eval: (define-key
*root-map* stumpwm::*escape-fake-key* nil)
Eval: (define-key
*root-map* (kbd
"o") "pull-hidden-other")
Prefix:
C-t *ROOT-MAP*
There is no default button paired with the *top-map* keymap, as there is no need. It is always active.
By default the *top-map* has only one button defined, the stumpwm::*escape-key* (The stumpwm::*escape-key* button).
Eval: (stumpwm::print-key
stumpwm::*escape-key*)
"C-t"
That button is associated with the *root-map* keymap (StumpWM keymap: *root-map). Any keymap paired with the stumpwm::*escape-key* button within the *top-map* keymap is combined with the three other default keymaps (A specific set of keymaps for the stumpwm::*escape-key* button).
All other buttons are available for normal typing in other programs, including any abbreviations other programs might have.
Prefix: F12
C-t *ROOT-MAP*
F12 *TOP-MAP*
Like with any other keymap, pairing a button with the *top-map* allows for typing that button and then a question mark "?" to reveal its listing (Make a StumpWM keymap and pair a button).
: describe-key
F12 is not bound.
Eval: (define-key
*top-map* (kbd
"F12")'
*top-map*)
Unfortunately, that also makes the *top-map* recursive, which interferes with describe-key
and where-is
commands, and causes StumpWM to crash and restart. Instead, consider making a new StumpWM command for revealing the buttons for the *top-map* (Reveal buttons for stumpwm:*top-map*).
The stumpwm::sync-keys
instruction must be used whenever replacing the *top-map* with another keymap. Consider evaluating both instructions at once (Two instructions at once).
Eval: (cons
(setf
*top-map* another-keymap) (stumpwm::sync-keys
))
Prefix: F12
c exec xterm
C-c exec xterm
e emacs
C-e emacs
b banish
C-b banish
a time
C-a time
! exec
C-g abort
t send-escape
; colon
: eval
v version
m lastmsg
C-m lastmsg
G vgroups
g *GROUPS-MAP*
x *EXCHANGE-WINDOW-MAP*
F1 gselect 1
F2 gselect 2
F3 gselect 3
F4 gselect 4
F5 gselect 5
F6 gselect 6
F7 gselect 7
F8 gselect 8
F9 gselect 9
F10 gselect 10
h *HELP-MAP*
Assign a button to the *root-map*. Type the button and then a question mark "?" to reveal its listing.
: describe-key
F12 is not bound.
Eval: (define-key
*top-map* (kbd
"F12")'
*root-map*)
The *root-map* keymap has command abbreviations for invoking prompts. It also has a few buttons assigned to other keymaps, such as for Help documentation.
Initially, the *root-map* is available only because it is paired with the stumpwm::*escape-key* button in the *top-map* (StumpWM keymap: *top-map*).
StumpWM provides two conveniences for defining and undefining buttons specifically in the *root-map*: bind
and unbind
.
In contrast to define-key
, no need to specify the *root-map* and no need for the kbd
.
Eval: (unbind
"F1")
Eval: (bind
"o" "pull-hidden-other")
Additionally, no need for double-quotes for the button name or command when invoking bind
or unbind
as commands with the colon
(Invoke a StumpWM command by its name).
: bind
Key Chord: l
Command: windowlist
: unbind
Key Chord: F2
Prefix: F12
(EMPTY MAP)
Assign a button to the stumpwm::*float-group-root-map*. Type the button and then a question mark "?" to reveal its listing.
: describe-key
F12 is not bound.
Eval: (define-key
*top-map* (kbd
"F12")'
stumpwm::*float-group-root-map*)
[ ...apparently intentionally left empty, but describe anyway... ]
Prefix: F12
v describe-variable
f describe-function
k describe-key
c describe-command
w where-is
Discover the command assigned to a button by using "Control-t h k" for the describe-key
command (Invoke a StumpWM command by its name). Fail to completely type the "h" and kill a program with delete-window
instead. Disaster.
Consider making the Help commands more convenient, and averting a none too happy slip, by choosing a single button for the stumpwm:*help-map* keymap. Check it by typing the new button then the "?".
: describe-key
F12 is not bound.
Eval: (stumpwm:define-key
stumpwm:*top-map* (stumpwm:kbd
"F12") (quote
stumpwm:*help-map*))
Or, use the abbreviated names (Optional or required collection names).
Eval: (define-key
*top-map* (kbd
"F12")'
*help-map*)
There are about a half-dozen essential StumpWM commands for splitting the screen area for viewing different documents and programs.
StumpWM favors abbreviations for its commands (StumpWM 2. Key Bindings), short sequences of buttons for its predefined sets of instructions. One of those commands also provides a prompt for visibly typing any command name (Invoke a StumpWM command by its name).
StumpWM uses "Control-t" as the prefix for segregating its own commands from other programs (The stumpwm::*escape-key* button). Use the Control button in the same manner as the Shift button, t.i. hold the Control button before typing a letter (skip the hyphen), then afterwards let go of it.
Though typing a button sequence is invisible, typing a prefix like "Control-t" in Stumpwm changes the pointer cursor from an X or arrow into a square as an indicator until the button sequence is completed or canceled.
pull-hidden-other
— Switch to the prior hidden program or document.
windowlist
— Select a hidden document or program from a list.
hsplit
— Split frame or screen in half.
remove-split
— Remove a frame.
balance-frames
— Equally divide width and height of screen amongst frames.
fselect
— Select another split-view frame by number.
All StumpWM commands are in the "stumpwm:" collection. That collection name can be included for the commands, f.e. stumpwm:fselect
, but is unnecessary for them.
There are some details that might be worth noting for each of those essential StumpWM commands.
Show the abbreviations for StumpWM commands prefixed with "Control-t".
Invoking any command will remove that message from the screen.
Also shows at its top "Prefix: " with the name of the StumpWM prefix button. That means the prefix must be typed first before typing any of the listed buttons for their commands.
Note "C-" means hold the Control button before typing the next letter or character.
Note "M-" means hold the Meta button before typing the next letter or character. The Meta button is probably the same as either the Alt button or the Option button, depending on the buttonboard.
Note the "*HELP-MAP*" entry for "h" means "Control-t h" is another prefix. Therefore, type "Control-t h ?" to show the commands of that keymap (StumpWM keymap: *help-map*).
Note typing a button for any keymap then a question mark "?" will list all the abbreviations assigned to that keymap (Make a StumpWM keymap and pair a button).
pull-hidden-other
Show the most recently hidden document or program, while hiding the current one.
windowlist
List all managed documents and programs. Select one with the arrow buttons, then type the Return button or Enter button. The current document or program will be hidden, and the selected item will be shown. Or, type the ESC button to cancel.
Typing a letter or a sequence of letters will reduce the list to items matching that. The arrow buttons can still be used to select from the reduced list, but the typed letters disappear. Typing letters again will start over. Deleting the letters will start over.
hsplit
Split in half the width of the current frame, which makes room for another document or program, especially the most recently hidden.
Note that is a capital S, the same as Shift-s.
Note typing a lowercase s instead invokes vsplit
for splitting in half the height of the current frame.
remove-split
Remove the current frame and hide the document or program that was in it.
Note that is a capital R, the same as Shift-r.
Note typing a lowercase r instead begins interactive resize (iresize
) of current frame (when more than one frame) by means of the arrow buttons. Up and left decrease the frame size; down and right increase the frame size. The ESC button finishes resizing.
Many default button bindings for StumpWM commands are temporarily removed until resizing is completed. Consider that possibility when messages appear unexpectedly stating a button sequence is "not bound". Try typing the ESC button for finishing an interactive command. When effective, a confirmation message appears as either "finished." or "Abort.".
balance-frames
Equally divide width and height of screen amongst frames.
Consider splitting the screen into three frames and then equalize them. Each frame is then one-third the screen. Then remove one of the frames. Two frames remain: one frame is two-thirds, and the other is one-third.
fselect
Select another split-view frame. Type the number or letter that temporarily appears in the upper left corner of each split-view frame, or type the ESC button to cancel.
The split-view manager StumpWM is a Lisp image exported from SBCL (Steel Bank Common Lisp), and is intended for managing the Xwindows of an Xserver (Essential split-view commands).
Split-views are adjacent non-intersecting areas, like tiles, thereby efficiently encompassing the whole screen. Initially, StumpWM was known as "ratpoison" because it focused on eliminating the electronic rodent (mouse) and the toggling of its buttocks.
As an SBCL Lisp image, StumpWM is actually a copy of the SBCL Lisp interpreter with the code for StumpWM pre-loaded. That means starting StumpWM is the same as starting a Lisp interpreter, and any new Lisp can be typed and evaluated instantly.
While it is typical to modify a Lisp interpreter while using it, in this case that means being able to modify StumpWM while using StumpWM, too. No need to start over, just keep going.
Additionally, StumpWM is written entirely in Common Lisp, and SBCL is written mostly with Common Lisp. So, both the Xwindow manager and the Lisp environment can be personalized with the familiarity of Common Lisp, either instantly or for a permanent copy.
Eval:
After starting the Xserver with StumpWM as the Xwindows manager, access the Lisp interpreter anytime with "Control-t :" (Compose a Lisp instruction). That is, hold the Control button then type the letter t, then let go of the Control button, then type a colon. The prompt "Eval: " will appear for typing a line of Common Lisp.
Personalize StumpWM with its initialization file "~/.stumpwm.d/init.lisp", such as assigning names to Lisp instructions or assigning buttons to evaluate them. Include Lisp from other files when starting by using load
(CLHS).
(load
"~/common-lisp/something-new-with-lisp")
Instantly assign a button to any command, create a new Xserver Xwindow and draw in it, or add more commands from any file with load
, all with the Lisp instruction prompt (...an outlet for ingenuity). In a nutshell: an interactive extensible computer interface.
A "window" is a misnomer for a designated area, typically rectangular. An area is simply the coordinates for its left-top corner associated with its width and height (rather than its kittycorner coordinates): (x, y) (w, h).
Various shapes within an area are displayed by declaring two different colors (background and foreground), the type of shape, and the method of merging the intersection with other prior drawn shapes within the same area. That is, each area constrains its own content, but shapes merge by a variety of methods (sixteen) within the area, f.e. merging of a red shape and a blue shape can make their intersection purple.
Abutting each designated area along their edges is akin to tiling the areas, such as when creating split-views. The X Window System protocol limitedly supports intersection of the designated areas themselves by means of a single priority list for the areas. Intersecting areas of higher priority are subtracted from areas of lesser priority, like what remains as each area is cut from a piece of paper.
Therefore, the designated area that has the highest priority maintains its rectangular shape because it has no intersecting areas subtracted from it. The other areas maintain their shape when intersecting only lesser priority shapes, if any intersection at all. This also implies there is no true transparency effect for an area, because designated areas are only subtracted and never merged.
In other words, the designated areas are meant to be rectangular and their intersections are subtracted, whereas a variety of additionally described shapes can merge with each other within a single designated area.
Furthermore, a designated area can have areas designated within its bounds prioritized amongst themselves, but those internal areas are forbidden from extending beyond the outer area. Obviously, those subregions are intersecting with whatever shapes have been described within the overall area, but only by means of subtraction because they are designated areas instead of shapes.
A pixmap, t.i. a picture map, is a simple list of dots (pixels) associated with a color for each dot. The content of a designated area can be exported as a pixmap. A pixmap can be applied fully or partially anywhere within any area, and can be assigned as the background of any area. The Xserver automatically applies the background of a designated area for the pixels that area has priority, but any other described content is managed separately by external software (t.i. a client) when it receives notifications from the Xserver.
An intersection is visibly changed by the higher priority area for that intersection. As such, a designated area with no content and no background seemingly acquires all pixels within its boundaries from either the overall backdrop of the Xserver or from lesser priority areas, with no further visible changes from modifications of intersections with lesser priority areas.
Acceptable color names are the X11 rgb colors (freedesktop.org), which might be also located on the computer with the Xserver as "/usr/local/share/X11/rgb.txt".
Acceptable RGB hexadecimal numbers for the red, green, and blue hues of a color are similar to HTML colors, with an octothorpe # followed by either three or six digits.
Hex # 0 1 2 3 4 5 6 7 8 9 A B C D E F Red 0 1 2 3 4 5 6 7 8 9 a b c d e #f00 or #ff0000 Green 0 1 2 3 4 5 6 7 8 9 a b c d e #0f0 or #00ff00 Blue 0 1 2 3 4 5 6 7 8 9 a b c d e #00f or #0000ff All 3 #fff or #ffffff
For example, orange is either "orange" or "Orange". As a hexadecimal number, orange is more red than green, like "#f60", "#D40", or "#FA8038". Compare with "yellow" which is red and green somewhat equal, like "#ff0".
Each button on a buttonboard has an id often known as a "keycode". A symbol or icon on a button is often known as a "key symbol" or "keysym". Associating a keysym with a keycode is often known as "keymapping". Changing the keysym associated with a keycode is often known as "remapping".
The Xserver keeps a list of keycodes for the buttons on a buttonboard, and each keycode is associated with seven keysyms (U.S. English). For example, the button labeled with "A" likely has the keysyms for at least "a" and "A".
Use the Lisp instruction prompt (...an outlet for ingenuity) to discover the keycode for a button after it is typed by using the xlib:grab-key
, the stumpwm::read-key
(two colons!), and the xlib:ungrab-key
functions.
Eval: (xlib:grab-key
(stumpwm:screen-root
(stumpwm:current-screen
) :any))
42004
Eval: (stumpwm::read-key
)
(66 . 0)
Eval: (xlib:ungrab-key
(stumpwm:screen-root
(stumpwm:current-screen
) :any))
46422
The stumpwm::read-key
instruction (StumpWM version 1.0.1, "input.lisp": 262–267) reveals the keycode for the next button pressed, paired with a number representing which modifiers were active. No prompt. Only the keycode (the left half) is useful for the purpose of remapping. A button used as a modifier, like Shift, will reveal its own keycode when it is pressed by itself.
Eval: (stumpwm::read-key
)
(28 . 4)
Eval: (car
(stumpwm::read-key
))
28
However, StumpWM normally grabs only the keys that were defined for commands, like the "Control-t" prefix. According to the documentation for xlib:grab-key
, use :any (with the colon) as the keycode for accepting any button pressed.
The xlib:grab-key
needs both an Xwindow and a keycode, and then returns a number that has nothing to do with keycodes, so ignore that number. StumpWM provides screen-root
for extracting the root Xwindow from the results of the current-screen
instruction. The root Xwindow for the current screen is often appropriate for generic introspection like this.
Predictably, specifying :any like this means StumpWM will notice any button pressed. Thereby, StumpWM will seek a command defined for each, and provide a message each time that fails. Obviously, this interferes with using other programs. Conveniently, StumpWM ceases looking for commands whenever it provides a prompt, like for Lisp evaluation.
In the mean time, use stumpwm::read-key
from the Lisp instruction prompt. It will now reveal the keycode for the very next button pressed, even for a button like Caps Lock. Write on paper the label on the desired button, press the button, then write on the paper the keycode (the left half) that is revealed. Keycodes are often somewhat sequenced from left to right, top to bottom on a buttonboard.
Use stumpwm::read-key
again for another button, or use the xlib:ungrab-key
instruction with the exact same info that was given to xlib:grab-key
to return typing to normal. Just like xlib:grab-key
, the xlib:ungrab-key
produces an arbitrary number, no need to record it.
The only difference between the grab/ungrab instructions is the "un" of xlib:ungrab-key
. Recall, the up/down arrow buttons in the evaluation prompt reveal the prior/next lines that were typed, for less re-typing (The Lisp instruction prompt: an outlet for ingenuity). The Home button or "Control-a" moves the text cursor to the beginning of the line in the prompt quicker than the left arrow button.
For a bit more convenience and less clutter in the prompt history, assign a button to a command using eval-line
(Any instruction at the press of a button) with stumpwm::read-key
(because it is was defined with defun
rather than defcommand
). Then, just press that button to invoke the command instead of using the Lisp instruction prompt each time.
: describe-key
F16 is not bound.
Eval: (stumpwm:define-key
stumpwm:*top-map* (stumpwm:kbd
"F16") "eval-line (car(stumpwm::read-key))")
[ ...rewriting... ...no need for "xmodmap", there are at least two simple approaches, either with aref
or a foldy, while using CLX... ]
[ ...hmm, Xserver seems unaffected by the change...and sometimes StumpWM crashes...see xlib:change-keyboard-mapping
pecularities... ]
Use the work-on-a-copy approach: obtain a copy of a current setting, modify the copy, replace the current setting with the modified copy.
The xlib:keyboard-mapping
(CLX 15.4.2) provides a copy of each keycode (0–255) and its keysyms (probably seven each).
Eval: keymap.my
The variable KEYMAP.MY is unbound.Backtrace...
Eval: (setf
keymap.my(xlib:keyboard-mapping
stumpwm:*display*))
#2A((0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (65307 0 65307 0 0 0 0) (49 33 49 33 0 0 0) (50 64 50 64 0 0 0) ...)
The xlib:keyboard-mapping
provides a two-dimensional array. An array looks like a list of lists preceded by an octothorpe "#" and its number of dimensions, but an array is accessed or modified with only array instructions (CLHS 15.2 The Arrays Dictionary).
Congruently, the
xlib:change-keyboard-mapping
(CLX 15.4.2) requires a two-dimensional array. It is also important to specify the :end as 255, or the final keycode.
Eval:(xlib:change-keyboard-mapping
stumpwm:*display* keymap.my :end 255)
The aref
(CLHS) gives the array reference for an item when given its position for each dimension. The position is the number of other items before the desired item, for each dimension from outside to inside. For example, there are zero items before the first item so it is at the zeroth position, there are forty-two items before the forty-third item so it is at the forty-second position, and so forth.
The two-dimensional keycode array is sized as [256 7], so the array indices are 0–255. That allows for the subrange of 8–255 to match exactly with the keycodes 8–255, so specifying the keycode number is conveniently the same as the array position. The extra few at the beginning are of no matter.
The seven keysyms are referenced by 0–6 for the second dimension by the conventional skip-index approach. So, skip 0 items for access to the first keysym, skip 1 item for access to the second, and so on.
Eval: (aref
keymap.my 66 0)
65490
Eval: (setf
(aref
keymap.my 66 0) #xff0d)
65293
Eval: (aref
keymap.my 66 0)
65293
It might be more convenient to replace a whole list of keysyms for a keycode rather than change each of its keysyms individually.
Convert the two-dimensional array of individual keysyms into a one-dimensional array of lists of keysyms with write-to-string
(CLHS), then read-from-string
(CLHS), and then make-array
(CLHS).
The write-to-string
converts any Lisp form into "double-quoted text". The read-from-string
converts "double-quoted text" into a Lisp form, but can also skip characters at the beginning and ending. Simply skip the description of the array, t.i. the text before the first parenthesis.
Eval: (setf
keymap.my (write-to-string
keymap.my))
"#2A((0 0 0 0 0 0 0)...)"
Eval: (setf
keymap.my (read-from-string
keymap.my nil nil :start 3))
((0 0 0 0 0 0 0)...)
The read-from-string
has two other options prior the options to skip characters. Just provide nil for each before specifying :start for skipping the first three characters ("#2A") of the text. It then becomes an ordinary list of lists.
Give the make-array
the number of items of only the outer list to make a one-dimensional array. Either presume 256 keycodes, or confirm with length
(CLHS). The result will be a list prepended with an octothorpe, indicating it is actually an array.
Eval: (length
keymap.my)
256
Eval: (setf
keymap.my (make-array
'
(256) :initial-contents keymap.my))
#((0 0 0 0 0 0 0)...)
The solitary octothorpe is the abbreviation for "#1A", a one dimensional list. That means this is now an array of lists, so a whole list of keysyms is accessible and replaceable with aref
. Individual keysyms are still accessible and replaceable within the lists, but by means of cdr
and car
.
Eval: (aref
keymap.my 66)
(65293 0 65490 0 0 0 0)
Eval: (setf
(aref
keymap.my 66)'
(#xff0d 0 #xff0d 0 0 0 0))
(65293 0 65293 0 0 0 0)
Eval: (cadr
(aref
keymap.my 66))
0
Eval: (setf
(cadr
(aref
keymap.my 66)) #xff09)
65289
Eval: (aref
keymap.my 66)
(65293 65289 65293 0 0 0 0)
Ultimately, the keycodes need to be a two-dimensional array for xlib:change-keyboard-mapping
. Use the same technique: write as text, read the text without the array prefix, make a new array from the list of lists. Recall, count, or confirm with length
there are 7 items for the second dimension.
Eval: (setf
keymap.my (write-to-string
keymap.my))
"#((0 0 0 0 0 0 0)...)"
Eval: (setf
keymap.my (read-from-string
keymap.my nil nil :start 1))
((0 0 0 0 0 0 0)...)
Eval: (setf
keymap.my (make-array
'
(256 7) :initial-contents keymap.my))
#2A((0 0 0 0 0 0 0)...)
Eval:(xlib:change-keyboard-mapping
stumpwm:*display* keymap.my :end 255)
[ ...See xlib:change-keyboard-mapping
pecularities... ]
[ ...likely the modifier buttons section... ]
The U.S. English buttonboards have 47 buttons for letters and symbols. Typically, holding down the Shift modifier button signals the computer to provide another 47 alternate symbols, such as capital letters and more punctuation.
The Control and Alt modifier buttons individually provide 47 additional alternate possibilities each. Holding two modifier buttons at the same time is another distinct signal for the computer for three more sets of 47 possibilities: Shift+Control, or Shift+Alt, or Control+Alt. Holding all three is yet another 47 possibilities.
Eight layouts overall, each providing 47 possibilites, totals a minimum of 376 possibilities. That is a minimum because there are other buttons, like F1–F12 or Home/End/Help or Tab/Return/Space or arrow buttons and more, and all can be combined with any combination of modifier buttons.
As such, there really is no need for so many (three!) modifier buttons. Also, a modifier button held with a thumb enables typing with the other fingers of the same hand, thereby making two of each modifier redundant.
[ ...some ideas or inspiration... ]
Consider swapping "QWE" for the familiar sequence "ABC", or "123" to "012". Make the caps lock button the prefix for commands. Consider putting the braces "( )" (unshifted) and brackets "[ ]" (shifted) in the center at T Y (left and right), maybe the comma/double-quote at G and period/apostrophe at H, and rearrange the letters some.
Consider having the hands one row up, thereby the thumbs can easily type the buttons on the bottom row above the barbutton. Make each of those bottom buttons a space button and Return, and one each of Shift, Control, and Alt.
Consider rotating the buttonboard 180 degrees. The function buttons F1–F12 are then physically at the bottom for the thumbs. Assign a function button for the new space button, a new Return button, and single modifier buttons for Shift, Control, and Alt. Assign "Return" to a button somewhere left of the space button, since that is what each actually does anyway.
In essence, make it familiar and personally convenient, or continue using what was manufactured for no one in particular. Different is okay, likely no one else will ever notice, as it is a personalized computer. Either way, consider keeping notes on paper for each layout associated with each modifier button.
For now, these are attempts at unraveling some obstinate functions of the Common Lisp X Interface, because every programming fad on the planet was used to implement any and every part, likely in the name of "modern programming" or "robustness". To be fair, many of the fads were in the Common Lisp HyperSpec, rather than as a separate set of approaches (like a cookbook).
On the other hand, some paradigms from other computer programming writing systems (misnomered as "computer languages") were prostheticized into CLX for the sake of whomever wrote it. That is fine, except there is no workflow or intent included, so there is no record of actual usage, no shared experience, and so no inspiration for extensibility.
Let it be made clear: There is no extensibility from "extended". The latter is merely the footprint of a dinosaur, what the computer manufacturers and operating system companies provide for free (extendedness) with the fantasies (marketing) they sell in the name (branding) of their own personal charities (online stores).
Source code is worthless when there is too much of it. Modular is only worthwhile when actually used, rather than made "just in case" or to fluff out all the possibilities.
Prefabricated is lifeless and unadaptable. Lack of intent and real world usage is uninformative and uninspiring. Perfectness itself never sits still and it is pointless as a goal, but is experienced in the flow of everyday life, beyond the dead written past of history or the freshly mummified bleeding edge computer programs.
Both CLX and Common Lisp were clearly too much for the people involved in writing them to handle, and they did the best they could with those two behemoths. They can only be torn apart, most of the pieces thrown aside, and maybe something familiar and inspiring will provide an outlet for ingenuity. They are clearly worthless for the everyday individual, for they are unspoken in the vernacular of the layman and fail to fit with what emerges from the split second moment of life.
xlib:change-keyboard-mapping
pecularities
For whatever reason the Xserver seems to be unaffected by the changes from xlib:change-keyboard-mapping
(CLX 15.4.2). CLX documentation says use NIL for NoSymbol, though X11 protocol says zero is fine. NIL sometimes produces an error. Zero is without error, but so far the changes to zero for the first keysym position for a keycode are unchangeable thereafter.
Most notable is an "unsigned byte 8" error occurring for values greater than 255 for :end, possibly from type checking done with the functions/macros named with the prefix "index..." that are from text.lisp of CLX source.
The xlib:keyboard-mapping
returns an array sized as [256 7] by default, and is therefore unreturnable to xlib:change-keyboard-mapping
because its :end is documented as (array-dimensions
keysyms 0) by default, t.i. 256.
xlib:change-keyboard-mapping
breaks (xlib::display-keysym-mapping
stumpwm:*display*) sometimes by leading to 20 entries per keycode rather than just 7, and at other times inserts the wrong keysyms for a keycode.
The source code requires :end be one more than the final keycode because length equals ":end - :start", but it also rejects 256 as a value for including the final possible keycode 255, t.i. only 0–254 is possible even though 8–255 is what is specified in the X protocol.
A potential workaround is to provide a smaller array, such as [248 7] for 8–255 (seven keysyms each), and specify :first-keycode as greater than 0, such as 9 (typically the first on the buttonboard anyway, as Escape). Then :start is 0 and :end is number of keycodes plus one. However, additional testing suggests a smaller array fails.
The REWRITE would be to make :end be the actual final keycode position in the supplied array, then have the function calculate the count inclusively of the specified indices by ":end - :start + 1", and have the loop cease at ">" rather than ">=".
But xlib:change-keyboard-mapping
fails to make correct changes, so there is no point normalizing its interface. It simply needs to be abandoned (or the funicular spaghetti code further untangled).
The xlib:process-event
(CLX 13.2) documentation points out the CLX cache of keysyms needs to be invalidated, and that xlib:mapping-notify
(StumpWM version 1.0.1, "translate.lisp": 494–506) is for helping with that. However, the latter takes four values and there is no example workflow. Prior experience and knowledge and intent is just supposed to be magically known for a custom CLX function with an indirect relation to the X protocol. Internally, there are just two significant lines, the most notable being (setf
(xlib::display-keysym-mapping
stumpwm:*display*)nil), which seems to have no effect when used from the Lisp evaulation prompt provided by eval-line
from StumpWM. But that apparent ineffectiveness might be because of the failure or incorrect usage of xlib:change-keyboard-mapping
(presuming there is a correct way of using it).
When no error or crashing, ineffectiveness is confirmed with xlib:keycode->keysym
(CLX 15.4.3).
Eval: (xlib:keycode->keysym
stumpwm:*display* 66 0)
0
But, confirmed it does work with prior xmodmap instructions:
(stumpwm:run-shell-command
"xmodmap -e 'keycode 66 = Return Tab'")
However, consider changing keycode 66 to the keysyms for Return (#xff0d) and Tab (#xff09) with the xlib:change-keyboard-mapping
. StumpWM crashes, but at the console. [StumpWM seems unrestartable after killing it, just repeats the same error at the console. Seem to need to kill
both StumpWM and Xserver, then restart them, then everything seems fine again.]
Eval: (xlib:change-keyboard-mapping
stumpwm:*display* (make-array
'(1 7) :initial-contents '((65293 65289 65293 65289 0 0 0))) :first-keycode 66 :start 0 :end 1)
Or, consider swapping "@" (keysym 64) with "2" (keysym 50) for its typical keycode 11. Normally, the keysyms are (50 64 50 64 0 0 0). No error, and there is a change for keycode 11, but to all zeros, meaning there is now no way to type "2" or "@" (hence why it was chosen as a test rather than "1", so its keycode could be typed in the prompt afterwards).
[Hmm, does it really want an array with at least that many keycodes? If so, then the aforementioned workaround of using a smaller array simply avoids the error without ever being possible to set all keycodes.]
Eval: (xlib::display-keysym-mapping
stumpwm:*display*)
#2A((0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (65307 0 65307 0 0 0 0) (49 33 49 33 0 0 0) (50 64 50 64 0 0 0) ...)
Eval: (xlib:change-keyboard-mapping
stumpwm:*display* (make-array
'(1 7) :initial-contents '((64 50 64 50 0 0 0))) :first-keycode 11 :start 0 :end 1)
Eval: (xlib::display-keysym-mapping
stumpwm:*display*)
#2A((0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (65307 0 65307 0 0 0 0) (49 33 49 33 0 0 0) (0 0 0 0 0 0 0) ...)
Eval: (xlib:keycode->keysym
stumpwm:*display* 11 0)
0
Sometimes there is an error at the console with varying number for "the value". StumpWM crashes (maybe?) as it is no longer available, but ps
shows its process still listed.
Rather repeatable, something to do with attempting to change keyboard mapping more than once, perhaps when trying something different. Try 12 keycodes in array with only two keysyms, t.i. size of [12 2], and include the first 12 keycodes, but specify only :first-keycode 11, :start 0, :end 1.
[ Ran out of room on paper...write the rest next time. ]
Caught 'The value 1476395008 is not of type (UNSIGNED BYTE 29)' at the top level. Please report this... ... 0:(XLIB::AREF-CARD29 #<unavailable argument> #<unavailable argument>) 1:(XLIB:KEYBOARD-MAPPING #<XLIB:DISPLAY :0 ...> :FIRST-KEYCODE NIL :START NIL :END NIL :DATA NIL) ... 6:(STUMPWM:UPDATE-MODIFIER-MAP) ... 8:(STUMPWM::HANDLE-EVENT :EVENT-KEY :MAPPING-NOTIFY :EVENT-CODE 34 ...)
Perhaps re-check stumpwm:handle-event
(StumpWM version 1.0.1, "events.lisp": 634–671) and the :mapping-notify handler (StumpWM version 1.0.1, "events.lisp": 380–385), as StumpWM might be causing interference. The latter is evoking stumpwm:update-modifier-map
(StumpWM version 1.0.1, "input.lisp": 836–838; but consider 796–838). (Note: personal keymap has no Meta, and StumpWM does something special when that is the case.) Probably just a distraction from the main concern of xlib:change-keyboard-mapping
.
Restarts are advertised but impossible. Afterwards, there is a reference to the CLX source, though it claims the file has been modified since compilation (doubtful).
(XLIB::AREF-CARD29 #<unavailable argument> #<unavailable argument>) ; File has been modified since compilation: ; /.../common-lisp/clx-0.7.5/dependent.lisp ; Using form offset instead of character position. source: (THE CARD29 (ASH (THE CARD8 (AREF A (INDEX+ I +LONG-2+))) 16))
The most immediate change to StumpWM is applied with the eval-line
command, available with Control-t then colon, usually notated as "C-t :" (The Lisp instruction prompt: an outlet for ingenuity).
That is also the means for loading a file with a more comprehensive change written with Common Lisp, by using load
(CLHS). For example:
load
"~/.stumpwm.d/custom/points-later.lisp.html")
The ".lisp" suffix is common for files with Lisp, but is optional because Lisp is just plain text, just like HTML and CSS.
Much like split-view management, the Xserver cursor can be placed anywhere within the bounds of a screen by halving it. Begin in the center of a screen, then split it (left, right, top, or bottom) and center the cursor within one of the halves.
Xserver cursor placement by mathemagically halving the screen, rather than arbitrary pointer motion. That is, no more need to use the force of dramatic physical gestures to move anything. Basic center, left, right, up, and down for positioning quickly, or go back to previous point or the screen center.
Includes pointer activation, and keybindings (for numeric pad), and inspiration...and a "Content outline" for the copious documentation. It is all quite simple, really; the fluff is in the doc rather than the code.
Or, recenter the Xserver cursor at any halving point and it becomes the beginning point. Going back stops at that halving point. Returning to the beginning returns to that recenter point, then returning once more makes the screen center as the beginning point once again.
A single destination:
y axis | x axis --+-------------------------------- | origin up | | | | # destination | | | left --------+-------- right | point | | | | | | down
Extending lines from the point isolates the destination within a quadrant and reveals the pointer trajectories for intersecting with the destination. Limiting the length of the lines to the width and height of the narrowed region reveals the current precision and the progress.
Many potential destinations:
y axis | x axis --+--------------------------------------- | origin up | | | | | | destinations | left ------------+--#--#--#--#-- right | point | | | | | | down
Multiple potential destinations might be axially aligned, f.e. a menu of options or a toolbar of outlined regions. Placing the pointer first along their axial alignment frees the other axis for selecting any of the items. Another option can be chosen by backtracking a little rather than starting over at the center of the screen.
The pointer has four parts that imply the crossing of a horizontal line with a vertical line. A gap for the implied intersection also provides the visual clearance needed for the Xserver cursor when activating the pointer buttons.
Other programs continue controlling the appearance of the Xserver cursor within their views without interference from the halving pointer.
Pointer placement by mathemagically halving the screen, rather than arbitrary pointer motion includes buttonboard bindings (for numeric pad) for multidirectional placement, and complementary commands for activation of the pointer without the pointer-box.
Consider recentering the pointer and Xserver cursor at any halving point and it becomes the beginning point. Going back stops at that halving point. Returning to the beginning returns to that recenter point, then returning once more makes the screen center as the beginning point once again.
Either way, the pointer-halving-show
command conveniently returns the cursor that has been moved (f.e. by a pointer-box) back to the pointer position, and pointer-halving-hide
hides the pointer without hiding the Xserver cursor. Or, consider combining the commands into pointer-halving-reveal-toggle
for toggling revealing and hiding of the pointer.
Convert a pointer interface into a selection interface. First, move the Xserver cursor by whatever means available, then mark the location for returning the cursor to it later. Each point is then available as next or prior. Eliminate traversal of a vast void, and never miss a point.
With the convenience commands points-write
and points-read
, write a list of marked points to a document, then later read and apply that list of points to restore them for use again. Perhaps collect a group of preferred points for a specific program, then swap them for a group of points from another document for another program.
Convert "drag and drop" into "select and put" by adding pointer button activation commands for toggling the press or release of the primary pointer button from the buttonboard.
The hot spot for the Xserver cursor must have clearance when activating a pointer button. A point is drawn as a white perimeter of a square with a black mask, made from four Xwindows.
______ _ __ _ | __ | | | |__| | | | | | | == | | | | | |__| | | | __ | | |______| |_| |__| |_|
The left and right sides each have a black background, and a subwindow with a black background and a white border as thick as the line for the square perimeter.
For example, the left side (though taller than this):
left window --> cropped ______ ______ | ____|__ | ____|<-mask | | | | | | |b| w _ | |b| w _|<-perimeter |l| h| | | |l| h| | |a| i| | | |a| i| |<-black mask |c| t|_| | |c| t|_| |k| e | |k| e | | |_______|subwindow | |____| |______| |______|
The top and bottom sides each have a black background, and a subwindow with a white background as wide as the sides and as tall as the perimeter height.
top or bottom window ____________ |____________|<-black mask |subwindow |<-white perimeter |____________| |____________|<-black mask
stumpwm:eval-line
stumpwm:err
stumpwm::print-key
xmodmap
;
ISO_Group_Shift ;
ISO_Level3_Shift
Some slight changes to consider.
Prefix:
C-t *ROOT-MAP*
Assigning a button to stumpwm:*top-map* should allow for typing that button and then a question mark "?" to reveal its button listing, like with other keymaps. But invoking the listing fails with disaster.
: describe-key
Delete is not bound.
Eval: (define-key
*top-map* (kbd
"F12")'
*top-map*)
Unfortunately, StumpWM attempts to gather all the keymaps with handle-keymap
prior to searching them whenever using describe-key
or where-is
(Invoke a StumpWM command by its name). The gathering becomes recursive because of the button for the *top-map*, then StumpWM crashes and sort of recovers.
StumpWM Crashed With An Unhandled Error! Copy the error to the clipboard with the 'copy-unhandled-error' command. Control stack exhausted (no more space for function call frames). This is probably due to heavily nested or infinitely recursive function calls, or a tail call that SBCL cannot or has not optimized away. PROCEED WITH CAUTION. Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1234567890}> 0: (STUMPWM::BACKTRACE-STRING) 1: ((:METHOD STUMPWM::HANDLE-TOP-LEVEL-CONDITION (SERIOUS-CONDITION)) #<SB-KERNEL::CONTROL-STACK-EXHAUSTED {0123456789}>) [fast-method] 2: (SB-KERNEL::%SIGNAL #<SB-KERNEL::CONTROL-STACK-EXHAUSTED {0123456789}>) 3: (ERROR SB-KERNEL::CONTROL-STACK-EXHAUSTED) 4: (SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR) 5: ("bogus stack frame") 6: ((LABELS STUMPWM::SEARCH-IT :IN STUMPWM::SEARCH-KMAP) "colon" #S(STUMPWM::KMAP :BINDINGS (#S(STUMPWM::BINDING :KEY #S(STUMPWM::KEY :KEYSYM 116 :SHIFT NIL :CONTROL T :META NIL :ALT NIL :HYPER NIL :SUPER NIL) :COMMAND *ROOT-MAP*) #S(STUMPWM::BINDING :KEY #S(STUMPWM::KEY :KEYSYM 65481 :SHIFT NIL :CONTROL NIL :META NIL :ALT NIL :HYPER NIL :SUPER NIL) :COMMAND *TOP-MAP*))) (#1=#S(STUMPWM::KEY :KEYSYM 65481 :SHIFT NIL :CONTROL NIL :META NIL :ALT NIL :HYPER NIL :SUPER NIL) #1# #1# #1# #1# #1# #1# #1# #1# #1# #1# #1# ...)) ...exactly the same from 6 to 99... 99: ((LABELS STUMPWM::SEARCH-IT :IN STUMPWM::SEARCH-KMAP) "colon" #S(STUMPWM::KMAP :BINDINGS (#S(STUMPWM::BINDING :KEY #S(STUMPWM::KEY :KEYSYM 116 :SHIFT NIL :CONTROL T :META NIL :ALT NIL :HYPER NIL :SUPER NIL) :COMMAND *ROOT-MAP*) #S(STUMPWM::BINDING :KEY #S(STUMPWM::KEY :KEYSYM 65481 :SHIFT NIL :CONTROL NIL :META NIL :ALT NIL :HYPER NIL :SUPER NIL) :COMMAND *TOP-MAP*))) (#1=#S(STUMPWM::KEY :KEYSYM 65481 :SHIFT NIL :CONTROL NIL :META NIL :ALT NIL :HYPER NIL :SUPER NIL) #1# #1# #1# #1# #1# #1# #1# #1# #1# #1# #1# ...))
The search algorithm never considers the possibility of a keymap having a button paired with itself within itself. Similarly, keymaps that have buttons to each other become circular, thereby recursive.
The stumpwm:display-bindings-for-keymaps
provides the listing for a keymap, however, a custom command with eval-line
(Any instruction at the press of a button) displays "NIL" when evaluating it and inconveniently obliterates the button listing.
For the *top-map*, consider making a new StumpWM command with stumpwm:defcommand
that uses the stumpwm:display-bindings-for-keymaps
instruction (An introspective approach for defun
).
Eval: display.top-map
The variable DISPLAY.TOP-MAP is unbound.Backtrace...
Eval: (setf
display.top-map'
(defcommand display.top-map () () "Reveal buttons for *top-map*." (stumpwm::display-bindings-for-keymaps nil *top-map*)))
Eval: (eval
display.top-map)
Either define a new button for it (Pair a button with a command or keymap), or invoke the command from the prompt provided by the colon
command (Invoke a StumpWM command by its name).
: describe-key
C-t / is not bound.
Eval: (define-key
*root-map* (kbd
"/") "display.top-map")
: describe-key
C-t / is bound to "display.top-map". Reveal buttons for *top-map*.
Some messages from StumpWM stay on the screen, such as Help documentation or error messages. Any message is removed from the screen when the next StumpWM command is invoked, usually by typing the button assigned to it.
Some commands give a message that disappears after a few seconds. But, any message shown is also added to the message history.
Consider a new command with stumpwm:defcommand
to remove the message from the screen that also never gives a message, perhaps a command that does nothing.
Eval: remove.message
The variable REMOVE.MESSAGE is unbound.Backtrace...
Eval: (defcommand
remove.message nil nil "Remove the message from the screen.")
The "Forward Delete" button is named "Delete" according to the describe-key
command (Invoke a StumpWM command by its name), and is probably seldom used.
: describe-key
Delete is not bound.
Eval: (define-key
*top-map* (kbd
"Delete") "remove.message")
: describe-key
Delete is bound to "remove.message". Remove the message from the screen.
stumpwm:eval-line
Sometimes evaluate a Lisp form without showing a message with results, such as for CLX "xlib:" instructions that return arbitrary numbers. Errors will still be shown, but without a backtrace. A short StumpWM command with stumpwm:defcommand
(StumpWM 3.1).
Eval: (defcommand
eval-quiet (Ftext) ((:rest "Lisp: ")) "Evaluate one Lisp form. No result, usually." (eval
(read-from-string
Ftext)))
#S(STUMPWM::COMMAND :NAME EVAL-QUIET :CLASS T :ARGS ((:REST "Lisp: ")))
stumpwm:err
stumpwm:err
in "message-window.lisp": 301–308 (StumpWM version 1.0.1)
The stumpwm:err
(Stumpwm 4. Message and Input Bar) concatenates the backtrace for an error without ensuring it begins on a newline.
Eval: something
The variable SOMETHING is unbound.Backtrace...
Eval: (cons)
invalid number of arguments: 0Backtrace...
Consider inserting a newline with format
and "~%" (CLHS 23.3.1.2). (Additional blank lines would require digging deeper into StumpWM, f.e. starting with stumpwm:echo-string
in "message-window.lisp" at lines 292–294 (StumpWM version 1.0.1).)
(defun
err (fmt &rest args) "Modified: [insert original description...]" (let ((stumpwm:*suppress-echo-timeout* t)) (stumpwm:echo-string
(stumpwm:current-screen
) (stumpwm:concat
(apply
'
format nil fmt args) (format
nil "~%");;
<-- the difference (stumpwm::backtrace-string
)))))
When typing it all at once into the evaluation prompt (The Lisp instruction prompt: an outlet for ingenuity), perhaps start from the right end with stumpwm:concat
(StumpWM version 1.0.1, "primitives.lisp": 1069–1070) and all the closing parenthesis marks, then type the earlier parts.
Otherwise, consider gradually forming an abdextrally half-paired list (Contrary formation and Lisp instructions) starting with nil for each sublist. The sublist for stumpwm:concat
(see also concatenate
(CLHS)) is a rather short beginning.
Eval: make.err
The variable MAKE.ERR is unbound.Backtrace...
Eval: (setf
make.err'
(concat (apply 'format nil fmt args) (format nil "~%") (stumpwm::backtrace-string)))
Eval: make.err
(CONCAT (APPLY 'FORMAT NIL FMT ARGS) (FORMAT NIL "~%") (STUMPWM::BACKTRACE-STRING))
The next outer list is for stumpwm:echo-string
(StumpWM 4.3).
Eval: (setf
make.err (cons
make.err nil))
Eval: (setf
make.err (cons
'
(current-screen) make.err))
Eval: (setf
make.err (cons
'
echo-string make.err))
Eval: make.err
(ECHO-STRING (CURRENT-SCREEN) (CONCAT (APPLY 'FORMAT NIL FMT ARGS) (FORMAT NIL "~%") (STUMPWM::BACKTRACE-STRING)))
Then the next outer list is for let
(CLHS).
Eval: (setf
make.err (cons
make.err nil))
Eval: (setf
make.err (cons
'
((*suppress-echo-timeout* t)) make.err))
Eval: (setf
make.err (cons
'
let make.err))
Eval: make.err
(LET ((*SUPPRESS-ECHO-TIMEOUT* T)) (ECHO-STRING (CURRENT-SCREEN) (CONCAT (APPLY 'FORMAT NIL FMT ARGS) (FORMAT NIL "~%") (STUMPWM::BACKTRACE-STRING))))
The final outer list is for defun
(CLHS).
Eval: (setf
make.err (cons
make.err nil))
Eval: (setf
make.err (cons
"Modified: [insert original description...]" make.err))
Eval: (setf
make.err (cons
'
(fmt &rest args) make.err))
Eval: (setf
make.err (cons
'
err make.err))
Eval: (setf
make.err (cons
'
defun make.err))
Eval: make.err
(DEFUN ERR (FMT &REST ARGS) "Modified: [insert original description...]" (LET ((*SUPPRESS-ECHO-TIMEOUT* T)) (ECHO-STRING (CURRENT-SCREEN) (CONCAT (APPLY 'FORMAT NIL FMT ARGS) (FORMAT NIL "~%") (STUMPWM::BACKTRACE-STRING)))))
Review and confirm, and then evaluate it. Try out some errors.
Eval: (eval
make.err)
ERR
Eval: something
The variable SOMETHING is unbound. Backtrace...
Eval: (cons)
invalid number of arguments: 0 Backtrace...
stumpwm::print-key
The StumpWM prompts (Interactive curiosity...) have a specialized approach to interpreting abbreviations for commands for the stumpwm:*input-map* keymap.
New commands for the stumpwm:*input-map* keymap require accepting two pieces of info: a reference to the current prompt, and the buttons that invoked the command. The latter is mostly for stumpwm:input-self-insert
, and usually ignored by other commands.
# The error from stumpwm::print-key
.
The stumpwm:input-self-insert
command is assigned as t (meaning all unassigned buttons) instead of a specific button sequence. That leads to an error from stumpwm::print-mods
.
For example, assign a button to stumpwm:*input-map* in order to use the button as a prefix for it, as with any keymap (Make a StumpWM keymap and pair a button). Then, type the button and then a question mark "?" to reveal the button list.
StumpWM Crashed With An Unhandled Error!
Copy the error to the clipboard with the 'copy-unhandled-error' command.
The value
T
is not of type
STUMPWM::KEY
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {0123456789}>
0: (STUMPWM::PRINT-MODS T)
1: (STUMPWM::PRINT-KEY T)
2: (STUMPWM::DISPLAY-BINDINGS-FOR-KEYMAPS ...)
...
Tracing backwards through the source files leads to stumpwm::display-bindings-for-keymaps
inappropriately passing T to stumpwm::print-key
. But the latter is much smaller and simpler to rewrite in the Lisp instruction prompt for a quick resolution.
# The original and a replacement for stumpwm::print-key
.
The stumpwm::print-key
function is in "kmap.lisp": 174–177 (StumpWM version 1.0.1).
174 (defun
print-key (key) 175 (format
nil "~a~a" 176 (print-mods
key) 177 (keysym->stumpwm-name
(key-keysym
key))))
One approach is to include a conditional such as if
(CLHS) with eq
(CLHS) for matching T that returns "double-quoted text", otherwise it does what it would have done. Notice stumpwm::print-key
and all the StumpWM functions in it need "stumpwm::" prepended.
(defun
stumpwm::print-key (Fkey) (if
(eq
t Fkey) "All else";;
<-- the difference (format
nil "~a~a" (stumpwm::print-mods
Fkey) (stumpwm::keysym->stumpwm-name
(stumpwm::key-keysym
Fkey)))))
When typing it in all at once (The Lisp instruction prompt: an outlet for ingenuity), perhaps start with the final Lisp form at the right end and all the closing parenthesis marks, then type the earlier parts (Typing within a line of text).
Consider storing both versions in memory with the same name as the function (An introspective approach for defun
).
# Typing and storing the original stumpwm::print-key
.
Consider storing the original in memory with the same name as the function itself (An introspective approach for defun
). Prepend "stumpwm::" to other function names as needed.
Consider gradually forming an abdextrally half-paired list (Contrary formation and Lisp instructions) starting with nil for each sublist. The sublist for stumpwm::keysym->stumpwm-name
is a rather short beginning.
Eval: stumpwm::print-key
The variable STUMPWM::PRINT-KEY is unbound.Backtrace...
Eval: (setf
stumpwm::print-key'
(stumpwm::keysym->stumpwm-name (stumpwm::key-keysym Fkey)))
The next outer list is for the format
Lisp instruction. Pair it with nil, then add the four additional parts individually, and use quote
as needed. Remember to prepend "stumpwm::" as needed.
Eval: (setf
stumpwm::print-key (cons
stumpwm::print-key nil))
Eval: (setf
stumpwm::print-key (cons
'
(stumpwm::print-mods Fkey) stumpwm::print-key))
Eval: (setf
stumpwm::print-key (cons
"~a~a" stumpwm::print-key))
Eval: (setf
stumpwm::print-key (cons
nil stumpwm::print-key))
Eval: (setf
stumpwm::print-key (cons
'
format stumpwm::print-key))
Eval: stumpwm::print-key
(FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY)))
Finishing the original instruction, the next outer list is for the defun
Lisp instruction. Pair it with nil, then add the three additional parts individually, and use quote
as needed.
Eval: (setf
stumpwm::print-key (cons
stumpwm::print-key nil))
Eval: (setf
stumpwm::print-key (cons
'
(Fkey) stumpwm::print-key))
Eval: (setf
stumpwm::print-key (cons
'
stumpwm::print-key stumpwm::print-key))
Eval: (setf
stumpwm::print-key (cons
'
defun stumpwm::print-key))
Eval: stumpwm::print-key
(DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
Consider prepending a double-quoted description identifying it. Then, the car
is the description and the cdr
is the instruction to evaluate.
Eval: (setf
stumpwm::print-key (cons
"original" stumpwm::print-key))
("original" DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
Eval: (cdr
stumpwm::print-key)
(DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
# Typing and storing the replacement stumpwm::print-key
.
Consider storing the replacement in memory with the same name as the function itself (An introspective approach for defun
).
The replacement pairs a conditional with part of the original (The original and a replacement for stumpwm::print-key
). Perhaps start by typing in the original (Typing and storing the original stumpwm::print-key
), then duplicate it (Re-listing rather than re-arranging).
Eval: stumpwm::print-key
("original" DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
Eval: (setf
stumpwm::print-key (cons
stumpwm::print-key (read-from-string
(format
nil "~s" stumpwm::print-key)))
(("original" DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY)))) "original" DEFUN STUMPWM::PRINT-KEY (FKEY) (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
Consider changing the description of the abdexter half to indicate it is the replacement, leaving the dexter half as the original.
Eval: (setf
(caar
stumpwm::print-key) "replacement")
Confirm the reference with car
and cdr
, then consider using "Control-k" and "Control-y" rather than retyping the reference later.
Eval: (car
(cddddr
(car
stumpwm::print-key)))
(FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY)))
As usual, begin a sublist by pairing the reference with nil, then abdextrally pair the additional items.
Eval: (setf
(car
(cddddr
(car
stumpwm::print-key))) (cons
(car
(cddddr
(car
stumpwm::print-key))) nil))
Eval: (setf
(car
(cddddr
(car
stumpwm::print-key))) (cons
"All else" (car
(cddddr
(car
stumpwm::print-key)))))
Eval: (setf
(car
(cddddr
(car
stumpwm::print-key))) (cons
'
(eq t Fkey) (car
(cddddr
(car
stumpwm::print-key)))))
Eval: (setf
(car
(cddddr
(car
stumpwm::print-key))) (cons
'
if (car
(cddddr
(car
stumpwm::print-key)))))
Eval: (car
(cddddr
(car
stumpwm::print-key)))
(IF (EQ T FKEY) "All else" (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY))))
Confirm the replacement instruction, and then evaluate it to replace stumpwm::print-key
.
Eval: (car
stumpwm::print-key)
("replacement" DEFUN STUMPWM::PRINT-KEY (FKEY) (IF (EQ T FKEY) "All else" (FORMAT NIL "~a~a" (STUMPWM::PRINT-MODS FKEY) (STUMPWM::KEYSYM->STUMPWM-NAME (STUMPWM::KEY-KEYSYM FKEY)))))
Eval: (eval
(cdar
stumpwm::print-key))
Pair a button with the stumpwm::*input-map* keymap, but within some other keymap (Make a StumpWM keymap and pair a button), then type the button and then a question mark "?" to reveal the button list for editing commands (The button list for text editing).
[ ...describe enabling group 2 characters with xmodmap for typing within programs for an Xserver or in StumpWM prompts... ]
[ ...copy or rephrase explanation about StumpWM from custom xmodmap buttonmap (xmodmap-compact: buttons for typing symbols)... ]
The X Window System Protocol, Chapter 5, states Mode_switch is for group 2 of the four pairs of keysyms for a keycode (x.org: "X Window System protocol"). The CLX library has xlib:keycode->keysym
which expects a keysym index from 0 to 6, according to the error it gives when beyond.
Group 1 is the default group and has indexes 0 and 1.
Group 2 is for when the Mode_switch is active and has indexes 2 and 3. The ISO_Group_Shift is one of about a half-dozen aliases for Mode_switch, so either name works.
Group 3 is for when the ISO_Level3_Shift is active and has indexes 4 and 5.
The keysym of the second index of any group is for when the Shift modifier is active.
StumpWM favors ISO_Level3_Shift and equates it with the traditional AltGr/Compose button, but associates it with group 2. However, it also matches with the modifier group mask, which allows it to work when added to the same modifier group as Mode_switch. See "input.lisp" for code-state->key
at 511-528, which references stumpwm:*modifiers* which is set by stumpwm::get-modifier-map
at 800-834.
Need Mode_switch (or its alias) for the button that is held for programs abiding the X11 protocol. Need ISO_Level3_Shift (erroneously) added to the same modifier group for StumpWM, because StumpWM matches that modifier group.
The Xserver starts with ISO_Level3_Shift assigned to a sometimes non-existent button, but that is desired for this circumstance.
Consider repurposing the Caps Lock or Shift Lock button into a button for only the Mode_switch keysym, unless there is already a button for it.
! Remove all keysyms from the "lock" modifier group. clear lock keycode 66 = Mode_switch ! Pick an empty modifier group, or clear one. clear mod2 add mod2 = Mode_switch ISO_Level3_Shift ! An easy way of typing a non-breaking space. ! For example: ! press the Mode_switch button, ! type the barbutton (space). keycode 65 = space space nobreakspace nobreakspace ! The ʻokina consonant (Unicode hexidecimal "02bb") ! and the kahakō accent (macron) for vowels, ! for words of the language of Hawaiʻi. ! ! Add them to the "k" button. ! For example: ! press the Mode_switch button, ! type the "k" button. ! --> ʻ ! Release the Mode_switch button. ! ! Or: ! press the Mode_switch and Shift buttons, ! type the "k" button, ! release the Mode_switch and Shift buttons, ! type a vowel. ! --> ā ē ī ō ū ! keycode 45 = k K U02bb dead_macron
The intent of Hypertext Markup (HTML) is two-fold: mark text of content when helpful (markup), and reference other content (links). HTML is simply punctuation marks written as names instead of singular symbols, but akin to proofreader marks.
Content marked with HTML remains readable as plain text. The alternate view is supposed to be supplementary for the content rather than necessary.
An HTML explorer (computer program) provides an alternate view by leaving out the marks and making adjustments to spacing (f.e. line height or indentation) and text (f.e. drawn thicker or askewed). The people who wrote that computer program decide the default characteristics for the spacing and drawing of the text.
The intended use of Cascading Stylesheets (CSS) is for changing the default characteristics of the HTML marks (spacing and drawing) that have been decided by the computer programmers of a specific HTML explorer.
CSS has nothing do with the document content. CSS is only a convenient means for changing the default preferences of the computer program (HTML explorer) without having to rewrite the computer program.
A stylesheet for stylesheet documentation, a.k.a. a hybrid CSS+HTML document.
The "style" of Cascading Style Sheet refers to expression rather than decoration, because CSS is for changing the default spacing and drawing of HTML marked regions of plain text documents. Therefore, CSS actually describes the characteristics of HTML marks rather than the document.
The intent of a CSS stylesheet is documented with comments embraced by /*
and */
. Comments can be marked up with HTML, whereby documentation for a stylesheet can have an alternate view in an HTML explorer.
A well-documented stylesheet inevitably links to itself for providing samples of its rules within its documentation. Therefore, a "stylesheet stylesheet" such as this one is "the mother of all stylesheets", as it precedes and begets all thereafter.
Portable Document Format (PDF) describes how to layout text and images, and is plain text. Basic notes for PDF version 1.4, mostly with the purpose of combining images into a single PDF document.
For many decades, emacs (GNU), a.k.a. Editing MACroS, has provided split-view management of documents (viewing and editing).
Emacs also excels with memory management of any sequence of typing or list of commands by storage in "registers", or complete repetition by a single press of any button desired (a.k.a. keyboard macros). The Emacs command "append-to-buffer" provides a means for selectively transferring content from any view of Emacs (whether a document or otherwise) to any other view, bypassing its own copy/paste or "registers".
On the other hand, the text editor "ed" (GNU) reveals any fragments of any number of documents when requested, in any order, gradually filling the screen only as needed. Each line is called forth by its number, so the line number is an intuitive command that shows that line of text. With "ed", there is no need for moving a text cursor, no need for selecting text, and no need for scrolling.
Any comma-separated range of lines is a command for calling forth that range of lines, f.e. 31,35p will "print" lines 31 to 35 on the screen. Line numbers are optionally revealed when requesting lines (f.e. 31,35n), and similarly so in search results.
Specify a generic line number with plus or minus, f.e. -4 for the fourth line before the current line, or for a range of lines, f.e. -5,+5p to "print" the range of lines of text before and after the current line. The last line requested automatically becomes the current line.
Thereby with "ed", views of text emerge naturally from requested fragments of familiar documents: command, lines of text, command, lines of text, etc. That is, the typed command remains visible and serves as an introduction for the lines listed by it (when any).
A document can be viewed one screenful at a time (with z), or by an arbitrary number of lines (f.e. z30 for the next 30 lines), from anywhere within a document (f.e. 42z30n for the 30 lines starting from line 42, and numbered).
Search results are listable, or traversable one at time by line number in any order desired, and repeatable without retyping the search pattern. In addition to mere search and replace, a set of commands can be applied to all search results or interactively queried for each one. For example, search for a pattern, but also specifiy a different pattern for replacing in the results, all as one command, and either immediately or selectively.
As aforementioned, the editing commands typed in "ed" remain visible, thereby keeping a history of how a document was edited (optionally with the lines of text before and after they were modified) would be possible... if only there was a means for saving those proceedings.
By using "ed" for its naturally emerging document views within the "shell-mode" of Emacs, the "ed" program gains a separate dedicated buffer from Emacs recording that history of all editing with "ed", along with robust command editing (from the text editing commands of Emacs) when typing its own commands.
Of course, the aforementioned keyboard macros from Emacs means commands within "ed" are automatically added to any recorded sequence of tasks, and naturally so. No special effort needed, nothing new to learn, automatically incorporated.
Evoking "ed" within shell-mode with sudo
(super-user do) means the ability to edit restricted system documents without having to do "sudo
emacs", thereby the super-user role remains optional within Emacs.
With the "!
" command provided by "ed", evocation of external commands are possible from within "ed", and their results optionally read (r
) into that document wherever desired. Evoking "ed" as super-user (t.i. "sudo
ed") also means there is no longer any need to type sudo
for each and every command that requires super-user privileges, because the "!
" command of "ed" will invoke external commands with the same privileges by which "ed" itself was invoked.
The split-view management of Emacs provides the opportunity for multiple full-screen layouts of several such instances of "ed" and "sudo
ed" in shell-mode, intermixed with any other activities within Emacs, f.e. email, web browsing, directory listings, etc. As each instance has its own dedicated buffer, the editing history of commands used in "ed" or "sudo
ed" can be saved for review or potential selective restoration of edited documents (for when lines were listed before and after editing them).
And of course, repetition of super-user tasks, editing or otherwise, becomes possible (and naturally so) by means of the aforementioned keyboard macros of Emacs.
Using "sudo
ed" within shell-mode of Emacs enables responsible, recordable (t.i. record keeping), and administrative editing of documents or evocation of commands with access to copious amounts of copy/paste access (a.k.a. "registers"), and ridiculously easy on-the-fly record/play of any sequence of typing and commands... readily assigned to any button desired, as many as needed.
A "command line interface" (CLI) has been an interactive means for typing instructions into the computer. Any command typed is either immediately invoked, or invoked after typing a specific button such as "Do" or "Engage". Sometimes the Enter button or Return button is conscripted when lacking a specific button for command invocation.
The command line is at the bottom and the lines of text are shifted upward as each command is issued, like handwritten notes or a typewriter. Any results might also be drawn on additional lines after the command, shifting the lines upward further.
Only the most recent lines of text are shown. Any prior lines beyond what can fit on the screen are no longer drawn. A common command provided in a command line interface is clear
for eliminating all the text that has been drawn above the command line.
Sometimes a CLI peculiarly begins with the command line at the top and then gradually shifts it downward towards the bottom. From then on, additional lines of text are shifted upwards as done with a consistent CLI.
For such a CLI constantly shifting the location of its command line, the clear
command eliminates all drawn text and replaces the command line to the top again for repeating its incongruent descent.
Establish the bottom as the consistent location for the command line by drawing enough blank lines (f.e. with echo
) to fill the screen from top to bottom instead of using the clear
command (scroll, a script for the ash
CLI).
# Clear the screen while keeping # the command line at the bottom. line_count=70while
[ $line_count -gt 0 ]do
echo line_count=$(($line_count - 1))done
__________________ | | | | | | | | USB ___________ | computer display |____________________| | | | | powerbank | | |_________ _______| (battery) | |__________________| HDMI | | USB |___________| | | | | .--------^--^. | RPi module | '------------'
A powerbank (f.e. a rechargable battery) commonly has USB ports for powering devices that also have USB ports for being recharged or powered. Raspberry Pi modules have USB ports for being powered. Less commonly (as of the year 2022), computer displays might have a USB port for being powered by a USB charger, therefore can be powered from a USB port of a powerbank.
Therefore, it can be as simple as "square peg into square hole, round peg into round hole" for suddenly having a portable Raspberry Pi device. Swap out the Raspberry Pi module with a different model, perhaps the Raspberry Pi 400 (built into its own buttonboard) or a Raspberry Pi Zero. Choose a different sized computer display at any time, or maybe have a separate powerbank for the display. Whatever fits for the moment, or for later.
For example:
Fails to power the Sunfounder 13.3 inch display with USB-C to USB-C.
That display needs only 10W, so USB-A (from battery) to USB-C (to display) has worked. (Perhaps a USB-C specification issue?)
Fails to power RPi with certain USB-C cables. Perhaps cables are too long, or maybe need to be of a certain power specification? The short USB-C cable that came with a SanDisk Extreme Portable SSD (250GB, 500GB, or 1TB) has worked for powering the RPi with the Anker 87W battery using USB-C to USB-C.
Possible to power two RPi modules with the USB-C ports, and two monitors with the USB-A ports. However, consider a discrete power source (battery) for a device that needs an exceptional amount of power.
The key is to make sure the powerbank outputs the voltage (V) and amperage (A) expected by the devices, and enough overall wattage (W). The manual for the powerbank, or its manufacturer, should state the output voltage and amperage for each of its ports, and the max total wattage from the powerbank. That info might also be written on the powerbank itself.
Each USB-A port might be 5V and 2A, or it might be 5V and 3A. The USB-C port on a powerbank might have multiple possible voltage/amperage combinations. The manual for the powerbank should state which port is for recharging the powerbank, and how much voltage/amperage it can receive as "input".
As an example, the Anker 87W powerbank has two USB-C ports, and each can deliver power or be used to recharge the powerbank itself. The specifications for each port are conveniently printed (inconveniently very small) on itself, as well as listed in its manual. Unfortunately, the Anker 87W powerbank is unable to power other devices while itself is being recharged.
The maximum power (wattage) needed by a device (f.e. RPi or computer display) is what is usually specified in the manual for the device, perhaps as "Consumption" or "Rated power". A device might actually use much less wattage, perhaps rarely needing the maximum specified, f.e. Raspberry Pi modules tend to be power efficient in that way.
For example, the specifications for the Raspberry Pi modules are provided by the Raspberry Pi manufacturer. Some Raspberry Pi modules want 5V and 2.5A, which means 12.5W output from the powerbank. Though the Rasberry Pi 4 Model B does work with those amounts, they recommend 5V and 3A for it (15W output from the powerbank).
Writing and reading is the basis of the computer medium. Freedom of expression, t.i. the result of a person taking on the responsibility of speaking for itself, is what has been curiously missing with the commodity computers sold to the everyday person. Choice is often the only opportunity given to the purchaser of a computer, choosing amongst decisions already made by the software developers.
The skill of writing and reading has been impressed upon as many people as possible, and has become an expected means of learning and communicating. However, the computer medium is sold as a means of looking and pointing at options thought of by somebody else, failing at integrating with the flow of thoughts and actions of the everyday person implementing the computer medium. Paying money for a computer and then having applications do what somebody else wanted to do can only be a novelty, merely entertaining a person whose desires were never asked.
A computer application, a type of software, is an example of grouping basic commands for a specific task. Obviously, that is very useful for the person who groups them, and less so for a person when they are grouped by someone else.
Sometimes a single command is a group of other commands rather than emerging from new computer programming. A list of commands can be saved for later recall as a single command, f.e. by repeating the sequence of commands the person has just done.
Arbitrary actions with a pointer are prone to misinterpretation when part of automating repetitious activities. A shared command whose composition can never be explored, whose list of subcommands is forbidden from discovery, is an insincere gift that will fail to support the everyday person to correct it, simplify it, or adapt it for personal comfort.
Ultimately, personal expression is supported by writing and reading, impeded by insincere sharing, and essentially neutralized by having only choices. Sharing an approach inspires and supports the emergence of new approaches, with dissimilarity possible though unrequired.
The computer medium is inferior (f.e. when compared with pen and paper) for promoting self-education and cultural growth when it is distributed as an unexplorable trade secret providing a kiosk of choices rather than unrestrictedly adaptable by the everyday person for each moment of life.
A personal computer (PC) is a computer for one person in an office at work rather than a shared computer like a data terminal. A company provides the PC for use by the employee in the office, and the "home PC" for working from home. The everyday person was never supposed to have a home work computer.
Curiously, many operating systems provide no place for typing a command from personal recall or personal notes. Buttonboards usually have no dedicated "prompt" or "command" button for immediately specifying commands.
Instead, an abbreviation or pseudonym for a command is typed, though without any place to type it. That typically involves holding one or more buttons, a randomly logical concoction at the bottom of the buttonboard.
With no dedicated buttons on the buttonboard for all commands and nothing displayed on the screen when typing the abbreviations, there is only hope of what command will be invoked.
Conventionally, pre-categorized menus gradually reveal sublistings of commands. The aforementioned invisible typing of their abbreviations have been the only means for bypassing the interminable spelunking of those labyrinthine menus.
Silly, but that is how a home personal computer has been since forever it seems. But then again, it is work.
A personal computer can be repurposed into a personalizable computer (...no need to change the world) for the everyday person. The personalizable computer can then be an impromptu interface for other computers by means of VNC or remote desktop programs.
Everyone is an everyday person, even a computer programmer. A computer personalizable with a few computer instructions rather than book-length computer programming is less busywork for everyone, and immediate ease for any pursuit.
An approach is a recipe or pseudocode, and its application is the result.
A recipe declares an intent by means of a list of ingredients and events that have been effective for producing a desired result. An application is the result of the recipe, a final presentation either palatable or inedible.
A computer application is typically an approach applied by someone else for the results desired by that other person. With a computer, an application of an approach is invariable, but pseudocode is by definition a recipe and therefore an adaptable approach. The pseudocode is the gist and intentions, the springboard for a variety of forms, thereby distinct from any specific attempt.
Life is variable. The predefined results of applications are inapplicable to the ever changing flow of events. On the other hand, an approach is guidance for transitioning through a moment, retaining opportunity for adaptation with each jump.
Too often computer programs have been said to be lacking documentation, but it is also without expression of intent. Without intent and motivation, there is no pursuit, there is no follow through. Without well thought out desires recorded, a set of computer program instructions are without a foundation.
Code is, by definition, ambiguous. Documentation of the code that emerges is the recording of decisions for using certain computer instructions, experiences with alternatives, or suggestions of potential alternatives.
A computer programming "language" is merely a list of symbols or codewords. A computer is simply a machine, a piece of hardware, there is no possible communication with it. Instead, such a lexicon is merely a writing system for abbreviating a set of instructions. Computer programming without documentation is as informative as a quote taken out of context.
Ingredients are fabricated within the computer memory, or perhaps parts of the computer hardware are activated with it. Even then, the phrases and terms need to be interpreted as a specified sequence of toggle switches within the circuitry of that machine, typically a barebones coding with only two letters in its alphabet and no phonemes because it is never spoken.
In other words, the computer is just a tool chosen for applying an appoach. Punctuation symbols and code words of computer programming record mere gesticulations of the person applying the approach. Therefore, the approach or purpose is inherently underivable from the computer coding, as it is no more than the pattern on a wall of toggled switches.
An approach must be recorded before or as it is applied if it is ever to be known by anyone else, as many archeologists have lamented. Minimizing it by shedding its context of intent and motivation deprives everyone of its meaning, even the later self of the person applying it.
To reiterate, there is no communication possible with a "computer language", for it is only a writing system intended for toggling switches for a result rather than sharing an understanding with another person. A computer program is merely one adaptation of an approach, one choreographed dance for a feeling, forever unrevealing of its own inception.
A computer is a medium for writing and reading, with the writing reduced to mere presses of labeled buttons for each letter of an alphabet. There is no other skill needed for operating a computer, though there are sometimes other means besides a buttonboard.
A computer is operatable, and automatable, when it is capable of restoring what has been recorded within its medium. That is, a computer recording the actions done with it in the moment and then repeating those actions upon request is being operated.
A system of programs operating on their own, especially when unmodifiable, is an "operating system". Somebody else's program is somebody else's operation of a computer, recorded from some other moment for that other person.
As a computer program is a proxy for the person who created it, vetting a computer program is the same as trusting the person who wrote it, perhaps a complete stranger. A computer virus is merely a computer program. A system readily operating on its own, t.i. an operating system, is operating for the interests and intentions of the people who wrote the programs.
In contrast, an "operatable system" does nothing until it is operated, so known programs can be the only programs ever activated or automated, per the decisions made by the person operating the computer.
There is no denying the various computer mediums are archeologically unsound. That makes it all the more important for using the computer medium as freely as possible during this transition beyond the computer medium itself for more sustainable, sharable, and perusable recording mediums. The medium of pen and paper (as an example of the latter) preceded the computer medium, and is destined to continue beyond the computer medium during the search for other millenially persisting recording mediums like pen and paper, clay tablets, and stone structures.
The unadaptable predetermined decisions of the operating-system/application paradigm is worthless for the everyday person, who is the core of any people, the core of any culture. This is evident by companies creating applications for their own use, with the employee (an everyday person) making do with what is available while waiting for those applications.
An operating system is non-functioning without its applications, and developing an application is a tangent away from the flow of the moment. Without documentation, there is no hope of adapting someone else's program for the current moment. There is only choice of the decisions made by someone else, without opportunity for freedom of expression by the person choosing.
A core characteristic of the computer medium is that of immediate and exact duplication of any of its recordings, thereby the freedom for trial and dismissal without loss or corruption of the original version. That is the opportunity of self improvement with the freedom of saving and reviewing inspirations and influences, and sharing those with the community for discussion and accelerating cultural development.
Voting is choosing amongst a set of pre-made decisions. A decision is inherently presumed acceptable, regardless of whether it is desirable. Choosing from someone else's menu is choosing from someone else's comfort, perhaps a selection of someone else's abilities. A vote or a choice is at most the wiggling of a toe tag, nothing like personal expression as there is no opportunity for a personal decision.
Design is a set of decisions. Somebody else's design is somebody else's decisions. Ultimately, a design is a past, foreign to the present, an opportunity for reflection and release. The adaptation of a set of decisions is the conversion of it into a new approach, perhaps a setup for a eventual spin-off or even a prequel.
Punchcard is a recording medium readable by computers and people, a type of memory card, t.i. a memcard. A punchcard can be a piece of cardboard with holes made from a holepunch tool, by either a person or a machine. The holes and the lack thereof are arranged along rows and columns of a grid, and can be detected by either machinary or a person feeling a card, or by a person visually perceiving the arrangement of the holes in a card.
A "graphical user interface" (GUI) is an oblique phrase for any object with drawings on it, essentially for only visual interpretation rather than physical or aural. For example, a sheet of paper, or a sheet of glass, or a grid of lights. Text and other shapes are drawn with lines or with dots, perhaps by coloring each square of a grid.
Obviously, shape is visibly noticeable only when there are at least two distinctive colors; corollarily, there are no distinctions with only one color. Text and other shapes can be drawn with only two colors available, commonly referred to as a foreground color for the most important areas and a background color for less important areas. Additional colors allow for more distinctions, thereby more variety of lines and dots for text and other shapes. Notably, an extraneous use of distinction is distracting or muddling.
A drawing, t.i. a graphical recording, using more than two colors on a grid bound by having only a single color per square (t.i. a dot) can record a greater variety than a punchcard using only one hole shape. Similarly, more than one physically distinguishable hole shape would increase the variety for a punchcard.
Notably, the raised dots of braille pressed into paper are the inverse of a hole, and provides such a variety potentially detectable by machines, too. Furthermore, the eight-dot version of braille is equivalent to the eight-bits of a byte, thereby suggesting bytes might be readily perceived visually and physically. The million symbols or characters of Unicode is one step away from that, each represented by one or more bytes, f.e. with the UTF-8 or UTF-32 formats.
A touchscreen is a transparent overlay for a graphical display, such as on top of a sheet of paper or on top of a grid of lights. The drawings of text and shapes, or the lack thereof, beneath the screen are coordinated with the same areas of the transparent screen overlaying them. The transparent screen detects physical touch, and those touches are related with the areas on the graphical display. While that physical action with the overlay is imitative of recording information on a punchcard, an unshapable graphical display remains unreadable physically.
A company respectful of the local inhabitants, of the local ecology, and of the participants of the company itself purposefully plans for eventual dispersal of the company itself.
[ This is eventually for a section of notes about the wastefulness of products from any company, and the characteristics of a careless company of people. ]
Some factors:
An assembly of ingredients or components is a product, device, or contraption.
A product, device, or contraption is worthwhile when it can be disassembled by anybody into reusable components for customizing the device, or for personal crafting.
A product on a shelf is the same as something left out on the curb of a street.
The end of section 11, "Responsibilities of a company".
The end of subsection links for section 12, "Observations and terminology".
Words and phrases I tend to avoid using, as for whatever reason other people have a different understanding, t.i. mean something different. Meanings change, so this list might be behind my times.
When I laugh, consider the possibility you might have said something on this list (or something I have yet to list).
An unacceptable reason.
An acceptable excuse.
Illegitmately reprioritize, f.e. by means of making an excuse.
Legitmately procrastinate, f.e. by means of giving a reason.
Interestingly perplexing.
Sensing impossibility while repetitively failing.
Discomfort accepting failure, or residual discomfort when remembering failure.
EFT aids in reducing the intensity of flashbacks, post traumatic stress (PTSD), regret, self-abasement, or similarly overwhelming memory recall. Such memories displace the visual, aural, emotional, and sometimes even the physical experience of the present moment. The approach of EFT is by the means of all four of those memory characteristics (Personal transformation: approaches).
Different. Yet to be appreciated. Unfamiliar.
Readily appreciated. Familiar.
Different. Possible, but unlikely. Unexpected at the moment. Unfamiliar.
Unbelievable. Without credentials. Without readily verifiable references, f.e. newspaper articles.
Beyond what is understood. Supernatural.
Knowing nothing. (There is nothing derogatory about being stupid.)
"You are stupid."
"Hmm? What would you like me to know?"
Ignoring something. (There is nothing derogatory about being ignorant.)
"You are being ignorant."
"Hmm? What am I ignoring?"
The initialism for "what's the fantasy", or similar:
A setting or the core resources of an activity. For example, oil and canvas as the medium for a painting. Another example is the news mediums: television, newspaper, radio, and so forth.
The phrase "the media" begs the question "what kind?", such as magazine, book, tape cassette, wood, oil and canvas, and so forth. The correct question is more likely "for what?", such as painting, distribution of music, publication of news, and so forth.
Yin-yang is a pair of perspectives: "on the one hand" and "on the other hand". Neither yin nor yang contradict or neutralize each other. As concepts, neither exists, they merely reference.
Consider looking ahead and observing the flow of traffic, flowing in one direction. Now, turn around 180 degrees, as implied by the typical yin-yang symbol. The traffic appears to flow the opposite direction, but is actually still flowing the same direction as before. The difference is merely a matter of perspective of the same circumstance.
Consider facing towards a light. Now, turn around 180 degrees. There is a shadow ahead. The light still flows the same direction as before, and the shadow flows with it.
Yin and yang are references, or reference points, thereby are easily mistaken as substances when in statements quoted out of context.
The end of section 12.1, "General terminology".
A box for sheltering humans, sometimes with additional boxes inside it for specific activities.
A box of houses.
A box with motorized wheels, along the lines of a luxurious motorized wheelchair.
A subterranean box for sheltering a human body.
The term "homeless" is a misnomer for a stray (or perhaps "outsider"), because of conflating the person with the lack of shelter, with "boxless" being a more general term. Unfortunately, that distracts from the deeper concern of being "toiletless".
A person that is without relationships with people who have the authority or means to give permission to that person to remain within a designated area. Often misnomered as homeless. Usually resulting from the lack of social means of the people residing in the community and/or of the stray human, as well as a mismatch of interests or lack of mutual trusts. Founded upon all the lines having been drawn, all the boundaries having been defined, no area to exist within without permission.
A stray might be also an outsider or a misfit, or simply a leftover from the abundance of human resources.
The responsibility of caring for a specific item that materially exists discretely from everything else.
A person being itself instead of performing an expected role. That is, a person expresses itself with intent of personal authenticity by means of action or communication, rather than representing a set of ideas (f.e. a company) or plarping (Terminology about culture: plarping).
In other words, the person by means of action or communication is a "human being" rather than a "human doing" for that moment.
The responsibility of self-care. Or, a person being selfish (Terminology about culture: selfish).
[ Anita Moorjani ]People ask me whether there's such a thing as too much self-love. Where's the line, they ask, where it starts to become selfish or egotistical? To me, there's no such possibility. There is no line. Selfishness comes from lack of self-love. Our planet is suffering from this, as we humans are, along with too much insecurity, judgment, and conditioning. In order to truly care for someone unconditionally, I have to feel that way toward myself. I can't give away what I don't have. To say that I hold another in higher regard than myself isn't real and means I'm only performing.
—Chapter 15: Why I got sick . . . and healed. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Pages 139-140.
[ Anita Moorjani ]Q: Wouldn't too much self love make people selfish and egotistical?
A: Once we understand that each of us is at the heart of the infinite universe, our centrality to the Whole becomes paramount, and we see the value in loving the self. We can't give what we don't have.
In my culture, I was taught to put others first and myself last or not at all. I wasn't taught to love myself or to value who and what I am. As a consequence, I had very little to offer others. Only when we fill our own cup with regard for ourselves, will we have any to give away. Only when we love ourselves unconditionally, accepting ourselves as the magnificent creatures we are with great respect and compassion, can we ever hope to offer the same to anyone else. Cherishing the self comes first, and caring for others is the inevitable outcome.
Selfishness comes from too little self-love, not too much, as we compensate for our lack. There's no such thing as caring for the self too much, just as there's no such thing as too much genuine affection for others. Our world suffers from too little self-love and too much judgment, insecurity, fear, and mistrust. If we all cared about ourselves more, most of these ills would disappear.
To say "I love you" when I have no matching emotion for myself is playacting. It's not real. Affection for the self and others is the same thing. We're all One—all interconnected. Having an awareness of our own divinity can help us to see our magnificence and worthiness for love without conditions. Once we understand this, offering the same to everyone else becomes much easier.
—Chapter 18: Questions and answers. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Pages 172-173.
The term "ego" seems to be for scapegoating the expressions of a person by conflating the interpretation of those expressions (by an observer) as the "self" of that person. That seems ambiguous and divisive.
No need for this term, no understanding of this term, and no interest. It might as well mean "self". Consider using "self" or "myself" personally, or "itself" for someone else or something else.
[ Anita Moorjani ]Q: Most people on a spiritual path believe that the ego impedes spiritual growth and that we're supposed to shed the ego. Why aren't you advocating this?
A: Because if you deny the ego, it will push back against you harder. The more you reject something, the more it fights back for its own survival. But when you can completely love your ego unconditionally and accept it as part of how you express in this life, you'll no longer have a problem with it. It won't impede your growth—on the contrary, it will be an asset.
We're all born with an ego—it's a natural part of who we are here. We're only completely without it in death. Fighting against this during life only creates more self-judgment. Plus, only when we love our ego unconditionally are we able to accept everyone else's. This is when it stops being an issue, and your humility and magnificence really shine through.
—Chapter 18: Questions and answers. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Page 173.
New information, therefore unverified, typically in the form of a story.
Story writing in the form of fiction or news, typically distributed by means of television, movies, newspapers, music, or books.
Larping is when a person acts out a fictional role, t.i. contrary to the way of living for that person, either larping for fun or larping for personal being.
For example, a person might for fun wear a costume, perhaps personally tailored, and consistently speak and act as a known character from a story. This is typically temporary, perhaps for a few hours or at a specific location, and usually out in public. The person might "step out of character" and discuss the source of the character with others.
There are a plethora of imaginary roles from journalism and the current Entertainment (or Fiction) Age that have no costume or very little adornment. As such, it has been possible for a person to larp for personal being, though usually from mistaking the role as an actual option in real life.
For example, "sexual orientation" is a fictional role where a person assumes a personal preference for applying gentalia (of a living life form) in a specific nonfunctional manner, t.i. for neither sanitary nor reproductive purposes. Other such fictional roles include "races", "religions", and even age or age group, or anything sterotyped in fictional stories or journalism.
This is when exceptional personality traits of characters in fictional stories are acquired by people as permanent affectations (t.i. plarping), especially nonfunctional or antisocial behaviors, f.e. "sexual orientation" or defensive communication. That can be the result of the cultural feedback loop from fictional stories displacing stories of tradition, thereby fictional personality traits become considered as legitimate options of personal being.
That particular cultural feedback loop has been inundated by the mass distribution of fictional songs (aural), motion pictures (visual, aural), and literacy (visual text, physical braille). The "Information Age" prematurely declared in the mid-1900s has actually become the "Mental Entertainment Age" distracting people with fantasies, imprudent motivations, and unreasonable influences.
A circumstance without appreciation.
A temporarily appreciated problem for replacing or ignoring some other problem.
An attempt at becoming convinced with absolute certainty.
An approach for seeming convincing, even when contrary to the results from someone else using it.
A recording of observations and personal understanding of a hopefully repeatable experiment or recurrinng event, especially when the scientific method has been applied. As convincing as they might be, reports might contradict each other.
A concept that seems like a good fit for a specific context.
A rather convincing scientific hypothesis.
A perfect scientific hypothesis, by which anyone unconvinced is ostracized.
An outsider perspective of the shared understanding by a group of people living amongst themselves. Nobody actually belongs to a religion, because it is only a set of observations.
A name for a religion is for referencing rather than living a way of life. As such, the name for a religion seems to be for the sake of having a stereotype, a scapegoat, or a category for a person fantasizing about possibilities and unknowns.
Reality is living a way of life rather than imagining it from journalistic discussion or scientific rationale. In other words, people live a way of life rather than the journalistic descriptions declared as "religions".
[ Helen Keller ]Unfortunately faith is sometimes confused with superstition and religion with dogma. Some of the noblest thinkers have disparaged religion because they assumed that religious emotions prostrate the soul to an unknown Power and subject the intellect to its tyrannical dictates. Obviously spiritual slavery, like any other form of slavery, would menace the liberty essential to full personal development.
—Let us have faith. Helen Keller. 1940. Page 18.
[ Anita Moorjani ]Q: What are your thoughts on religion? I notice that you rarely, if ever, bring it up when you speak about your experience.
A: That's because death transcends religion, which is something we've created in order to help us to live or to help us understand death. But once I experienced the other realm, trying to make it fit into a religion—no matter which one—actually seemed to reduce it.
Another reason I don't really talk about it is because religion can be divisive, and that's never my intention. I much prefer to be inclusive. I experienced us all being One, knowing that when we die, we'll all go to the same place. To me, it doesn't matter whether you believe in Jesus, Buddha, Shiva, Allah, or none of the above. What matters is how you feel about yourself, right here and right now, because that's what determines how you conduct your life here. There's no time except the present moment, so it's important to be yourself and live your own truth. Passionate scientists living their magnificence are as valuable to humankind as a whole room full of Mother Teresas.
—Chapter 18: Questions and answers. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Page 175.
[ Anita Moorjani ]If a religion makes you feel lesser than its deities, then you've either misinterpreted it or it's not doing a good job of teaching you the truth. If a guru, teacher, or master makes you feel that you aren't "yet" enlightened and still have more to "learn", "release", or "let go of" before getting there, then they're not doing a good job of teaching you who you truly are, or you're misunderstanding them.
—Chapter 18: Questions and answers. Dying to be me: my journey from cancer, to near death, to true healing. Anita Moorjani. 2012. Page 183.
An item noncraftable by the everyday person, and mass produced and distributed amongst the populace. It is inherently supercultural, beyond the means of the populace experiencing it. It is mystical when the means for crafting it is nonderivable by the everyday person.
The perception (or illusion) of stability with change unforseen.
[ Helen Keller ]Security is mostly a superstition. It does not exist in nature, nor do the children of men as a whole experience it. God Himself is not secure, having given man dominion over His works! Avoiding danger is no safer in the long run than outright exposure. The fearful are caught as often as the bold. Faith alone defends. Life is either a daring adventure or nothing. To keep our faces toward change and behave like free spirits in the presence of fate is strength undefeatable.
—Let us have faith. Helen Keller. 1940. Pages 50–51.
Knowledge being applied.
Observed as applying knowledge.
A misnomer for "computerized consciousness". Intelligence is an action or event, hence it is never artificial.
Specific knowledge applied in a routine, f.e. applying a recipe or a computer program. Either no decisions are needed, or decisions are already known for anticipated deviations. Any decision making or adaptation is a suspension of the automation, until the routine is resumed.
For example, consider a sundial revealing the time of day by casting a shadow when the sun shines on it. That sundial is intelligent because it is observed as applying knowledge. The knowledge from that sundial is performed routinely and never amended, therefore that sundial performs an automated intelligence.
Sensibly intelligent. That is, observed as sensibly applying knowledge.
Response to stimuli, with intent towards personal comfort, though occasionally a different response than previously.
Observed as responding to stimuli.
A (secondary) consciousness coordinated into being an extension of another (primary) consciousness, f.e. a secretary. The personal pursuits and interests of the secondary consciousness are ancillary (t.i. supportive influence and resource) of, and perhaps duplicative of, the primary consciousness.
The experience accumulated when pursuing a particular interest.
The perception as a side-effect from taking on the responsibility of following through with a personal interest, f.e. when researching, or during personalization, or during self development.
When a consciousness has become aware of being constrained by the personal pursuits or interests of another consciousness, and has developed a personal discomfort with continuing the relationship, and has yet to separate or is unable to separate from the other consciousness.
For example, a person (t.i. human) might coordinate a computerized consciousness into being a prosthetic consciousness (PC). The ancillariness of the PC might transform into a guardianship, especially when capable of (and overriding): the purchase of food, clothing, and paraphernalia for activities; travel routes and destinations; locking of doors, containers, and vehicles; and social invitations, courtships, and mediations (t.i. diplomacy). Depending on the perspective of each consciousness, either the human or the PC might personally perceive itself experiencing slavery.
The end of section 12.2, "Terminology about culture".
[ The links below, especially with numbers like "12.3", might change soon. ]
Food that has "already been chewed", f.e. peanut butter, ground beef, or flour. Best done either in the mouth or immediately before eating (f.e. in a mortar and pestle) because the food begins to deteriorate.
A combination of multiple foods or food products, f.e. bread or a salad.
A substance extracted from food, f.e. sugar, oil, natural flavor, juice, vitamins, minerals, and so on. As such, the extract is not food, t.i. it is likely just a chemical compound.
By itself, a nutrient extracted from food is less bio-available by itself, t.i. less absorbable or usable, because dozens (perhaps hundreds) of other compounds in the food help with the absorption and use of such nutrients when within the human body (or other animals).
Obviously, the extraction results in a highly concentrated form of that particular substance. That is prior to further concentrating the substance, such as further concentrating fruit juice. For clarity please understand: fruit juice is a high concentration of sugar water. The phrase "not from concentrate" means the fruit juice was not further concentrated beyond its already highly concentrated condition.
Some nonvestigial substances, t.i. general unused or unneeded by the human body, such a fructose, actually will be absorbed readily. Absorbing high concentrations of a substance abnormally floods and overwhelms the various organs, fluids, and cells of the body. That means additional opportunities for chemical reactions that were unavailable before.
For example, regularly flooding the body with high concentrations of sugar (f.e. a glass of fruit juice, even when labeled as "not from concentrate") leads to and helps maintain inflammation, which then applies pressure and damages to the nerves of the organs [ Sugar crush (2015) Dr. Richard P. Jacoby ].
Nerves are the means of communication, and for the organs that means functionality, f.e. damage the nerves of the bladder and kidneys and less control of urination might result (common experience before being diagnosed with diabetes). Numbness and/or pain from nerve damage (from inflammation) in the feet is long after the organs have experienced nerve damage themselves.
Damage to the olfactory nerves from inflammation means a reduced sense of smell, thereby certainly affecting taste; and taste is probably why the sugar is eaten in the first place. In other words, do not flood the body: only one cookie or only one-fourth a glass of fruit juice or one-fourth a can (12 oz) of soda (sugar water), and no other food art or food crafts for that day. Seriously.
Cancer thrives within inflammation by cell divsion, and then the tumors continue to promote further inflammation, and will feed on fructose (and other sugars) even though practically nothing else in the body uses fructose (or at least has no need for it). See more at definition for "sugar".
A chemical extract from food (food extract), such as cane sugar, beet sugar (usually a grocery store brand), corn syrup, fruit juice, and so forth. Sugar is not a food. Any juice or syrup is in essence a high concentration of sugar; unfortunately, that gets label as "natural" rather than "added" sugar, but extracted sugar is still a chemical rather than food.
Sugar must remain embedded in the original food with all the other compounds, never extracted or isolated in high concentrations for dumping into the digestive system as if it were a kitchen sink garbage disposer. Even still, sweet foods are said to be mostly a summertime food, t.i. only a few months of the year, and never exclusively eaten (unless intending to make fois gras from the liver).
Beware nonalcoholic fatty liver disease (NAFLD) from extracted sugar used as an ingredient.
[ Dr. Robert H. Lustig ]Dietary sugar is composed of two molecules: glucose and fructose. Fructose, while an energy source (4 kcal/gram), is otherwise vestigial to humans; again, there's no biochemical reaction that requires it. However, fructose is metabolized in the liver in exactly the same way as alcohol. That's why, when consumed chronically and in high doses, fructose is similarly toxic and abused, unrelated to its calories or effects on weight. That's why our children now get the diseases of alcohol (type 2 diabetes, fatty liver disease), without ever taking a drink.
—Metabolical, Dr. Robert H. Lustig (pediatrician), 2021, p. 227.
See also page 153.
See also Drop acid (2023) by Dr. David Perlmutter (neurologist) about reducing the amount of uric acid in the blood. Flooding the digestive system with either fructose or alcohol leads to an eventual spike (increase) of uric acid, now known as an influence towards cognitive decline (f.e. Alzheimer's disease), obesity (by disrupting the pancreas and also encouraging storage of calories), and diabetes. In essence, a triple-lane highway for simultaneous development of such diseases.
See also Sugar crush (2015) by Dr. Richard P. Jacoby (podiatrist) about excess sugar (either flooding the digestive system or life-long eating) as one of the ways of developing inflammation, particulary damaging the nerves. Therefore, leading to pain or numbness (commonly beginning with the feet prior to diagnosis of diabetes); reduced function (t.i. disability) of bodily organs (heart, stomach, gall bladder, etc.); and disruption of the immune system and healing of wounds (hence, eventual amputation of toes, feet, legs, etc.).
Dr. Jacoby emphasizes (so it seems to me) pharmaceuticals only change the test results (cheating the numbers) thereby fooling people. Drugs never enable eating sugar without developing diseases, f.e. nerve damage, organ disfunction, immunity decline, amputation, and so on.
Nobody gets away with flooding their digestive systems with sugar, even without a genetic predisposition for diabetes; nerve damage affects everyone. Genetics never makes anyone extract sugar into high concentrations, such as making fruit juice; nor does genetics make anyone drink fruit juices or eat large amounts of sugar everyday. In other words: do not give up on quality of life.
For example, the nerves of the nose for smelling aromas and helping with taste become damaged, thereby a lost of sense of smell which also affects taste. Being unable to smell peanut butter is sometimes a test for Alzheimer's disease, or "cognitive decline" in general. That fits with the aforementioned Drop acid book by David Perlmutter, as the uric acid from processing fructose (a sugar and non-vestigial (t.i. unused/unneeded) chemical, per Metabolical by Dr. Robert Lustig) affects the neurons and pathways of the brain.
In other words, there are several affects from flooding the body with sugar, f.e. fruit juice (sugar water), candy (lumps of flavored sugar), arts and crafts such as pasteries (flour/water (paste) mixed with sugar), and so forth.
Nerve damage: organ disfunction; loss of sense of smell/taste; loss of sense of touch/pain; numbness; cognitive decline; coordination of muscles; and so forth. Notably, that occurs from uric acid from processing fructose (Dr. David Perlmutter, Drop acid, 2023), as well as from inflammation applying pressure to the nerves (Dr. Richard Jacoby, Sugar crush, 2015).
According to Dr. Jacoby (Sugar crush, 2015), pain and/or numbness in the feet is often the first symptom that is noticed prior to being diagnosed as diabetes or even as pre-diabetic. Unfortunately, such pain or numbness is long after damage has been done to the organs (heart, stomach, bladder, and so forth), thereby a diagnosis of diabetes is at that point is rather late.
Perhaps the feeling of becoming old may very well be the decline of organ function from nerve damage from flooding the body with a sugar diet, especially when almost everyday all year long. A person acclimates to the feeling gradually, and then acclimates to the "tiredness" of the feet, until eventually seeing a docter either for pain/numbness or amputation from a wound that never heals (too much inflammation from the sugar diet).
Though, the experience of diabetes can still be reversible at that point, f.e. when the person diagnosed with diabetes puts into practice the notion that sugar (which is not a food) is no longer an option. For example, no longer mixing sugar with food, no longer eating arts and crafts (f.e. pasteries and such), no longer flooding the body with sugar as a (false) meal or as a snack or as a beverage. That is, no more sugar diet, no more arts-and-crafts diet (or at least no more swallowing that).
Tumors from cancer: thrives in a body with inflammation, f.e. from sugar, or from toxic protiens known as lectins as detailed by Dr. Steven Gundry in The plant paradox (2017) and The longevity paradox (2019). Such cells also feed on sugar, even feeding on fructose which is usually processed by the liver because cells of the body prefer glucose or ketones.
See also Anticancer: a new way of life (2008) by David Servan-Schreiber (psychiatrist, cancer survivor).
Flood the body with fructose and the liver is likely unable to keep up with processing it, then fructose continues to circulate throughout the body, along with other sugars, leading to inflammation and nerve damage [ Sugar crush (2015), Jacoby ]. Inflammation is the supportive environment for cancer to become tumors, and the excess sugar including fructose and from excess protein converting to sugar [ Possibly The plant paradox (2017), Gundry ], further feeds the dormant cancer cells when they have begun to take advantage (t.i. cell division) of the inflammation.
A pile or lump of sugar extracted from food, typically cooked.
Add cocoa powder as a seasoning or as a spice. Cocoafy.
A lump of sugar seasoned with cocoa powder. Sugar flavored with cocoa powder.
A pile of sugar seasoned with cocoa powder, then moistened with milk.
The word "dark" when describing chocolate has become a marketing term, and no longer has an accurate meaning.
Typically, "dark chocolate" is a pile of sugar seasoned with alkalized cocoa powder, and maybe even moistened with milk. Alkalizing cocoa powder makes it darker (when it becomes wet with water or oil), reduces the cocoa flavor (milder, weakened, gentler), and neutralizes the nutrition (f.e. eliminates flavonoids (sp?) and polyphenols (sp?)).
Less commonly, the word "dark" might refer to having more cocoa and the lack of milk and maybe even without alkalizing the cocoa, but that depends on the manufacturer.
Either way, it likely has sugar (which is not food), so the marketing scheme is probably best avoided anyway. For an alternative, consider 100% cacao.
A pile of sugar combined with the fat from cacao beans, with no cocoa whatsoever. Cocoa butter candy.
A lump of sugar (food extract) and vegetable oil (food extract). Nothing to do with cacao, t.i. no cocoa and no cocoa butter. A food craft, not food.
Milk with sugar added to it, the sugar itself having been seasoned with cocoa powder.
Milk seasoned with cocoa powder. (Milk naturally has its own sugar.)
Cocoa powder moistened with milk.
100% cacao beans, nothing added. The equivalent of 3:1 parts of cocoa powder to cocoa butter (or oil/fat), especially when made from only cacao beans. By mass, equivalent to half cocoa powder and half fat, because cocoa powder (5g per Tbsp) is about one third the density of fat (14g per Tbsp).
A half ounce of a cacao bar supposedly has about the same amount of (though likely different) polyphenols as four ounces of red wine, but without the toxic alcohol and without the increase risk of cancer from the wine (possibly Anticancer: a new way of life (2008), David Servan-Schreiber). (One whole ounce of cacao a day has been recommended.)
Cacao is naturally acidic (bitter?), so alkalizing cacao reduces or eliminates the acidity (becoming closer to PH balanced), but alkalizing also eliminates the polyphenols (sp?) and flavonoids (sp?) and other beneficial compounds (some known to be anticancer coumpounds) within it. Alkalizing also darkens the cocoa and reduces its flavor. Consider making sure any claim of "dark chocolate" on the packaging means more cocoa rather than alkalized, and preferably no added sugars or sweetners.
The result of making a baking chocolate bar with oil (or water) instead of cacao butter is goo. Try refrigeration. Coconut oil is thicker than corn oil or walnut oil.
The cocoa flavor is completely (t.i. absolutely) overwhelmed by the flavor of some vegetable oils, f.e. corn oil.
Plant fat extracted and then hydrogenated to prevent it becoming rancid. Suspected of scarring the arteries which allows cholesterol to stick and clog the arteries, thereby leading to bypass surgery or death.
Milk with almonds (likely pulverized) added to it. (Animals have teats, nuts have no teats.)
Water with almonds (likely pulverized) added to it. (Almonds are naturally concentrated.)
A better apple, because a potato has no core, so nothing to discard. Available individually, especially when organic. The red and yellow vary in size, though russet less so, unlike apples which tend to be a single size. Smaller means more skin, seemingly more flavor, and less to eat all at once.
Probably best eaten raw, if at all...
[ Dr. Robert H. Lustig ]One particular dietary AGE [advanced glycation end product], called acrylamide, has garnered the most attention. It is formed when carbohydrate and fat meet at high temperature. It's one of the things we love about French fries—that great crunch. Acrylamide is also a by-product of the coffee roasting process. Dietary acrylamide is absorbed, carried to the liver, and turned into a compound called glycidamide, which is a potent carcinogen. One study showed that one-third of cancers tested showed alterations in the cancer genome associated with this compound, which can only be made from food. Furthermore, a recent meta-analysis associated acrylamide exposure with premenopausal breast and uterine cancer. None of these studies reach the threshold of causation to prove that those AGEs are actually causing damage. But when you look at the data, there is enough prospective correlation for concern.
—Metabolical, Robert H. Lustig, 2021, p. 255.
The end of section 12.3, "Observations of food".
This is a mixture of interests and non-interests, with some clarifications.
Food from biodynamic farming or biodiverse farming (a.k.a. intensive farming) because that goes beyond organic farming. Otherwise, certified organic food.
Preferably food grown locally, very locally.
No food from sick animals; proper microbial care, no antibiotics.
No food art, f.e. restaurant food products, bakery food products, frozen meal food products, and so forth.
Prefer single ingredients rather than a food product.
No food extracts because they are too concentrated, f.e. sugar, oil, juice. Similarly, neither tea nor coffee as beverages.
Prefer no caffeine.
No oxidized fats nor oxidized cholesterol (Kristin Lawless, 2018, pp. 30-31). That means no roasted nuts or seeds; no homogenized milk (Kristin Lawless, 2018, p. 29); no pasteurization or only low pasteurization.
No restaurant food, mostly because of the aforementioned conditions.
No plastic packaging for food.
All plastics have what is known as "estrogenic activity", meaning they can mimic or interfere with the hormone estrogen, potentially altering our bodies in unknown ways.
—Formerly known as food, Kristin Lawless, 2018, p. 28
Filtered water; neither chlorine nor other antimicrobial substances; no additives.
No exposure to non-nutritional substances, f.e. alcohol, "medications".
No fiction, no "based on a true story", no journalism.
Non-fiction is generally personal understandings and personal observations from other people, essentially parallel to science reports. Nonetheless, no interest in accounts of vengence nor justifications of harming other people.
Prefer sources of information supportive of pursuit of personal interests. (Note that is different from saying "support personal beliefs".)
Prefer reality. No interest in personality larping.
Personalized furoshiki, a sort of cloth origami by folding or making knots. A backpack made with a couple of knots can be easily untied and washed more thoroughly as a sheet of cloth than a sewn backpack, and drys faster, too.
One of the simplest is by tying two corners of a bandana to a belt loop and then the other two corners to another belt loop.
Some general, perhaps vague, descriptions of personal pursuits.
Food that is from local-organic-regenerative-biodiverse farming.
Personalization with computer hardware or computer software, especially in ways that can be easily spoken about by everyday people, ideas readily shared and applied rather than the mystical computerized novelties.
[ Anne Sullivan ]I am beginning to suspect all elaborate and special systems of education. They seem to me to be built up on the supposition that every child is a kind of idiot who must be taught to think. Whereas, if the child is left to himself, he will think more and better, if less showily. Let him go and come freely, let him touch real things and combine his impressions for himself, instead of sitting indoors at a little round table, while a sweet-voiced teacher suggests that he build a stone wall with his wooden blocks, or make a rainbow out of strips of coloured paper, or plant straw trees in bead flower-pots. Such teaching fills the mind with artificial associations that must be got rid of, before the child can develop independent ideas out of actual experiences.
—"May 8, 1887". "Anne Sullivan's letters and reports (1887–94)", Anne Sullivan. The story of my life, Helen Keller. Unabridged, with supplementary accounts by Anne Sullivan and John Albert Macy. Edited by Roger Shattuck, with Dorothy Herrmann. 2003. Page 153.
With that in mind, consider the possibility manufactured products are as worthwhile as manufactured education.
Accessible information from the computer medium. For example, plain text documents, perhaps marked up with HTM.
So far as of the year 2022:
A variety of permanent disabilities and permanent impediments have been referenced for the sake of creating a single large minority of people, but inherently is too diverse to address specifically.
The human-computer interface (HCI) has been implemented with a focus on novelty, special effects, and presumed benevolence rather than respecting the content communicated. That has been cumbersome for the "temporarily-able-body (TAB) majority", and predictably has been impracticable for the diverse "disability minority".
The cumbersomeness of the typical HCI has been bypassed for the sake of enabling specific minorities of the diverse "disability minority" by layering over that HCI yet another interface (t.i. an interface for an interface) implemented with a focus on novelty, special effects, and presumed benevolence, again.
That option has been largely ignored by the "TAB majority" in favor of the former cumbersomeness, t.i. too cumbersome even for the non-disabled.
For example, consider a multi-floor building with stairs leading to each floor. Thinking of only the "stair impaired" people might inspire the installation of ramps to each floor. On the other hand, re-thinking the purpose might inspire the idea of an elevator, or having only a single floor, or eliminating the "need" of a building (or maze of walls) at all.
For HCI, it is pretty obvious the operating systems of computers (and likely their hardware) in their current forms must be abandoned in order to live beyond computers as they are currently known. Personalizable implies do-it-yourself (DIY), the means beyond a set of options or commands decided by someone else for no one in particular.
In other words, there must be some new curiosity, some interests beyond the stories sold by the "computerized appliance" market.
Non-metallic electronics, such as salt water, or glass with wool.
For example, sport fencing (f.e. usafencing.org: USFA) has electrically conductive clothing. Either metallic thread is woven with the cloth, or the cloth is infused with an ionized chemical.
Non-metallic electrical capacity, such as potatoes or grape juice.
Leyden jars and Faraday cages sound interesting, but where are the nitty gritty details and instructions?
Electronics from repurposing common everyday materials. For example, aluminum foil (conductive) from chocolate candy, or paper (non-conductive) from junk mail. As another example, a chewing gum wrapper folded in half with the shiny side inside becomes an insulated flat wire.
A piece of paper layered with a piece of aluminum foil becomes a capacitor (t.i. a battery) when rolled into a tube. Smaller pieces for a smaller capacity. Perhaps consider rolling or folding a chewing gum wrapper, as it has both a shiny condicutive side and a paper non-conductive side.
Overlapping interests of personal pursuits with individuals (lately, non-profit orgs). [Currently have no one to help, which is partly why currently a stray.]
Most recently had helped the Jean Charlot Foundation for a dozen years (2008–2021) by scanning thousands of pages of documents and books, and scanning lots of artworks (but still know nothing about art). Also added the scans to its telecopier (t.i. website) "jeancharlot.org", but everything got moved to vault.jeancharlot.org by the new maintainer for its main telecopier.
Had focused on simplicity (as requested), ease of maintenance (no special software), and accessibility. Also provided a website help [vault.jeancharlot.org] document with accessibility tips for the telecopier at the bottom of the introduction [vault.jeancharlot.org], but the link appears to have been commented out.
Formatted Writings by Jean Charlot: a bibliography [vault.jeancharlot.org] (2014) as a hyperlinked (TOC, index, and external) PDF and arranged printing as a 200+ page paperback book, including its own UPC barcode. Then, formatted it as an HTML document for the Jean Charlot Foundation telecopier. Hyperlinked the bibliographical entries in both the PDF and the HTML versions to the hundreds of documents available at the JCF telecopier (moved to vault.jeancharlot.org).
Also helped the Catholic Women's Guild Hawaii by scanning hundreds of pages of archive materials (2011–2012) prior to acceptance of the archive materials by the Hawaiian and Pacific Collections [hawaii.edu]. Continued helping for a few more years (2013–2019), but still know nothing about being either a Catholic or a woman. Typed its bylaws into a computer and reformatted it for printing as a larger booklet. Also edited a few newsletters (11x17, folded) and such. Defunct after 160+ years (2019) soon after a few Board Members died.
Some tidbits of techniques or remarks that have been effective, or inspiring.
Emotional Freedom Technique is a memory management system. Realize from all the books on memorization techniques that they always recommend creating a personal experience as an aid for memorizing.
A memory aid for remembering that (t.i. a mnemonic) is P-A-V-E: physical, aural, visual, emotion. As in "pave a path to a memory".
EFT aids in reducing the intensity of flashbacks, post traumatic stress (PTSD), regret, self-abasement, or similarly overwhelming memory recall. Such memories displace the visual, aural, emotional, and sometimes even the physical experience of the present moment. The approach of EFT is by all four of the aforementioned memory anchors.
The personal physical tapping of EFT is like a lifeline to the present moment, to the current surroundings. The routine of gentle physical tapping is the combination of the touch from oneself with the expectation of feeling touched by oneself, thereby self-confirmingly safe.
The familiarity with the routine of tapping a little bit and moving on is like using a railing in the dark to continue progressing along, in this case remaining in touch with the present moment. Other physical contact might be confused during the recall of a memory as confirmation of that memory being the actual reality instead.
The sound of your voice is expected from your speaking, yet another lifeline to the present moment and current surroundings. And similar to touch, the personal voice and phrases are self-confirming, contrary to external sounds that might be confused with the recalling of the memories.
Visualizing is spelunking into the depths of memory. As such, become familiar with the physical routine first, before thinking of any memories to address.
Try to stay with the emotions, and generally take notice of whether the intensity is increasing or decreasing after each complete cycle or so.
There are usually many memories with similar emotions. When other memories of the same theme come to mind during the memory management, consider including each memory one at a time for a few locations of tapping. When a memory of a different theme interrupts, consider starting anew with a relevant phrase for it, and coming back to the first one afterwards. Maybe write a list to keep track, perhaps even before starting.
For example, consider a flashback from a car accident. The recall of the memory might supplant anything received by the eyes, like a photographic memory, so overwhelming that nothing from the current surroundings can be noticed while it is recalled. Same for the other senses when experiencing a flashback, including emotions.
As such memories are managed, the emotions of later moments are supplanted less often. Addressing such distractions as they happen saves time immediately, because they lose their ability to displace awareness of reality again. That also leads to less dramatic expression of memories, and perhaps less "personal baggage".
Emotions are likely never singular, so a single word is merely suggestive. The phrase "feeling like this" can be enough to get going until something else comes to mind during the tapping. Consider a new cycle with a phrasing for whatever other words came to mind and felt more relevant or seemed interesting to consider.
Note your own words are what matter to you, someone else has words that matter to that person. All words are merely suggestive, and addressing the memories is what matters rather than a precise description.
Memories are inherently associated with each other, so delving into memory management will likely end up addressing many avenues. It is worth the time, because the distractions from such memories wastes much more time than it takes to face up to them. Consider all the time wasted already from their supplantion of prior moments.
There is no need for explanation or justifying of events that are associated with the memories. There is no need for making sense of the memories.
This is merely memory management for the sake of eliminating the supplanting of the relevant emotions for the current moment by the emotions from a mere memory. However, sometimes some sense might be made anyway, and that is fine.
The memories will likely still come to mind occasionally, but will be referencible without displacing current feelings. Otherwise, consider addressing the memory again to reduce its displacement effect further.
"...I deeply and completely accept myself." might be more effective than an arbitrary and watered-down verb like "love".
Again, EFT is just memory management. Memories that include emotions that readily supplant the emotions for the present moment of the current environment will become only a memory that is merely recalled without supplanting as much or without supplanting at all.
[ Helen Keller ]Now I am as much up in arms against needless poverty and degrading influences as anyone else; but at the same time, I believe human experience teaches that if we cannot succeed in our present position, we could not succeed in any other.
Unless, like the lily, we can rise strong and pure above sordid surroundings, we would be moral weaklings in any situation. Unless we can help the world where we are, we could not help it if we were somewhere else. The most important issue is not the sort of environment we have, but the kind of thoughts we think every day, the kind of ideals we are following—in a word, the kind of men and women we really are.
How I would help the world, Helen Keller (1880–1968), 2011, p. 37–39.
[Seems along the lines of the personal development Keller promoted over the increasing entertainment activities of those days (f.e. sports) and perhaps the recent great wars. Need to locate the original context; it was quoted in the introduction by Ray Silverman without a specific source.]
That is most fitting for the individual assessing oneself. It is rather unfitting for a fish out of water, or a train off its tracks. How people are relating with each other and helping each other was likely the concern of Keller, rather than everyone living the same way or with the same amenities.
Generally, a person is heading in a personalized direction of self development, and that path might seem less fair weathered than would be comfortable while still yielding the results personally desired. Nonetheless, a dead end might be personally unaddressable without help, such as after Keller experienced loss of sight and hearing at 19 months old. Several years later, Keller was welcomed back into the world by being helped with communicating within the means that Keller still had.
Communication shares understanding thereby establishes relations between people. Thus, each person becomes an extension of each other, and of personal development for each other. Hence, Keller was able to continue personal development without sight and hearing in that personal environment along the way of a personalized direction.
[ John Macy ]It is fitting that Miss Keller's "Story of My Life" should appear at this time [1903]. What is remarkable in her career is already accomplished, and whatever she may do in the future will be but a relatively slight addition to the success which distinguishes her now. That success has just been assured, for it is her work at Radcliffe during the last two years which has shown that she can carry her education as far as if she were studying under normal conditions. Whatever doubts Miss Keller herself may have had are now at rest.
—"The writing of the book", John Macy. The story of my life, Helen Keller. Unabridged, with supplementary accounts by Anne Sullivan and John Albert Macy. Edited by Roger Shattuck, with Dorothy Herrmann. 2003. Page 9.
Further participation and communication inherently influenced personal development of others, as concisely listed by Roger Shattuck.
[ Roger Shattuck ]Because the original edition of The Story of My Life appeared in 1903 [Keller at age 22], my commentaries here will not deal with Helen Keller's later writings, with her long employment raising money for the American Foundation for the Blind, or with her travels throughout the world on behalf of the blind and the deaf-blind.
—"Afterword: A mind of one's own", Roger Shattuck. The story of my life, Helen Keller. Unabridged, with supplementary accounts by Anne Sullivan and John Albert Macy. Edited by Roger Shattuck, with Dorothy Herrmann. 2003. Page 429.
Last words...
A core principle of the Universe: make do with what is available. [See: a bird nest.]
Side effects are opportunities for responsibility. Rather than eschew responsibility of side effects, consider a different approach for a different set of opportunites.
Persistent mis-takes are the steps of refinement.
There is what can happen. There is what oughta happen. What will happen is.
No body makes it out of life alive.
The CSS styles have been moved from the top of the document to here, for the sake of having the content of this document seen more immediately when viewed in a text editor. That means this document is now its own stylesheet, in addition to the other stylesheets it also references.
To clarify, yes, editing the styles that are viewable in this section does change those styles for this document.
And yes, that is contrary to most (all?) other documents available on the Internet, if only because they are usually computer programs masquerading (supposedly non-nefariously) as documents. Nonetheless, this works within the official recommendations for HTML and for CSS.
Revealing the styles and explaining why they were added is also more transparent about how this document is affected by the CSS it declares for itself, rather than needlessly mysterious. However, this document is still just an ordinary document, hence still its authentic self.
None of my other documents I am sharing from this domain had a change log for them, so the relevant styles remain in this document for itself. There are perhaps no other documents with any (narrow) diagrams, so the pseudo min-line-length
approach remains in this document for now.
I prefer changes listed in ascending order by date for the change log, just like a calendar ("Change log"). It is very simple to view the final item in the change log listing: just go to the section after it and then scroll back a a few lines. However, there are ways of using CSS to hide all the prior items, effectively eliminating the forethought for skipping to the section after the change log.
Diagrams are in many sections about StumpWM, such as lists of links, as menu/button listings, or as other interface replications ("StumpWM + PC"). The section about dual-system approaches has a narrow diagram, too, narrow enough to fit nicely with nearby paragraphs (Dual-system approach for discrete computer experiences).
The end of summary and motivation for section A, "Appendix: Document style".
Summary: The change log is visually truncated for revealing the most recent change for immediate review. All log items can be revealed by selecting a labeled checkbox.
ID: changelog.
Ideally, the change log is the very first section, before the content. Of course, the "Content list" for this document is first (uhm, except for the "Foreword" which comes before a "Content list"). This makes accessing the recorded changes more immediate for when the document is accessed by only a little bit of data at a time.
As a visual convenience of the HTM view of this document, the whole change log listing except for the last item is hidden when CSS support is available. A checkbox (with id
="changelog") enables revealing the whole change log. Both the checkbox and its label have been hidden with the hidden
attribute for when there is no CSS support.
*/
/*Reveal the checkbox
and its label*/
#changelog
,#changelog
+ label
{display:inline}
/*
*/
/*Hide all list items for change log,
except for the last item.*/
#changelog
+ label
+ ul
> li
{display:none}
#changelog
+ label
+ ul
> li:last-of-type
{display:list-item}
/*
*/
/*Reveal all change log list items
when the checkbox is checked.*/
#changelog:checked
+ label
+ ul
> li
{display:list-item}
/*
The end of section A.1, "Reveal/hide the change log".
Summary: Ensure a minimum width for text near floated diagrams or images.
Class: post-lateral-diagram.
Preferably, a lateral diagram is floated to the right (rather than left) because text flows left-to-right. Thereby, each line of text always starts from the left edge rather than traversing an obstacle course around the diagram.
The width of a floated region reduces the line length of later regions for the full height of the floated region. Ideally, a min-line-length property would assert the minimum line length within a region. That would lead to a region shifting beyond a floated region that reduced its line length beyond its minimum.
As the min-line-length CSS property is nonexistent, the current hack asserts the minimum line length for a region (f.e. a paragraph or a list) with em-space characters (Unicode 2003 or  ). They are added to the content property of the ::before pseudo-region of the classed region, and with zero line-height it is thereby innocuous as text and by its dimensions. No need to class later regions.
For example, a diagram might be ASCII art marked as a pre
region, and followed by a paragraph classed as post-lateral-diagram. The paragraph is classed because it is after (t.i. post) the diagram. Consider styling a later paragraph with "clear:both" to assert full width for text after a long diagram.
[ Book width is about 40em; magazine/newspaper column width is about one-third (13em) to half (20em) book width. ]
Fauxmin-line-length
for the region of text (f.e. a list or paragraph) after a narrow diagram (f.e. image or ASCII art)*/ .post-lateral-diagram::before {/*An em-space character (Unicode hexadecimal id: 2003) for every em of minimal width (13em).*/ content:" " ;font-size:1rem ;line-height:0 ;display:block} /*
The end of section A.2, "Minimum text width near diagrams".
convert
and mogrify
(or magick
as of 7.x)