On Thu, Aug 04, 2022 at 08:17:39PM +0200, Dennis Preiser wrote: > I use vim and have the following vim9script function in my vimrc: > > | #--------------------------------------------------------------------------- > | # fix mail quotes for mutt, e.g. '> >foo' -> '>> foo' > | # muttrc: set editor='vim -c ":call FixMailQuotes()"' > | # cursor placement only useful if edit_headers is set in mutt > | #--------------------------------------------------------------------------- > | def g:FixMailQuotes() > | # find first body line after headers > | var first_body_line = search('^$') + 1 > | # compress quote marks > | while search('^>[> ]* >', 'w') > 0 > | silent! s/> >/>>/e > | endwhile > | # add space after last '>' if none is present > | silent! :%s/^[>]*\zs>\ze[^> ]/> /e > | # place cursor at first line of body > | cursor(first_body_line, 1) > | enddef > > Not better, but gets along without perl (of course only if you use > vim). Quotes are merged and it is ensured that there is a space after > the last quote character. > > '> >> >foo' becomes '>>>> foo')
Not sure if you want it, but this reduces a bunch of that code to a one-liner %s/^\(> *\)\+/\=substitute(submatch(0), ' ', '', 'g').' ' finding any quoted indentation, removing all the spaces from it, and tacking on one space at the end. Additionally, I think that your first_body_line pair of lines can be reduced to just a raw search: /^$/+ reducing your function to: def g:FixMailQuotes() %s/^\(> *\)\+/\=substitute(submatch(0), ' ', '', 'g').' ' /^$/+ enddef Just in case you find it useful. -tkc