Running execute g:xx doesn't work.
let g:str="move to right win\t<C-w>h"
let g:temp=escape(matchstr(g:str,'\(\t\)\@<=.*$'),'<')
let g:xx= "normal ".g:temp
execute g:xx
Can anyone explain why?
Running execute g:xx doesn't work.
let g:str="move to right win\t<C-w>h"
let g:temp=escape(matchstr(g:str,'\(\t\)\@<=.*$'),'<')
let g:xx= "normal ".g:temp
execute g:xx
Can anyone explain why?
let g:temp=eval('"'. g:temp .'"')
after
let g:temp=escape(matchstr(g:str,'\(\t\)\@<=.*$'),'<')
Extracting this into a :function:
function! Literalize(string)
" get already properly escaped sequences out of the way, so we don't double-escape them
let s = eval('"'. a:string .'"')
" escape remaining special key sequences
let s = escape(s, '<')
let s = eval('"'. s .'"')
return s
endfunction
The problem was that escape() handles its input° and output strings as a literal-string (as in single quotes ''). So escaping the < in "<C-w>" results in '\<C-w>', not the desired "\<C-w>"/'^W'.
° If the input is given as a double quoted "string", its escape sequences are evaluated by the vimscript parser, before it is passed to escape().
In your first line, the <C-w> is not escaped, so it appears to be matched as a literal string, and the escape function doesn't convert it to the ^W character.
So to get what you want, the first line should actually read
let g:str="move to right win\t\<C-w>h"
In addition, according to the documentation here at sourceforge, the escape command doesn't work how you appear to think. It's going to escape just the '<' character, which does nothing.
eval() can do that 'with a little help' – see my answer.