是否有办法让vim(或插件)读取json文件并使用它来定义浏览结构?
在我的情况下,json文件定义了一本小说,它是各章的集合。一章是一组场景文件。
这样做的原因是允许许多不同的组织使用同一组文件。基于磁盘的目录/文件结构不够灵活,无法用于多个层次结构。
我想在文件浏览器窗口中看到类似的内容,其结构在json文件中定义(请参见下面的示例):
MyNovel/
Beginning/
001
002
003
Middle/
004
100
101
End/
203
202
201
{
"version" : "2.0",
"manuscript" : {
"title" : "MyNovel",
"chapters" : [
{
"title" : "Beginning",
"scenes" : ["001", "002", "003"]
},
{
"title" : "Middle",
"scenes" : ["004", "100", "101"]
},
{
"title" : "End",
"scenes" : ["203", "202", "201"]
}
]
}
}
在这种情况下,MyNovel
,Beginning
,Middle
和End
是场景文件的虚拟分组,并且在磁盘上不存在。
我很高兴能破解我自己的解决方案。我看过最常见的vim插件,但没有看到一个示例作为起点,但似乎类似的东西必须放在某个地方...
谢谢!
VimScript已经具有两个内置函数来本地支持json:json_encode()
和json_decode()
。可以将“浏览器”实现为具有预设内容的另一个缓冲区。
非常原始的草图(没有任何错误检查等):
function! DisplayAsTree(bufnr)
let l:mytree = json_decode(join(getbufline(a:bufnr, 1, "$")))
new
call setline(1, l:mytree.manuscript.title . "/")
for l:chap in l:mytree.manuscript.chapters
call append("$", repeat(' ', &ts) . l:chap.title . "/")
for l:scene in l:chap.scenes
call append("$", repeat(' ', 2 * &ts) . l:scene)
endfor
endfor
endfunction
但是最复杂和令人讨厌的部分将是所需功能的实际“类似于浏览器的”实现。例如,您可能想要设置一些选项,例如:h 'buftype'
和:h 'concealcursor'
,以及一些:h map-<buffer>
中的一些:h autocommands
映射。
[原则上,有很多Vim插件显示一种或另一种这样的“专用缓冲区”,不仅是像vim-dirvish这样的“文件浏览器”,而且例如许多插件管理器(例如minpac)也这样做。另外,有些书籍可能会讨论此类插件的编写(例如“ VimL Primer”),等等。