vim command to restructure/force text to 80 columns

109,193

Solution 1

Set textwidth to 80 (:set textwidth=80), move to the start of the file (can be done with Ctrl-Home or gg), and type gqG.

gqG formats the text starting from the current position and to the end of the file. It will automatically join consecutive lines when possible. You can place a blank line between two lines if you don't want those two to be joined together.

Solution 2

Michael's solution is the key, but I most often find I want to reformat the rest of the current paragraph; for this behavior, use gq}.

Solution 3

You can use gq with any movement operators. For example, if you only want to reformat to the end of the current line (i.e. to wrap the line that your cursor is on) you can use gq$

You can also reformat by selecting text in visual mode (using `v and moving) and then typing gq.

There are other options for forcing lines to wrap too.

If you want vim to wrap your lines while you're inserting text in them instead of having to wait till the end to restructure the text, you will find these options useful:

:set textwidth=80
:set wrapmargin=2

(Don't get side-tracked by wrap and linebreak, which only reformat the text displayed on screen, and don't change the text in the buffer)

Solution 4

Thanks to a comment from DonaldSmith I found this, as the textwidth option didn't reformat my long line of text (I was converting playing with hex-to-byte conversions):

:%!fold -w 60

That reformated the whole file (which was one line for me) into lines of length 60.

Solution 5

If you're looking for a non-Vim way, there's always the UNIX commands fmt and par.

Notes:

  • I can't comment on Unicode, it may or may not behave differently.
  • @nelstrom has already mentioned using par in his webcast.

Here's how we would use both for your example.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

To use from inside Vim:

:%! fmt -w 13
:%! par 13gr

You can also set :formatprg to par or fmt and override gq. For more info, call :help formatprg inside Vim.

Share:
109,193

Related videos on Youtube

wickedchicken
Author by

wickedchicken

Updated on August 12, 2020

Comments

  • wickedchicken
    wickedchicken over 3 years

    I know there are ways to automatically set the width of text in vim using set textwidth (like Vim 80 column layout concerns). What I am looking for is something similar to = (the indent line command) but to wrap to 80. The use case is sometimes you edit text with textwidth and after joining lines or deleting/adding text it comes out poorly wrapped.

    Ideally, this command would completely reorganize the lines I select and chop off long lines while adding to short ones. An example:

    long line is long!  
    short
    

    After running the command (assuming the wrap was 13 cols):

    long line is  
    long! short
    

    If this isn't possible with a true vim command, perhaps there is a command-line program which does this that I can pipe the input to?

    After searching I found this reference which has some more options: http://www.cs.swarthmore.edu/help/vim/reformatting.html

    • nelstrom
      nelstrom almost 14 years
      You might also be interested to learn that Vim can delegate text formatting to an external program, such as par. I made a screencast which demonstrates how to format text with par.
    • Steven Lu
      Steven Lu over 10 years
      @nelstrom thanks, TIL about par. It's fantastic!
    • ruffin
      ruffin almost 8 years
      When you want text to look slim & trim (well cut?), always think of gq -- Gentleman's Quarterly. (Apologies for anthropomorphizing male, but the mnemonic works.)
  • Dan Schnau
    Dan Schnau over 10 years
    expanding on this - you can use gq<motion> to format whatever you'd like.
  • mmoya
    mmoya over 10 years
    From wrapmargin help: When 'textwidth' is non-zero this option is not used.
  • Alex Hirzel
    Alex Hirzel over 9 years
    Also, the 'nojoinspaces' option which prevents two spaces from appearing after periods when lines are joined at a sentence boundry. Good when your typographical style is single spaces between sentences in English.
  • Plouff
    Plouff over 9 years
    And it also works with visual selections. Ie something like: V}gq. In this way you see what you are going to format before actually formatting it.
  • Richard-Degenne
    Richard-Degenne over 9 years
    By the way, what exactly does q by itself?
  • Donald Smith
    Donald Smith almost 9 years
    Is there a way to do this with lines that are just one long string of characters, with no spaces? EDIT: I've discovered the "fold" utility. Still wondering about doing this in vi.
  • shearn89
    shearn89 over 8 years
    @DonaldSmith - I've added an answer below.
  • Yibo Yang
    Yibo Yang over 8 years
    use set tw=80 instead of set textwidth=80 to save time
  • dmranck
    dmranck about 8 years
    Is there a way to keep these settings applied so that when you enter more text into the document, it auto-wraps at 80? Or do you have to reapply these steps every so often to reformat the doc?
  • ktbiz
    ktbiz about 7 years
    @dmranck After set textwidth=76 your lines will autowrap while typing. My complaint is that it doesn't do anything to existing lines being editing. But V}gq is extremely useful in that regard. V enters visual selection mode, } selects down to the next paragraph break, and gq executes the current formatter on it (or use gw to explicitly call the vi formatter). Also, { will select upwards. You can select the whole document and format with ggVGgq although maybe there's an easier way. Save that as a macro using @ to make it easier. Use vipgq to fmt current paragraph.
  • Shammel Lee
    Shammel Lee almost 7 years
    gw does the same thing as gq except it keeps the cursor in place.
  • pedrosaurio
    pedrosaurio about 6 years
    This is very nice. All answers focus on limiting the width of a line when a line is split spaces into words. This solution works for very long words (DNA sequences).
  • SkyLeach
    SkyLeach almost 6 years
    For long urls this is about the only thing I've found that works. I already new about textwidth but it will not break unbroken strings (which is usually a good thing)
  • Geremia
    Geremia over 5 years
    This doesn't have the same behavior as Emacs's fill-region.