【问题标题】:Vim: browse a file hierarchy defined in a file?Vim:浏览文件中定义的文件层次结构?
【发布时间】:2020-02-28 12:32:38
【问题描述】:

有没有办法让 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】:

    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 autocommands 中的一些:h map-<buffer> 映射。

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

    【讨论】:

    • 谢谢,马特。我订购了这本书,并将深入研究上面的示例。我没想到这是它自己的缓冲区/上下文——希望添加到现有的插件中——但这将是一个简单的、独立的解决方案。谢谢!
    猜你喜欢
    • 2012-10-13
    • 2013-10-03
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多