Den tis 20 apr. 2021 17:46Julius Hamilton <julkh...@gmail.com> skrev:

> Thanks.
>
> This is pretty complicated, but probably what I had in mind.
>
> So, some basic clarification -
>
> You defined a new command called Jp. You specify a line range, and it
> starts at every non blank line and joins all following non blank lines.
>
> That's quite good. Thanks very much.
>
> What about the second command I had in mind? I could really use a way to
> select a paragraph and insert N newlines between every Word (Vim "W") (and
> also sentence, on a separate occasion), with a single command, say in
> visual mode.
>
> With your command, I can imagine it could be modified to start at every
> Word and just append newlines. Do you think you could write an example of
> this?
>

I came up with the following. It basically is a pair of typing-saving
canned s/// command which replaces all consecutive horizontal whitespace
with a given number of linebreaks throughout the buffer, in a range or in
the current visual selection, in the second version restricted to
horizontal whitespace after sentence-final punctuation.

" Command :Wl [{N}] (*W*ord *l*ine)
"   Replace consecutive horizontal whitespace in buffer/range/selection
"   with N line breaks (Default: the number in variable g:Wl_line_breaks)

let g:Wl_line_breaks=1

:com! -range=% -nargs=? Wl exe
printf('<line1>,<line2>s/\s\+/%s/g',repeat('\r', (<q-args> ? <q-args> :
g:Wl_line_breaks)))

" Explanation:
"   -range=%
"     The command operates over the whole buffer or over a given range,
which
"     may be visual.
"   -nargs=?
"     The command takes an optional argument.
"   exe printf(...)
"     Constructs a string containing the actual command, then executes this
"     string as a command.
"   (<q-args> ? <q-args> : g:Wl_line_breaks)
"     Compute N: use the argument if there was one (and it was non-zero)
"     or else use the number which is the value of the global variable
"     g:Wl_line_breaks, which must be defined.
"     It is up to you to make sure that the argument and the variable value
"     are positive integers!
"   repeat('\r', N)
"     Construct a string which will be interpolated as N linebreaks.
"     The string doesn't actually contain linebreaks, but they will "become"
"     line breaks when the command is executed.
"   s/\s\+/%s/g
"     Here %s will be replaced with N linebreaks,
"     so if N is 1 it's s/\s+/\r/g
"     and if N is 4 it's s/\s+/\r\r\r\r/g
"     so basically replace all consecutive horizontal whitespace
"     with the desired number of linebreaks.

" Command :Sl [{N}] (*S*entence *l*ine)
"   Replace consecutive horizontal whitespace *after a ./?/!*
"   in buffer/range/selection with N line breaks (Default: the number in
variable g:Sl_line_breaks)

let g:Sl_line_breaks=1

:com! -range=% -nargs=? Sl exe
printf('<line1>,<line2>s/[.?!]\zs\s\+/%s/g',repeat('\r', (<q-args> ?
<q-args> : g:Sl_line_breaks)))

" Explanation:
"   This is basically the same as above, but requires that the horizontal
"   whitespace is preceded with a "." or "?" or "!", and it has its own
"   variable for the default value of N.

" Mappings to execute :Wl/:Sl (without argument) over buffer/selection
nor Wl :Wl<cr>
nor Sl :Sl<cr>


And, how to use it on highlighted text in visual mode, instead of
> specifying a line range?
>

The commands above and the command from yesterday work on an existing or
previous visual selection too. If you have a visual selection and press :
the commandline is prefixed with '<,'> which is a range equal to the lines
holding the visual selection. You can also insert that range manually to
restrict a previously used command to the latest visual selection.

The mappings above work either on the whole buffer or the visual selection,
so just make a visual selection and type Wl and it just happens in the
visual selection.

In yesterday's installment the

vnor Jp :Jp<cr>

means that you can make a visual selection and just type Jp and have the
:Jp command applied to the selection. Just make sure that the selection
ends with a blank line. The

nnor Jp ...

line from yesterday does the same over the whole buffer in normal mode,
with the difference that it first inserts a blank line at the bottom of the
buffer to make sure there is one.



> Thanks very much,
> Julius
>

It's nothing. I have been using yesterday's command/mappings for ages, and
I will certainly use those from today too.

/bpj


>
>
>
>
> On Tue, Apr 20, 2021, 09:13 BPJ <b...@melroch.se> wrote:
>
>> Den fre 16 apr. 2021 19:27Stan Brown <the_stan_br...@fastmail.fm> skrev:
>>
>>> On 2021-04-16 09:42, Julius Hamilton wrote:
>>>
>>> > At the beginning of a paragraph which has been separated mid-sentence
>>> > onto separate lines, how might I automate the process of calling CTRL-J
>>> > until all the separated lines in the paragraph have been combined into
>>> > one line? Will Vim be able to call CTRL-J until a condition is met, for
>>> > example, that the single line being built ends in a sentence (a
>>> period),
>>> > or until the next line is a blank newline?
>>>
>>
>> I have the following in my .vimrc :
>>
>> " Command to join lines in all paragraphs in a range/the whole buffer (Jp
>> == join paras)
>> :com! -range=% Jp <line>,<line>g/^\s*\S/ .,/^\s*$/-join
>>
>> " Explanation:
>> "  :g/^\s*\S/ " Go to the first in each sequence of non-blank lines
>>           " Actually every non-blank line but the result is the same here!
>> "  .,/^\s*$/- " "Select" all lines from the current to the one before the
>> next blank line
>> "  join  " Join the "selected" lines
>>
>> " Mapping to join lines in all paras in the buffer
>> :nnor Jp Go<esc>ggVG:Jp<cr>
>>
>> " Explanation:
>> "  G " Go to the last line in the buffer
>> "  o<esc> " Add a blank line below the last so we are sure there is one!
>> "  gg " Go to the first line in the buffer
>> "  V  " Visually select the (first) line
>> "  G  " Extend the selection to the last line in the buffer
>> "  :Jp<cr> " Execute the command defined above
>>
>> " Mapping to execute the :Jp command over the current visual selection
>> :vnor Jp :Jp<cr>
>>
>> HTH
>>
>> /bpj
>>
>>
>>> The short answer is go to the top of the paragraph and press Shift+V,
>>> then to the bottom and press Shift+J (not Ctrl+J). You can automate this
>>> further by writing a function that would figure out the top and bottom
>>> of the paragraph via whatever logic you build in. See :help :function.
>>>
>>> > Then, how might I automate the process of entering N newlines between
>>> > every sentence? I.e., automating pressing ), i, enter a few times, then
>>> > escape, for multiple sentences? I could create a shortcut to execute
>>> > these commands and call it myself, or it could also repeat until the
>>> > conditions above. How would I do either?
>>>
>>> Example, for N = 4:
>>> :imap <F9> <CR><CR><CR><CR><Esc>
>>> Type the actual < and > characters as shown. To use this, at the end of
>>> typing your paragraph do not press Esc but press F9 (or whatever key you
>>> mapped).
>>>
>>> If you sometimes want to insert N blank lines in already-written text,
>>> add this:
>>> :map <F9> A<F9>
>>> The previous map was active in insert mode; this one is active in normal
>>> mode. It moves to the end of the current line ("A") in insert mode and
>>> then appends the insert-mode version of F9.
>>>
>>> Once you've verified that these work as you wish, you can put them in
>>> your $VIM/_vimrc file so that they will be executed whenever you start
>>> Vim.
>>>
>>> > Also, how do I go back to where the cursor previously was, in case I
>>> > accidentally move it?
>>>
>>> `` or ''
>>> (One goes back to the _line_) where you were; the other goes back to the
>>> exact position within the line.)
>>>
>>> --
>>> Stan Brown
>>> Tehachapi, CA, USA
>>> https://BrownMath.com
>>> https://OakRoadSystems.com
>>>
>>> --
>>> --
>>> You received this message from the "vim_use" maillist.
>>> Do not top-post! Type your reply below the text you are replying to.
>>> For more information, visit http://www.vim.org/maillist.php
>>>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "vim_use" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to vim_use+unsubscr...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/vim_use/d9ee4264-13cb-eef7-be14-e0e68f9df155%40fastmail.fm
>>> .
>>>
>> --
>> --
>> You received this message from the "vim_use" maillist.
>> Do not top-post! Type your reply below the text you are replying to.
>> For more information, visit http://www.vim.org/maillist.php
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "vim_use" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to vim_use+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/vim_use/CADAJKhA-3Dmp1O7XcGsJ0BPkivshP%3DWt47_nvP_sJdPwN2j64Q%40mail.gmail.com
>> <https://groups.google.com/d/msgid/vim_use/CADAJKhA-3Dmp1O7XcGsJ0BPkivshP%3DWt47_nvP_sJdPwN2j64Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> --
> You received this message from the "vim_use" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>
> ---
> You received this message because you are subscribed to the Google Groups
> "vim_use" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to vim_use+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/vim_use/CAGrXgp28LN5gA3KEUhCcsTieDLLTjDSA3U2SeWBpLB8AS2Rbmg%40mail.gmail.com
> <https://groups.google.com/d/msgid/vim_use/CAGrXgp28LN5gA3KEUhCcsTieDLLTjDSA3U2SeWBpLB8AS2Rbmg%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_use+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_use/CADAJKhD8zmR3dKQ8C-Ck1c-%2BLeu9Ez998%2B1cTF7JTHJ1ZnwOxA%40mail.gmail.com.

Reply via email to