]> git.wincent.com - docvim.git/commitdiff
Make Vim headings work by colocating link targets on same line
authorGreg Hurrell <greg@hurrell.net>
Mon, 6 Jun 2016 08:03:58 +0000 (01:03 -0700)
committerGreg Hurrell <greg@hurrell.net>
Mon, 6 Jun 2016 08:03:58 +0000 (01:03 -0700)
lib/Docvim/Printer/Vim.hs
lib/Docvim/Visitor/Symbol.hs
tests/fixtures/vim/integration-ferret-plugin.golden
tests/fixtures/vim/integration-pinnacle.golden
tests/fixtures/vim/link-targets.golden
tests/fixtures/vim/links.golden

index f77e9b01615ac61a825b9cc9facb045e690a92d2..94eee407bbb619d253e0abf298604c6c5bce5afc 100644 (file)
@@ -4,7 +4,7 @@ import Control.Arrow ((***))
 import Control.Monad (join)
 import Control.Monad.Reader
 import Control.Monad.State
-import Data.Char (isSpace, toUpper)
+import Data.Char (isSpace, toLower, toUpper)
 import Data.List (intercalate, isSuffixOf, span, sort)
 import Data.List.Split (splitOn)
 import Data.Tuple (swap)
@@ -121,10 +121,10 @@ node n = case n of
   Blockquote b               -> blockquote b >>= nl >>= nl
   BreakTag                   -> breaktag
   Code c                     -> append $ "`" ++ c ++ "`"
-  CommandsAnnotation         -> genHeading "commands"
+  CommandsAnnotation         -> heading "commands"
   DocBlock d                 -> nodes d
   Fenced f                   -> fenced f
-  FunctionsAnnotation        -> genHeading "functions"
+  FunctionsAnnotation        -> heading "functions"
   FunctionDeclaration {}     -> nodes $ functionBody n
   -- TODO: Vim will only highlight this as a heading if it has a trailing
   -- LinkTarget on the same line; figure out how to handle that; may need to
@@ -139,8 +139,8 @@ node n = case n of
   LinkTargets l              -> linkTargets l
   List ls                    -> nodes ls >>= nl
   ListItem l                 -> listitem l
-  MappingsAnnotation         -> genHeading "mappings"
-  OptionsAnnotation          -> genHeading "options"
+  MappingsAnnotation         -> heading "mappings"
+  OptionsAnnotation          -> heading "options"
   Paragraph p                -> nodes p >>= nl >>= nl
   Plaintext p                -> plaintext p
   -- TODO: this should be order-independent and always appear at the top.
@@ -215,21 +215,23 @@ fenced f = do
   return $ concat [cut, prefix, body, suffix]
 
 heading :: String -> Env
-heading h = append $ map toUpper h ++ "\n\n"
-
--- | Like `heading`, but auto-generates a link target as well.
-genHeading :: String -> Env
-genHeading h = do
+heading h = do
   metadata <- ask
-  link <- maybe (append "") (\x -> linkTargets [x ++ "-" ++ h]) (pluginName metadata)
-  genHeading' <- heading h
-  return $ link ++ genHeading'
+  heading' <- append $ map toUpper h ++ " "
+  link <- maybe (append "\n") (\x -> linkTargets [target x]) (pluginName metadata)
+  trailing <- append "\n"
+  return $ concat [heading', link, trailing]
+  where
+    target x = map (toLower . sanitize) $ x ++ "-" ++ h
+    sanitize x = if isSpace x then '-' else x
 
 -- TODO: be prepared to wrap these if there are a lot of them
 linkTargets :: [String] -> Env
-linkTargets ls = append $ rightAlign targets ++ "\n"
+linkTargets ls = do
+  context <- get
+  append $ rightAlign (partialLine context) (targets ++ "\n")
   where
     targets = unwords (map linkify $ sort ls)
     linkify l = "*" ++ l ++ "*"
-    rightAlign ws = replicate (count ws) ' ' ++ ws
-    count xs = maximum [textwidth - length xs, 0]
+    rightAlign currentlyUsed ws = replicate (count currentlyUsed ws) ' ' ++ ws
+    count currentlyUsed xs = maximum [textwidth - length xs - length currentlyUsed, 0]
index 33ade1ce8afc8db00cf48c0f92c60bdb5d81570d..56f8062e0c1d0cad8622a07fb541c5dd6b8acabb 100644 (file)
@@ -25,9 +25,9 @@ getSymbols node = if length symbols == Set.size set
     gatherSymbols (MappingsAnnotation)      = genHeading "mappings"
     gatherSymbols (OptionsAnnotation)       = genHeading "options"
     gatherSymbols _                         = []
-    titleAnchor title                       = titlePrefix ++ sanitizeAnchor title
+    titleAnchor title                       = sanitizeAnchor $ titlePrefix ++ title
     titlePrefix                             = downcase $ maybe "" (++ "-") $ getPluginName node
-    genHeading h                            = maybe [] (\x -> [x ++ "-" ++ h]) (getPluginName node)
+    genHeading h                            = maybe [] (\x -> [sanitizeAnchor $ x ++ "-" ++ h]) (getPluginName node)
     duplicates                              = nub $ f (sort symbols)
       where
         f [] = []
index f7798dc0e70beacf693257f0ee57972ceb09a374..55e0c148982b9f4ff77db003c5896b5f44c7da4e 100644 (file)
@@ -1,13 +1,12 @@
 *ferret.txt*    Ferret plug-in for Vim      *ferret*
 
-INTRO
+INTRO                                                          *ferret-intro*
 
     "ferret (verb)
     (ferret something out) search tenaciously for and find something: she
     had the ability to ferret out the facts."
 
-
-                                                             *ferret-features*
+                                                            *ferret-features*
 Ferret improves Vim's multi-file search in four ways:
 
 1. Powerful multi-file search ~
@@ -55,7 +54,7 @@ the |quickfix| listing into the |:args| list, where they can be operated on
 in bulk via the |:argdo| command. This is what's used under the covers by
 |:Acks| to do its work.
 
-INSTALLATION
+INSTALLATION                                            *ferret-installation*
 
 To install Ferret, use your plug-in management system of choice.
 
@@ -177,9 +176,7 @@ configured, set to 0:
 >
     let g:FerretQFCommands=0
 <
-
-                                                             *ferret-mappings*
-MAPPINGS
+MAPPINGS                                                    *ferret-mappings*
 
 Circumstances where mappings do not get set up ~
 
@@ -201,10 +198,9 @@ unless prevented from doing so by |g:FerretQFMap|:
 - `dd` (|Normal-mode|): delete current line
 - `d`{motion} (|Normal-mode|): delete range indicated by {motion}
 
-CUSTOM AUTOCOMMANDS
-
+CUSTOM AUTOCOMMANDS                              *ferret-custom-autocommands*
 
-                                            *FerretDidWrite* *FerretWillWrite*
+                                           *FerretDidWrite* *FerretWillWrite*
 For maximum compatibility with other plug-ins, Ferret runs the following
 "User" autocommands before and after running the file writing operations
 during |:Acks|:
@@ -220,7 +216,7 @@ you might do:
     autocmd! User FerretDidWrite
     autocmd User FerretDidWrite call CustomDidWrite()
 <
-OVERRIDES
+OVERRIDES                                                  *ferret-overrides*
 
 Ferret overrides the 'grepformat' and 'grepprg' settings, preferentially
 setting `ag`, `ack` or `grep` as the 'grepprg' (in that order) and
@@ -229,16 +225,14 @@ configuring a suitable 'grepformat'.
 Additionally, Ferret includes an |ftplugin| for the |quickfix| listing that
 adjusts a number of settings to improve the usability of search results.
 
-
-                                                               *ferret-nolist*
+                                                              *ferret-nolist*
 'nolist'
 
 Turned off to reduce visual clutter in the search results, and because
 'list' is most useful in files that are being actively edited, which is not
 the case for |quickfix| results.
 
-
-                                                     *ferret-norelativenumber*
+                                                    *ferret-norelativenumber*
 'norelativenumber'
 
 Turned off, because it is more useful to have a sense of absolute progress
@@ -247,30 +241,26 @@ through the results list than to have the ability to jump to nearby results
 previous file, which are both handled nicely by |:cnf| and |:cpf|
 respectively).
 
-
-                                                               *ferret-nowrap*
+                                                              *ferret-nowrap*
 'nowrap'
 
 Turned off to avoid ugly wrapping that makes the results list hard to read,
 and because in search results, the most relevant information is the
 filename, which is on the left and is usually visible even without wrapping.
 
-
-                                                               *ferret-number*
+                                                              *ferret-number*
 'number'
 
 Turned on to give a sense of absolute progress through the results.
 
-
-                                                            *ferret-scrolloff*
+                                                           *ferret-scrolloff*
 'scrolloff'
 
 Set to 0 because the |quickfix| listing is usually small by default, so
 trying to keep the current line away from the edge of the viewpoint is
 futile; by definition it is usually near the edge.
 
-
-                                                         *ferret-nocursorline*
+                                                        *ferret-nocursorline*
 'nocursorline'
 
 Turned off to reduce visual clutter.
@@ -280,10 +270,9 @@ can set |g:FerretQFOptions| to 0 in your |.vimrc|:
 >
     let g:FerretQFOptions=0
 <
-TROUBLESHOOTING
-
+TROUBLESHOOTING                                      *ferret-troubleshooting*
 
-                                                               *ferret-quotes*
+                                                              *ferret-quotes*
 Ferret fails to find patterns containing spaces ~
 
 As described in the documentation for |:Ack|, the search pattern is passed
@@ -314,7 +303,7 @@ without having to worry about shell escaping rules:
 >
     :Ack \blog\((['"]).*?\1\) -i --ignore-dir=src/vendor src dist build
 <
-FAQ
+FAQ                                                              *ferret-faq*
 
 Why do Ferret commands start with "Ack", "Lack" and so on? ~
 
@@ -326,14 +315,14 @@ So, even though Ferret has a new name now and actually prefers `ag` over
 `ack` when available, I prefer to keep the command names intact and benefit
 from years of accumulated muscle-memory.
 
-RELATED
+RELATED                                                      *ferret-related*
 
 Just as Ferret aims to improve the multi-file search and replace experience,
 Loupe does the same for within-file searching:
 
 https://github.com/wincent/loupe
 
-WEBSITE
+WEBSITE                                                      *ferret-website*
 
 The official Ferret source code repo is at:
 
@@ -347,7 +336,7 @@ Official releases are listed at:
 
 http://www.vim.org/scripts/script.php?script_id=5220
 
-LICENSE
+LICENSE                                                      *ferret-license*
 
 Copyright 2015-present Greg Hurrell. All rights reserved.
 
@@ -372,7 +361,7 @@ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGE.
 
-DEVELOPMENT
+DEVELOPMENT                                              *ferret-development*
 
 Contributing patches ~
 
@@ -404,7 +393,7 @@ At the moment the release process is manual:
 <
 - Upload to http://www.vim.org/scripts/script.php?script_id=5220
 
-AUTHORS
+AUTHORS                                                      *ferret-authors*
 
 Ferret is written and maintained by Greg Hurrell <greg@hurrell.net>.
 
@@ -419,7 +408,7 @@ order):
 - Nelo-Thara Wallus
 - Vaibhav Sagar
 
-HISTORY
+HISTORY                                                      *ferret-history*
 
 0.3.1 (not yet released)
 
index 92b042c5cf58eeacc112434d382934953acfafa0..f587c20f0eefc1fac7dcf7b2df9104425e62f9c1 100644 (file)
@@ -1,10 +1,10 @@
 *Pinnacle.txt*    Highlight group manipulation for Vim      *Pinnacle*
 
-INTRO
+INTRO                                                        *pinnacle-intro*
 
 Pinnacle provides functions for manipulating |:highlight| groups.
 
-INSTALLATION
+INSTALLATION                                          *pinnacle-installation*
 
 To install Pinnacle, use your plug-in management system of choice.
 
@@ -26,7 +26,7 @@ To generate help tags under Pathogen, you can do so from inside Vim with:
 >
     :call pathogen#helptags()
 <
-WEBSITE
+WEBSITE                                                    *pinnacle-website*
 
 The official Pinnacle source code repo is at:
 
@@ -42,7 +42,7 @@ Official releases are listed at:
 
 http://www.vim.org/scripts/script.php?script_id=[TODO]
 
-LICENSE
+LICENSE                                                    *pinnacle-license*
 
 Copyright (c) 2016-present Greg Hurrell
 
@@ -64,7 +64,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 IN THE SOFTWARE.
 
-DEVELOPMENT
+DEVELOPMENT                                            *pinnacle-development*
 
 Contributing patches ~
 
@@ -96,11 +96,11 @@ At the moment the release process is manual:
 <
 - Upload to http://www.vim.org/scripts/script.php?script_id=[TODO]
 
-AUTHORS
+AUTHORS                                                    *pinnacle-authors*
 
 Pinnacle is written and maintained by Greg Hurrell <greg@hurrell.net>.
 
-HISTORY
+HISTORY                                                    *pinnacle-history*
 
 0.1 (30 March 2016) ~
 
index e5cf316c39d8e426e277fe53491ca2b2acc64a02..a2829e3e907699b5c1c62c0f0d860106c819bf87 100644 (file)
@@ -1,3 +1,2 @@
-
-                                                           *foo_bar* *g:Thing*
+                                                          *foo_bar* *g:Thing*
 This paragraph has some associated link targets above it.
index c41fd75e624cb778bc3aa21193d9db2ed779db4a..29b6e87735058454848fe6c0fb22896a8afb1c98 100644 (file)
@@ -1,5 +1,4 @@
-
-                                                          *'foobar'* *g:Thing*
+                                                         *'foobar'* *g:Thing*
 See those links targets?
 
 I'm going to link to |g:Thing| and |'foobar'| here.