Am 19.05.2010 15:30, schrieb Bram Moolenaar:
Andy Wokula wrote:
BTW: How do you now insert a literal <CR> or a literal <NL>?
abc<CR>def
:s/.*/\="abc\\\<CR>def"/
s/.*/\="abc<CR>def"/
No need for backslashes. If you want to get \<CR> then you need to use
two backslashes:
s/.*/\="abc\\<CR>def"/
I know how to get < C R > ;-) Sorry, with "literal <CR>", I meant the
carriage return character.
With an unpatched Vim, the above :substitute (that one with 3
backslashes) and the two cited :substitutes below achieve the same
result (^M = one character):
abc\^Mdef
(or :s/.*/\="abc\\\rdef"/
or :s/.*/\='abc\^Mdef'/ where ^M was inserted with<C-V><CR>)
It now breaks the line.
What about backwards compatibility?
Yes, that worried me too. But the example of replacing literal text by
using submatch(N) is most convincing. The basic idea now is that the
expression returns literally what needs to be inserted.
Ok, that is right:
:s/.*/&/
and
:s/.*/\=submatch(0)/
should always give the same result.
Only problem now is to make it possible to insert a line break. That
would be a NUL, but that also terminates the string...
I had a script dealing with conversion of binary data, it's (most
probably) broken now.
Sorry, I should have checked: it's not broken. It takes carriage
returns, line feeds / null chars as special cases, without using \=.
So actually, I don't have a good example that needs to insert special
characters via \= .
I also see updates for other scripts due to this patch, e.g.
Vimscript #162, auctex.vim, v2.2.1 -> v2.2.2
Not nice. So do we prefer the old solution? That will also allow for
inserting a line break again.
I think indeed the problem is backwards compatibility:
How to write new code, how to fix old code?
Just ignore older Vims (like auctex does it)? If that is not wanted,
then something like the following will be needed (untested):
if v:version > 702 || v:version == 702 && has("patch407")
let s:sr_esc = ''
else
let s:sr_esc = '\'
endif
s/.../\=escape(submatch(0), s:sr_esc)/
" or
let s:sr_esc = !(v:version > 702 || v:version == 702 && has("patch407"))
if s:sr_esc
s/.../\=escape(submatch(0), '\')/
else
s/.../\=submatch(0)/
endif
Apparently, this is not easier.
On the other hand: Older scripts, where the author wasn't aware of the
escaping issue, are magically fixed now.
Hmm, at the moment, I cannot clearly vote for or vote against the patch.
So my suggestion is to keep it, fix remaining bugs, and wait for
problems to come ... :-/
--
Andy
--
You received this message from the "vim_dev" 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