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-2623rdEditionで削除されるという欠点があります。

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 に答える