On Fri, Oct 23, 2026 at 11:43:23PM +0000, dvalin via vim_use wrote: > Vim is so much handier than Vi was last century. The folding options are > great, and the spellchecker installation assist was a neat surprise, last > time. Digraphs, ctags, encryption, ... well... I use simpler vi clones from time to time and there are much more simpler things I immediatly miss: * the text objects (ci", dap, ...) * contextual mappings * buffer and file navigations (c-w-*, gF, ...) but also: vim missed some very cool features from the old tools like https://doc.cat-v.org/bell_labs/structural_regexps/se.pdf Actually, the mix of vim very magic regexps and SRE could be amazing regards -- Marc Chantreux -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/atydWOMYPfLeWQr6%40prometheus.
Saturday, October 24, 2026
Re: Atomic Substitution (a vi way?)
On Sat, Oct 24, 2026 at 05:28:33AM +0300, Riza Dindir wrote: > Maybe this is not answering the question. But I wanted to share... > I do think that vi's feature of using filters, and external tools to pipe > text in and out is wonderful. I do think that this feature is not used as > much... I do use that feature instead of writing viml functions. That is > the feature that made me stick with vi/vim. Indeed! that's why it's so hard to exit from vim: there is no good reason for it :) I really like combos like grep -RFn something<esc>!sh<cr> then use GF > I do use vim for syntax coloring mostly, and the folding. But I am using > vim as it is vi, and use viml when I can not do things with the filter > commands (the ! command). The filter commands are also handy with > read/write commands like r !<filter>. indeed. It would be even more joyable if vim would have a better completion of < from command line :r!dpkg -L <cf regards -- Marc Chantreux -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/atya6dTdbxQPMaNy%40prometheus.
Re: Atomic Substitution (viml solution inspired by the vi way)
On Fri, Oct 23, 2026 at 03:22:51PM -0500, Tim Chase wrote: > > %! tee X | grep -qv '[12]' && cat X || sed s/2/3/ X > > > > tee X | grep -qv '[12]' # checking unacceptable lines while writing X > > && cat X # cat X if there are any > > || sed s/2/3/ X # if none, do the substitution > This isn't bad and I regularly do things like you describe when I'm in > vi(1) or nvi or ed(1) where I lack the full power of vim expressions. > But does then require that you then clean up the X temp-file when you're > done. I actually use a personnal convention here: ~/.[XYZ] are stores for volatile content. I never delete them as * they can be used by another script/mapping in few seconds anyway * sometimes it took me seconds (minutes?) to realize I went wrong, in this case, ~/.[XYZ] can provide informations to understand what was wrong or data that can be a good start give me a second chance. but you made a point. let's provide other examples for future reads: <<\% tee X | grep -qv '[12]' && cat X || sed s/2/3/ X ; rm X <<\% perl -wE '@l= map {chomp; $_}<>; say for (@l == grep /[12]/, @l) ? (map s/2/3/r, @l) : @l' <<\% raku -e '.say for ((my @l=lines).all ~~ /<[ 1 2 ]>/ ?? @l.map: {S/2/3/} !! @l )' <<\% awk '/[12]/{n++} {l[NR]=$0} END{ if (NR!=n) s="cat"; for (i=1; i<=NR; ++i) print l[i]|c }' s='sed s/2/3/' Notes: * the raku version is probably golfable. it puzzles me * I would be delighted by an array programming solution like J or something :) while writing those exemples, I realize we can write a viml solution based on the same idea: if ! len(filter(getline("'a","'b"),'v:val !~ "[12]"' )) | 'a,'bs/2/3/ | endif old school evals is shorter in this case but lambdas are easier to maintain: echo filter(getline("'a","'b") , 'v:val !~ "[12]"' ) echo filter(getline("'a","'b") , { _,v -> v !~ "[12]" } ) vim9cmd echo filter(getline("'a", "'b"), (_, v) => v !~ "[12]" ) It would be even better if vim could use commands as part of expressions and coerce lists in boolean (even python have it!) and num contexts [] => 0 => false ["haha","cool"] => 2 => true + ["haha","cool"] => 2 because an ultimate solution could have been :let filter(getline("'a","'b"),'v:val !~ "[12]"' )) ?? 'a,'bs/2/3/ regards. -- Marc Chantreux -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/atyXJxRAf7-lstPe%40prometheus.
Friday, October 23, 2026
AW: AW: Atomic Substitution.
Tim, but your 4-line example can be solved exactly by the command I previously suggested; for your case it would be just :g/one a/s/a/b/ Mind that it gets only slightly more difficult if the substitution pattern would also be part of the "global" pattern, as if your lines would have one e one e one one e then it would be necessary to better characterize the substitution pattern; in this case, for example, by adding the space to the pattern and replacement. :g/one e/s/ e/ b/ There's yet more complicated patterns thinkable. Solutions can likely be found with such elementary ex-commands without the need to resort to vim-scripting. Janis ________________________________________ Von: vim_use@googlegroups.com <vim_use@googlegroups.com> im Auftrag von Tim Chase <vim@tim.thechases.com> Gesendet: Freitag, 23. Oktober 2026 16:51 An: vim_use@googlegroups.com Betreff: Re: AW: Atomic Substitution. On 2026-10-23 13:46, Janis Papanagnou wrote: >> I woud like to first make ether a range selection or a grep on ines >> and after that substitute them but only if the substitution can take >> place on all itemm. Is that possible? > > Your description is not quite clear to me. - It sounds as if you want > something like I *think* the intent is that the OP only wants to do the replacement if *all* the lines match the problem, so if you had something like one a one a one one a and they want something like :g/one/s/a/b/ but only if *all* the /one/ matches have a substitute that will take place. In my example above, the 3rd one doesn't have an "a" that would be substituted, so it sounds like the OP would like the whole batch to fail. One would likely have to check the count of substitution-lines before and the number of substitution-lines after, and see if they match. Maybe something like this wrapped in a function: let a=0 let b=0 g/pattern1/let a+=1 g/pattern1/g/pattern2/let b+=1 if (a == b) | g/pattern1/s/pattern2/replacement/g | endif For the OP's "range of lines" version, the pattern1 would be just /^/ and the 3 ":g" commands would need the relevant range before them '<,'>g/pattern1/let a+=1 '<,'>g/pattern1/g/pattern2/let b+=1 if (a == b) | '<,'>g/pattern1/s/pattern2/replacement/g | endif I might be misunderstanding, but at least that's how I parse the "only if the substitution can take place on all" :-) -tim -- -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/att0fQbUZpyh6kIH%40thechases.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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/PAXPR05MB8908533F9BDD37696C3F7DD8F3642%40PAXPR05MB8908.eurprd05.prod.outlook.com.
Re: Atomic Substitution.
On 2026-10-23 16:55, Vim Users wrote: > But I have overseen one thing. Lets see I have a block like this: > > 1 > 1 > 2 > 1 > 1 > 1 > 1 > > And I want to substitute all 1 to 3 but only if all lines can be substituted. > > So this should be refuted while > > 1 > 1 > 1 > 1 > 1 > 1 > 1 > > should be substituted. Maybe something like let refrain=0 | exec 'v/pattern/let refrain+=1' | if (refrain == 0) | %s//replacement/g | endif This assumes we shouldn't refrain from doing the substitution, but if any lines in the file don't match, it will set 'refrain' to a non-zero value. The 'if' block then checks the value to see if it should refrain from doing the substution, and only proceed with the substitution if all the lines matched the /pattern/ in question. Making it work for arbitrary ranges or grep-subsets of lines gets a little trickier, but doable. -tim -- -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/att6Zo3U865p7NW-%40thechases.com.
Re: Atomic Substitution.
But I have overseen one thing. Lets see I have a block like this: 1 1 2 1 1 1 1 And I want to substitute all 1 to 3 but only if all lines can be substituted. So this should be refuted while 1 1 1 1 1 1 1 should be substituted. On 2026-10-23 13:46:11, Janis Papanagnou wrote: > Your description is not quite clear to me. - It sounds as if you want something like > > :g/pattern/s/pattern/replacement/g > > or > > :g/grep-pattern/s/other-pattern/replacement/g > > i.e. use of the "global" command 'g' to select all existing matching lines, > and only on those do another replacement on the second pattern expression. > > For example to replace the word "world" by "vim" only in lines where > "hello world" is seen (but not, e.g., in lines where "world wide web" is written) > > :g/hello world/s/world/vim/g > > If that's not what you want, please clarify. > > Janis > > ________________________________________ > Von: 'Frank Schwidom' via vim_use <vim_use@googlegroups.com> > Gesendet: Freitag, 23. Oktober 2026 15:33 > An: vim_use@googlegroups.com > Betreff: Atomic Substitution. > > Hi. > > I woud like to first make ether a range selection or a grep on ines and after that substitute them but only if the substitution can take place on all itemm. Is that possible? > > Thanks in Advance. > > -- > -- > 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+unsubscribe@googlegroups.com. > To view this discussion visit https://groups.google.com/d/msgid/vim_use/attiQu6zokeSUzll%40debian64. > > -- > -- > 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+unsubscribe@googlegroups.com. > To view this discussion visit https://groups.google.com/d/msgid/vim_use/PAXPR05MB890835EB32D675404728FFDEF3642%40PAXPR05MB8908.eurprd05.prod.outlook.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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/att1TWog2NG6DgMo%40debian64.
Re: AW: Atomic Substitution.
On 2026-10-23 13:46, Janis Papanagnou wrote: >> I woud like to first make ether a range selection or a grep on ines >> and after that substitute them but only if the substitution can take >> place on all itemm. Is that possible? > > Your description is not quite clear to me. - It sounds as if you want > something like I *think* the intent is that the OP only wants to do the replacement if *all* the lines match the problem, so if you had something like one a one a one one a and they want something like :g/one/s/a/b/ but only if *all* the /one/ matches have a substitute that will take place. In my example above, the 3rd one doesn't have an "a" that would be substituted, so it sounds like the OP would like the whole batch to fail. One would likely have to check the count of substitution-lines before and the number of substitution-lines after, and see if they match. Maybe something like this wrapped in a function: let a=0 let b=0 g/pattern1/let a+=1 g/pattern1/g/pattern2/let b+=1 if (a == b) | g/pattern1/s/pattern2/replacement/g | endif For the OP's "range of lines" version, the pattern1 would be just /^/ and the 3 ":g" commands would need the relevant range before them '<,'>g/pattern1/let a+=1 '<,'>g/pattern1/g/pattern2/let b+=1 if (a == b) | '<,'>g/pattern1/s/pattern2/replacement/g | endif I might be misunderstanding, but at least that's how I parse the "only if the substitution can take place on all" :-) -tim -- -- -- 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+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_use/att0fQbUZpyh6kIH%40thechases.com.