26

Vim/gvim will wrap long lines like this:

000000000000000000000000000000000000|
00000000000000                      |
    11111111111111111111111111111111|
111111111111111111                  |
    22222222222222222222222222222222|
222222222222222222                  |
        3333333333333333333333333333|
3333333333333333333333              |

Is there a way to get Vim to display these lines wrapped like this instead?:

000000000000000000000000000000000000|
 00000000000000                     |
    11111111111111111111111111111111|
     111111111111111111             |
    22222222222222222222222222222222|
     222222222222222222             |
        3333333333333333333333333333|
         3333333333333333333333     |

I want the wrapped line to start a little past the indent of where that line started. (Just to be clear, I'm talking about wrap, i.e. soft line breaks, not textwidth.)

I want the indentation of the line to be considered in the wrapping of that line so that the code structure isn't hidden by wrapped lines.

5 Answers 5

19

UPDATE: This functionality landed in vim 7.4.338, though you'll want 7.4.354 or later.


So apparently this requires a patch to Vim. There is a patch by Vaclav Smilauer from back in 2007. I updated the patch to work with Vim 7.2.148 from Fedora 11. But it does seem to do the job.

8
  • 1
    As Fedora releases updates to Vim, I'm updating the patch. See retracile.net/wiki/VimBreakIndent for the latest.
    – retracile
    Nov 23, 2010 at 4:16
  • Bonus points to someone who can explain how to get this to work with MacVim.
    – donut
    Mar 29, 2011 at 20:01
  • Where is the patch? That site doesn't link to any I can see
    – puk
    Feb 23, 2012 at 11:57
  • 1
    As of today (June 25, 2014) the breakindent patch is officially part of Vim 7.4 -- it is added by patch 338 and 345.
    – Heptite
    Jun 25, 2014 at 21:21
  • 2
    ...and this answer describes how to use this new (since vim 7.4.338) feature to achieve what the OP asked for.
    – Carl
    Mar 1, 2021 at 20:38
15

In your .vimrc:

set wrap               " soft-wrap lines

" requires +linebreak compile-time option (not in the 'tiny' and 'small' builds); check your :version
set showbreak=----->   " prefix for soft-wrapped lines (no actual line break character)
"set linebreak          " soft-wrap lines only at certain characters (see :help breakat)

" If you like line numbers, you may want this instead:
"set number
"set showbreak=------>\  " line up soft-wrap prefix with the line numbers
"set cpoptions+=n        " start soft-wrap lines (and any prefix) in the line-number area

Or just type :set showbreak=-----> in any session.

For reference, my research trail (Vim 6.2): :help 'wrap' -> :help 'linebreak' -> ( :help 'showbreak' -> :help 'cpoptions', :help 'breakat')

1
  • 1
    Very cool, but not really what I meant. You took it a bit more literally than I intended, so my fault there. I'll see if I can clarify.
    – retracile
    Nov 20, 2009 at 15:03
9

The solution to your question can be achieved setting two parameters in your vimrc:

To break the lines with the same indentation: set breakindent

And one space for indenting soft-wrapped lines: let &showbreak=' '

It will work this way:

111111111111111|
 11111111111111|
 11111         |
222222222222222|
 222222222222  |
333333333333333|
 33333         |
2
  • 1
    This worked perfectly for me in vim8 to produce the display of a lovely hanging indent without altering the source code. I added set breakindent and let &showbreak=' ' to my vimrc. Thanks!
    – JDG
    Sep 14, 2020 at 15:18
  • 1
    Now that vim supports breakindent, this would be the correct answer.
    – Carl
    Mar 1, 2021 at 20:36
0

Not the perfect answer you're looking for, but here's what I do to get around vim's lack of proper indentation.

First, download Nathanael Kane's indent guide (optional) as it better indicates what indentation level you are at, even to the point where you can set tabwidths to be only 2 spaces!

Second, map a key combination to toggle word wrap. I have mine set to 'r' for 'wrap' ('w' is for saving) like so

:noremap <leader>r :set nowrap! <CR>

Then I always have word wrap off, since it is more aesthetically pleasing, and I quickly toggle it on if I need to edit the line.

0

The foul "workaround" I currently use, is to have a fixed but big indentation in the prefix. It looks good, as long as this fixed indentation is bigger than the wrapped line's indentation, which is the case most of the time.

" 'showbreak'   : string to put before wrapped screen lines
set sbr=\ \ \ \ \ \ \ \ \ \ \ \ \ \|\ 

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.