Vim: просматривать файловую иерархию, определенную в файле? - PullRequest
0 голосов
/ 02 ноября 2019

Есть ли способ заставить 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 и не вижу примера для использования в качестве отправной точки, но кажется, что-то вроде этого должно быть где-то там ...

Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2019

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) тоже делают это. Также некоторые книги могут обсуждать написание таких плагинов (например, «The VimL Primer») и т. Д.

...