0

有没有办法让 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"]
        }
    ]   
}
}

在这种情况下,MyNovelBeginningMiddleEnd是场景文件的虚拟分组,并且不存在于磁盘上。

我很高兴破解我自己的解决方案。我查看了最常见的 vim 插件,并没有看到一个可以用作起点的示例,但似乎这样的东西必须存在于某个地方......

谢谢!

4

1 回答 1

-1

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'and :h 'concealcursor',以及一些:h map-<buffer>映射:h autocommands

原则上,有大量的 Vim 插件显示一种或另一种这样的“专用缓冲区”,不仅仅是“文件浏览器”,例如 vim-dirvish,而且很多插件管理器(例如 minpac)也这样做。还有一些书可能会讨论编写这样的插件(例如“The VimL Primer”),等等。

于 2019-11-02T16:38:37.930 回答