It seems you're on the right track concerning keybindings and such. Random tips: * You can rebind a key globally though the defaultKeymap field * Use 'io' to lift IO to YiM; * functions to manipulate buffers are in Editor.hs (mostly). * You can use setBufferContents to overwrite the contents of the current buffer with whatever string you want.
Cheers, JP. On Wed, Nov 26, 2008 at 8:42 PM, Gwern Branwen <[EMAIL PROTECTED]> wrote: > > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > Hello all. So recently I resolved to write, in some sort of Haskell > way, an 'incremental reading' utility. For details, see . > The summarized version is that an incremental reader is essentially an > editor* which has the user read a small portion of a number of > articles/books/papers (basically a bunch of text), and edit them. > > I want to implement this in Yi as a mode. How would this work? Here's > my current idea: > > (Let us assume I have previously inserted 5 articles into the > database). In my shell, I do '$yi'. Yi pops up. In Yi, I do 'M-x > iread'. A buffer pops up with a lengthy article in it. Perhaps it is a > scholarly essay on the mixing of genders in _Revolutionary Girl > Utena_. I read the first two paragraphs of article, and decide that > the introduction is devoid of any interesting material and I C-k all > 10 lines. I decide that's enough for today, do a C-x s (updating the > database or file with the shortened version), and then I C-hit Esc. > That article is closed, and the second one opens. This one is an essay > by Karl Popper on his theory that Parmenides was the first to discover > that the Moon's light is reflected. I find it interesting, and I edit > a couple paragraphs down into question/answer pairs for review (eg. > 'Popper believes what Pre-socratic philosopher founded the Eleatic > school?' 'Xenophanes'). I save, C-Esc, and begin on article #3... When > I finish article #5, then the whole iread mode exits and I'm left back > at *scratch* where I started. > > OK, so now you have an idea of what I want the user/me to be able to > do. Here's the simple interface: for convenience, we store all the > articles in a single file, rather than have to deal with each article > being a file; the file is just a serialized list of strings which we > can 'read' back in as our list. Articles, once read & edited a little, > get sent to the back of the list. (It's possible to improve on this: > Strings aren't efficient, file I/O would be faster if we were > operating on a directory of files instead of a single file, we could > use a dlist instead of a list and so on; but this is very simple, > nigh-trivial.): > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.9 (GNU/Linux) > > iEYEAREKAAYFAkktprQACgkQvpDo5Pfl1oIasACeNquucBxWcFgVrf16cDbN/GLk > mXIAoIjDtQuULyWtugLyTd/MB70yIVuN > =l9h/ > -----END PGP SIGNATURE----- > > >> type Article = String >> type ArticleDB = [String] -- show/read already derived > >> getLatestArticle :: ArticleDB -> Article >> getLatestArticle [] = "" >> getLatestArticle adb = head adb > >> updateSetLast :: ArticleDB -> Article -> ArticleDB >> updateSetLast [] a = [a] >> updateSetLast (b:bs) a = bs ++ [a] > >> insertNewArticle :: ArticleDB -> Article -> ArticleDB >> insertNewArticle adb a = a:adb > >> deleteArticle :: ArticleDB -> Article -> ArticleDB >> deleteArticle = flip delete > >> writeDB :: ArticleDB -> IO () >> writeDB adb = join $ liftM (flip writeFile $ show adb) dbLocation > >> readDB :: IO ArticleDB >> readDB = liftM readFile dbLocation >>= \ db -> (liftM read db) > >> dbLocation :: IO FilePath >> dbLocation = getHomeDirectory >>= \ home -> return (home ++ >> ".yi/articles.db") > > Where I bog down is actually turning this into a mode. I think what I > ultimately want looks a little like: > >> imode = ireaderMode { >> modeKeymap = (choice [ctrlCh 'c' ?>> ctrl (char 'Esc') ?>>! >> saveAndNewArticle, >> metaCh 'Esc' ?>>! quitIreader ] >> <||) >> } > >> -- ??? -- saveAndNewArticle :: Yim () >> saveAndNewArticle = do olddb <- readDB > newarticle <- turnIntoAString getBufferContents > newdb <- updateSetLast newarticle olddb > writeDB newdb > nextarticle <- getLatestArticle newdb > setBufferContents nextarticle >> quitIreader = undefined -- ??? > > Where I'm bogged down in saveAndNewArticle is that I have no > getBufferContents - there is a getBuffer, but that returns some sort > of BufferRef, and getBuffers returns EditorM [FBuffer], so... > Presumably I'd also need some way to convert from the fingerstrings or > whatever Yi is using to regular String. > > Thoughts, everyone? > > * either textual or an HTML editor; SuperMemo's > <https://secure.wikimedia.org/wikipedia/en/wiki/SuperMemo> incremental > reader is basically an editor which uses Internet Explorer to display > HTML documents. I don't terribly need HTML display capabilities, so > it's a text editor for me. > > -- > gwern > > > > --~--~---------~--~----~------------~-------~--~----~ Yi development mailing list yi-devel@googlegroups.com http://groups.google.com/group/yi-devel -~----------~----~----~----~------~----~------~--~---