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