Vim将内容行转换为JavaScript字符串文字

Vim convert lines of content to javascript string literal

本文关键字:JavaScript 字符串 文字 转换 Vim      更新时间:2023-09-26

我在vim脚本中寻找一些方法

json.dumps(join(getlines(1,'$'),''n'))

就像Python的JSON模块一样

例如,在 Vim 中打开一个文本文件:

1. var  a=1,
2. b=2,
3. c="";

调用函数应输出以下内容

"var a=1,'nb=2,'nc='"'""

它是一个有效的JavaScript字符串文字

无论如何,我找到了一种方法来实现这一点,以下是我的代码

let b:content = join(getline(1,'$'),"''n'''n") . "'''n"
let b:content = printf("'"%s'"", escape(b:content,"'""))

上面的代码运行后,你会得到

"var  a=1, 'n'
 b=2,'n'
 c='"'";'
 "

这是一个有效的多行 javascript 字符串文字,但缺点是此功能将根据这篇文章在 ECMA-262 第 3 版中删除

阅读RFC后,我编写了这个函数,也许有帮助

" utility encode to json string
if !exists("*b:json_encode_basestring")
    function b:json_encode_basestring(str)
        let l:ret = a:str
        let l:ret = substitute(l:ret,''%x5C','''''','g')
        let l:ret = substitute(l:ret,''%x22','''"','g')
        let l:ret = substitute(l:ret,''%x2F','/','g')
        let l:ret = substitute(l:ret,''%x08','''b','g')
        let l:ret = substitute(l:ret,''%x0C','''f','g')
        let l:ret = substitute(l:ret,''%x0A','''n','g')
        let l:ret = substitute(l:ret,''%x0D','''r','g')
        let l:ret = substitute(l:ret,''%x09','''t','g')
        " TODO unicode escape
        " http://www.ietf.org/rfc/rfc4627
        return l:ret
    endfunction
endif
if !exists("*b:json_encode")
    function b:json_encode(lines)
        let l:json = []
        let l:lines = a:lines
        for line in l:lines
            call add(l:json, b:json_encode_basestring(line))
        endfor
        let l:str = join(l:json,''n').''n'
        let l:str = printf('"%s"',l:str)
        return l:str
    endfunction
endif

用法:

:echo b:json_encode(getline(1,'$'))