diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,20 @@
 User-visible changes in hledger-ui.
 See also the hledger changelog.
 
+# 1.17 2020-03-01
+
+- don't enable --auto by default
+
+- don't enable --forecast by default; drop the --future flag (#1193)
+
+  Previously, periodic transactions occurring today were always shown,
+  in both "present" and "future" modes.
+
+  Now, generation of periodic transactions and display of future
+  transactions (all kinds) are combined as "forecast mode", which can
+  be enabled with --forecast and/or the F key.  The --future flag is
+  now a hidden alias for --forecast, and deprecated.
+
 # 1.16.2 2020-01-14
 
 - add support for megaparsec 8 (#1175)
diff --git a/Hledger/UI/AccountsScreen.hs b/Hledger/UI/AccountsScreen.hs
--- a/Hledger/UI/AccountsScreen.hs
+++ b/Hledger/UI/AccountsScreen.hs
@@ -83,12 +83,15 @@
     uopts' = uopts{cliopts_=copts{reportopts_=ropts'}}
     ropts' = ropts{accountlistmode_=if tree_ ropts then ALTree else ALFlat}
 
-    -- Add a date:-tomorrow to the query to exclude future txns, by default.
-    -- XXX this necessitates special handling in multiBalanceReport, at least
-    pfq | presentorfuture_ uopts == PFFuture = Any
-        | otherwise                          = Date $ DateSpan Nothing (Just $ addDays 1 d)
-    q = And [queryFromOpts d ropts, pfq]
-
+    q = And [queryFromOpts d ropts, excludeforecastq (forecast_ ropts)]
+      where
+        -- Except in forecast mode, exclude future/forecast transactions.
+        excludeforecastq True = Any
+        excludeforecastq False =  -- not:date:tomorrow- not:tag:generated-transaction
+          And [
+             Not (Date $ DateSpan (Just $ addDays 1 d) Nothing)
+            ,Not (Tag "generated-transaction" Nothing)
+          ]
 
     -- run the report
     (items,_total) = report ropts' q j
@@ -123,7 +126,7 @@
 asInit _ _ _ = error "init function called with wrong screen type, should not happen"
 
 asDraw :: UIState -> [Widget Name]
-asDraw UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
+asDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
               ,ajournal=j
               ,aScreen=s@AccountsScreen{}
               ,aMode=mode
@@ -215,7 +218,7 @@
               ,("-+", str "depth")
               ,("T", renderToggle (tree_ ropts) "flat" "tree")
               ,("H", renderToggle (not ishistorical) "end-bals" "changes")
-              ,("F", renderToggle (presentorfuture_ uopts == PFFuture) "present" "future")
+              ,("F", renderToggle1 (forecast_ ropts) "forecast")
               --,("/", "filter")
               --,("DEL", "unfilter")
               --,("ESC", "cancel/top")
@@ -310,7 +313,7 @@
         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 'E') []) -> suspendAndResume $ void (runEditor endPosition (journalFilePath j)) >> uiReloadJournalIfChanged copts d j ui
         VtyEvent (EvKey (KChar 'B') []) -> continue $ regenerateScreens j d $ toggleCost ui
         VtyEvent (EvKey (KChar 'V') []) -> continue $ regenerateScreens j d $ toggleValue ui
         VtyEvent (EvKey (KChar '0') []) -> continue $ regenerateScreens j d $ setDepth (Just 0) ui
@@ -336,7 +339,7 @@
         VtyEvent (EvKey (KChar 'U') []) -> asCenterAndContinue $ regenerateScreens j d $ toggleUnmarked ui
         VtyEvent (EvKey (KChar 'P') []) -> asCenterAndContinue $ regenerateScreens j d $ togglePending ui
         VtyEvent (EvKey (KChar 'C') []) -> asCenterAndContinue $ regenerateScreens j d $ toggleCleared ui
-        VtyEvent (EvKey (KChar 'F') []) -> asCenterAndContinue $ regenerateScreens j d $ toggleFuture ui
+        VtyEvent (EvKey (KChar 'F') []) -> continue $ regenerateScreens j d $ toggleForecast ui
 
         VtyEvent (EvKey (KDown)     [MShift]) -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui
         VtyEvent (EvKey (KUp)       [MShift]) -> continue $ regenerateScreens j d $ growReportPeriod d ui
diff --git a/Hledger/UI/Editor.hs b/Hledger/UI/Editor.hs
--- a/Hledger/UI/Editor.hs
+++ b/Hledger/UI/Editor.hs
@@ -2,11 +2,15 @@
 
 -- {-# LANGUAGE OverloadedStrings #-}
 
-module Hledger.UI.Editor
+module Hledger.UI.Editor (
+   -- TextPosition
+   endPosition
+  ,runEditor
+  ,runIadd
+  )
 where
 
 import Control.Applicative ((<|>))
-import Data.List
 import Safe
 import System.Environment
 import System.Exit
@@ -15,76 +19,91 @@
 
 import Hledger
 
--- | Editors we know how to create more specific command lines for.
-data EditorType = Emacs | EmacsClient | Vi | Other
-
 -- | A position we can move to in a text editor: a line and optional column number.
--- 1 (or 0) means the first and -1 means the last (and -2 means the second last, etc.
--- though this may not be well supported.)
+-- Line number 1 or 0 means the first line. A negative line number means the last line.
 type TextPosition = (Int, Maybe Int)
 
-endPos :: Maybe TextPosition
-endPos = Just (-1,Nothing)
+-- | The text position meaning "last line, first column".
+endPosition :: Maybe TextPosition
+endPosition = Just (-1,Nothing)
 
--- | Run the hledger-iadd executable (an alternative to the built-in add command),
--- or raise an error.
+-- | Run the hledger-iadd executable on the given file, blocking until it exits,
+-- and return the exit code; or raise an error.
+-- hledger-iadd is an alternative to the built-in add command.
 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.
+-- | Run the user's preferred text editor (or try a default editor),
+-- on the given file, blocking until it exits, and return the exit
+-- code; or raise an error. If a text position is provided, the editor
+-- will be focussed at that position in the file, if we know how.
 runEditor :: Maybe TextPosition -> FilePath -> IO ExitCode
-runEditor mpos f = editorOpenPositionCommand mpos f >>= runCommand >>= waitForProcess
+runEditor mpos f = editFileAtPositionCommand mpos f >>= runCommand >>= waitForProcess
 
--- Get the basic shell command to start the user's preferred text editor.
--- This is the value of environment variable $HLEDGER_UI_EDITOR, or $EDITOR, or
--- a default (emacsclient -a '' -nw, start/connect to an emacs daemon in terminal mode).
-editorCommand :: IO String
-editorCommand = do
+-- | Get a shell command line to open the user's preferred text editor
+-- (or a default editor) on the given file, and to focus it at the
+-- given text position if one is provided and if we know how.
+-- We know how to focus on position for: emacs, vi, nano.
+-- We know how to focus on last line for: vi.
+--
+-- Some tests: With line and column numbers specified,
+-- @
+-- if EDITOR is:  the command should be:
+-- -------------  -----------------------------------
+-- notepad        notepad FILE
+-- vi             vi +LINE FILE
+--                vi + FILE                                    # negative LINE
+-- emacs          emacs +LINE:COL FILE
+--                emacs FILE                                   # negative LINE
+-- (unset)        emacsclient -a '' -nw +LINE:COL FILE
+--                emacsclient -a '' -nw FILE                   # negative LINE
+-- @
+--
+-- How to open editors at the last line of a file:
+-- @
+-- emacs:       emacs FILE -f end-of-buffer
+-- emacsclient: can't
+-- vi:          vi + FILE
+-- @
+--
+editFileAtPositionCommand :: Maybe TextPosition -> FilePath -> IO String
+editFileAtPositionCommand mpos f = do
+  let f' = singleQuoteIfNeeded f
+  editcmd <- getEditCommand
+  let editor = lowercase $ takeFileName $ headDef "" $ words' editcmd
+  let positionarg =
+        case mpos of
+          Just (l, mc)
+            | editor `elem` [
+                "ex",
+                "vi","vim","view","nvim","evim","eview",
+                "gvim","gview","rvim","rview","rgvim","rgview"
+                ] -> plusAndMaybeLine l mc
+          Just (l, mc)
+            | editor `elem` ["emacs", "emacsclient"] -> plusLineAndMaybeColonColumnOrEnd l mc
+          Just (l, mc)
+            | editor `elem` ["nano"] -> plusLineAndMaybeCommaColumn l mc
+          _ -> ""
+        where
+          plusAndMaybeLine            l _  = "+" ++ if l >= 0 then show l else ""
+          plusLineAndMaybeCommaColumn l mc = "+" ++ show l ++ maybe "" ((","++).show) mc
+          plusLineAndMaybeColonColumnOrEnd l mc
+            | l >= 0    = "+" ++ show l ++ maybe "" ((":"++).show) mc
+            | otherwise = ""
+            -- otherwise = "-f end-of-buffer"
+            -- XXX Problems with this:
+            -- it must appear after the filename, whereas +LINE:COL must appear before
+            -- it works only with emacs, not emacsclient
+  return $ unwords [editcmd, positionarg, f']
+
+-- | Get the user's preferred edit command. This is the value of the
+-- $HLEDGER_UI_EDITOR environment variable, or of $EDITOR, or a
+-- default ("emacsclient -a '' -nw", which starts/connects to an emacs
+-- daemon in terminal mode).
+getEditCommand :: IO String
+getEditCommand = do
   hledger_ui_editor_env <- lookupEnv "HLEDGER_UI_EDITOR"
   editor_env            <- lookupEnv "EDITOR"
-  let Just cmd =
-        hledger_ui_editor_env
-        <|> editor_env
-        <|> Just "emacsclient -a '' -nw"
+  let Just cmd = hledger_ui_editor_env <|> editor_env <|> Just "emacsclient -a '' -nw"
   return cmd
 
--- | Get a shell command to start the user's preferred text editor, or a default,
--- and optionally jump to a given position in the file. This will be the basic
--- editor command, with the appropriate options added, if we know how.
--- Currently we know how to do this for emacs and vi.
--- Some examples:
--- $EDITOR=notepad         -> "notepad FILE"
--- $EDITOR=vi              -> "vi +LINE FILE"
--- $EDITOR=vi, line -1     -> "vi + FILE"
--- $EDITOR=emacs           -> "emacs +LINE:COL FILE"
--- $EDITOR=emacs, line -1  -> "emacs FILE -f end-of-buffer"
--- $EDITOR not set         -> "emacs -nw FILE -f end-of-buffer"
---
-editorOpenPositionCommand :: Maybe TextPosition -> FilePath -> IO String
-editorOpenPositionCommand mpos f = do
-  cmd <- editorCommand
-  let f' = singleQuoteIfNeeded f
-  return $
-   case (identifyEditor cmd, mpos) of
-    (EmacsClient, Just (l,mc)) | l >= 0 -> cmd ++ " " ++ emacsposopt l mc ++ " " ++ f'
-    (EmacsClient, Just (l,mc)) | l < 0  -> cmd ++ " " ++ emacsposopt 999999999 mc ++ " " ++ f'
-    (Emacs, Just (l,mc))       | l >= 0 -> cmd ++ " " ++ emacsposopt l mc ++ " " ++ f'
-    (Emacs, Just (l,_))        | l < 0  -> cmd ++ " " ++ f' ++ " -f end-of-buffer"
-    (Vi, Just (l,_))                    -> cmd ++ " " ++ viposopt l ++ " " ++ f'
-    _                                   -> cmd ++ " " ++ f'
-    where
-      emacsposopt l mc = "+" ++ show l ++ maybe "" ((":"++).show) mc
-      viposopt l       = "+" ++ if l >= 0 then show l else ""
-
--- Identify which text editor is used in the basic editor command, if possible.
-identifyEditor :: String -> EditorType
-identifyEditor cmd
-  | "emacsclient" `isPrefixOf` exe = EmacsClient
-  | "emacs" `isPrefixOf` exe       = Emacs
-  | exe `elem` ["vi","nvim","vim","ex","view","gvim","gview","evim","eview","rvim","rview","rgvim","rgview"]
-                                   = Vi
-  | otherwise                      = Other
-  where
-    exe = lowercase $ takeFileName $ headDef "" $ words' cmd
diff --git a/Hledger/UI/ErrorScreen.hs b/Hledger/UI/ErrorScreen.hs
--- a/Hledger/UI/ErrorScreen.hs
+++ b/Hledger/UI/ErrorScreen.hs
@@ -99,7 +99,7 @@
           where
             (pos,f) = case parsewithString hledgerparseerrorpositionp esError of
                         Right (f,l,c) -> (Just (l, Just c),f)
-                        Left  _       -> (endPos, journalFilePath j)
+                        Left  _       -> (endPosition, journalFilePath j)
         e | e `elem` [VtyEvent (EvKey (KChar 'g') []), AppEvent FileChange] ->
           liftIO (uiReloadJournal copts d (popScreen ui)) >>= continue . uiCheckBalanceAssertions d
 --           (ej, _) <- liftIO $ journalReloadIfChanged copts d j
diff --git a/Hledger/UI/Main.hs b/Hledger/UI/Main.hs
--- a/Hledger/UI/Main.hs
+++ b/Hledger/UI/Main.hs
@@ -21,13 +21,13 @@
 #endif
 -- import Data.Monoid              --
 import Data.List
+import Data.List.Extra (nubSort)
 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 System.Directory
 import System.FilePath
 import System.FSNotify
@@ -61,22 +61,19 @@
 
 main :: IO ()
 main = do
-  opts <- getHledgerUIOpts
-  let copts = cliopts_ opts
-      copts' = copts
-        { inputopts_ = (inputopts_ copts) { auto_ = True }
-        , reportopts_ = (reportopts_ copts) { forecast_ = True }
-        }
-
+  opts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=ropts,rawopts_=rawopts}} <- getHledgerUIOpts
   -- when (debug_ $ cliopts_ opts) $ printf "%s\n" prognameandversion >> printf "opts: %s\n" (show opts)
-  run $ opts { cliopts_ = copts' }
-    where
-      run opts
-        | "help"            `inRawOpts` (rawopts_ $ cliopts_ opts) = putStr (showModeUsage uimode) >> exitSuccess
-        | "version"         `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn prognameandversion >> exitSuccess
-        | "binary-filename" `inRawOpts` (rawopts_ $ cliopts_ opts) = putStrLn (binaryfilename progname)
-        | otherwise                                                = withJournalDo (cliopts_ opts) (runBrickUi opts)
 
+  -- always include forecasted periodic transactions when loading data;
+  -- they will be toggled on and off in the UI.
+  let copts' = copts{reportopts_=ropts{forecast_=True}}
+
+  case True of
+    _ | "help"            `inRawOpts` rawopts -> putStr (showModeUsage uimode)
+    _ | "version"         `inRawOpts` rawopts -> putStrLn prognameandversion
+    _ | "binary-filename" `inRawOpts` rawopts -> putStrLn (binaryfilename progname)
+    _                                         -> withJournalDo copts' (runBrickUi opts)
+
 runBrickUi :: UIOpts -> Journal -> IO ()
 runBrickUi uopts@UIOpts{cliopts_=copts@CliOpts{inputopts_=_iopts,reportopts_=ropts}} j = do
   d <- getCurrentDay
@@ -205,7 +202,7 @@
       withManager $ \mgr -> do
         dbg1IO "fsnotify using polling ?" $ isPollingManager mgr
         files <- mapM (canonicalizePath . fst) $ jfiles j
-        let directories = nub $ sort $ map takeDirectory files
+        let directories = nubSort $ map takeDirectory files
         dbg1IO "files" files
         dbg1IO "directories to watch" directories
 
diff --git a/Hledger/UI/RegisterScreen.hs b/Hledger/UI/RegisterScreen.hs
--- a/Hledger/UI/RegisterScreen.hs
+++ b/Hledger/UI/RegisterScreen.hs
@@ -59,7 +59,7 @@
 rsSetAccount _ _ scr = scr
 
 rsInit :: Day -> Bool -> UIState -> UIState
-rsInit d reset ui@UIState{aopts=uopts@UIOpts{cliopts_=CliOpts{reportopts_=ropts}}, ajournal=j, aScreen=s@RegisterScreen{..}} =
+rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportopts_=ropts}}, ajournal=j, aScreen=s@RegisterScreen{..}} =
   ui{aScreen=s{rsList=newitems'}}
   where
     -- gather arguments and queries
@@ -69,10 +69,15 @@
     ropts' = ropts{
                depth_=Nothing
               }
-    pfq | presentorfuture_ uopts == PFFuture = Any
-        | otherwise                          = Date $ DateSpan Nothing (Just $ addDays 1 d)
-    q = And [queryFromOpts d ropts', pfq]
---    reportq = filterQuery (not . queryIsDepth) q
+    q = And [queryFromOpts d ropts, excludeforecastq (forecast_ ropts)]
+      where
+        -- Except in forecast mode, exclude future/forecast transactions.
+        excludeforecastq True = Any
+        excludeforecastq False =  -- not:date:tomorrow- not:tag:generated-transaction
+          And [
+             Not (Date $ DateSpan (Just $ addDays 1 d) Nothing)
+            ,Not (Tag "generated-transaction" Nothing)
+          ]
 
     (_label,items) = accountTransactionsReport ropts' j q thisacctq
     items' = (if empty_ ropts' then id else filter (not . isZeroMixedAmount . fifth6)) $  -- without --empty, exclude no-change txns
@@ -133,7 +138,7 @@
 rsInit _ _ _ = error "init function called with wrong screen type, should not happen"
 
 rsDraw :: UIState -> [Widget Name]
-rsDraw UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
+rsDraw UIState{aopts=_uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}
               ,aScreen=RegisterScreen{..}
               ,aMode=mode
               } =
@@ -232,7 +237,7 @@
 --              ,("RIGHT", str "transaction")
               ,("T", renderToggle (tree_ ropts) "flat(-subs)" "tree(+subs)") -- rsForceInclusive may override, but use tree_ to ensure a visible toggle effect
               ,("H", renderToggle (not ishistorical) "historical" "period")
-              ,("F", renderToggle (presentorfuture_ uopts == PFFuture) "present" "future")
+              ,("F", renderToggle1 (forecast_ ropts) "forecast")
 --               ,("a", "add")
 --               ,("g", "reload")
 --               ,("q", "quit")
@@ -315,7 +320,7 @@
         VtyEvent (EvKey (KChar 'E') []) -> suspendAndResume $ void (runEditor pos f) >> uiReloadJournalIfChanged copts d j ui
           where
             (pos,f) = case listSelectedElement rsList of
-                        Nothing -> (endPos, journalFilePath j)
+                        Nothing -> (endPosition, journalFilePath j)
                         Just (_, RegisterScreenItem{
                           rsItemTransaction=Transaction{tsourcepos=GenericSourcePos f l c}}) -> (Just (l, Just c),f)
                         Just (_, RegisterScreenItem{
@@ -331,7 +336,7 @@
         VtyEvent (EvKey (KChar 'U') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleUnmarked ui
         VtyEvent (EvKey (KChar 'P') []) -> rsCenterAndContinue $ regenerateScreens j d $ togglePending ui
         VtyEvent (EvKey (KChar 'C') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleCleared ui
-        VtyEvent (EvKey (KChar 'F') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleFuture ui
+        VtyEvent (EvKey (KChar 'F') []) -> rsCenterAndContinue $ regenerateScreens j d $ toggleForecast ui
 
         VtyEvent (EvKey (KChar '/') []) -> continue $ regenerateScreens j d $ showMinibuffer ui
         VtyEvent (EvKey (KDown)     [MShift]) -> continue $ regenerateScreens j d $ shrinkReportPeriod d ui
diff --git a/Hledger/UI/TransactionScreen.hs b/Hledger/UI/TransactionScreen.hs
--- a/Hledger/UI/TransactionScreen.hs
+++ b/Hledger/UI/TransactionScreen.hs
@@ -45,7 +45,7 @@
 tsInit :: Day -> Bool -> UIState -> UIState
 tsInit _d _reset ui@UIState{aopts=UIOpts{cliopts_=CliOpts{reportopts_=_ropts}}
                            ,ajournal=_j
-                           ,aScreen=TransactionScreen{..}
+                           ,aScreen=TransactionScreen{}
                            } =
   -- plog ("initialising TransactionScreen, value_ is "
   --       -- ++ (pshow (Just (AtDefault Nothing)::Maybe ValuationType))
diff --git a/Hledger/UI/UIOptions.hs b/Hledger/UI/UIOptions.hs
--- a/Hledger/UI/UIOptions.hs
+++ b/Hledger/UI/UIOptions.hs
@@ -7,11 +7,8 @@
 
 module Hledger.UI.UIOptions
 where
-import Data.Data (Data)
 import Data.Default
-import Data.Typeable (Typeable)
 import Data.List (intercalate)
-import Data.Maybe (fromMaybe)
 import System.Environment
 
 import Hledger.Cli hiding (progname,version,prognameandversion)
@@ -41,7 +38,6 @@
   ,flagNone ["flat","F"] (setboolopt "flat") "show accounts as a list (default)"
   ,flagNone ["tree","T"] (setboolopt "tree") "show accounts as a tree"
 --  ,flagNone ["present"] (setboolopt "present") "exclude transactions dated later than today (default)"
-  ,flagNone ["future"] (setboolopt "future") "show transactions dated later than today (normally hidden)"
   -- ,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"
   -- ,flagNone ["no-elide"] (setboolopt "no-elide") "don't compress empty parent accounts on one line"
@@ -54,6 +50,7 @@
               modeGroupFlags = Group {
                                 groupUnnamed = uiflags
                                ,groupHidden = hiddenflags
+                                 ++ [flagNone ["future"] (setboolopt "forecast") "compatibility alias, use --forecast instead"]
                                ,groupNamed = [(generalflagsgroup1)]
                                }
              ,modeHelpSuffix=[
@@ -65,7 +62,6 @@
 data UIOpts = UIOpts {
      watch_   :: Bool
     ,change_  :: Bool
-    ,presentorfuture_  :: PresentOrFutureOpt
     ,cliopts_ :: CliOpts
  } deriving (Show)
 
@@ -73,7 +69,6 @@
     def
     def
     def
-    def
 
 -- instance Default CliOpts where def = defcliopts
 
@@ -83,22 +78,8 @@
   return defuiopts {
               watch_   = boolopt "watch" rawopts
              ,change_  = boolopt "change" rawopts
-             ,presentorfuture_ = presentorfutureopt rawopts
              ,cliopts_ = cliopts
              }
-
--- | Should transactions dated later than today be included ?
--- Like flat/tree mode, there are three states, and the meaning of default can vary by command.
-data PresentOrFutureOpt = PFDefault | PFPresent | PFFuture deriving (Eq, Show, Data, Typeable)
-instance Default PresentOrFutureOpt where def = PFDefault
-
-presentorfutureopt :: RawOpts -> PresentOrFutureOpt
-presentorfutureopt =
-  fromMaybe PFDefault . choiceopt parse where
-    parse = \case
-      "present" -> Just PFPresent
-      "future"  -> Just PFFuture
-      _         -> Nothing
 
 checkUIOpts :: UIOpts -> UIOpts
 checkUIOpts opts =
diff --git a/Hledger/UI/UIState.hs b/Hledger/UI/UIState.hs
--- a/Hledger/UI/UIState.hs
+++ b/Hledger/UI/UIState.hs
@@ -151,13 +151,24 @@
     b | balancetype_ ropts == HistoricalBalance = PeriodChange
       | otherwise                               = HistoricalBalance
 
--- | Toggle between including and excluding transactions dated later than today.
-toggleFuture :: UIState -> UIState
-toggleFuture ui@UIState{aopts=uopts@UIOpts{presentorfuture_=pf}} =
-  ui{aopts=uopts{presentorfuture_=pf'}}
+-- | Toggle hledger-ui's "forecast mode". In forecast mode, periodic
+-- transactions (generated by periodic rules) are enabled (as with
+-- hledger --forecast), and also future transactions in general
+-- (including non-periodic ones) are displayed. In normal mode, all
+-- future transactions (periodic or not) are suppressed (unlike
+-- command-line hledger).
+--
+-- After toggling this, we do a full reload of the journal from disk
+-- to make it take effect; currently that's done in the callers (cf
+-- AccountsScreen, RegisterScreen) where it's easier. This is
+-- overkill, probably we should just hide/show the periodic
+-- transactions with a query for their special tag.
+--
+toggleForecast :: UIState -> UIState
+toggleForecast ui@UIState{aopts=uopts@UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts}}} =
+  ui{aopts=uopts{cliopts_=copts'}}
   where
-    pf' | pf == PFFuture = PFPresent
-        | otherwise      = PFFuture
+    copts' = copts{reportopts_=ropts{forecast_=not $ forecast_ ropts}}
 
 -- | Toggle between showing all and showing only real (non-virtual) items.
 toggleReal :: UIState -> UIState
diff --git a/Hledger/UI/UIUtils.hs b/Hledger/UI/UIUtils.hs
--- a/Hledger/UI/UIUtils.hs
+++ b/Hledger/UI/UIUtils.hs
@@ -19,6 +19,7 @@
   ,moveUpEvents
   ,normaliseMovementKeys
   ,renderToggle
+  ,renderToggle1
   ,replaceHiddenAccountsNameWith
   ,scrollSelectionToMiddle
   ,suspend
@@ -122,7 +123,7 @@
                    withAttr ("help" <> "heading") $ str "Filtering"
                   ,renderKey ("/   ", "set a filter query")
                   ,renderKey ("UPC ", "show unmarked/pending/cleared")
-                  ,renderKey ("F   ", "show future/present txns")
+                  ,renderKey ("F   ", "show future & periodic txns")
                   ,renderKey ("R   ", "show real/all postings")
                   ,renderKey ("Z   ", "show nonzero/all amounts")
                   ,renderKey ("DEL ", "remove filters")
@@ -210,13 +211,21 @@
     -- sep = str " | "
     sep = str " "
 
--- | Render the two states of a toggle, highlighting the active one.
+-- | Show both states of a toggle ("aaa/bbb"), highlighting the active one.
 renderToggle :: Bool -> String -> String -> Widget Name
 renderToggle isright l r =
   let bold = withAttr ("border" <> "selected") in
   if isright
   then str (l++"/") <+> bold (str r)
   else bold (str l) <+> str ("/"++r)
+
+-- | Show a toggle's label, highlighted (bold) when the toggle is active.
+renderToggle1 :: Bool -> String -> Widget Name
+renderToggle1 isactive l =
+  let bold = withAttr ("border" <> "selected") in
+  if isactive
+  then bold (str l)
+  else str l
 
 -- temporary shenanigans:
 
diff --git a/hledger-ui.1 b/hledger-ui.1
--- a/hledger-ui.1
+++ b/hledger-ui.1
@@ -1,5 +1,5 @@
 
-.TH "hledger-ui" "1" "January 2020" "hledger-ui 1.16.2" "hledger User Manuals"
+.TH "hledger-ui" "1" "March 2020" "hledger-ui 1.17" "hledger User Manuals"
 
 
 
@@ -15,9 +15,9 @@
 \f[C]hledger ui -- [OPTIONS] [QUERYARGS]\f[R]
 .SH DESCRIPTION
 .PP
-hledger is a cross-platform program for tracking money, time, or any
-other commodity, using double-entry accounting and a simple, editable
-file format.
+hledger is a reliable, cross-platform set of programs for tracking
+money, time, or any other commodity, using double-entry accounting and a
+simple, editable file format.
 hledger is inspired by and largely compatible with ledger(1).
 .PP
 hledger-ui is hledger\[aq]s terminal interface, providing an efficient
@@ -26,19 +26,17 @@
 It is easier than hledger\[aq]s command-line interface, and sometimes
 quicker and more convenient than the web interface.
 .PP
-Note hledger-ui has some different defaults (experimental):
-.IP \[bu] 2
-it generates rule-based transactions and postings by default (--forecast
-and --auto are always on).
-.IP \[bu] 2
-it hides transactions dated in the future by default (change this with
---future or the F key).
-.PP
 Like hledger, it reads data from one or more files in hledger journal,
 timeclock, timedot, or CSV format specified with \f[C]-f\f[R], or
 \f[C]$LEDGER_FILE\f[R], or \f[C]$HOME/.hledger.journal\f[R] (on windows,
 perhaps \f[C]C:/Users/USER/.hledger.journal\f[R]).
 For more about this see hledger(1), hledger_journal(5) etc.
+.PP
+Unlike hledger, hledger-ui hides all future-dated transactions by
+default.
+They can be revealed, along with any rule-generated periodic
+transactions, by pressing the F key (or starting with --forecast) to
+enable \[dq]forecast mode\[dq].
 .SH OPTIONS
 .PP
 Note: if invoking hledger-ui as a hledger subcommand, write \f[C]--\f[R]
@@ -64,9 +62,6 @@
 .TP
 \f[B]\f[CB]-T --tree\f[B]\f[R]
 show accounts as a tree
-.TP
-\f[B]\f[CB]--future\f[B]\f[R]
-show transactions dated later than today (normally hidden)
 .PP
 hledger input options:
 .TP
@@ -91,7 +86,8 @@
 use some other field or tag for the account name
 .TP
 \f[B]\f[CB]-I --ignore-assertions\f[B]\f[R]
-ignore any failing balance assertions
+disable balance assertion checks (note: does not disable balance
+assignments)
 .PP
 hledger reporting options:
 .TP
@@ -154,8 +150,9 @@
 apply automated posting rules to modify transactions.
 .TP
 \f[B]\f[CB]--forecast\f[B]\f[R]
-apply periodic transaction rules to generate future transactions, to 6
-months from now or report end date.
+generate future transactions from periodic transaction rules, for the
+next 6 months or till report end date.
+In hledger-ui, also make ordinary future transactions visible.
 .PP
 When a reporting option appears more than once in the command line, the
 last one takes precedence.
@@ -217,12 +214,11 @@
 \f[C]BACKSPACE\f[R] or \f[C]DELETE\f[R] removes all filters, showing all
 transactions.
 .PP
-As mentioned above, hledger-ui shows auto-generated periodic
-transactions, and hides future transactions (auto-generated or not) by
-default.
-\f[C]F\f[R] toggles showing and hiding these future transactions.
-This is similar to using a query like \f[C]date:-tomorrow\f[R], but more
-convenient.
+As mentioned above, by default hledger-ui hides future transactions -
+both ordinary transactions recorded in the journal, and periodic
+transactions generated by rule.
+\f[C]F\f[R] toggles forecast mode, in which future/forecasted
+transactions are shown.
 (experimental)
 .PP
 \f[C]ESCAPE\f[R] removes all filters and jumps back to the top screen.
@@ -370,9 +366,6 @@
 a depth limit.
 In other words, the register always shows the transactions contributing
 to the balance shown on the accounts screen.
-.PD 0
-.P
-.PD
 Tree mode/flat mode can be toggled with \f[C]T\f[R] here also.
 .PP
 \f[C]U\f[R] toggles filtering by unmarked status, showing or hiding
@@ -427,6 +420,27 @@
 \f[C]-f\f[R].
 Default: \f[C]\[ti]/.hledger.journal\f[R] (on windows, perhaps
 \f[C]C:/Users/USER/.hledger.journal\f[R]).
+.PP
+A typical value is \f[C]\[ti]/DIR/YYYY.journal\f[R], where DIR is a
+version-controlled finance directory and YYYY is the current year.
+Or \f[C]\[ti]/DIR/current.journal\f[R], where current.journal is a
+symbolic link to YYYY.journal.
+.PP
+On Mac computers, you can set this and other environment variables in a
+more thorough way that also affects applications started from the GUI
+(say, an Emacs dock icon).
+Eg on MacOS Catalina I have a \f[C]\[ti]/.MacOSX/environment.plist\f[R]
+file containing
+.IP
+.nf
+\f[C]
+{
+  \[dq]LEDGER_FILE\[dq] : \[dq]\[ti]/finance/current.journal\[dq]
+}
+\f[R]
+.fi
+.PP
+To see the effect you may need to \f[C]killall Dock\f[R], or reboot.
 .SH FILES
 .PP
 Reads data from one or more files in hledger journal, timeclock,
diff --git a/hledger-ui.cabal b/hledger-ui.cabal
--- a/hledger-ui.cabal
+++ b/hledger-ui.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 2b0a9cb6df439ba7f11df93f34158c1317a7327c5e4cffe2e92a242a706f1ab2
+-- hash: 66249cd38304b42dc730bbee0dc85ef0132c4bd1977482948b16c1781d2d04d8
 
 name:           hledger-ui
-version:        1.16.2
+version:        1.17
 synopsis:       Terminal user interface for the hledger accounting tool
 description:    This is hledger's terminal interface.
                 It is simpler and more convenient for browsing data than the command-line interface,
@@ -27,7 +27,7 @@
 maintainer:     Simon Michael <simon@joyful.com>
 license:        GPL-3
 license-file:   LICENSE
-tested-with:    GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.5, GHC==8.8.1
+tested-with:    GHC==8.0.2, GHC==8.2.2, GHC==8.4.3, GHC==8.6.5, GHC==8.8.2, GHC==8.10
 build-type:     Simple
 extra-source-files:
     CHANGES.md
@@ -64,20 +64,21 @@
   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.16.2"
+  cpp-options: -DVERSION="1.17"
   build-depends:
       ansi-terminal >=0.6.2.3
     , async
-    , base >=4.9 && <4.14
+    , base >=4.9 && <4.15
     , base-compat-batteries >=0.10.1 && <0.12
     , cmdargs >=0.8
     , containers
     , data-default
     , directory
+    , extra >=1.6.3
     , filepath
     , fsnotify >=0.2.1.2 && <0.4
-    , hledger >=1.16.2 && <1.17
-    , hledger-lib >=1.16.2 && <1.17
+    , hledger >=1.17 && <1.18
+    , hledger-lib >=1.17 && <1.18
     , megaparsec >=7.0.0 && <8.1
     , microlens >=0.4
     , microlens-platform >=0.2.3.1
diff --git a/hledger-ui.info b/hledger-ui.info
--- a/hledger-ui.info
+++ b/hledger-ui.info
@@ -3,33 +3,44 @@
 
 File: hledger-ui.info,  Node: Top,  Next: OPTIONS,  Up: (dir)
 
-hledger-ui(1) hledger-ui 1.16.2
-*******************************
+hledger-ui(1) hledger-ui 1.17
+*****************************
 
-hledger-ui is hledger's terminal interface, providing an efficient
+hledger-ui - terminal interface for the hledger accounting tool
+
+   'hledger-ui [OPTIONS] [QUERYARGS]'
+'hledger ui -- [OPTIONS] [QUERYARGS]'
+
+   hledger is a reliable, cross-platform set of programs for tracking
+money, time, or any other commodity, using double-entry accounting and a
+simple, editable file format.  hledger is inspired by and largely
+compatible with ledger(1).
+
+   hledger-ui is hledger's terminal interface, providing an efficient
 full-window text UI for viewing accounts and transactions, and some
 limited data entry capability.  It is easier than hledger's command-line
 interface, and sometimes quicker and more convenient than the web
 interface.
 
-   Note hledger-ui has some different defaults (experimental):
-
-   * it generates rule-based transactions and postings by default
-     (-forecast and -auto are always on).
-   * it hides transactions dated in the future by default (change this
-     with -future or the F key).
-
    Like hledger, it reads data from one or more files in hledger
 journal, timeclock, timedot, or CSV format specified with '-f', or
 '$LEDGER_FILE', or '$HOME/.hledger.journal' (on windows, perhaps
 'C:/Users/USER/.hledger.journal').  For more about this see hledger(1),
 hledger_journal(5) etc.
 
+   Unlike hledger, hledger-ui hides all future-dated transactions by
+default.  They can be revealed, along with any rule-generated periodic
+transactions, by pressing the F key (or starting with -forecast) to
+enable "forecast mode".
+
 * Menu:
 
 * OPTIONS::
 * KEYS::
 * SCREENS::
+* ENVIRONMENT::
+* FILES::
+* BUGS::
 
 
 File: hledger-ui.info,  Node: OPTIONS,  Next: KEYS,  Prev: Top,  Up: Top
@@ -62,10 +73,7 @@
 '-T --tree'
 
      show accounts as a tree
-'--future'
 
-     show transactions dated later than today (normally hidden)
-
    hledger input options:
 
 '-f FILE --file=FILE'
@@ -89,7 +97,8 @@
      use some other field or tag for the account name
 '-I --ignore-assertions'
 
-     ignore any failing balance assertions
+     disable balance assertion checks (note: does not disable balance
+     assignments)
 
    hledger reporting options:
 
@@ -154,8 +163,9 @@
      apply automated posting rules to modify transactions.
 '--forecast'
 
-     apply periodic transaction rules to generate future transactions,
-     to 6 months from now or report end date.
+     generate future transactions from periodic transaction rules, for
+     the next 6 months or till report end date.  In hledger-ui, also
+     make ordinary future transactions visible.
 
    When a reporting option appears more than once in the command line,
 the last one takes precedence.
@@ -215,11 +225,10 @@
 below).  'BACKSPACE' or 'DELETE' removes all filters, showing all
 transactions.
 
-   As mentioned above, hledger-ui shows auto-generated periodic
-transactions, and hides future transactions (auto-generated or not) by
-default.  'F' toggles showing and hiding these future transactions.
-This is similar to using a query like 'date:-tomorrow', but more
-convenient.  (experimental)
+   As mentioned above, by default hledger-ui hides future transactions -
+both ordinary transactions recorded in the journal, and periodic
+transactions generated by rule.  'F' toggles forecast mode, in which
+future/forecasted transactions are shown.  (experimental)
 
    'ESCAPE' removes all filters and jumps back to the top screen.  Or,
 it cancels a minibuffer edit or help dialog in progress.
@@ -277,7 +286,7 @@
    Additional screen-specific keys are described below.
 
 
-File: hledger-ui.info,  Node: SCREENS,  Prev: KEYS,  Up: Top
+File: hledger-ui.info,  Node: SCREENS,  Next: ENVIRONMENT,  Prev: KEYS,  Up: Top
 
 3 SCREENS
 *********
@@ -366,8 +375,8 @@
 the register if the accounts screen is in tree mode, or if it's in flat
 mode but this account has subaccounts which are not shown due to a depth
 limit.  In other words, the register always shows the transactions
-contributing to the balance shown on the accounts screen.
-Tree mode/flat mode can be toggled with 'T' here also.
+contributing to the balance shown on the accounts screen.  Tree
+mode/flat mode can be toggled with 'T' here also.
 
    'U' toggles filtering by unmarked status, showing or hiding unmarked
 transactions.  Similarly, 'P' toggles pending transactions, and 'C'
@@ -421,22 +430,95 @@
 to cancel the reload attempt.)
 
 
+File: hledger-ui.info,  Node: ENVIRONMENT,  Next: FILES,  Prev: SCREENS,  Up: Top
+
+4 ENVIRONMENT
+*************
+
+*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.journal').
+
+   A typical value is '~/DIR/YYYY.journal', where DIR is a
+version-controlled finance directory and YYYY is the current year.  Or
+'~/DIR/current.journal', where current.journal is a symbolic link to
+YYYY.journal.
+
+   On Mac computers, you can set this and other environment variables in
+a more thorough way that also affects applications started from the GUI
+(say, an Emacs dock icon).  Eg on MacOS Catalina I have a
+'~/.MacOSX/environment.plist' file containing
+
+{
+  "LEDGER_FILE" : "~/finance/current.journal"
+}
+
+   To see the effect you may need to 'killall Dock', or reboot.
+
+
+File: hledger-ui.info,  Node: FILES,  Next: BUGS,  Prev: ENVIRONMENT,  Up: Top
+
+5 FILES
+*******
+
+Reads data from one or more files in hledger journal, timeclock,
+timedot, or CSV format specified with '-f', or '$LEDGER_FILE', or
+'$HOME/.hledger.journal' (on windows, perhaps
+'C:/Users/USER/.hledger.journal').
+
+
+File: hledger-ui.info,  Node: BUGS,  Prev: FILES,  Up: Top
+
+6 BUGS
+******
+
+The need to precede options with '--' when invoked from hledger is
+awkward.
+
+   '-f-' doesn't work (hledger-ui can't read from stdin).
+
+   '-V' affects only the accounts screen.
+
+   When you press 'g', the current and all previous screens are
+regenerated, which may cause a noticeable pause with large files.  Also
+there is no visual indication that this is in progress.
+
+   '--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. 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.
+
+   Also, if you are viewing files mounted from another machine,
+'--watch' requires that both machine clocks are roughly in step.
+
+
 Tag Table:
 Node: Top71
-Node: OPTIONS1101
-Ref: #options1198
-Node: KEYS4589
-Ref: #keys4684
-Node: SCREENS8991
-Ref: #screens9076
-Node: Accounts screen9166
-Ref: #accounts-screen9294
-Node: Register screen11510
-Ref: #register-screen11665
-Node: Transaction screen13661
-Ref: #transaction-screen13819
-Node: Error screen14689
-Ref: #error-screen14811
+Node: OPTIONS1470
+Ref: #options1567
+Node: KEYS4998
+Ref: #keys5093
+Node: SCREENS9369
+Ref: #screens9474
+Node: Accounts screen9564
+Ref: #accounts-screen9692
+Node: Register screen11908
+Ref: #register-screen12063
+Node: Transaction screen14060
+Ref: #transaction-screen14218
+Node: Error screen15088
+Ref: #error-screen15210
+Node: ENVIRONMENT15454
+Ref: #environment15568
+Node: FILES16375
+Ref: #files16474
+Node: BUGS16687
+Ref: #bugs16764
 
 End Tag Table
 
diff --git a/hledger-ui.txt b/hledger-ui.txt
--- a/hledger-ui.txt
+++ b/hledger-ui.txt
@@ -11,10 +11,10 @@
        hledger ui -- [OPTIONS] [QUERYARGS]
 
 DESCRIPTION
-       hledger  is  a  cross-platform program for tracking money, time, or any
-       other commodity, using double-entry accounting and a  simple,  editable
-       file  format.   hledger  is  inspired  by  and  largely compatible with
-       ledger(1).
+       hledger  is  a  reliable,  cross-platform  set of programs for tracking
+       money, time, or any other commodity, using double-entry accounting  and
+       a  simple,  editable  file  format.  hledger is inspired by and largely
+       compatible with ledger(1).
 
        hledger-ui is hledger's  terminal  interface,  providing  an  efficient
        full-window  text  UI  for  viewing accounts and transactions, and some
@@ -22,25 +22,22 @@
        line  interface, and sometimes quicker and more convenient than the web
        interface.
 
-       Note hledger-ui has some different defaults (experimental):
-
-       o it generates rule-based transactions and postings by default (--fore-
-         cast and --auto are always on).
-
-       o it  hides  transactions  dated  in the future by default (change this
-         with --future or the F key).
-
        Like hledger, it reads data from one or more files in hledger  journal,
        timeclock,  timedot,  or CSV format specified with -f, or $LEDGER_FILE,
        or       $HOME/.hledger.journal       (on       windows,        perhaps
        C:/Users/USER/.hledger.journal).   For  more about this see hledger(1),
        hledger_journal(5) etc.
 
+       Unlike hledger, hledger-ui hides all future-dated transactions  by  de-
+       fault.   They  can  be revealed, along with any rule-generated periodic
+       transactions, by pressing the F key (or starting  with  --forecast)  to
+       enable "forecast mode".
+
 OPTIONS
-       Note: if invoking hledger-ui as a hledger subcommand, write  --  before
+       Note:  if  invoking hledger-ui as a hledger subcommand, write -- before
        options as shown above.
 
-       Any  QUERYARGS  are interpreted as a hledger search query which filters
+       Any QUERYARGS are interpreted as a hledger search query  which  filters
        the data.
 
        --watch
@@ -53,7 +50,7 @@
               start in the (first) matched account's register screen
 
        --change
-              show period balances (changes) at startup instead of  historical
+              show  period balances (changes) at startup instead of historical
               balances
 
        -F --flat
@@ -62,9 +59,6 @@
        -T --tree
               show accounts as a tree
 
-       --future
-              show transactions dated later than today (normally hidden)
-
        hledger input options:
 
        -f FILE --file=FILE
@@ -72,7 +66,7 @@
               $LEDGER_FILE or $HOME/.hledger.journal)
 
        --rules-file=RULESFILE
-              Conversion  rules  file  to  use  when  reading  CSV   (default:
+              Conversion   rules  file  to  use  when  reading  CSV  (default:
               FILE.rules)
 
        --separator=CHAR
@@ -87,7 +81,8 @@
               use some other field or tag for the account name
 
        -I --ignore-assertions
-              ignore any failing balance assertions
+              disable balance assertion checks (note: does not disable balance
+              assignments)
 
        hledger reporting options:
 
@@ -150,8 +145,9 @@
        --auto apply automated posting rules to modify transactions.
 
        --forecast
-              apply periodic transaction rules  to  generate  future  transac-
-              tions, to 6 months from now or report end date.
+              generate future transactions from  periodic  transaction  rules,
+              for  the  next 6 months or till report end date.  In hledger-ui,
+              also make ordinary future transactions visible.
 
        When a reporting option appears more than once in the command line, the
        last one takes precedence.
@@ -170,44 +166,43 @@
               show debug output (levels 1-9, default: 1)
 
        A @FILE argument will be expanded to the contents of FILE, which should
-       contain  one  command line option/argument per line.  (To prevent this,
+       contain one command line option/argument per line.  (To  prevent  this,
        insert a -- argument before.)
 
 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
-       down through lists.  Vi-style (h/j/k/l) and  Emacs-style  (CTRL-p/CTRL-
-       n/CTRL-f/CTRL-b)  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 app is one way
+       the previous screen, up/down/page up/page  down/home/end  move  up  and
+       down  through  lists.  Vi-style (h/j/k/l) and Emacs-style (CTRL-p/CTRL-
+       n/CTRL-f/CTRL-b) 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 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  period
-       durations:  year,  quarter,  month,  week, day.  Then, 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
+       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.
+       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 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 transaction status  (see  below).
+       common  filters  like account depth and transaction status (see below).
        BACKSPACE or DELETE removes all filters, showing all transactions.
 
-       As  mentioned  above, hledger-ui shows auto-generated periodic transac-
-       tions, and hides future transactions (auto-generated  or  not)  by  de-
-       fault.   F  toggles showing and hiding these future transactions.  This
-       is similar to using a query like date:-tomorrow, but  more  convenient.
-       (experimental)
+       As mentioned above, by default hledger-ui hides future  transactions  -
+       both ordinary transactions recorded in the journal, and periodic trans-
+       actions generated by rule.  F  toggles  forecast  mode,  in  which  fu-
+       ture/forecasted transactions are shown.  (experimental)
 
        ESCAPE  removes  all  filters and jumps back to the top screen.  Or, it
        cancels a minibuffer edit or help dialog in progress.
@@ -329,44 +324,44 @@
        the register if the accounts screen is in tree mode, or if it's in flat
        mode but this account has subaccounts which are  not  shown  due  to  a
        depth  limit.   In  other words, the register always shows the transac-
-       tions contributing to the balance shown on the accounts screen.
-       Tree mode/flat mode can be toggled with T here also.
+       tions contributing to the balance shown on the accounts  screen.   Tree
+       mode/flat mode can be toggled with T here also.
 
-       U toggles filtering by unmarked  status,  showing  or  hiding  unmarked
+       U  toggles  filtering  by  unmarked  status, showing or hiding unmarked
        transactions.  Similarly, P toggles pending transactions, and C toggles
-       cleared transactions.  (By default, transactions with all statuses  are
-       shown;  if  you activate one or two status filters, only those transac-
+       cleared  transactions.  (By default, transactions with all statuses are
+       shown; if you activate one or two status filters, only  those  transac-
        tions are shown; and if you activate all three, the filter is removed.)
 
        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,  de-
-       scription,  comments, along with all of its account postings are shown.
-       Simple transactions have two postings, but there can  be  more  (or  in
+       The  transaction's  date(s) and any cleared flag, transaction code, de-
+       scription, 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 de-
+       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  de-
        pending on which account register you came from (remember most transac-
-       tions  appear  in multiple account registers).  The #N number preceding
+       tions 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.)
 
@@ -374,9 +369,24 @@
        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).
 
+       A  typical  value  is  ~/DIR/YYYY.journal,  where DIR is a version-con-
+       trolled finance directory and YYYY is the current year.  Or  ~/DIR/cur-
+       rent.journal, where current.journal is a symbolic link to YYYY.journal.
+
+       On Mac computers, you can set this and other environment variables in a
+       more thorough way that also affects applications started from  the  GUI
+       (say, an Emacs dock icon).  Eg on MacOS Catalina I have a ~/.MacOSX/en-
+       vironment.plist file containing
+
+              {
+                "LEDGER_FILE" : "~/finance/current.journal"
+              }
+
+       To see the effect you may need to killall Dock, or reboot.
+
 FILES
        Reads data from one or more files in hledger journal, timeclock,  time-
        dot,   or   CSV   format   specified   with  -f,  or  $LEDGER_FILE,  or
@@ -431,4 +441,4 @@
 
 
 
-hledger-ui 1.16.2                January 2020                    hledger-ui(1)
+hledger-ui 1.17                   March 2020                     hledger-ui(1)
