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.