vim中 如何對(duì) 包含中文的 json 進(jìn)行格式化

1. 問(wèn)題

最近一段時(shí)間開(kāi)始使用vim作為文本編輯器,好處不多說(shuō),就說(shuō)今天遇到的問(wèn)題。
在使用vim編輯json文件的時(shí)候,進(jìn)行json格式化可以在vim命令行模式下使用

:%!python -m json.tool

但是這樣會(huì)有一個(gè)問(wèn)題,就是包含中文的會(huì)變成unicode 字符串
從網(wǎng)上搜了一堆文章都是同一個(gè)解決方案,關(guān)鍵是我這邊還不行,天下文章。。。
后來(lái)干脆自己用python實(shí)現(xiàn)一下。

2. 問(wèn)題分析及解決過(guò)程

2.1 原文本為

{
    "query": {
        "get": "中國(guó)",        "match_all": "美國(guó)"
    },
    "size": 1000
}

在執(zhí)行完上述格式化命令后格式是成功了,但是中文變成unicode字符串

{
    "query": {
        "get": "\u4e2d\u56fd",
        "match_all": "\u7f8e\u56fd"
    },
    "size": 1000
}

2.2 再增加一個(gè)命令,將上面的unicode字符串再替換一下

:%!python -c "import re,sys;sys.stdout.write(re.sub(r'\\\u[0-9a-f]{4}', lambda m:m.group().decode('unicode_escape').encode('utf-8'), sys.stdin.read()))"
{
    "query": {
        "get": "中國(guó)",
        "match_all": "美國(guó)"
    },
    "size": 1000
}

2.3 也就是在vim命令下先后執(zhí)行兩個(gè)命令

:%!python -m json.tool

:%!python -c "import re,sys;sys.stdout.write(re.sub(r'\\\u[0-9a-f]{4}', lambda m:m.group().decode('unicode_escape').encode('utf-8'), sys.stdin.read()))"

2.4 命令提煉

當(dāng)然,如果每次都這樣玩的話那真是要哭了,誰(shuí)記得這么長(zhǎng)的命令啊
所以,我們可以在~/.vimrc 文件中增加一個(gè)命令別稱
下面是我的配置

?  ~ cat ~/.vimrc
set nu
colorscheme darkblue
syntax on
set backspace=2
 command! Jsonf :execute '%!python -m json.tool'
  \ | :execute '%!python -c "import re,sys;sys.stdout.write(re.sub(r\"\\\u[0-9a-f]{4}\", lambda m:m.group().decode(\"unicode_escape\").encode(\"utf-8\"), sys.stdin.read()))"'
?  ~

這樣的話,只需要在vim json 文件的命令行模式中輸入下面的字符串即可 “:” 是命令行模式帶的哈

:Jsonf 

3,環(huán)境相關(guān)

我的機(jī)器是mac
python 是2.7
理論上contos,ubuntu 應(yīng)該也支持,只是用了python最基礎(chǔ)的兩個(gè)方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。