vim中 如何对 包含中文的 json 进行格式化

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最基础的两个方法

你可能感兴趣的:(vim中 如何对 包含中文的 json 进行格式化)