]> git.wincent.com - docvim.git/commitdiff
Print options
authorGreg Hurrell <greg@hurrell.net>
Mon, 6 Jun 2016 15:31:14 +0000 (08:31 -0700)
committerGreg Hurrell <greg@hurrell.net>
Mon, 6 Jun 2016 15:31:14 +0000 (08:31 -0700)
Alignment will need a bit of work here, but this is a good first draft.

Specifically, if we want things to look like this in the UI:

                                g:SomeOpt
    g:SomeOpt        string (default: 10)

The output will actually need to be:

                                *g:SomeOpt*
    |g:SomeOpt|        string (default: 10)

Because `|` and `*` don't take up any width due to being concealed by Vim.

lib/Docvim/AST.hs
lib/Docvim/Printer/Vim.hs
tests/fixtures/vim/integration-ferret-ftplugin-qf.golden
tests/fixtures/vim/integration-ferret-plugin.golden
tests/fixtures/vim/integration-ferret-private.golden

index 3b8635a78600815c0c32fea506b4e9852d3d0d2f..4940382f9a0828366ff0649264d188f96cc0bcca 100644 (file)
@@ -62,9 +62,13 @@ data Node
           | IndentAnnotation
           | DedentAnnotation
           | CommandsAnnotation
+          -- TODO: may need more here, command name, for example
+          -- :Ack {blah}                        *:Ack*
           | CommandAnnotation Usage
           | FooterAnnotation
           | MappingsAnnotation
+          -- TODO: need more here, like default value?
+          -- ferret just has a link target *<Plug>(FerrtAck)*
           | MappingAnnotation Name
           | OptionsAnnotation
           | OptionAnnotation Name Type (Maybe Default)
index 4abea66e32b12090eb95a72154b19c8524d38cf2..9afe376374563c7dec1d1c11c8a9aa6d06574387 100644 (file)
@@ -7,6 +7,7 @@ import Control.Monad.State
 import Data.Char (isSpace, toLower, toUpper)
 import Data.List (intercalate, isSuffixOf, span, sort)
 import Data.List.Split (splitOn)
+import Data.Maybe (fromMaybe)
 import Data.Tuple (swap)
 import Docvim.AST
 import Docvim.Parse (rstrip)
@@ -144,12 +145,16 @@ node n = case n of
   --
   -- I could also just make people specify a target explicitly.
   HeadingAnnotation h        -> heading h
-  Link l                     -> append $ "|" ++ l ++ "|"
+  Link l                     -> append $ link l
   LinkTargets l              -> linkTargets l True
   List ls                    -> nodes ls >>= nl
   ListItem l                 -> listitem l
   MappingsAnnotation         -> heading "mappings"
+  -- TODO: if there is no OptionsAnnotation but there are OptionAnnotations, we
+  -- need to insert a `heading "options"` before the first option (ditto for
+  -- functions, mappings, commands)
   OptionsAnnotation          -> heading "options"
+  OptionAnnotation {}        -> option n
   Paragraph p                -> nodes p >>= nl >>= nl
   Plaintext p                -> plaintext p
   -- TODO: this should be order-independent and always appear at the top.
@@ -190,6 +195,18 @@ listitem l = do
   where
     customLineBreak = "\n  "
 
+option :: Node -> Env
+option (OptionAnnotation n t d) = do
+  targets <- linkTargets [n] True
+  ws <- appendNoWrap " " -- no echoed...
+  opt <- appendNoWrap $ link n
+  context <- get
+  meta <- appendNoWrap $ aligned context
+  return $ concat [targets, ws, opt, meta]
+  where
+    aligned context = rightAlign context rhs
+    rhs = t ++ " (default: " ++ fromMaybe "none" d ++ ")\n\n"
+
 whitespace :: Env
 whitespace =
   -- if current line > 80 "\n" else " "
@@ -227,13 +244,16 @@ heading :: String -> Env
 heading h = do
   metadata <- ask
   heading' <- appendNoWrap $ map toUpper h ++ " "
-  link <- maybe (append "\n") (\x -> linkTargets [target x] False) (pluginName metadata)
+  target <- maybe (append "\n") (\x -> linkTargets [target x] False) (pluginName metadata)
   trailing <- append "\n"
-  return $ concat [heading', link, trailing]
+  return $ concat [heading', target, trailing]
   where
     target x = map (toLower . sanitize) $ x ++ "-" ++ h
     sanitize x = if isSpace x then '-' else x
 
+link :: String -> String
+link l = "|" ++ l ++ "|"
+
 -- TODO: be prepared to wrap these if there are a lot of them
 -- TODO: fix code smell of passing in `wrap` bool here
 linkTargets :: [String] -> Bool -> Env
@@ -243,8 +263,12 @@ linkTargets ls wrap = do
   then append $ aligned context
   else appendNoWrap $ aligned context
   where
-    aligned context = rightAlign (partialLine context) (targets ++ "\n")
+    aligned context = rightAlign context (targets ++ "\n")
     targets = unwords (map linkify $ sort ls)
     linkify l = "*" ++ l ++ "*"
-    rightAlign currentlyUsed ws = replicate (count currentlyUsed ws) ' ' ++ ws
-    count currentlyUsed xs = maximum [textwidth - length xs - length currentlyUsed, 0]
+
+rightAlign :: Context -> String -> String
+rightAlign context string = align (partialLine context)
+  where
+    align used = replicate (count used string) ' ' ++ string
+    count used xs = maximum [textwidth - length xs - length used, 0]
index 053a7dc805a90fa2650fbc26c5416481b3a95f76..b79b7b4ef92d628a15c3bb6c49cbff156e20bae5 100644 (file)
@@ -1,3 +1,6 @@
+                                                          *g:FerretQFOptions*
+ |g:FerretQFOptions|                                    boolean (default: 1)
+
 Controls whether to set up setting overrides for |quickfix| windows. These
 are various settings, such as |norelativenumber|, |nolist| and |nowrap|,
 that are intended to make the |quickfix| window, which is typically very
@@ -10,6 +13,9 @@ to 0:
 >
     let g:FerretQFOptions=0
 <
+                                                              *g:FerretQFMap*
+ |g:FerretQFMap|                                        boolean (default: 1)
+
 Controls whether to set up mappings in the |quickfix| results window for
 deleting results. The mappings include:
 
index d68bbafc2f895709c80ff1cc1ce0f5ae78b50f48..73210f1e7a160a18d2ab5b1d2ce516c4d0cacb36 100644 (file)
@@ -185,12 +185,18 @@ in your |.vimrc| instead using |:nmap|:
     " Instead of <leader>r, use <leader>u.
     nmap <leader>u <Plug>(FerretAcks)
 <
+                                                                *g:FerretMap*
+ |g:FerretMap|                                          boolean (default: 1)
+
 Controls whether to set up the Ferret mappings, such as |<Plug>(FerretAck)|
 (see |ferret-mappings| for a full list). To prevent any mapping from being
 configured, set to 0:
 >
     let g:FerretMap=0
 <
+                                                         *g:FerretQFCommands*
+ |g:FerretQFCommands|                                   boolean (default: 1)
+
 Controls whether to set up custom versions of the |quickfix| commands,
 |:cn|, |:cnf|, |:cp| an |:cpf|. These overrides vertically center the match
 within the viewport on each jump. To prevent the custom versions from being
index a6f8f18363527fa1261b12347f5da5268a0546e9..e2ed73f633f75cf784e187d61960e134c242841a 100644 (file)
@@ -1,3 +1,6 @@
+                                                           *g:FerretDispatch*
+ |g:FerretDispatch|                                     boolean (default: 1)
+
 Controls whether to use vim-dispatch (and specifically, |:Make|) to run
 |:Ack| searches asynchronously, when available. To prevent vim-dispatch from
 being used, set to 0: