Vim:浏览文件中定义的文件层次结构?

问题描述 投票:0回答:1

是否有办法让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插件,但没有看到一个示例作为起点,但似乎类似的东西必须放在某个地方...

谢谢!

json vim directory-structure netrw
1个回答
0
投票

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”),等等。

© www.soinside.com 2019 - 2024. All rights reserved.