]> 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
 
+import Control.Arrow ((***))
+import Control.Monad (join)
 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)
@@ -49,26 +52,28 @@ vimHelp n = rstrip output ++ "\n"
 append :: String -> Env
 append string = do
   context <- get
-  -- TODO make that >=
   -- 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
-                    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)
-    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.
index 013b5e6e2a2ebeca0ec07ea1f30582dc04f5dd8d..053a7dc805a90fa2650fbc26c5416481b3a95f76 100644 (file)
@@ -1,12 +1,12 @@
 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|.
 
-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
 <
index cc412e913fe302d219c62eef010cf42ab4adab2b..abf7318453fb9700d4f06bb2120f38b9fa329c84 100644 (file)
@@ -3,8 +3,8 @@
 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*
@@ -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
-(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 ~
 
@@ -130,9 +130,9 @@ adjusts a number of settings to improve the usability of search results.
                                                                *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*
@@ -149,8 +149,8 @@ respectively).
 '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*
@@ -307,8 +307,8 @@ AUTHORS
 
 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):
@@ -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
-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.
-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
 <
@@ -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
-<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
-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|.
@@ -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
-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.
@@ -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.
 
-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
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
-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
 <
@@ -48,10 +48,10 @@ LICENSE
 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
@@ -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
-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