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 +19/−3
- Hledger/UI/AccountsScreen.hs +10/−2
- Hledger/UI/Editor.hs +5/−0
- Hledger/UI/ErrorScreen.hs +3/−2
- Hledger/UI/Main.hs +83/−14
- Hledger/UI/RegisterScreen.hs +8/−2
- Hledger/UI/TransactionScreen.hs +7/−3
- Hledger/UI/UIOptions.hs +15/−5
- Hledger/UI/UIState.hs +19/−6
- Hledger/UI/UITypes.hs +9/−5
- Hledger/UI/UIUtils.hs +3/−2
- doc/hledger-ui.1 +31/−14
- doc/hledger-ui.1.info +34/−24
- doc/hledger-ui.1.txt +106/−92
- hledger-ui.cabal +10/−7
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)