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è)方法