]> git.neil.brown.name Git - edlib.git/blob - DOC/TODO.md
a1ab4b73c5de9353c93e53dfe2bc7e9e7f9344dd
[edlib.git] / DOC / TODO.md
1 To-do list for edlib
2 ====================
3
4 Current priorities
5 ------------------
6
7 All of these, except Triage, are references to todo items elsewhere in
8 the file.
9
10 ### Triage
11
12 - [X] w3m hangs for CAAmjac0r78WpiYW9FsJK=+E8-FG4MoxD2zkUJS_oCRyNW+=rug@mail.gmail.com
13       It is writing to stdout which is reading very slowly.
14 - [ ] in filename completion, TAB might add a '/' to a partial name and
15       then get confused.
16 - [X] when search succeeds on final line then trying again loops back to
17       there, redraw is strange
18 - [ ] There is a "window:close" and a "Window:close" and they are
19       different.  Fix this!
20 - [X] unknown keysequence should be reported so e.g. if keyboard
21       is is Greek mode, then I will be told that Cx-b doesn't work
22 - [X] menubar doesn't redraw background when resized wider.
23 - [X] open second x11 window, use selections.  Close it.  command
24       in x11selection_Xcb gets freed???
25 - [X] adding new lines at end of doc in x11 leaves phantom underline
26       cursors.
27 - [X] 20230908090027.6AA0DC05B9@prodcs.lwn.net has a wrapped
28       <a> tag which isn't parsed well.
29 - [X] find-document - if default doc has <>, displays wrongly.
30 - [X] From start-of-file move to end, then up, then down.
31       Display jumps.  Why?
32 - [X] Add menubar menu with recent documents?
33 - [X] why does clicking on status line go to top-of-file?
34 - [X] search hangs when seeking "^( *)"
35 - [X] selection-menu item to show git-commit from list of known git
36       trees
37 - [ ] selection-menu item for word-count
38 - [X] selection-menu item for QR-code
39 - [ ] selection-menu sub-menu for UPPER lower Caps ??
40 - [ ] selection-menu item for text-fill
41 - [ ] selection-menu item for spell-check ??
42 - [ ] selection-menu item to view a named file - in Popup:Tile
43 - [ ] notmuch - capture errors about multiple Subject lines and
44       display them better.
45 - [ ] switch display-pygtk to use Draw:scale-image
46
47 ### Small
48
49 - [X] notmuch addresses in From: list to have menu to add address to any
50       from-* query
51 - [X] Disable <hide> if cursor is in the hidden region.
52 - [X] fill mode to handle all punctuation at start of this line
53 - [X] Enable lib-menu to show short-cut keys
54 - [X] Add menu-bar to lib-menu.  Pop it up on F10 with simple commands
55 - [X] attach an extensible menu to the selection
56         cut, copy, paste-in, QR, git-view
57
58 ### Medium
59
60 - [X] split range management out of autospell so it can be used by other
61       modules.
62 - [ ] make it easy for a make-search command to search backwards
63 - [X] Make a start on CUA mode with mouse/menu/selection support.
64       Also Function keys: help, close, refresh
65
66 ### Large
67
68 - [X] image-display pane
69 - [ ] git-mode
70 - [ ] render-markdown.py
71 - [X] lib-menu
72 - [ ] Remote display
73
74 Requirements for a v1.0 release
75 -------------------------------
76
77 - [X] logo!!!  to use as icon in X11 for example.  Building blocks?
78       Window pane?
79       Maybe a pencil in a window pane
80 - [ ] configuration
81 - [ ] vi mode
82 - [ ] CUA mode
83 - [ ] nano mode(?)
84 - [ ] multiple front ends: elvi, elma, elnm, eled, elpnt?
85 - [ ] introspection
86 - [ ] markdown editor (with PDF output)
87 - [ ] non-line-based render, such as a tabular render for spreadsheet,
88       or side-scrolling horiz row of thumbnails for presentation, or
89       even a menu-bar with row of menus.
90 - [ ] documentation reader
91 - [ ] block-dev (mmap) doc type, and some hex-mode support
92 - [ ] user documentation
93 - [ ] developer documentation
94 - [ ] some git support
95
96 Core features
97 -------------
98
99 - [ ] universal times_up tests might cause Close_mark or similar
100       not to be called.  How can we avoid that?
101 - [ ] If a pane wants to block mouse events from parents, as lib-view
102       does, it shouldn't need to catch all the combinations, or it
103       should be much easier
104 - [ ] gather memory usage stats per-pane, ensure 0 on close, and allow a dump
105 - [ ] show doc size in doc list - include undo size?
106 - [X] Ensure all panes that should use "Free" properly, and find some
107       way to encourage its use.
108 - [ ] Add optional unit-test interface for modules.  This should be
109       implemented at least by lib-search, doc-text and probably many
110       others.  It is particularly for things that are awkward to test
111       with the ncurses/replay test approach.
112 - [X] Send global notify before/after refresh.  LOG must suspend logging
113       (or notifications at least) during refresh if is visible anywhere
114 - [X] Do I want "Display" as in "window:close", or "window" as in
115       "window:notify".  Decide, and make everything consistent.
116 - [ ] Do I really need global-multicall- or can I just use
117       notifications.
118       It would mean more modules would need a private pane, but might
119       I want that to support module unload anyway?
120       multicall- is currently used for:
121       - open-doc- to find something to open a given file type
122           doc-dir doc-email doc-text
123       - doc:appeared- to configure doc based on name
124           doc-docs hex c-mode viewer autosave calc mergeview config presenter
125       - startup- for initialising editor
126           autosave server
127
128 - [ ] if a view creation fails - like render_master_view_attach
129       hitting a python error - there will be no active view so the
130       screen will be meaningless.  I need to properly abort and
131       auto-choose a new pane.
132 - [X] LOG_BT() doesn't see TYPE_pane and TYPE_comm calls.
133 - [ ] LOG should take a pane arg, and not use any static vars.
134 - [ ] reduce size of $(nm O/*.o | grep ' b ' | grep -v '_map$')
135 - [X] give every pane a link to root/editor main and use that
136       instead of statics.  Then maybe times_up() can use pane_too_long()
137 - [ ] teach input to allow a repeat command to be registered so that e.g.
138       search/replace and do a bit of work, then ask to be called again.
139       input can cancel this on suitable input.
140 - [ ] should input leave mode unchanged for key that isn't handled at
141       all
142 - [X] marks can be used after they go invalid too easily.  How to fix??
143 - [ ] catching doc:replace in a pane doesn't catch doc:insert-file.
144       I need a simple way to intercept any change.
145 - [X] switch-buffer in pop-up window - shouldn't kill the popup (does it?)
146 - [X] explicitly guard against infinite loops in consistency checks
147 - [X] skip consistency checks after several with no stop for input.
148 - [ ] unwanted docs too easily appear high in recent-list - *Output*
149 - [ ] design a way for a keystroke to interrupt a long-running function.
150 - [ ] extend Draw:measure protocol to allow constant-width-fonts to
151       cannot-scale displays can be detected and measurement optimised for.
152 - [X] improve timeout.  Set timer once, then set a flag so that all commands fail
153       until some top-level clears the flag.
154 - [ ] reconsider all 'return comm_call()' calls.  Do we every really
155       care if the callback succeeded?
156 - [ ] Change Efallthough to -1 so I can return '0' meaningfully.
157       Efalse probably becomes 0.
158 - [X] send warning message when recursive notification is prohibited.
159        editor:notify:Message:broadcast
160 - [ ] Make DEF_CB really different from DEF_CMD and ensure it is used properly.
161 - [X] is DocLeaf really a good idea?  Maybe panes should have 'leafward'
162       pointer separate to 'focus'?  Maybe panes could have optional
163       'child' method which returns main child - pane_focus() calls that.
164       Maybe pane_focus() find a pane with z=0 and matching w,h ??
165 - [ ] support text-replace as easy as text-insert (doc:char...)
166 - [ ] for doc:cmd transformation,  what about :Enter and BS TAB ESC ???
167 - [ ] For a notify handler, returning non-zero doesn't stop other handlers
168       running.  For a call handler it does.  This inconsistency is awkward for
169       messageline_msg which wants to allow fallthrough, but needs to acknowledge.
170       How can I resolve this? Use Efallthrough as -1.
171 - [ ] make a doc read-only if dir doesn't exist or isn't writable
172 - [ ] change some pane_focus() to pane_leaf() where appropriate.
173 - [ ] account all mem allocation types separately, and (optionally) report
174       stats regularly
175 - [ ] document the use of doc:replaced.  What are the two
176       marks exactly? start and end of range.  Verify all clients and providers
177       The 'num' is for when mark2 is absent and it suggests a number of bytes
178       that might have changed.
179 - [ ] revise and document behaviour of doc:open etc, particularly for
180        reloading and filenames etc.
181 - [ ] review all aspects of mark lifetime.  ->owner must be set for
182       points and vmarks.  A non-owner may never hold onto a mark beyond
183       the call which gave access to it, unless it registers for
184       notifications from the owner, and that probably only applies to
185       points.
186 - [ ] do something useful on SIGINT - maybe expedite times_up().
187
188 ### Longer term
189
190 - [ ] Make it possible to unload C modules when refcount on all commands
191       reaches zero
192 - [ ] Make it possible to unload Python modules
193 - [ ] Malloc anti-fail policy.  Small allocations don't fail but use pre-allocated.
194       large allocations use different API and can fail.
195 - [ ] support $SUBST in file-open path names ??
196 - [ ] Need a debug mode where every mark usage is checked for validity.
197       also check the setref sets up all linkages.
198 - [ ] remove all FIXMEs (there are 77) ... and any HACKs (5).
199 - [ ] Replace asserts with warnings where possible.
200 - [ ] hide view-num inside pane so number cannot be misused.
201      i.e. each view is owned by a pane and can only be used by that pane.
202
203 Module features
204 ---------------
205
206 ### render-imageview
207
208 - [ ] use a document, not a magic command.  This requires multipart
209       to be able to hand over a document
210 - [ ] activate from file browser somehow
211 - [ ] cache the decompressed image somewhere.
212
213 ### lib-menubar
214
215 - [ ] enable activation via F10.  Cancel makes it disappear if
216       configured not too.  How to keep??
217 - [ ] allow left/right arrows to move between menus
218 - [ ] emacs to disable 'save' when cannot be saved.
219
220 ### lib-qrcode
221
222 - [X] pop up window to show selection as QR code
223 - [ ] text qrcode (qr --ascii foo) don't look right in xcb display
224
225 ### workspaces
226
227 - [ ] I think I want a "Workspaces" concept, maybe tabbed set of tile
228       collections.  I would have one of mail and one for each project
229       that I might be looking in.  I have lots of documents, but few
230       projects so this would be easier to move between.
231       "grep" and "make" etc don't care which document in a project they
232       are in.
233       "nm" already gets me to the email project quickly.  Getting back
234       is not so easy.
235       Maybe some docs could be marked "project" and so be easy to find?
236       Maybe docs could be associated with a session, and are preferred
237       for select-new-document operations.
238
239 ### render-stack
240
241    My idea is to have a generic rendering pane which draws row or column
242    of other panes.  Maybe a doc-list describes those panes with attrs
243    identifying the doc, the pos in the doc, the view.
244    Marks only identify the panes, not anything in the pane. (maybe).
245    I want to use this for:
246         - menu bar - as stack of menu triggers
247         - presenter thumbnails
248         - image thumbnails
249
250    However this *could* be render-lines which stacks lib-renderline
251    panes all on the same document.  This wouldn't use an attribute to
252    identify the location in the doc, so I'm not 100% sure of this
253
254 ### lib-askpass
255
256 - [ ] have askpass tell shellmode (and others) about the SSH_ASKPASS*
257       environment, so they don't need to know it themselves
258 - [ ] start-agent command which runs ssh-agent can records the
259       environment reported for later shells.
260
261 ### lib-linecount
262
263 - [ ] handle view:changed properly, and make sure total count changes
264       appropriately in notmuch-query-view.  Maybe view:changed should
265       report if content changed, or just attributes.
266
267 ### lib-server
268
269 - [ ] catch broken-pipe errors when sending to sock
270 - [ ] ctrl-z in elc doesn't ask edlib to release the terminal
271 - [ ] do we need both .term and .disp?  When are they different?
272
273 ### lib-x11selection-xcb
274
275 - [ ] will need to listen for property-change-event on requestor to know
276       when result has been deleted to handle INCR.
277 - [ ] if too big, or alloc error, switch to INCR more for sending
278 - [ ] support INCR mode for receiving
279 - [ ] use iso-8859-15 for some of the text formats.
280 - [ ] test very large copy/paste
281 - [ ] need a queue of pending selection requests
282
283 ### lib-textfill
284
285 - [X] auto-wrap on a line like this one doesn't recognize all the
286   punctuation a the start of the line ... should it?
287 - [X] fill mode to handle all punctuation at start of this line
288
289 ### render-format
290
291 - [ ] improve caching of attributes
292 - [ ] profile performance to find opportunities for optimisation.
293
294 ### lib-search
295
296 - [ ] make it easy for a make-search command to search backwards
297
298 ### autosave
299
300 - [ ] if multiple files are opened quickly (e.g. by grep), we might get cascading
301       autosave prompts.  Introduce a mechanism to queue them and only have one per
302       display
303
304 ### tile
305
306
307 ### rexel
308
309 - [ ] move to separate git repo and document well.
310 - [ ] review return code of rxl_advance().  What should be
311       returned if a flag allowed a match, but the char didn't.
312 - [ ] add self-tests which ensure that the return value is correct.
313 - [ ] support backward search by compiling expression backwards
314 - [ ] make prefix-fast-search work for case-insensitive matches??
315 - [ ] rexel term for "expression" with balanced brackets.
316       Also quotes and maybe <>.  Possibly a list of pairs?
317
318 ### popup
319
320 ### lib-wiggle
321
322 - [ ] maybe find matches considering only alphanum first, then
323       refine the gaps considering punctuation.
324
325 ### lib-diff
326
327 - [ ] highlight white-space errors.
328 - [ ] command to apply a hunk to a given document - or to reverse it.
329       How much of a hunk?  Selection?  How to record which hunks are done?
330       How to identify document?  Maybe I want a generic "Other" document where
331        patches are applied, diffs are calculated, etc
332        If only two panes, then "other" is clear, else it must be marked with C-x-7??
333       'a' to apply current hunk
334 - [ ] Link wiggle code to find best-match if direct match fails
335 - [ ] command to find best 'wiggle' match, and another to apply it if no conflicts.
336 - [ ] command to move to matching place in other branch Cx-Cx if mark not active??
337
338 ### lib-mergeview
339
340 - [ ] Menu of options somewhere to remind me.
341 - [ ] mergeview command to show diff between "found" and "replacement".
342 - [ ] mergeview command to include both found and replacement, discard
343 - [ ] Consider what else can be done with < and > on other markers.
344 - [ ] Capture a new doc-reappeared for when reloaded, and search again
345       for markers.
346
347 ### emacs
348
349 - [ ] multi-file search-replace.  Find files with 'git-grep'
350 - [ ] there is no way to count characters in a range, or find how many
351       characters into the document I am.  Maybe bytes would be good too.
352 - [ ] :CX-= to look-up unicode name of character if not ASCII
353 - [ ] ":C-q ?" or "- :C-q" to open a find dialog with list of unicode
354       chars.
355 - [ ] split some generic functionality like arrows and mouse clicks
356       into a separate module to be shared with other edit modes.
357 - [ ] Do I want a 'truncated' marker at start/end of line when not
358       wrapping, and does the '\' go away properly when I start shifting.
359 - [ ] change shift left/right to work in characters rather than pixels
360 - [ ] filename completion should ignore uninteresting files like ".o"
361       Maybe use .gitignore, or have config module understand that.
362 - [ ] maybe alt-, does c-x` if that is the recent search?
363 - [ ] C-uC-xC-v prompts for file name, like C-xC-v in emacs
364 - [ ] compare two panes somehow - new lib-compare function??
365 - [ ] file in pop-up window in 'view' mode by default
366       From 'grep' this is probably OK.  For Cx-44, it isn't.
367
368 ##### needs design work
369
370 - [ ] search/replace should support undo somehow
371       I can already step out, undo, step back.  What more?  Maybe Alt-U (uppercase)?
372 - [ ] What should be passed to M-x commands?  prefix arg?  selection string?  point?
373        Surely everything.  Prefix if present, string if active, point always.
374
375 #### history
376
377 - [ ] history doesn't restore initial default (or empty) string when
378       returning after excursion into history or favourites.
379 - [ ] how can we save history-favourites back to a config file?
380
381 ### ncurses
382
383 - [ ] What to do with Focus-in/out keys?
384 - [ ] add full list of colour names (to lib-colourmap)
385 - [ ] allow a pane to require 'true-colour' and discover number of colours available
386       Colour map gets changed when it becomes the focus.
387 - [ ] When only 16 colours, maybe add underline when insufficient contrast available.
388 - [ ] automatically ensure the fg colour contrasts with bg, unless explicitly disabled.
389       If bg is bright, reduce fg brightness.  If bg is dark, reduce saturation.
390
391 ### pygtk
392
393 - [ ] can we capture the substates of character composition, and give
394       feed-back?
395
396 ### display-x11-xcb
397
398 - [ ] Add test option, fetching image back from server after 'post'
399 - [ ] would GraphicsMagick be better than ImageMagick?
400 - [ ] share connections among multiple windows
401
402 ### render-lines
403
404 - [ ] improve Move-line in multi-line renders (images). prev
405       must only move up one line, and moving down should start
406      in column
407 - [ ] the background "call:" option should report if background was changed.
408       An attribute could store chosen information for comparison.
409       Would need a 'force' flag.
410 - [ ] I regularly hit problems because ->mdata is not up to date and we render
411       to find a cursor and compare with ->mdata and get confusion.  How can I avoid this?
412 - [ ] view:changed shouldn't destroy the view, else Move-CursorXY
413       gets confused.
414 - [ ] make renderlines "refresh everything when point moves" optional.
415 - [ ] if flush_line from render_line() keeps returning zero, abort
416 - [ ] render-lines should always re-render the line containing point, so
417       the location of “point” can affect the rendering.
418
419 ### lib-renderline
420
421 - [ ] Teach render-lines to pad spaces to left/right align text
422 - [ ] Maybe "word-wrap" should be a list of characters to wrap on??
423       But I might want "comma and following spaces".  How do I say that?
424       Possibly declare some chars that cause a map-attr callback??
425 - [ ] renderline *knows* about scaling and when it places the cursor
426       in an image, it gets it wrong for ncurses.  It should ask about
427       scaling.
428 - [ ] if the first char if a line is marked for <wrap> it disappears
429       without cursor.  This is bad.
430
431 ### lib-markup
432
433 - [X] Move <hide> handling to lib-renderline so we can disable <hide>
434       if cursor is in the hidden region.
435
436 ### lib-macro
437
438 - [X] don't allow starting macro inside a macro
439 - [ ] detect errors including Abort and search failure etc. Abort capture or
440       replay on error
441 - [ ] Possibly wait for a shell-command etc to complete before continuing.
442
443 ### doc-dir
444
445 - [ ] if fstatat() fails for an entry, zero out the stat buf, and possibly
446       schedule a reload of the directory (but not too often).
447 - [ ] allow setting a pattern, as alternate to substr, for 'complete'
448       viewer.
449       I think this would be more efficient than the current linefilter.
450       We could have a doc-filter which adds the pattern to doc:char
451       commands so forward/backward stepping is v.fast.  The pattern
452       could even be a pre-compiled rexel command.
453 - [ ] support directory views for sorting.  I think this requires
454       a separate dir document, which borrows state from the main one.
455       It definitely needs an independent set of marks, so that means
456       a separate document.  Using the same dir_ent content might help
457       save space, but then we need an index separate from the dir_ents.
458       Maybe that is OK.  We could have linked lists of small arrays.
459       Marks would point to entries in the array and we walk back to find
460       find start: low-bit-set.  So each array is fore, back, 14 dir_ent
461       pointers.  Or use aligned_alloc() and mask out unwanted bits.
462
463 ### doc-text
464
465 - [ ] things slow down after lots of edits.  Maybe track
466       number of chunk, marks, undos etc and display them somewhere
467 - [ ] stop consistency checking a doc when it gets "big" ??
468 - [X] avoid infinite loops in consistency checks
469 - [ ] doc-text: opening file with e.g. 200,000 lines is very slow
470       Check this..
471 - [ ] moving in a big file is slow - check this
472 - [ ] support disable of undo in text, e.g. for copybuf document.
473       I think this is a completely different doc type
474 - [ ] Possibly move read-only handling to core-doc, once docs/dir
475       respond to something other than 'replace' to open files.
476 - [ ] how to prune old undo history?
477 - [ ] allow undo across re-read file. Keeping marks in the right place
478       will be tricky, but might not be critical.
479 - [ ] report stats on:
480         undo usage, chunk usage
481 - [ ] if 'find-file' finds same inode/inum, check the name is still valid.
482        file might have changed (stg pop/push) underneath us.
483 - [ ] handle large files better - loading a 42M file took too long.
484       Maybe it was the linecount?
485
486 ### completion
487
488 - [ ] The “complete” popup should be positioned above/below the file name,
489       not over the top of it.
490
491 ### lib-view
492
493 - [ ] review use of line-drawing chars for window boarders
494 - [ ] improve scroll bars
495 - [ ] review decision about that to do when high < 3*border-height.
496       Current (disabled) code makes a mess when differing scales causes
497       borders to be shorter than content.
498 - [ ] Place docs menu on the doc name in status line
499
500 ### grep/make
501
502 - [ ] make uses too much CPU on large output
503 - [ ] Need keystroke to step through different grep/make windows
504 - [ ] if file isn't already loaded, wait until it is wanted, or something
505       else loads it.
506 - [ ] if file is reloaded, re-place all the marks, don't just ignore them.
507 - [ ] clarify and document the role of numeric args to git-grep
508
509 ### message-line
510
511 - [ ] reset timer each time so that message stay an exact period, and
512       timestamp updates on the minute.
513 - [ ] allow marked-up messages to be given.
514 - [ ] Differentiate warnings from info, and blink-screen for warnings.
515
516 ### docs
517
518 - [ ] accessing document list can be slow.  Same for large directories
519
520 ### hex
521
522 - [ ] improve doc:replaced handing, by tracking the visible region and
523       checking if a replacement changes the number of chars.
524
525 ### shell mode
526
527 - [ ] allow input.  Can I use SIGTTIN?  Need to ignore SIGTTOU, attach
528       task to pty and catch when SIGTTIN is received.  Then switch back
529       pgrp, restart, and feed content.
530       Any chars from ' ' to '~' are queued in a separate buffer shown at
531       bottom.  It can be edited and :Enter will submit it.
532       Could just use pipes and FIONREAD to detect when content is slurped.
533 - [ ] non-utf8 in output makes python spit the dummy
534 - [ ]  Use pattern-match on command to optionally choose an overlay
535        which can highlight output and allow actions.
536        e.g. (git )?grep   - highlight file names and jump to match
537             git log  - highlight hash and jump to "git show"
538             diff -u  - some diffmode handling
539 - [ ]  If no output, don't create a pane??  Or just one online.
540 - [ ]  Detect ^M in output and handle it... delete from start of line?
541 - [ ] always track time for a run and report it - or at least make it available
542
543 ###  edlibclient
544 - [ ] Catch broken-pipe in all sock.send calls
545 - [ ] run edlib directly if no socket
546 - [ ] option to create a new frame
547 - [ ] more work on server mode:
548 - [ ] improve protocol
549
550 ### line count
551
552 - [ ] Find a way to locate mark faster than walking the whole list
553       adding up the interval counts.  Add a second mark list as a
554       'skiplist' with 1 mark for every 100 of the main sequence.
555
556 ### lib-utf-8
557
558 - [ ] lib-utf8 takes chars, not bytes, so it doesn't work over
559       a utf8 document
560
561 ### doc-email
562
563 - [ ] if charset module doesn't load, things go very bad. (utf-8 failure)
564 - [ ] use mimetypes.guess_type() to interpret filenames in email attachments??
565 - [ ] don't allow non-text email parts to appear as text.  Maybe hex??
566
567 ### Notmuch - overview
568
569 - [ ] When moving among messages, always move cursor to search pane
570 - [ ] 'other' notmuch search doesn't show older messages sometimes
571 - [ ] split notmuch into two databases, last 6 months and the rest.
572 - [ ] script to move messages every week - but not deleted messages
573   Maybe not spam either
574 - [ ] edlib to offer to search older messages
575
576 - [ ] Email summary line for single-message threads should show size??
577 - [ ] Only clear "new" tag on explicit quit, not when going to
578       other search or simply closing the window
579 - [ ] 'm' in 'move marks on tid to before self.pos' was reportedly NULL once.
580 - [ ] Two threads with same timestamp swap order on reload
581 - [ ] When main_doc notices counts increase, it should ensure the next
582       visit of the search triggers a refresh.
583 - [ ] all shares-ref docs must be careful about comparing marks ... or else
584       we need to compare ignoring offset?  Best to compare <, not <=??
585 - [ ] If I open a search but there are no messages (yet) I get a python
586       error that select-message failed
587 - [ ] saved queries that are not mentioned in any other query should get
588       presented in the search list. ... except maybe current/unread/new ???
589 - [ ] if a thread matched query and so is still cached, but no
590       individual messages match any more, then whole thread is shown.
591       This is confusing.  Maybe we report an error when open is attempted,
592       but somehow allow 'Z' to still work.
593 - [ ] purge old entries from query when updates but not being viewed
594       ... don't we already do this?
595 - [ ] updating tags can take long when 100s.  Enable background queuing of these.
596 - [ ] Don't display query entries that have a 0 match count.??
597 - [ ] update counts more often when a query is being changed.  e.g. when any change happens
598       while a query is open, schedule an update in 2 minutes.
599 - [ ] handle errors better.  e.g. file reported by notmuch might not
600       exist, or not be readable
601 - [ ] allow opening drafts in composer on restart.
602 - [ ] allow deleting of drafts without posting.  Maybe just 'delete'..
603 - [ ] When active query changes, highlight on list view doesn't immediately
604       follow
605 - [ ] TESTS
606 - [ ] make sure Clone actually works for all panes - or remove it
607 - [ ] add counter and colour for 'flagged'
608 - [ ] if no 'query.current' use "not exclude_tags"
609 - [ ] support selection messages and applying tags
610 - [ ] When changing any tag in a thread, or when opening the thread,
611       assess thread tags by looking at all matched messages.
612 - [ ] make min top/bottom margin configurable, set for message list
613 - [ ] display counts of current thread somewhere, so I know where I'm up to. - new/unread/matched in status line
614 - [ ] review highlight on query when the message selected isn't the message displayed
615 - [ ] fix bugs in stored-query!! query: is slow and (I think) buggy
616 - [ ] rel_date could report how long until display would change, and
617    we could set a timer for the minimum.
618 - [ ] allow re-ordering of saved-search list click-drag? +/-?
619 - [ ] allow editing of saved searches, including deletion
620       must support undo. % for replace?
621 - [ ] make sure doc cleans up when closed. processes must be killed
622       and query docs must be closed
623 - [ ] Can I implement "undo" for large-scale tag changes?
624       Maybe don't write them to the DB immediately??
625 - [ ] Can I fix notmuch to extract resent-foo headers for searching?
626
627 ###  Notmuch message display
628
629 - [X] notmuch addresses in From: list to have menu to add address to
630       any from-* query
631 - [ ] "%d quoted lines" still not quite right.  Moving 'down' past it
632       jumps to end of line.
633 - [ ] Don't wrap email header lines when cursor isn't on the line - too noisy
634 - [ ] word-wrap subject (only) in email summary line
635 - [ ] check for Efail errors from doc:open
636 - [ ] make it practical for 'text' documents to contain non-utf8 so that
637       "Save" can copy to a buffer.  There is some support for a charset
638       to be "8bit" (hex-mode only).  Maybe that is part of the answer.
639 - [ ] error check 'external viewer' code
640 - [ ] add module for external-view which creates a unique temp file and
641       removes it when the viewer is done.
642 - [ ] check for "Command Line Error: Incorrect password" from pdf, and
643       ask for password
644 - [ ] delay conversion until unhide
645 - [ ] detect Content-disposition, use for filename, and hide anything
646       that is an attachment
647 - [ ] detect char-width and suppress images if 1 or 2
648 - [ ] create general choose-file pane which can seek an existing, or
649       non-existing file.  Allow a default dir which can be remembered.
650       Use this for Emacs, and for saving attachments
651 - [ ] when unhiding for a alternate part, hide any others.
652 - [ ] next part/prev part button on spacer
653 - [ ] closing a large section pushed cursor to top of display, which
654       isn't really what I want.  I'd rather the cursor stayed still.
655 - [ ] in notmuch I searched in a message (mimepart), then enter to choose,
656    then 'q' and crash.
657 - [ ] A multipart still had an active view.
658 - [ ] when I unhide an email part which is a single v.long line,
659     redraw gets confused and point goes off-screen, which seems
660     to leave it confused.
661 - [ ] maybe hide signature, unless small
662 - [ ] When click on first char in tagged range, I don't see the tag and
663    don't get a Activate event.
664 - [ ] line wrap in header should not appear as space??
665 - [ ] handle all Unicode newline chars.
666 - [ ] Auto-hide depending on type - with extensible table
667 - [ ] Open-with always,  Open only if a handler is known
668 - [ ] "save" to copy to buffer
669 - [ ] save function - doc:save-file given file name or fd
670 - [ ] wiggle-highlight patches found in email
671 - [ ] detect and hide cited text
672 - [ ] maybe detect "-----Original Message-----" as indicating cited text
673 - [ ] Make long to/cc headers truncate unless selected.
674 - [ ] Make addresses active (menu?) to allow adding to a saved search
675       with options and/or/andnot.  Also "mail to" or "save"..
676 - [ ] Allow any selection to be added to a saved search.
677 - [ ] verify signature if present
678 - [ ] decrypt if needed
679 - [ ] treat message/RFC822 much like multipart
680
681 ### Notmuch composition
682
683 - [ ] when aborting email composition, unlink the file if it is
684       empty.  Probably dispose of autosave too.
685 - [ ] should I look for Delivered-to headers. Even;
686          1. To, Cc, Bcc, Reply-To, From
687          2. Envelope-To
688          3. X-Original-To
689          4. Delivered-To
690          5. Received (for)
691          6. Received (by)
692          7. configured primary address
693
694 - [ ] sanity check message:
695       - body/subject/to not empty
696       - only 1 'to' or 'cc'
697       - provide 'sender' if multiple 'from'
698       - word 'attach' without attachments
699       - message has already been sent
700 - [ ] catch exceptions from email.message creation.
701        particularly adding headers can complain
702 - [ ] be smart about quoting displayname before <addr>
703 - [ ] capture editing of to/cc and mark ',' as a wrap point.
704 - [ ] If attachments are requested, set mime-version etc
705 - [ ] inline images get displayed
706 - [ ] auto-insert signature... like an attachment?
707 - [ ] address-completion should be referred to module, not assumed to be notmuch
708 - [ ] support address book and allow completion from there
709 - [ ] markdown mode that creates HTML?
710 - [ ] encryption and signing
711       gpg --no-tty --pinentry-mode=loopback .....
712        will cause an error "gpg: Sorry, no terminal at all requested - can't get input"
713        if it needs to prompt for a passphrase.
714       If that happens then
715        DISPLAY= GPG_TTY=/dev/whatever gpg .....
716       will use the tty to ask for a password.
717       But need to specifiy a suitable pinentry program via
718        ~/.config/systemd/user.control.gpg-agent.server.d/pinentry.conf
719           [Service] \ ExecStart= \ ExecStart=/usr/bin/gpg-agent --supervised --pinenty-program ...
720
721 ### Presenter
722
723 - [ ] split into lower pane which parse markdown and upper which handles presentation.
724 - [ ] translucent bg colour for paragraphs
725 - [ ] partial-view-points. Only render beyond here if mark here or beyond.
726     page-down goes to next such point
727 - [ ] temp attribute.  :bold: etc only apply to para, :: is appended to para format
728 - [ ] should doc attributes append to defaults, or replace?
729 - [ ] word-wrap.  Interesting task for centring
730 - [ ] force x:scale to be maximum width of any line - to avoid surprises
731 - [ ] proportional vertical space ??
732 - [ ] thumbnails for easy select?
733 - [ ] \_  etc to escape special chars
734 - [ ] boiler-plate, like page numbers
735
736      - Maybe stuff before "# " is copied everywhere.
737      - Need magic syntax for fields ##page#
738
739 ### render-markdown.py
740
741 - [ ] parse markdown adding attributes for improved display
742      - alignment?  Hide newlines and get render-line to wrap?
743      - centring
744      - Large text for headings
745      - list bullets
746      - non-cw font
747      - bold, italic, colour?
748      - code, quoted, images
749      - urls and other references?
750 - [ ] Make sure editing causes quick re-rendering
751 - [ ] inline images - so welcome can have a logo
752 - [ ] consider following MyST
753         https://jupyterbook.org/en/stable/content/myst.html
754
755 ### C-mode
756
757 - [ ] in parse_code 'c' might be None - need to check
758 - [ ] if .. else switch adds into to the switch.  Should it?
759 - [ ] auto-indent enhancements: '/' should see if at start of comment line
760        following '* ', and discard space?
761 - [ ] A line after one ending ; or } or : or unindented is assumed to be
762          correctly indented.??
763
764 - [ ] configuration: use tabs or spaces for indent
765 - [ ] configuration: use only spaces for bracket-alignment indents - or tabs as well.
766 - [ ] python command to shift indent of range.
767 - [ ] python-mode: when changing indent, make same change to the whole block.
768       Not sure how to handle 'else:' which looks like the next block.
769 - [ ] in python mode, a comment at the end of an 'if' block confuses indenting.
770       next line cannot go back one level
771
772 ### git-mode
773
774 - [ ] configure list of known git repos
775 - [ ] log view (:C-c l?) which uses --max-count and --skip to only
776       collect enough log entries to fill the display.  Or better: have a
777       shell mode which only reads from pipe if insertion position is
778       visible.
779 - [ ] from log-view, view a commit.  From a commit, view the file
780       at that time.  Maybe 'save' creates a fixup commit which is
781       added to the log.
782 - [ ] Have a list of paths are top of log and any commit which doesn't
783       touch the paths is greyed out.  "git log --oneline --stat"
784       provides the info, some of which we hide.
785 - [ ] when a git-managed file is saved, if there is a "diff" view, it is
786       updated.  Maybe show both cached and uncached in different colours.
787 - [ ] action from log-view to reword and commit - with auto rebase and
788       update of the view
789 - [ ] actions to re-arrange and deleted the commits.  Integrate with
790       git-rebase...  or simulate git-rebase with "git worktree add
791       --no-checkout" on the most recent unchanged commit, then adding
792       each required commit with git-apply--cached and git-commit
793 - [ ] diff-mode editing enhancements:
794       - kill the file marker (+++) kills all chunks in the file
795       - kill the chunk marker (@@) kills the whole chunk
796       - insert line in chunk gets '+' prefix and updates line counts
797       - delete line in chunk updates line counts
798       - editing in chunk re-runs word-diff
799 - [ ] git-commit command (:Commit) which presents the patch and allows
800       it to be edited (with consistency checks and number updates).  On
801       :Commit the patch is applied with "git apply --cached" an if
802       successful the message is added with "| git commit -F"
803
804 ### lang-python
805
806 - [ ] review python doc:char implementations for simplification.
807 - [X] repeated alarm(10)/alarm(0) calls slow things down
808 - [ ] array index should allow two args, second being a mark for
809       doc:get-attr etc.
810 - [ ] should be able to test if a mark is NULL or Freed
811 - [ ] should Efallthrough be an exception?
812 - [ ] Log loading of modules - Can I provide version info?
813 - [ ] we aren't catching errors from functions called from .connect()
814        Maybe use sys.excepthook(typ,val,tb)
815 - [ ] Add version info to python modules
816
817 ### white-space
818
819 - [ ] don't show errors unless doc has been changed.???
820 - [ ] highlight of adjacent blank lines isn't removed if first has text added
821 - [ ] support highlight suitable for diff: a space is first character is allowed,
822       even if EOL or followed by space.
823 - [ ] make set of highlights, and colors, configurable
824
825 ### test suite
826
827 - [ ] always run with timezone of Australia/Sydney
828 - [ ] add test infrastructure to display-x11
829 - [ ] tests for double-click and drag.
830 - [ ] test for recent search improvements
831 - [ ] Add mechanism to easily run a command with pre-canned output.
832 - [ ] Add one test case, and arrange for auto-testing on commit.
833 - [ ] allow single-step testing?
834 - [ ] Allow testing gtk as well an ncurses
835 - [ ] Allow testing of server/client accesses
836 - [ ] create a pane which exercises lots of code and measure coverage.
837       particularly cover all the doc-text undo/redo code.
838 - [ ] Track 'coverage' of all commands in keymaps.
839
840 ### dynamic completion
841
842 - [ ] unify UI with spell
843
844 ### spell-checker
845 - [ ] mode-specific so latex can ignore \foo
846 - [ ] Some way for 'c-mode' to report where comments are so they can be spell-checked
847 - [ ] drop-down with options
848 - [ ] unify UI with dynamic-completion
849 - [X] split range management out of autospell so it can be used by other
850   modules.
851
852 ### calculator
853 - [ ] regression test
854 - [ ] calc-replace should leave result in selection. - or only in the selection.
855 - [ ] calc-replace could cycle through bases.
856 - [ ] highlight error location in red
857 - [ ] trunc(a,2) a^b  pi % // & | ~ &~
858 - [ ] increase precision of sqrt)()
859 - [ ] useful error messages.
860 - [ ] alt-p to interpolate previous expression
861 - [ ] fix Make dependencies so changing calc.mdc only requires one 'make'.
862 - [ ] Don't always show fraction - maybe request it like with '@' for octal
863 - [ ] if calculation produces same result as is present, don't modify doc.
864
865 ### lib-menu
866
867 - [ ] remove that blank line at the end of menus
868 - [X] Enable lib-menu to show short-cut keys
869 - [X] menu-bar to which we can add menus from which commands are sent
870 - [ ] track movement so entry under cursor can be highlighted
871 - [ ] support positioning above the target is no space below.
872 - [ ] support single-click to open modal menu.??
873 - [ ] improve hack for communicating action position.  Maybe require
874       an 'is-button' attribute and report button height (and width?)
875       in num and num2.
876
877 ### lib-url
878
879 ### config
880
881 - [ ] file patterns for "complete" to (optionally) ignore
882 - [ ] read .gitignore and add to "ignore" list
883 - [ ] top/bottom margin  - "render-vmargin" set on view or doc??
884       vmargin should be relative or absolute
885 - [ ] c-mode to use tabs or spaces for indent
886 - [ ] c-mode: use only spaces for bracket-alignment, or tabs as well
887 - [ ] shell command regex to choose parsing: diff, git-log, grep/make
888 - [ ] shift width for auto and manual left/right display shift
889 - [ ] tab width ??
890
891 - [ ] colours of whitespace: tab, at-eol, tab-after-space, past-col ....
892 - [ ] whitespace max-col (per-line??)
893 - [ ] white-space blanklines at sof, eof, multiple-together
894 - [ ] colours for notmuch summary lines
895 - [ ] colours for urls
896 - [ ] colours: dir: flag/metadata/name/link
897 - [ ] colours: dir: header
898 - [ ] colours: email spacer
899 - [ ] colours: search: this, other, replaced
900 - [ ] colours: markup control
901 - [ ] colours: message-line
902 - [ ] colours: renderline wrap/truncate markers - char also
903 - [ ] colours: emacs: file-name open: ignored, Ok-dir, missing-dir,
904       non-dir
905 - [ ] colours: emacs: selection: active, transient, replacable...
906 - [ ] colours: abbrev - prefix and completed
907 - [ ] colours: spell - errors
908 - [ ] colours: compose: headers, unknown, bad, header-marker,
909       section-marker
910 - [ ] colours: compose: interpolated text, interpolation character.
911 - [ ] compose: known headers
912 - [ ] colours: diff: added, removed, '@@', diff-same
913 - [ ] colours: make: current-match, subordinate matches
914 - [ ] colours: mergeview: markers: conflict, space-only, good
915 - [ ] colours: mergeview: Unmatches, Extraneous, Changed, Conflict,
916       Conflict-spaces, Already
917 - [ ] colours: notmuch - LOTS
918 - [ ] colours: c-mode: paren-same, paren-different
919 - [ ] colours: hex ....
920 - [ ] colours: complete: matching section
921
922 - [ ] config alternate key-strokes???
923
924
925 New Modules
926 -----------
927
928 - [ ] emacs-pinentry.  pinentry-curses can talk to emacs using a
929       protocol that edlib can copy.
930       export INSIDE_EMACS=yes
931       Listen on a SOCK_STREAM at ${TMPDIR-/tmp}/emacs$(id -u)/pinentry.
932       On connect, end "OK".  In general responses are lines terminated
933       by '\n' with OK or ERR ending a response
934       D <data up to newline>  with %XX esacpe for % \n \r
935       OK
936       ERR <errcode>
937       #comment
938
939       Respond to GETPIN with D data
940       Respond to CONFIRM with  OK if user sends OK.
941       Accept some settings:
942            SETTITLE Context for PIN
943            SETDESC  Enter PIN for Fred Bloggs <freddy@bloggs.net>
944            SETERROR Error message
945            SETPROMPT PIN:
946            SETREPEAT  IF PIN needs to be entered twice for confirmation
947            SETREPEATERROR  message to show if they don't match
948            SETOK   Text for label of OK button
949            SETCANCEL Text for label of "NO" or "Cancel" button
950            SETNOTOK   NOT OK button???
951
952 - [ ] separate out CUA-base from mode-emacs:
953
954      - selection management
955      - mouse management
956      - arrows - shift for selection, control for word
957      - BS Del
958      - Next Prior Home End
959     - home/end - start/end of line
960     - Shift-home/end - start/end of file
961     - C-up/down start/end para
962     - C-bs C-del delete word
963
964 - [ ] vi mode
965
966     - two mode: command and entry
967     - h,j,k,l w,e,W
968     - d* c* s  a A i I ^ $ / ? . fX
969     - numeric prefix
970     - much more
971
972 - [ ] "CUA" mode
973
974     - "extra" on CUA-base which might conflict with emacs/vi, including
975       control-letter and function keys.
976
977     - C-c for copy, C-x for cut, C-v for paste,
978     - C-a select all
979     - C-f find/replace C-S-f - search again
980     - C-z undo C-y redo
981     - A-x for menu x
982     -  attach an extensible menu to the selection
983         copy, paste-in, QR, git-view
984
985 - [ ] info browser
986
987       Content is (mostly) ready-formatted.  Need to parse and handle navigation.
988
989 - [ ] man page viewer
990
991       - MANWIDTH=72 MAN_KEEP_FORMATTING=yes man page and process X\bX
992         and _\bX for bold and underline.
993
994
995 - [ ] more charset support? Next in my popularity list from my email database
996      are: is0-8859-15  gb2312 iso-8859-2 iso-2022-jp gbk ansi_x3
997      kc_c_5601-1987 is a korean with 2-byte encoding when firt is >=0x80.
998      I don't think it can be parsed backwards..
999      windows-1250 is needed - or at least a reliable fall-back
1000         AM6PR04MB6328CFDD9A91D3F0125D1A1491809@AM6PR04MB6328.eurprd04.prod.outlook.com
1001 - [ ] use iconv(3) for char-set conversion
1002
1003 - [ ] generic syntax highlighting:
1004       strings, comments, keywords, type/function/const/var distinction
1005       urls, email address
1006       Possibly oversee diff/wiggle highlighting
1007       markdown bold/ital/code bullet, counter. heading.
1008
1009       Call-out or regex to find para.
1010       Another to find words
1011       Maybe another to classify words
1012
1013       Classify some content as "section" for outlining
1014
1015 - [ ] gdb integration.
1016
1017        - break at line in code
1018        - show code from reported line
1019        - continue to code location
1020
1021 Possibly some of these will end up being features in other modules.
1022
1023 - [ ] C/python code "index" pane to quickly jump to function, and see context
1024       This part of the IDE project below.
1025
1026 - [ ] create view-pane that either puts a cursor on whole line, or moves
1027       the cursor to the "right" place.  Maybe a markup to say "here is the
1028       preferred column" ??  Maybe use for make output so I can see current
1029       match more easily.
1030
1031 - [ ] tags handling - and easy tag-search without tags. e.g. git-search.
1032       alt-S looks for TAGS or .git and either does a tags-search or a grep-l and
1033       check every match.  So maybe this is part of the 'make' module
1034 - [X] menus
1035       This might support a menu-bar, or drop-downs for spelling or dynamic completion.
1036 - [ ] hex edit block device - mmap document type
1037
1038 - [X] image-display pane - e.g. can be given a png/jpeg etc file and display
1039       it scaled, plus allow scaling and movement
1040 - [ ] pdf-display pane - like image-display but with multiple pages.
1041       Would use libpoppler.
1042
1043 - [ ] Separate out filesystem access from doc-text and doc-dir and elsewhere
1044       into a filesystem access module.
1045 - [ ] Create compress-access module that layers compression over fs access
1046 - [ ] Create gpg-access module that layers encryption and decryption over fs access
1047 - [ ] Create ssh-access module that uses ssh/scp to access files - maybe use python paramiko
1048
1049 New Modules - more complex
1050 -------------------------
1051
1052 ### remote editing ideas
1053 A good model for remote editing is to have a proxy at some point in the stack,
1054 so that edlib runs on both ends, but at some point a pane is a proxy for a remote
1055 pane (though maybe not 'pane' exactly) which connects over the network.
1056 But what point?
1057
1058 - raw-display: this might have just ncurses on the client and everything else on
1059   the server.  client could send keystroke, mouse events, resize/refresh request,
1060   selection-request, selection-content, and maybe file content
1061   server could send "panel" create/resize/reposition, panel clear,
1062   draw text with attributes, selection-request, selection-content, file-content
1063   run-command request (e.g. to run a local viewer for attachments)
1064 - generic-display:  This could be a full pane, but would need to proxy
1065   Draw:text-size measurement requests which might be slow
1066 - doc-view:  This would be a proxying core-doc view (doc_handle) where all
1067   the viewing panes are local, and all the doc-side panes are remote.
1068   This seems most elegant, but managing updates to marks and handling all
1069   callback might be awkward
1070 - specific docs:  Some documents would explicitly support proxying.
1071   e.g. text, dir, docs.  Any doc filtering (e.g. charset, crop etc) would
1072   happen locally.  The proxy would use a lease to cache content locally
1073   and would treat a lease timeout like on-disk file change.
1074 - filesystem: this is little more than an sshfs mount.  Probably too low level.
1075
1076 One outcome of these musings is that edlib programs should run external
1077 commands and access file through a specific pane - either a doc pane or
1078 a display pane.  This might result in them running on different hosts.
1079
1080 The protocol over then should be QUIC if possible as they seems to allow
1081 mobility nicely.  I'd need to look at how it handles network breaks.
1082
1083 ### Remote display
1084
1085 I don't think I'll go with QUIC.  I'll make something focussed, like
1086 mosh and wireguard do.
1087 ssh will be used to request a key and 2 nounces - requested over the
1088 server socket.  Using this key, messages are secured with the "secretbox"
1089 module of libsodium and sent via UDP - client can send from anywhere and
1090 server replies to there.
1091
1092 Client sends keystrokes, mouse-action, size report.  Each have an event
1093 sequence number.
1094
1095 Server sends pane reset/create/destroy/clear/update/done messages.
1096 These have sequence numbers with a history stored and updates are resent
1097 if a client message has an old seq number.  If the client seq is too
1098 old, the server can send a reset, then create and fill each pane.
1099
1100 The client acknowleges server messages with a 'size' update, and also
1101 reports the size every 5 seconds as a ping.  Server replies with any
1102 un-acked updates, or with a new 'done' message.
1103
1104 Some day I might need "measure" requests from the server which the
1105 client can reply to, so texts can be measured for variable-sized fonts.
1106 Server would need to cache results for performance, and would need to
1107 know if a font is constant-width, so a single measurement will suffice.
1108
1109 I also need basic file transfer - particularly from server to client
1110 so that an external viewer can be run.  May as well make it bi-di so
1111 that an external editor can be requested.
1112
1113 ### threaded-panes
1114
1115 An import characteristic of a good editor is low latency.  While you can
1116 usually get good latency in a single thread by dividing the work up into
1117 small tasks run from an event loop, this isn't always possible or easy.
1118 So some sort of threading will be useful.
1119
1120 Some of the use-cases for threading that have occurred to me are:
1121
1122 - multiple event loops:: gtk code needs to use the glib event loop, but
1123   I rather use a simpler event loop when not using gtk.  I current have
1124   a mechanism to select between event loops so the glib one is selected
1125   for everything if anything needs it.  But I don't like this approach.
1126
1127   If I could have threads, I'd have the edlib event loop handling
1128   the main editor loop, and gtk could be in a separate thread with its
1129   own event loop, exchanging messages with the main loop as needed.
1130
1131 - long-running tasks:: word count and spell check can each be divided
1132   up into small events, which each do a limited amount of work and reschedule
1133   themselves, but having a separate thread that could just keep working
1134   until the job is done would be easier.
1135
1136 - fsync:: Calling fsync when saving a file is important, but can be slow.
1137   It would be nice if the main thread could just write out the file,
1138   then a separate thread could call fsync() and report when that was done.
1139
1140 - remote editing::  It probably doesn't require threads, but they might
1141   be a suitable abstraction for allowing one editor instance to work
1142   with another over a socket - possibly between machines.  I imagine
1143   an editor running on my notebook communicating with the editor
1144   running on my desktop - directly accessing the document as stored
1145   in the desktop editor.  These would have to be two separate threads - separate
1146   processes even.  The same mechanism used for local threads to communicate
1147   could be leveraged for remote threads to communicate.
1148
1149 I probably don't want any shared data structures except the pipe that sends
1150 events back and forth, and these events need to be standard commands communicating
1151 between panes.  So it might be a variant of notifications.
1152
1153 Keeping tracks of marks across the link will probably be the most complex
1154 part.  Possibly only marks owned by the pane will be mirrored across.
1155
1156 ###  interactive shell / terminal emulator
1157
1158 I never quite got into using shell-mode in emacs - it never felt quite
1159 as raw as an xterm.  And the infinite history bothered me - possibly
1160 irrationally.
1161
1162 Still, a shell mode for edlib  might be a useful thing, though having
1163 edlib easily available in any terminal window might be just as good.
1164
1165 If I did a shell mode, I would capture the output of each command into
1166 a separate buffer, and display all those buffers in the one view.
1167 Sufficiently old buffers would be discarded.  Output from any recent
1168 command could easily be saved or piped.  It would be possible to
1169 arrange for some interactive commands to also send output of each
1170 command to a separate buffer.
1171
1172 Auto paging would be disabled (where possible) and edlib would page
1173 output as needed.  This means that `cat bigfile` could move the whole
1174 file into a buffer, which wouldn't be good.  If a “less” command could
1175 give the filename to edlib and let it display, that might be nice.
1176
1177 It would generally be useful to have a pane that read from a pipe and
1178 only read more when some view wanted to see more of the output.  It might
1179 also be useful for such a pane to store the content in a mem-mapped file
1180 rather than in anon memory.
1181
1182 ### Outline code rendering.
1183
1184 I like the principle of outlines and only showing the heading of
1185 nearby sections, but the detail of the current section.  I've always
1186 found them a bit clumsy to use.  I want the rendering to automatically
1187 do what I want, partly depending on where the cursor is, partly
1188 depending on space.
1189
1190 So when I am editing I want to see a lot of immediately surrounding
1191 text, but I also want to see nearby minor headings and all major
1192 headings.
1193 If headings are short enough and there are enough of them, the having
1194 several to a line would be a good idea - maybe even abbreviated.  If I
1195 click on an abbreviated heading in the middle of a line at the top of
1196 the screen, then that section should open up, and the nearby sections
1197 should get a bit more space.
1198
1199 When searching, I probably don't need as much context of the current
1200 point, so less of the current section would be displayed, more of
1201 surrounding sections.  If those surrounding sections also contained
1202 matches, then that would be the part of those sections that was shown.
1203
1204 I would like to implement this sort of view for markright mode, but
1205 more importantly I want to implement it for C-mode.  When editing C
1206 code (which I do a lot) I want the few lines at the top and bottom of
1207 the view to just list some function names.  Then maybe a few lines
1208 with function signature one the whole line.
1209
1210 Certainly the start of the current function would appear somewhere no
1211 matter where in the function I am editing, and as many of the
1212 variables as possible.  If I am in an “if” statement in a “for” look,
1213 then the loop header and the if condition would be displayed if at all
1214 possible.
1215
1216 ### a “reflection” document so I can view the internal data structures.
1217
1218 When developing a new pane things go wrong, but it is hard to see what.
1219 I want a pane which shows me the structure of all panes, with parent/focus
1220 links, with notification chains, and with other ad-hoc connections.
1221
1222 I'd also like to be able to follow a command as it moves through the panes.
1223 This probably needs to be recorded, then played back for me.
1224
1225 ### calendar/diary/planner
1226
1227 I don't keep a diary or use a planner much, so this seems like an odd thing to include.
1228 But dates are cool, and this is a highly structured concept and I like structure.
1229 At the very least I want a calendar pop-up.
1230
1231 ### A suite of tools making use of some sort of "mark-down" like language
1232
1233 Restructured text? Markdown?  Commonmark?  Markright?
1234
1235 Having simple readable extensible markup is useful for writing
1236 READMEs and TODO lists and emails and calendar entries and presentations
1237 and all sorts of stuff.  I probably want to invent my own, because the
1238 world always needs another markup language.
1239
1240 I want:
1241
1242 - easy render to PDF - e.g. use PyFPDF
1243 - ASCII-Math or similar
1244 - anchors for links, structure tags (author, title), foot notes,
1245   figure captures, tables, index, content.
1246 - figure drawing.
1247 - spreadsheet cells for auto calculations.
1248 - outlining support of course.
1249
1250 Syntax - markdown plus...
1251
1252 Lines:
1253 - basic paragraph: not indented more than 3 spaces
1254 - heading: starts # or single line followed by 3 or more - or = on next
1255   line
1256 - bullet list: lines starts '-' in first 4.  Following lines that are
1257   indented are included.  Maybe '*' or '+' also do same?? A waste
1258 - number list: digits period.
1259 - block-quote: lines start '>'  These nest naturally
1260 - code: lines indented with no prefix
1261 - fenced code: line starts ``` then until a close.  Ouch - hard to parse
1262   backwards
1263 - horzontal rule: --- or ___ or *** and nothing else following blank line
1264
1265 - table.  Line start '|' continue to blank line.??
1266     A row starts with '|' at start of line and ends with '|' at end of line.
1267 - formatting info starts ':'
1268 - image: ![caption](file)
1269 - reference [label]: link "text" If link in HERE then internal
1270   reference.  link can have #label to find label in that file.
1271
1272 Special:
1273 - is a line ends 2 or more spaces, hard line break.  If 0 or 1, then continue
1274
1275 Intra line:
1276  **word** is bold
1277  _word_ is italic
1278  `word` is monospaced (code)
1279  [word] is a link. [word](link) is too
1280     or [word](link "title text")
1281
1282  <url>
1283  <user@domian.thing>
1284
1285  \X  is X literal.  \ * _ `
1286
1287  $=number[calculation](format)
1288
1289 Formatting controls..
1290
1291 Non-module functionality
1292 ------------------------
1293
1294 ### Documentation
1295
1296  Both user-documentation and developer documentation, extracted from
1297  literate programming comments, and viewable using markdown mode.  This
1298  would include links to other files with more content.  Maybe
1299  documentation from a given file could be parsed out and displayed
1300  interactively by a doc pane.
1301
1302 ### IDE
1303
1304 To build an IDE with edlib there are various parts that are needed.
1305 They wouldn't all be in one pane, but the various panes might work
1306 together.
1307
1308 Functionality includes:
1309
1310 - LSP (Language Server Protocol) integration.
1311 - build:: I can already run "make" easily, though there is room for improvement.
1312 - error location:: Going to an error line is easy.  It might be nice to have
1313    the error message appear in-line with the code, rather than needing to have
1314    a separate pane containing that.
1315 - search::  jump to definition or use of function, types, variables, structure fields etc.
1316   Most of this needs an external tool, whether 'grep' or 'git grep' or 'cscope'.
1317 - syntax highlight:: different colours for different types of symbols is sometimes nice.
1318 - auto-format:: indenting and comment wrapping are particularly helpful to have
1319   automatic support for.  I've never found I wanted key-strokes to insert
1320   structured commands, but maybe having a close-bracket auto-added when
1321   the open is typed would be nice.  Then when close is typed, just step over
1322   the already existing one.
1323 - outlining:: I would really like to always be able to see the function name and
1324   signature - and probably the names of surrounding functions so that I can easily
1325   navigate to them.  See "Outline code rendering" above.
1326
1327 Interaction with gdb would be nice too - things like
1328
1329 - set break points and watch points from the code
1330 - step up and down stack and jump around code at same time.
1331 - view values of variables directly from the code.
1332