about summary refs log tree commit diff stats
path: root/src/local/pager.nim
diff options
context:
space:
mode:
Diffstat (limited to 'src/local/pager.nim')
-rw-r--r--src/local/pager.nim27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/local/pager.nim b/src/local/pager.nim
index dce66505..79511f86 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -52,12 +52,13 @@ type
     askcursor: int
     askpromise*: Promise[bool]
     askprompt: string
-    commandMode* {.jsget.}: bool
+    commandMode {.jsget.}: bool
     config: Config
     container*: Container
     cookiejars: Table[string, CookieJar]
     display: FixedGrid
     forkserver: ForkServer
+    inputBuffer*: string # currently uninterpreted characters
     iregex: Result[Regex, string]
     isearchpromise: EmptyPromise
     lineedit*: Option[LineEdit]
@@ -66,8 +67,10 @@ type
     mailcap: Mailcap
     mainproc: Pid
     mimeTypes: MimeTypes
+    notnum*: bool # has a non-numeric character been input already?
     numload*: int
     omnirules: seq[OmniRule]
+    precnum*: int32 # current number prefix (when vi-numeric-prefix is true)
     procmap*: Table[Pid, Container]
     proxy: URL
     redraw*: bool
@@ -196,6 +199,7 @@ proc alert*(pager: Pager, msg: string)
 
 proc newPager*(config: Config, attrs: WindowAttributes,
     forkserver: ForkServer, mainproc: Pid, ctx: JSContext): Pager =
+  let (mailcap, errs) = config.getMailcap()
   let pager = Pager(
     config: config,
     display: newFixedGrid(attrs.width, attrs.height - 1),
@@ -206,10 +210,9 @@ proc newPager*(config: Config, attrs: WindowAttributes,
     siteconf: config.getSiteConfig(ctx),
     statusgrid: newFixedGrid(attrs.width),
     term: newTerminal(stdout, config, attrs),
-    mimeTypes: config.getMimeTypes()
+    mimeTypes: config.getMimeTypes(),
+    mailcap: mailcap
   )
-  let (mcap, errs) = config.getMailcap()
-  pager.mailcap = mcap
   for err in errs:
     pager.alert("Error reading mailcap: " & err)
   return pager
@@ -249,7 +252,7 @@ proc writeStatusMessage(pager: Pager, str: string,
     return i
   for r in str.runes:
     let pi = i
-    i += r.twidth(i)
+    i += r.width()
     if i >= e:
       if i >= pager.statusgrid.width:
         i = pi
@@ -258,7 +261,9 @@ proc writeStatusMessage(pager: Pager, str: string,
       inc i
       break
     if r.isControlChar():
-      pager.statusgrid[pi].str = "^" & getControlLetter(char(r))
+      pager.statusgrid[pi].str = "^"
+      pager.statusgrid[pi + 1].str = $getControlLetter(char(r))
+      pager.statusgrid[pi + 1].format = format
     else:
       pager.statusgrid[pi].str = $r
     pager.statusgrid[pi].format = format
@@ -275,7 +280,13 @@ proc refreshStatusMsg*(pager: Pager) =
   if container == nil: return
   if pager.tty == nil: return
   if pager.askpromise != nil: return
-  if container.loadinfo != "":
+  if pager.precnum != 0:
+    pager.writeStatusMessage($pager.precnum)
+    if pager.inputBuffer != "":
+      pager.writeStatusMessage(pager.inputBuffer)
+  elif pager.inputBuffer != "":
+    pager.writeStatusMessage(pager.inputBuffer)
+  elif container.loadinfo != "":
     pager.alerton = false
     pager.writeStatusMessage(container.loadinfo)
   elif pager.alerts.len > 0:
@@ -302,7 +313,7 @@ proc refreshStatusMsg*(pager: Pager) =
 
 # Call refreshStatusMsg if no alert is being displayed on the screen.
 proc showAlerts*(pager: Pager) =
-  if not pager.alerton:
+  if not pager.alerton and pager.inputBuffer == "" and pager.precnum == 0:
     pager.refreshStatusMsg()
 
 proc drawBuffer*(pager: Pager, container: Container, ostream: Stream) =