]> git.wincent.com - docvim.git/commitdiff
Be better about hard-wrap placement
authorGreg Hurrell <greg@hurrell.net>
Sun, 5 Jun 2016 04:26:53 +0000 (21:26 -0700)
committerGreg Hurrell <greg@hurrell.net>
Sun, 5 Jun 2016 04:26:53 +0000 (21:26 -0700)
Still needs a refactor, but the output is better.

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

index 3d12f4cd255a47740dfc8477950cade818fbb681..ef7b77310362adc0e6e2a14d4bf6f4acdc7fbe5b 100644 (file)
@@ -4,10 +4,13 @@ module Docvim.Printer.Vim
   , pv
   ) where
 
   , pv
   ) where
 
+import Control.Arrow ((***))
+import Control.Monad (join)
 import Control.Monad.Reader
 import Control.Monad.State
 import Data.Char (isSpace, toUpper)
 import Control.Monad.Reader
 import Control.Monad.State
 import Data.Char (isSpace, toUpper)
-import Data.List (intercalate, isSuffixOf, sort)
+import Data.List (intercalate, isSuffixOf, span, sort)
+import Data.Tuple (swap)
 import Docvim.AST
 import Docvim.Parse (parseUnit, rstrip)
 import Docvim.Visitor.Plugin (getPluginName)
 import Docvim.AST
 import Docvim.Parse (parseUnit, rstrip)
 import Docvim.Visitor.Plugin (getPluginName)
@@ -49,26 +52,28 @@ vimHelp n = rstrip output ++ "\n"
 append :: String -> Env
 append string = do
   context <- get
 append :: String -> Env
 append string = do
   context <- get
-  -- TODO make that >=
   -- TODO obviously tidy this up
   -- TODO obviously tidy this up
-  -- TODO instead of deleting trailing whitespace (might not actually be any)
-  -- delete back to whitespace, then replay non-whitespace bits; should fix bad
-  -- output like this:
-  --     Searches for {pattern} in all the files under the current directory (see :pwd
-  --     ), unless otherwise overridden via {options}, and displays the results in the
   -- TODO: always suppress trailing whitespace (some of it is making it into the
   -- output)
   let (ops, line) = if length (partialLine context) + length string >= textwidth
   -- TODO: always suppress trailing whitespace (some of it is making it into the
   -- output)
   let (ops, line) = if length (partialLine context) + length string >= textwidth
-                    then ([Delete (trailing $ partialLine context), Append (lineBreak context), Append $ slurpWhitespace string], lineBreak context ++ slurpWhitespace string)
+                    then ([Delete (length $ snd $ split $ partialLine context), Slurp " ", Append (lineBreak context), Append (snd $ split $ partialLine context), Append $ string], lineBreak context ++ (snd $ split $ partialLine context) ++ string)
                     else ([Append string], partialLine context ++ string)
   put (Context (lineBreak context) (end line))
   return ops
   where
     trailing str = length $ takeWhile isSpace (reverse str)
     end l = reverse $ takeWhile (/= '\n') (reverse l)
                     else ([Append string], partialLine context ++ string)
   put (Context (lineBreak context) (end line))
   return ops
   where
     trailing str = length $ takeWhile isSpace (reverse str)
     end l = reverse $ takeWhile (/= '\n') (reverse l)
-    slurpWhitespace atom = if atom == " "
-                           then ""
-                           else atom
+    split str = hardwrap str
+
+-- http://stackoverflow.com/a/9723976/2103996
+mapTuple = join (***)
+
+-- Given a string, hardwraps it into two parts by splitting it at the rightmost
+-- whitespace.
+hardwrap :: String -> (String, String)
+hardwrap str = swap $ mapTuple reverse split
+  where
+    split = span (not . isSpace) (reverse str)
 
 -- Helper function that deletes `count` elements from the end of the
 --`partialLine` context.
 
 -- Helper function that deletes `count` elements from the end of the
 --`partialLine` context.
index 013b5e6e2a2ebeca0ec07ea1f30582dc04f5dd8d..053a7dc805a90fa2650fbc26c5416481b3a95f76 100644 (file)
@@ -1,12 +1,12 @@
 Controls whether to set up setting overrides for |quickfix| windows. These
 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 small
-relative to other windows, more usable.
+are various settings, such as |norelativenumber|, |nolist| and |nowrap|,
+that are intended to make the |quickfix| window, which is typically very
+small relative to other windows, more usable.
 
 A full list of overridden settings can be found in |ferret-overrides|.
 
 
 A full list of overridden settings can be found in |ferret-overrides|.
 
-To prevent the custom settings from being applied, set |g:FerretQFOptions| to
-0:
+To prevent the custom settings from being applied, set |g:FerretQFOptions|
+to 0:
 >
     let g:FerretQFOptions=0
 <
 >
     let g:FerretQFOptions=0
 <
index cc412e913fe302d219c62eef010cf42ab4adab2b..abf7318453fb9700d4f06bb2120f38b9fa329c84 100644 (file)
@@ -3,8 +3,8 @@
 INTRO
 
     "ferret (verb)
 INTRO
 
     "ferret (verb)
-    (ferret something out) search tenaciously for and find something: she had
-    the ability to ferret out the facts."
+    (ferret something out) search tenaciously for and find something: she
+    had the ability to ferret out the facts."
 
 
                                                              *ferret-features*
 
 
                                                              *ferret-features*
@@ -27,8 +27,8 @@ provides a |:Lack| command that behaves like |:Ack| but uses the
 |location-list| instead, and a <leader>l mapping as a shortcut to |:Lack|.
 
 Finally, Ferret offers integration with dispatch.vim
 |location-list| instead, and a <leader>l mapping as a shortcut to |:Lack|.
 
 Finally, Ferret offers integration with dispatch.vim
-(https://github.com/tpope/vim-dispatch), which enables asynchronous searching
-despite the fact that Vim itself is single-threaded.
+(https://github.com/tpope/vim-dispatch), which enables asynchronous
+searching despite the fact that Vim itself is single-threaded.
 
 2. Streamlined multi-file replace ~
 
 
 2. Streamlined multi-file replace ~
 
@@ -130,9 +130,9 @@ adjusts a number of settings to improve the usability of search results.
                                                                *ferret-nolist*
 '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.
+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*
@@ -149,8 +149,8 @@ respectively).
 'nowrap'
 
 Turned off to avoid ugly wrapping that makes the results list hard to read,
 '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.
+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*
@@ -307,8 +307,8 @@ AUTHORS
 
 Ferret is written and maintained by Greg Hurrell <greg@hurrell.net>.
 
 
 Ferret is written and maintained by Greg Hurrell <greg@hurrell.net>.
 
-The idea for vim-dispatch integration was taken from Miles Sterrett's ack.vim
-plug-in (https://github.com/mileszs/ack.vim).
+The idea for vim-dispatch integration was taken from Miles Sterrett's
+ack.vim plug-in (https://github.com/mileszs/ack.vim).
 
 Other contributors that have submitted patches include (in alphabetical
 order):
 
 Other contributors that have submitted patches include (in alphabetical
 order):
@@ -352,13 +352,13 @@ needed.
 If dispatch.vim is installed the search process will run asynchronously via
 the |:Make| command, otherwise it will be run synchronously via |:cexpr|.
 Asynchronous searches are preferred because they do not block, despite the
 If dispatch.vim is installed the search process will run asynchronously via
 the |:Make| command, otherwise it will be run synchronously via |:cexpr|.
 Asynchronous searches are preferred because they do not block, despite the
-fact that Vim itself is single threaded. The |g:FerretDispatch| option can be
-used to prevent the use of dispatch.vim.
+fact that Vim itself is single threaded. The |g:FerretDispatch| option can
+be used to prevent the use of dispatch.vim.
 
 The {pattern} is passed through as-is to the underlying search program, and
 no escaping is required other than preceding spaces by a single backslash.
 
 The {pattern} is passed through as-is to the underlying search program, and
 no escaping is required other than preceding spaces by a single backslash.
-For example, to search for "\bfoo[0-9]{2} bar\b" (ie. using `ag`'s Perl-style
-regular expression syntax), you could do:
+For example, to search for "\bfoo[0-9]{2} bar\b" (ie. using `ag`'s
+Perl-style regular expression syntax), you could do:
 >
     :Ack \bfoo[0-9]{2}\ bar\b
 <
 >
     :Ack \bfoo[0-9]{2}\ bar\b
 <
@@ -370,12 +370,12 @@ option (to search on word boundaries), and scope the search to the "foo" and
 <
 As a convenience <leader>a is set-up (|<Plug>(FerretAck)|) as a shortcut to
 enter |Cmdline-mode| with `:Ack` inserted on the |Cmdline|. Likewise
 <
 As a convenience <leader>a is set-up (|<Plug>(FerretAck)|) as a shortcut to
 enter |Cmdline-mode| with `:Ack` inserted on the |Cmdline|. Likewise
-<leader>s (|<Plug>(FerretAckWord)|) is a shortcut for running |:Ack| with the
-word currently under the cursor.
+<leader>s (|<Plug>(FerretAckWord)|) is a shortcut for running |:Ack| with
+the word currently under the cursor.
 
 Just like |:Ack|, but instead of using the |quickfix| listing, which is
 
 Just like |:Ack|, but instead of using the |quickfix| listing, which is
-global across an entire Vim instance, it uses the |location-list|, which is a
-per-window construct.
+global across an entire Vim instance, it uses the |location-list|, which is
+per-window construct.
 
 Note that |:Lack| always runs synchronously via |:cexpr|, because
 dispatch.vim doesn't currently support the |location-list|.
 
 Note that |:Lack| always runs synchronously via |:cexpr|, because
 dispatch.vim doesn't currently support the |location-list|.
@@ -425,8 +425,8 @@ instead using |:nmap|:
 <
 Ferret maps <leader>r (mnemonic: "replace") to |<Plug>(FerretAcks)|, which
 triggers the |:Acks| command and fills the prompt with the last search term
 <
 Ferret maps <leader>r (mnemonic: "replace") to |<Plug>(FerretAcks)|, which
 triggers the |:Acks| command and fills the prompt with the last search term
-from Ferret. to use an alternative mapping instead, create a different one in
-your |.vimrc| instead using |:nmap|:
+from Ferret. to use an alternative mapping instead, create a different one
+in your |.vimrc| instead using |:nmap|:
 >
 
     " Instead of <leader>r, use <leader>u.
 >
 
     " Instead of <leader>r, use <leader>u.
@@ -438,9 +438,9 @@ generally useful enough to warrant being exposed publicly.
 It takes the files currently in the |quickfix| listing and sets them as
 |:args| so that they can be operated on en masse via the |:argdo| command.
 
 It takes the files currently in the |quickfix| listing and sets them as
 |:args| so that they can be operated on en masse via the |:argdo| command.
 
-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
+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
 configured, set to 0:
 >
     let g:FerretQFCommands=0
 configured, set to 0:
 >
     let g:FerretQFCommands=0
index 0104298fd4762504c57edc8ce8a0aa43409d3106..bd47bd6d7c30008c6080dbd6493f4104971934cf 100644 (file)
@@ -11,8 +11,8 @@ To install Pinnacle, use your plug-in management system of choice.
 If you don't have a "plug-in management system of choice", I recommend
 Pathogen (https://github.com/tpope/vim-pathogen) due to its simplicity and
 robustness. Assuming that you have Pathogen installed and configured, and
 If you don't have a "plug-in management system of choice", I recommend
 Pathogen (https://github.com/tpope/vim-pathogen) due to its simplicity and
 robustness. Assuming that you have Pathogen installed and configured, and
-that you want to install vim-docvim into `~/.vim/bundle`, you can do so with:
-
+that you want to install vim-docvim into `~/.vim/bundle`, you can do so
+with:
 >
     git clone https://github.com/wincent/pinnacle.git ~/.vim/bundle/pinnacle
 <
 >
     git clone https://github.com/wincent/pinnacle.git ~/.vim/bundle/pinnacle
 <
@@ -48,10 +48,10 @@ LICENSE
 Copyright (c) 2016-present Greg Hurrell
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 Copyright (c) 2016-present Greg Hurrell
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
 furnished to do so, subject to the following conditions:
 
 The above copyright notice and this permission notice shall be included in
@@ -61,9 +61,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-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.
+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