1

我在 vim-script 中寻找一些方法

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 3rd Edition 中删除

4

1 回答 1

0

阅读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,'$'))
于 2012-05-08T19:53:59.983 回答