packages feed

hledger-ui 1.0.5 → 1.1

raw patch · 15 files changed

+362/−181 lines, 15 filesdep +asyncdep +directorydep +fsnotifydep ~hledgerdep ~hledger-lib

Dependencies added: async, directory, fsnotify

Dependency ranges changed: hledger, hledger-lib

Files

CHANGES view
@@ -2,10 +2,26 @@ See also the hledger and project change logs.  -# 1.0.5 (2016/11/19)+# 1.1 (2016/12/31) -- allow brick 0.14, vty 5.12, text-zipper 0.9-- set base lower bound to 4.8 to enforce GHC 7.10++-   with --watch, the display updates automatically to show file or date changes++    hledger-ui --watch will reload data when the journal file (or any included file) changes.+    Also, when viewing a current standard period (ie this day/week/month/quarter/year),+    the period will move as needed to track the current system date.++-   the --change flag shows period changes at startup instead of historical ending balances++-   the A key runs the hledger-iadd tool, if installed++-   always reload when g is pressed++    Previously it would check the modification time and reload only if+    it looked newer than the last reload.++-   mark hledger-ui as "stable"++-   allow brick 0.15, vty 5.14, text-zipper 0.9   # 1.0.4 (2016/11/2)
Hledger/UI/AccountsScreen.hs view
@@ -247,7 +247,7 @@         sel | selected  = (<> "selected")             | otherwise = id -asHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+asHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) asHandle ui0@UIState{    aScreen=scr@AccountsScreen{..}   ,aopts=UIOpts{cliopts_=copts}@@ -289,9 +289,17 @@         -- EvKey (KChar 'l') [MCtrl] -> do         VtyEvent (EvKey KEsc        []) -> continue $ resetScreens d ui         VtyEvent (EvKey (KChar c)   []) | c `elem` ['?'] -> continue $ setMode Help ui-        VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue+        -- XXX AppEvents currently handled only in Normal mode+        -- XXX be sure we don't leave unconsumed events piling up+        AppEvent (DateChange old _) | isStandardPeriod p && p `periodContainsDate` old ->+          continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui+          where+            p = reportPeriod ui+        e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] ->+          liftIO (uiReloadJournal copts d ui) >>= continue         VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)         VtyEvent (EvKey (KChar 'a') []) -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui+        VtyEvent (EvKey (KChar 'A') []) -> suspendAndResume $ void (runIadd (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui         VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor endPos (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui         VtyEvent (EvKey (KChar '0') []) -> continue $ regenerateScreens j d $ setDepth (Just 0) ui         VtyEvent (EvKey (KChar '1') []) -> continue $ regenerateScreens j d $ setDepth (Just 1) ui
Hledger/UI/Editor.hs view
@@ -26,6 +26,11 @@ endPos :: Maybe TextPosition endPos = Just (-1,Nothing) +-- | Run the hledger-iadd executable (an alternative to the built-in add command),+-- or raise an error.+runIadd :: FilePath -> IO ExitCode+runIadd f = runCommand ("hledger-iadd -f " ++ f) >>= waitForProcess+ -- | Try running the user's preferred text editor, or a default edit command, -- on the main journal file, blocking until it exits, and returning the exit code; -- or raise an error.
Hledger/UI/ErrorScreen.hs view
@@ -68,7 +68,7 @@  esDraw _ = error "draw function called with wrong screen type, should not happen" -esHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+esHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) esHandle ui@UIState{    aScreen=ErrorScreen{..}   ,aopts=UIOpts{cliopts_=copts}@@ -92,7 +92,8 @@             (pos,f) = case parsewithString hledgerparseerrorpositionp esError of                         Right (f,l,c) -> (Just (l, Just c),f)                         Left  _       -> (endPos, journalFilePath j)-        VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j (popScreen ui)) >>= continue . uiCheckBalanceAssertions d+        e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] ->+          liftIO (uiReloadJournal copts d (popScreen ui)) >>= continue . uiCheckBalanceAssertions d --           (ej, _) <- liftIO $ journalReloadIfChanged copts d j --           case ej of --             Left err -> continue ui{aScreen=s{esError=err}} -- show latest parse error
Hledger/UI/Main.hs view
@@ -11,26 +11,30 @@  -- import Control.Applicative -- import Lens.Micro.Platform ((^.))+import Control.Concurrent+import Control.Concurrent.Async import Control.Monad -- import Control.Monad.IO.Class (liftIO)--- import Data.Default+import Data.Default (def) -- import Data.Monoid              --  import Data.List import Data.Maybe -- import Data.Text (Text) import qualified Data.Text as T -- import Data.Time.Calendar+import Graphics.Vty (mkVty) import Safe import System.Exit--import qualified Graphics.Vty as V+import System.Directory+import System.FilePath+import System.FSNotify import Brick  import Hledger import Hledger.Cli hiding (progname,prognameandversion,green) import Hledger.UI.UIOptions import Hledger.UI.UITypes--- import Hledger.UI.UIUtils+import Hledger.UI.UIState (toggleHistorical) import Hledger.UI.Theme import Hledger.UI.AccountsScreen import Hledger.UI.RegisterScreen@@ -126,16 +130,18 @@                    ,aMode=Normal                    }   -    ui = (sInit scr) d True-         UIState{-            aopts=uopts'-           ,ajournal=j-           ,aScreen=scr-           ,aPrevScreens=prevscrs-           ,aMode=Normal-           }+    ui =+      (sInit scr) d True $+        (if change_ uopts' then toggleHistorical else id) $ -- XXX+        UIState{+          aopts=uopts'+         ,ajournal=j+         ,aScreen=scr+         ,aPrevScreens=prevscrs+         ,aMode=Normal+         } -    brickapp :: App (UIState) V.Event Name+    brickapp :: App (UIState) AppEvent Name     brickapp = App {         appStartEvent   = return       , appAttrMap      = const theme@@ -144,5 +150,68 @@       , appDraw         = \ui    -> sDraw   (aScreen ui) ui       } -  void $ defaultMain brickapp ui+  if not (watch_ uopts')+  then+    void $ defaultMain brickapp ui +  else do+    -- a channel for sending misc. events to the app+    eventChan <- newChan++    -- start a background thread reporting changes in the current date+    -- use async for proper child termination in GHCI+    let+      watchDate old = do+        threadDelay 1000000 -- 1 s+        new <- getCurrentDay+        when (new /= old) $ do+          let dc = DateChange old new+          -- dbg1IO "datechange" dc -- XXX don't uncomment until dbg*IO fixed to use traceIO, GHC may block/end thread+          -- traceIO $ show dc+          writeChan eventChan dc+        watchDate new++    withAsync+      (getCurrentDay >>= watchDate)+      $ \_ -> do++      -- start one or more background threads reporting changes in the directories of our files+      -- XXX many quick successive saves causes the problems listed in BUGS+      -- with Debounce increased to 1s it easily gets stuck on an error or blank screen+      -- until you press g, but it becomes responsive again quickly.+      -- withManagerConf defaultConfig{confDebounce=Debounce 1} $ \mgr -> do+      -- with Debounce at the default 1ms it clears transient errors itself+      -- but gets tied up for ages+      withManager $ \mgr -> do+        dbg1IO "fsnotify using polling ?" $ isPollingManager mgr+        files <- mapM canonicalizePath $ map fst $ jfiles j+        let directories = nub $ sort $ map takeDirectory files+        dbg1IO "files" files+        dbg1IO "directories to watch" directories++        forM_ directories $ \d -> watchDir+          mgr+          d+          -- predicate: ignore changes not involving our files+          (\fev -> case fev of+            Modified f _ -> f `elem` files+            -- Added    f _ -> f `elem` files+            -- Removed  f _ -> f `elem` files+            -- we don't handle adding/removing journal files right now+            -- and there might be some of those events from tmp files+            -- clogging things up so let's ignore them+            _ -> False+            )+          -- action: send event to app+          (\fev -> do+            -- return $ dbglog "fsnotify" $ showFSNEvent fev -- not working+            dbg1IO "fsnotify" $ showFSNEvent fev+            writeChan eventChan FileChange+            )++        -- and start the app. Must be inside the withManager block+        void $ customMain (mkVty def) (Just eventChan) brickapp ui++showFSNEvent (Added    f _) = "Added "    ++ show f+showFSNEvent (Modified f _) = "Modified " ++ show f+showFSNEvent (Removed  f _) = "Removed "  ++ show f
Hledger/UI/RegisterScreen.hs view
@@ -236,7 +236,7 @@     sel | selected  = (<> "selected")         | otherwise = id -rsHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+rsHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) rsHandle ui@UIState{    aScreen=s@RegisterScreen{..}   ,aopts=UIOpts{cliopts_=copts}@@ -267,9 +267,15 @@         VtyEvent (EvKey (KChar 'q') []) -> halt ui         VtyEvent (EvKey KEsc        []) -> continue $ resetScreens d ui         VtyEvent (EvKey (KChar c)   []) | c `elem` ['?'] -> continue $ setMode Help ui-        VtyEvent (EvKey (KChar 'g') []) -> liftIO (uiReloadJournalIfChanged copts d j ui) >>= continue+        AppEvent (DateChange old _) | isStandardPeriod p && p `periodContainsDate` old ->+          continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui+          where+            p = reportPeriod ui+        e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] ->+          liftIO (uiReloadJournal copts d ui) >>= continue         VtyEvent (EvKey (KChar 'I') []) -> continue $ uiCheckBalanceAssertions d (toggleIgnoreBalanceAssertions ui)         VtyEvent (EvKey (KChar 'a') []) -> suspendAndResume $ clearScreen >> setCursorPosition 0 0 >> add copts j >> uiReloadJournalIfChanged copts d j ui+        VtyEvent (EvKey (KChar 'A') []) -> suspendAndResume $ void (runIadd (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui         VtyEvent (EvKey (KChar 't') [])    -> continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui         VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui           where
Hledger/UI/TransactionScreen.hs view
@@ -102,7 +102,7 @@  tsDraw _ = error "draw function called with wrong screen type, should not happen" -tsHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+tsHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) tsHandle ui@UIState{aScreen=s@TransactionScreen{tsTransaction=(i,t)                                                 ,tsTransactions=nts                                                 ,tsAccount=acct}@@ -129,9 +129,13 @@         VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui           where             (pos,f) = let GenericSourcePos f l c = tsourcepos t in (Just (l, Just c),f)-        VtyEvent (EvKey (KChar 'g') []) -> do+        AppEvent (DateChange old _) | isStandardPeriod p && p `periodContainsDate` old ->+          continue $ regenerateScreens j d $ setReportPeriod (DayPeriod d) ui+          where+            p = reportPeriod ui+        e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] -> do           d <- liftIO getCurrentDay-          (ej, _) <- liftIO $ journalReloadIfChanged copts d j+          ej <- liftIO $ journalReload copts           case ej of             Left err -> continue $ screenEnter d errorScreen{esError=err} ui             Right j' -> do
Hledger/UI/UIOptions.hs view
@@ -26,8 +26,15 @@  uiflags = [   -- flagNone ["debug-ui"]  (\opts -> setboolopt "rules-file" opts) "run with no terminal output, showing console"-   flagReq  ["theme"] (\s opts -> Right $ setopt "theme" s opts) "THEME" ("use this custom display theme ("++intercalate ", " themeNames++")")+   flagNone ["watch"] (\opts -> setboolopt "watch" opts) "watch for data changes and reload automatically"+  ,flagReq  ["theme"] (\s opts -> Right $ setopt "theme" s opts) "THEME" ("use this custom display theme ("++intercalate ", " themeNames++")")   ,flagReq  ["register"] (\s opts -> Right $ setopt "register" s opts) "ACCTREGEX" "start in the (first) matched account's register"+  ,flagNone ["change"] (\opts -> setboolopt "change" opts)+    "show period balances (changes) at startup instead of historical balances"+  -- ,flagNone ["cumulative"] (\opts -> setboolopt "cumulative" opts)+  --   "show balance change accumulated across periods (in multicolumn reports)"+  -- ,flagNone ["historical","H"] (\opts -> setboolopt "historical" opts)+  --   "show historical ending balance in each period (includes postings before report start date)\n "   ,flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show full account names, unindented"   -- ,flagReq ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "with --flat, omit this many leading account name components"   -- ,flagReq  ["format"] (\s opts -> Right $ setopt "format" s opts) "FORMATSTR" "use this custom line format"@@ -51,13 +58,15 @@  -- hledger-ui options, used in hledger-ui and above data UIOpts = UIOpts {-     debug_ui_ :: Bool-    ,cliopts_   :: CliOpts+     watch_   :: Bool+    ,change_  :: Bool+    ,cliopts_ :: CliOpts  } deriving (Show)  defuiopts = UIOpts     def     def+    def  -- instance Default CliOpts where def = defcliopts @@ -65,8 +74,9 @@ rawOptsToUIOpts rawopts = checkUIOpts <$> do   cliopts <- rawOptsToCliOpts rawopts   return defuiopts {-              debug_ui_ = boolopt "debug-ui" rawopts-             ,cliopts_   = cliopts+              watch_   = boolopt "watch" rawopts+             ,change_  = boolopt "change" rawopts+             ,cliopts_ = cliopts              }  checkUIOpts :: UIOpts -> UIOpts
Hledger/UI/UIState.hs view
@@ -86,15 +86,28 @@ shrinkReportPeriod d ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =   ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodShrink d $ period_ ropts}}}} --- | Step the report start/end dates to the next period of same duration.+-- | Step the report start/end dates to the next period of same duration,+-- remaining inside the given enclosing span. nextReportPeriod :: DateSpan -> UIState -> UIState-nextReportPeriod journalspan ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =-  ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodNextIn journalspan p}}}}+nextReportPeriod enclosingspan ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =+  ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodNextIn enclosingspan p}}}} --- | Step the report start/end dates to the next period of same duration.+-- | Step the report start/end dates to the next period of same duration,+-- remaining inside the given enclosing span. previousReportPeriod :: DateSpan -> UIState -> UIState-previousReportPeriod journalspan ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =-  ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodPreviousIn journalspan p}}}}+previousReportPeriod enclosingspan ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =+  ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodPreviousIn enclosingspan p}}}}++-- | If a standard report period is set, step it forward/backward if needed so that+-- it encloses the given date.+moveReportPeriodToDate :: Day -> UIState -> UIState+moveReportPeriodToDate d ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts@ReportOpts{period_=p}}}} =+  ui{aopts=uopts{cliopts_=copts{reportopts_=ropts{period_=periodMoveTo d p}}}}++-- | Get the report period.+reportPeriod :: UIState -> Period+reportPeriod UIState{aopts=UIOpts{cliopts_=CliOpts{reportopts_=ReportOpts{period_=p}}}} =+  p  -- | Set the report period. setReportPeriod :: Period -> UIState -> UIState
Hledger/UI/UITypes.hs view
@@ -39,7 +39,6 @@ module Hledger.UI.UITypes where  import Data.Time.Calendar (Day)-import Graphics.Vty (Event) import Brick import Brick.Widgets.List import Brick.Widgets.Edit (Editor)@@ -83,6 +82,11 @@   | RegisterList   deriving (Ord, Show, Eq) +data AppEvent =+    FileChange          -- one of the Journal's files has been added/modified/removed+  | DateChange Day Day  -- the current date has changed since last checked (with the old and new values)+  deriving (Eq, Show)+ -- | hledger-ui screen types & instances. -- Each screen type has generically named initialisation, draw, and event handling functions, -- and zero or more uniquely named screen state fields, which hold the data for a particular@@ -92,7 +96,7 @@     AccountsScreen {        sInit   :: Day -> Bool -> UIState -> UIState              -- ^ function to initialise or update this screen's state       ,sDraw   :: UIState -> [Widget Name]                             -- ^ brick renderer for this screen-      ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)  -- ^ brick event handler for this screen+      ,sHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)  -- ^ brick event handler for this screen       -- state fields.These ones have lenses:       ,_asList            :: List Name AccountsScreenItem  -- ^ list widget showing account names & balances       ,_asSelectedAccount :: AccountName              -- ^ a backup of the account name from the list widget's selected item (or "")@@ -100,7 +104,7 @@   | RegisterScreen {        sInit   :: Day -> Bool -> UIState -> UIState       ,sDraw   :: UIState -> [Widget Name]-      ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+      ,sHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)       --       ,rsList    :: List Name RegisterScreenItem      -- ^ list widget showing transactions affecting this account       ,rsAccount :: AccountName                       -- ^ the account this register is for@@ -111,7 +115,7 @@   | TransactionScreen {        sInit   :: Day -> Bool -> UIState -> UIState       ,sDraw   :: UIState -> [Widget Name]-      ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+      ,sHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)       --       ,tsTransaction  :: NumberedTransaction          -- ^ the transaction we are currently viewing, and its position in the list       ,tsTransactions :: [NumberedTransaction]        -- ^ list of transactions we can step through@@ -120,7 +124,7 @@   | ErrorScreen {        sInit   :: Day -> Bool -> UIState -> UIState       ,sDraw   :: UIState -> [Widget Name]-      ,sHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+      ,sHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState)       --       ,esError :: String                              -- ^ error message to show     }
Hledger/UI/UIUtils.hs view
@@ -56,7 +56,8 @@                   ,str " "                   ,str "MISC"                   ,renderKey ("?", "toggle help")-                  ,renderKey ("a", "add transaction")+                  ,renderKey ("a", "add transaction (hledger add)")+                  ,renderKey ("A", "add transaction (hledger-iadd)")                   ,renderKey ("E", "open editor")                   ,renderKey ("g", "reload data")                   ,renderKey ("I", "toggle balance assertions")@@ -110,7 +111,7 @@     renderKey (key,desc) = withAttr (borderAttr <> "keys") (str key) <+> str " " <+> str desc  -- | Event handler used when help mode is active.-helpHandle :: UIState -> BrickEvent Name Event -> EventM Name (Next UIState)+helpHandle :: UIState -> BrickEvent Name AppEvent -> EventM Name (Next UIState) helpHandle ui ev =   case ev of     VtyEvent (EvKey k []) | k `elem` [KEsc, KLeft, KChar 'h', KChar '?'] -> continue $ setMode Normal ui
doc/hledger-ui.1 view
@@ -1,5 +1,5 @@ -.TH "hledger\-ui" "1" "October 2016" "hledger\-ui 1.0" "hledger User Manuals"+.TH "hledger\-ui" "1" "December 2016" "hledger\-ui 1.1" "hledger User Manuals"   @@ -39,21 +39,31 @@ Any QUERYARGS are interpreted as a hledger search query which filters the data. .TP-.B \f[C]\-\-flat\f[]-show full account names, unindented+.B \f[C]\-\-watch\f[]+watch for data (and time) changes and reload automatically .RS .RE .TP+.B \f[C]\-\-theme=default|terminal|greenterm\f[]+use this custom display theme+.RS+.RE+.TP .B \f[C]\-\-register=ACCTREGEX\f[] start in the (first) matched account\[aq]s register screen .RS .RE .TP-.B \f[C]\-\-theme=default|terminal|greenterm\f[]-use this custom display theme+.B \f[C]\-\-change\f[]+show period balances (changes) at startup instead of historical balances .RS .RE .TP+.B \f[C]\-\-flat\f[]+show full account names, unindented+.RS+.RE+.TP .B \f[C]\-V\ \-\-value\f[] show amounts as their current market value in their default valuation commodity (accounts screen only)@@ -193,7 +203,8 @@ .RE .TP .B \f[C]\-B\ \-\-cost\f[]-show amounts in their cost price\[aq]s commodity+convert amounts to their cost at transaction time (using the transaction+price, if any) .RS .RE .TP@@ -201,8 +212,6 @@ will transform the journal before any other processing by replacing the account name of every posting having the tag TAG with content VALUE by the account name "TAG:VALUE".-.RS-.RE The TAG will only match if it is a full\-length match. The pivot will only happen if the TAG is on a posting, not if it is on the transaction.@@ -239,8 +248,11 @@ report period durations: year, quarter, month, week, day. Then, \f[C]shift\-left/right\f[] moves to the previous/next period. \f[C]t\f[] sets the report period to today.-(To set a non\-standard period, you can use \f[C]/\f[] and a-\f[C]date:\f[] query).+With the \f[C]\-\-watch\f[] option, when viewing a "current" period (the+current day, week, month, quarter, or year), the period will move+automatically to track the current date.+To set a non\-standard period, you can use \f[C]/\f[] and a+\f[C]date:\f[] query. .PP \f[C]/\f[] lets you set a general filter query limiting the data shown, using the same query terms as in hledger and hledger\-web.@@ -424,12 +436,17 @@ \f[C]\-V\f[] affects only the accounts screen. .PP When you press \f[C]g\f[], the current and all previous screens are-regenerated, which may cause a noticeable pause.+regenerated, which may cause a noticeable pause with large files. Also there is no visual indication that this is in progress. .PP-The register screen\[aq]s switching between historic balance and running-total based on query arguments may be confusing, and there is no column-heading to indicate which is being displayed.+\f[C]\-\-watch\f[] is not yet fully robust.+It works well for normal usage, but many file changes in a short time+(eg saving the file thousands of times with an editor macro) can cause+problems at least on OSX.+Symptoms include: unresponsive UI, periodic resetting of the cursor+position, momentary display of parse errors, high CPU usage eventually+subsiding, and possibly a small but persistent build\-up of CPU usage+until the program is restarted.   .SH "REPORTING BUGS"
doc/hledger-ui.1.info view
@@ -4,7 +4,7 @@  File: hledger-ui.1.info,  Node: Top,  Up: (dir) -hledger-ui(1) hledger-ui 1.0+hledger-ui(1) hledger-ui 1.1 ****************************  hledger-ui is hledger's curses-style interface, providing an efficient@@ -37,15 +37,22 @@    Any QUERYARGS are interpreted as a hledger search query which filters the data. -`--flat'-     show full account names, unindented+`--watch'+     watch for data (and time) changes and reload automatically +`--theme=default|terminal|greenterm'+     use this custom display theme+ `--register=ACCTREGEX'      start in the (first) matched account's register screen -`--theme=default|terminal|greenterm'-     use this custom display theme+`--change'+     show period balances (changes) at startup instead of historical+     balances +`--flat'+     show full account names, unindented+ `-V --value'      show amounts as their current market value in their default      valuation commodity (accounts screen only)@@ -132,16 +139,17 @@      show items with zero amount, normally hidden  `-B --cost'-     show amounts in their cost price's commodity+     convert amounts to their cost at transaction time (using the+     transaction price, if any)  `--pivot TAG'      will transform the journal before any other processing by      replacing the account name of every posting having the tag TAG-     with content VALUE by the account name "TAG:VALUE".  The TAG will+     with content VALUE by the account name "TAG:VALUE". The TAG will      only match if it is a full-length match. The pivot will only-     happen if the TAG is on a posting, not if it is on the transaction.-     If the tag value is a multi:level:account:name the new account-     name will be "TAG:multi:level:account:name".+     happen if the TAG is on a posting, not if it is on the+     transaction. If the tag value is a multi:level:account:name the+     new account name will be "TAG:multi:level:account:name".  `--anon'      show anonymized accounts and payees@@ -170,8 +178,10 @@ `shift-down/up' steps downward and upward through these standard report period durations: year, quarter, month, week, day. Then, `shift-left/right' moves to the previous/next period. `t' sets the-report period to today. (To set a non-standard period, you can use `/'-and a `date:' query).+report period to today. With the `--watch' option, when viewing a+"current" period (the current day, week, month, quarter, or year), the+period will move automatically to track the current date. To set a+non-standard period, you can use `/' and a `date:' query.     `/' lets you set a general filter query limiting the data shown, using the same query terms as in hledger and hledger-web. While editing@@ -351,17 +361,17 @@ Node: Top88 Node: OPTIONS823 Ref: #options922-Node: KEYS3786-Ref: #keys3883-Node: SCREENS6284-Ref: #screens6371-Node: Accounts screen6461-Ref: #accounts-screen6591-Node: Register screen8629-Ref: #register-screen8786-Node: Transaction screen10674-Ref: #transaction-screen10834-Node: Error screen11701-Ref: #error-screen11825+Node: KEYS4003+Ref: #keys4100+Node: SCREENS6670+Ref: #screens6757+Node: Accounts screen6847+Ref: #accounts-screen6977+Node: Register screen9015+Ref: #register-screen9172+Node: Transaction screen11060+Ref: #transaction-screen11220+Node: Error screen12087+Ref: #error-screen12211  End Tag Table
doc/hledger-ui.1.txt view
@@ -35,14 +35,21 @@        Any  QUERYARGS  are interpreted as a hledger search query which filters        the data. -       --flat show full account names, unindented+       --watch+              watch for data (and time) changes and reload automatically +       --theme=default|terminal|greenterm+              use this custom display theme+        --register=ACCTREGEX               start in the (first) matched account's register screen -       --theme=default|terminal|greenterm-              use this custom display theme+       --change+              show period balances (changes) at startup instead of  historical+              balances +       --flat show full account names, unindented+        -V --value               show amounts as their current market value in their default val-               uation commodity (accounts screen only)@@ -51,7 +58,7 @@         -h     show general usage (or after COMMAND, the command's usage) -       --help show  the  current  program's  manual as plain text (or after an+       --help show the current program's manual as plain  text  (or  after  an               add-on COMMAND, the add-on's manual)         --man  show the current program's manual with man@@ -68,7 +75,7 @@               use a different input file.  For stdin, use -         --rules-file=RULESFILE-              Conversion  rules  file  to  use  when  reading  CSV   (default:+              Conversion   rules  file  to  use  when  reading  CSV  (default:               FILE.rules)         --alias=OLD=NEW@@ -101,7 +108,7 @@               multiperiod/multicolumn report by year         -p --period=PERIODEXP-              set  start date, end date, and/or reporting interval all at once+              set start date, end date, and/or reporting interval all at  once               (overrides the flags above)         --date2@@ -126,63 +133,66 @@               show items with zero amount, normally hidden         -B --cost-              show amounts in their cost price's commodity+              convert  amounts  to  their  cost at transaction time (using the+              transaction price, if any)         --pivot TAG               will transform  the  journal  before  any  other  processing  by               replacing  the  account name of every posting having the tag TAG-              with content VALUE by the account name "TAG:VALUE".-       The TAG will only match if it is a full-length match.  The  pivot  will-       only  happen  if  the TAG is on a posting, not if it is on the transac--       tion.  If the tag value is a multi:level:account:name the  new  account-       name will be "TAG:multi:level:account:name".+              with content VALUE by the account  name  "TAG:VALUE".   The  TAG+              will  only  match  if it is a full-length match.  The pivot will+              only happen if the TAG is on a posting, not  if  it  is  on  the+              transaction.  If the tag value is a multi:level:account:name the+              new account name will be "TAG:multi:level:account:name".         --anon show anonymized accounts and payees  KEYS-       ?  shows a help dialog listing all keys.  (Some of these also appear in+       ? shows a help dialog listing all keys.  (Some of these also appear  in        the quick help at the bottom of each screen.) Press ? again (or ESCAPE,        or LEFT) to close it.  The following keys work on most screens:         The cursor keys navigate: right (or enter) goes deeper, left returns to-       the previous screen,  up/down/page up/page down/home/end  move  up  and+       the  previous  screen,  up/down/page up/page down/home/end  move up and        down through lists.  Vi-style h/j/k/l movement keys are also supported.-       A tip: movement speed is limited by your keyboard repeat rate, to  move-       faster  you  may want to adjust it.  (If you're on a mac, the Karabiner+       A  tip: movement speed is limited by your keyboard repeat rate, to move+       faster you may want to adjust it.  (If you're on a mac,  the  Karabiner        app is one way to do that.) -       With shift pressed, the cursor keys adjust the report period,  limiting-       the   transactions   to   be   shown   (by  default,  all  are  shown).-       shift-down/up steps downward and upward through these  standard  report+       With  shift pressed, the cursor keys adjust the report period, limiting+       the  transactions  to  be  shown   (by   default,   all   are   shown).+       shift-down/up  steps  downward and upward through these standard report        period   durations:   year,   quarter,   month,   week,   day.    Then,-       shift-left/right moves to the previous/next period.  t sets the  report-       period  to  today.   (To set a non-standard period, you can use / and a-       date: query).+       shift-left/right  moves to the previous/next period.  t sets the report+       period to today.  With the --watch option,  when  viewing  a  "current"+       period  (the  current  day,  week, month, quarter, or year), the period+       will move automatically to track the current date.  To set a  non-stan-+       dard period, you can use / and a date: query. -       / lets you set a general filter query limiting the  data  shown,  using-       the  same query terms as in hledger and hledger-web.  While editing the-       query, you can use CTRL-a/e/d/k, BS, cursor keys; press  ENTER  to  set+       /  lets  you  set a general filter query limiting the data shown, using+       the same query terms as in hledger and hledger-web.  While editing  the+       query,  you  can  use CTRL-a/e/d/k, BS, cursor keys; press ENTER to set        it, or ESCAPEto cancel.  There are also keys for quickly adjusting some-       common filters like account depth and  cleared/uncleared  (see  below).+       common  filters  like  account depth and cleared/uncleared (see below).        BACKSPACE or DELETE removes all filters, showing all transactions. -       ESCAPE  removes  all  filters and jumps back to the top screen.  Or, it+       ESCAPE removes all filters and jumps back to the top  screen.   Or,  it        cancels a minibuffer edit or help dialog in progress. -       g reloads from the data file(s) and updates the current screen and  any-       previous  screens.   (With  large  files, this could cause a noticeable+       g  reloads from the data file(s) and updates the current screen and any+       previous screens.  (With large files, this  could  cause  a  noticeable        pause.) -       I toggles balance assertion  checking.   Disabling  balance  assertions+       I  toggles  balance  assertion  checking.  Disabling balance assertions        temporarily can be useful for troubleshooting. -       a  runs  command-line  hledger's  add  command, and reloads the updated+       a runs command-line hledger's add  command,  and  reloads  the  updated        file.  This allows some basic data entry. -       E  runs  $HLEDGER_UI_EDITOR,  or   $EDITOR,   or   a   default   (emac-+       E   runs   $HLEDGER_UI_EDITOR,   or   $EDITOR,   or  a  default  (emac-        sclient -a "" -nw) on the journal file.  With some editors (emacs, vi),-       the cursor will be positioned at the current transaction  when  invoked-       from  the  register  and transaction screens, and at the error location+       the  cursor  will be positioned at the current transaction when invoked+       from the register and transaction screens, and at  the  error  location        (if possible) when invoked from the error screen.         q quits the application.@@ -191,42 +201,42 @@  SCREENS    Accounts screen-       This is normally the first screen displayed.   It  lists  accounts  and-       their  balances,  like hledger's balance command.  By default, it shows-       all accounts and their latest ending balances (including  the  balances-       of  subaccounts).  if you specify a query on the command line, it shows+       This  is  normally  the  first screen displayed.  It lists accounts and+       their balances, like hledger's balance command.  By default,  it  shows+       all  accounts  and their latest ending balances (including the balances+       of subaccounts).  if you specify a query on the command line, it  shows        just the matched accounts and the balances from matched transactions. -       Account names are normally indented to show the hierarchy (tree  mode).+       Account  names are normally indented to show the hierarchy (tree mode).        To see less detail, set a depth limit by pressing a number key, 1 to 9.        0 shows even less detail, collapsing all accounts to a single total.  --       and  +  (or  =)  decrease  and increase the depth limit.  To remove the-       depth limit, set it higher than the maximum  account  depth,  or  press+       and + (or =) decrease and increase the  depth  limit.   To  remove  the+       depth  limit,  set  it  higher than the maximum account depth, or press        ESCAPE. -       F  toggles  flat mode, in which accounts are shown as a flat list, with-       their full names.  In this mode, account balances exclude  subaccounts,-       except  for accounts at the depth limit (as with hledger's balance com-+       F toggles flat mode, in which accounts are shown as a flat  list,  with+       their  full names.  In this mode, account balances exclude subaccounts,+       except for accounts at the depth limit (as with hledger's balance  com-        mand).         H toggles between showing historical balances or period balances.  His--       torical  balances  (the  default) are ending balances at the end of the-       report period, taking into account all transactions  before  that  date-       (filtered  by  the  filter query if any), including transactions before-       the start of the report period.  In other  words,  historical  balances-       are  what  you  would  see on a bank statement for that account (unless-       disturbed by a filter  query).   Period  balances  ignore  transactions+       torical balances (the default) are ending balances at the  end  of  the+       report  period,  taking  into account all transactions before that date+       (filtered by the filter query if any),  including  transactions  before+       the  start  of  the report period.  In other words, historical balances+       are what you would see on a bank statement  for  that  account  (unless+       disturbed  by  a  filter  query).   Period balances ignore transactions        before the report start date, so they show the change in balance during        the report period.  They are more useful eg when viewing a time log. -       C toggles cleared mode, in which uncleared  transactions  and  postings-       are  not  shown.   U  toggles  uncleared  mode, in which only uncleared+       C  toggles  cleared  mode, in which uncleared transactions and postings+       are not shown.  U toggles  uncleared  mode,  in  which  only  uncleared        transactions/postings are shown.         R toggles real mode, in which virtual postings are ignored. -       Z toggles nonzero mode, in which only accounts  with  nonzero  balances-       are  shown (hledger-ui shows zero items by default, unlike command-line+       Z  toggles  nonzero  mode, in which only accounts with nonzero balances+       are shown (hledger-ui shows zero items by default, unlike  command-line        hledger).         Press right or enter to view an account's transactions register.@@ -235,62 +245,62 @@        This screen shows the transactions affecting a particular account, like        a check register.  Each line represents one transaction and shows: -       o the  other  account(s)  involved, in abbreviated form.  (If there are-         both real and virtual postings, it shows only the  accounts  affected+       o the other account(s) involved, in abbreviated form.   (If  there  are+         both  real  and virtual postings, it shows only the accounts affected          by real postings.) -       o the  overall change to the current account's balance; positive for an+       o the overall change to the current account's balance; positive for  an          inflow to this account, negative for an outflow.         o the running historical total or period total for the current account,-         after  the  transaction.  This can be toggled with H.  Similar to the-         accounts screen, the historical total  is  affected  by  transactions-         (filtered  by  the  filter query) before the report start date, while+         after the transaction.  This can be toggled with H.  Similar  to  the+         accounts  screen,  the  historical  total is affected by transactions+         (filtered by the filter query) before the report  start  date,  while          the period total is not.  If the historical total is not disturbed by-         a  filter  query, it will be the running historical balance you would+         a filter query, it will be the running historical balance  you  would          see on a bank register for the current account. -       If the accounts screen was in  tree  mode,  the  register  screen  will+       If  the  accounts  screen  was  in  tree mode, the register screen will        include transactions from both the current account and its subaccounts.-       If the accounts screen  was  in  flat  mode,  and  a  non-depth-clipped-       account  was  selected,  the  register screen will exclude transactions+       If  the  accounts  screen  was  in  flat  mode, and a non-depth-clipped+       account was selected, the register  screen  will  exclude  transactions        from subaccounts.  In other words, the register always shows the trans--       actions  responsible  for  the  period  balance  shown  on the accounts+       actions responsible for  the  period  balance  shown  on  the  accounts        screen.  As on the accounts screen, this can be toggled with F. -       C toggles cleared mode, in which uncleared  transactions  and  postings-       are  not  shown.   U  toggles  uncleared  mode, in which only uncleared+       C  toggles  cleared  mode, in which uncleared transactions and postings+       are not shown.  U toggles  uncleared  mode,  in  which  only  uncleared        transactions/postings are shown.         R toggles real mode, in which virtual postings are ignored. -       Z toggles nonzero mode, in which only transactions  posting  a  nonzero-       change  are  shown (hledger-ui shows zero items by default, unlike com-+       Z  toggles  nonzero  mode, in which only transactions posting a nonzero+       change are shown (hledger-ui shows zero items by default,  unlike  com-        mand-line hledger).         Press right (or enter) to view the selected transaction in detail.     Transaction screen-       This screen shows a single transaction, as  a  general  journal  entry,-       similar  to  hledger's  print command and journal format (hledger_jour-+       This  screen  shows  a  single transaction, as a general journal entry,+       similar to hledger's print command and  journal  format  (hledger_jour-        nal(5)). -       The transaction's date(s)  and  any  cleared  flag,  transaction  code,-       description,  comments,  along  with  all  of  its account postings are-       shown.  Simple transactions have two postings, but there  can  be  more+       The  transaction's  date(s)  and  any  cleared  flag, transaction code,+       description, comments, along with  all  of  its  account  postings  are+       shown.   Simple  transactions  have two postings, but there can be more        (or in certain cases, fewer). -       up  and  down will step through all transactions listed in the previous-       account register screen.  In the title bar, the numbers in  parentheses-       show  your  position  within  that  account  register.   They will vary+       up and down will step through all transactions listed in  the  previous+       account  register screen.  In the title bar, the numbers in parentheses+       show your position  within  that  account  register.   They  will  vary        depending on which account register you came from (remember most trans-        actions appear in multiple account registers).  The #N number preceding        them is the transaction's position within the complete unfiltered jour-        nal, which is a more stable id (at least until the next reload).     Error screen-       This  screen  will appear if there is a problem, such as a parse error,-       when you press g to reload.  Once you have fixed the problem,  press  g+       This screen will appear if there is a problem, such as a  parse  error,+       when  you  press g to reload.  Once you have fixed the problem, press g        again to reload and resume normal operation.  (Or, you can press escape        to cancel the reload attempt.) @@ -298,17 +308,17 @@        COLUMNS The screen width to use.  Default: the full terminal width.         LEDGER_FILE The journal file path when not specified with -f.  Default:-       ~/.hledger.journal  (on  windows,  perhaps C:/Users/USER/.hledger.jour-+       ~/.hledger.journal (on  windows,  perhaps  C:/Users/USER/.hledger.jour-        nal).  FILES-       Reads data from one or more files in hledger journal, timeclock,  time--       dot,   or   CSV   format   specified   with  -f,  or  $LEDGER_FILE,  or-       $HOME/.hledger.journal          (on          windows,           perhaps+       Reads  data from one or more files in hledger journal, timeclock, time-+       dot,  or  CSV  format  specified   with   -f,   or   $LEDGER_FILE,   or+       $HOME/.hledger.journal           (on          windows,          perhaps        C:/Users/USER/.hledger.journal).  BUGS-       The  need  to precede options with -- when invoked from hledger is awk-+       The need to precede options with -- when invoked from hledger  is  awk-        ward.         -f- doesn't work (hledger-ui can't read from stdin).@@ -316,17 +326,21 @@        -V affects only the accounts screen.         When you press g, the current and all previous screens are regenerated,-       which may cause a noticeable pause.  Also there is no visual indication-       that this is in progress.+       which may cause a noticeable pause with large files.  Also there is  no+       visual indication that this is in progress. -       The register screen's switching between historic  balance  and  running-       total based on query arguments may be confusing, and there is no column-       heading to indicate which is being displayed.+       --watch  is  not yet fully robust.  It works well for normal usage, but+       many file changes in a short time (eg  saving  the  file  thousands  of+       times  with an editor macro) can cause problems at least on OSX.  Symp-+       toms include: unresponsive UI, periodic resetting of the  cursor  posi-+       tion, momentary display of parse errors, high CPU usage eventually sub-+       siding, and possibly a small but persistent build-up of CPU usage until+       the program is restarted.    REPORTING BUGS-       Report bugs at http://bugs.hledger.org (or on the #hledger IRC  channel+       Report  bugs at http://bugs.hledger.org (or on the #hledger IRC channel        or hledger mail list)  @@ -340,7 +354,7 @@   SEE ALSO-       hledger(1),      hledger-ui(1),     hledger-web(1),     hledger-api(1),+       hledger(1),     hledger-ui(1),     hledger-web(1),      hledger-api(1),        hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-        dot(5), ledger(1) @@ -348,4 +362,4 @@   -hledger-ui 1.0                   October 2016                    hledger-ui(1)+hledger-ui 1.1                   December 2016                   hledger-ui(1)
hledger-ui.cabal view
@@ -1,9 +1,9 @@--- This file has been generated from package.yaml by hpack version 0.14.0.+-- This file has been generated from package.yaml by hpack version 0.15.0. -- -- see: https://github.com/sol/hpack  name:           hledger-ui-version:        1.0.5+version:        1.1 stability:      stable category:       Finance, Console synopsis:       Curses-style user interface for the hledger accounting tool@@ -55,17 +55,20 @@   hs-source-dirs:       .   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans-  cpp-options: -DVERSION="1.0.5"+  cpp-options: -DVERSION="1.1"   build-depends:-      hledger >= 1.0.1 && < 1.1-    , hledger-lib >= 1.0.1 && < 1.1+      hledger >= 1.1 && < 1.2+    , hledger-lib >= 1.1 && < 1.2     , ansi-terminal >= 0.6.2.3 && < 0.7+    , async     , base >= 4.8 && < 5     , base-compat >= 0.8.1     , cmdargs >= 0.8     , containers     , data-default+    , directory     , filepath+    , fsnotify >= 0.2 && < 0.3     , HUnit     , microlens >= 0.4 && < 0.5     , microlens-platform >= 0.2.3.1 && < 0.4@@ -82,8 +85,8 @@     buildable: False   else     build-depends:-        brick >= 0.12 && < 0.15-      , vty >= 5.5 && < 5.13+        brick >= 0.12 && < 0.16+      , vty >= 5.5 && < 5.15   if flag(threaded)     ghc-options: -threaded   if flag(oldtime)