1. 问题
最近一段时间开始使用vim作为文本编辑器,好处不多说,就说今天遇到的问题。
在使用vim编辑json文件的时候,进行json格式化可以在vim命令行模式下使用
:%!python -m json.tool
但是这样会有一个问题,就是包含中文的会变成unicode 字符串
从网上搜了一堆文章都是同一个解决方案,关键是我这边还不行,天下文章。。。
后来干脆自己用python实现一下。
2. 问题分析及解决过程
2.1 原文本为
{
"query": {
"get": "中国", "match_all": "美国"
},
"size": 1000
}
在执行完上述格式化命令后格式是成功了,但是中文变成unicode字符串
{
"query": {
"get": "\u4e2d\u56fd",
"match_all": "\u7f8e\u56fd"
},
"size": 1000
}
2.2 再增加一个命令,将上面的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": "中国",
"match_all": "美国"
},
"size": 1000
}
2.3 也就是在vim命令下先后执行两个命令
:%!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 命令提炼
当然,如果每次都这样玩的话那真是要哭了,谁记得这么长的命令啊
所以,我们可以在~/.vimrc
文件中增加一个命令别称
下面是我的配置
➜ ~ 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,环境相关
我的机器是mac
python 是2.7
理论上contos,ubuntu 应该也支持,只是用了python最基础的两个方法