列出JSON中给定文件夹的文件

时间:2019-04-18 02:52:52

标签: vim

使用Vim。 假设我有一个包含很多文件的文件夹,我需要以某种方式列出它们...

choere_01.mp3 choere_02.mp3 choere_03.mp3 choere_04.mp3 choere_05.mp3 choere_06.mp3 choere_07.mp3 choere_08.mp3 choere_09.mp3 choere_10.mp3 choere_11.mp3 choere_12.mp3 ...

最简单的生成JSON文件的方式是什么:

 {
   "audio":[
     {"file":"choere_01.mp3"},
     {"file":"choere_02.mp3"},
     {"file":"choere_03.mp3"},
     {"file":"choere_04.mp3"},
     {"file":"choere_05.mp3"},
     {"file":"choere_06.mp3"},
     {"file":"choere_07.mp3"},
     {"file":"choere_08.mp3"},
     {"file":"choere_09.mp3"},
     {"file":"choere_10.mp3"},
     {"file":"choere_11.mp3"},
     {"file":"choere_12.mp3"},
     ...
    ]
  }

我已经使用Vim 8个月了,并认为自己是新手。 此任务可以在其他编辑器中快速完成。什么是神奇的vim方式?任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

好吧,不确定为什么要在Vim中这样做,那里可能有更好的工具。

但是,这是在Vim中编写脚本的一种方法,它可能还可以做更多 互动使用宏和:s魔术;)

首先定义一个Vim函数:

func DirContents2Json()
  let list=glob('*.mp3', 0, 1)
  let b=map(sort(copy(list)), { i, v -> {'file': v}})
  return json_encode({'audio': b})
endfunc

此函数首先返回当前目录中所有mp3文件的列表,然后使用lambda表达式将返回的列表转换为字典列表。最后,它返回带有“音频”键的字典,该字典包含列表,并使用json_encode()函数将其转换为json。

要运行它,请在包含文件的目录中打开Vim,然后调用:call append('$', DirContents2Json())。要正确格式化,您可以使用例如!!python -m json.tool或类似的内容。

这至少需要一个Vim 8.1

答案 1 :(得分:0)

我不确定是否需要列出文件或生成整个json。如果是后者,则Christian的答案是完美的,应该对您来说很有效!

如果通常在当前缓冲区中列出文件,那么可以使用一种更直观的方法。而且由于您是相对较新的人,请添加此内容,以防万一您以前不认识它(因为这真让我感到震惊,当我第一次认识这时:))

Vim可以运行外部Shell命令,并使用:r!将命令的输出输入当前缓冲区。这非常强大,因为您可以通过管道传递多个命令以获得所需的输出。例如,您可以使用cat过滤器读取大文件,使用grep反向sort输出,依此类推,依次类推 然后将其输入到当前文件中。缓冲。

例如,无论如何要为目录中的每个文件输入"file": "somefile.mp3"",您可以使用以下命令:

:r! ls /some/directory/where/files/are | grep '.mp3' | awk '{$line = "\"file\": \"" $1 "\""; print $line }'

分解它,该命令执行3个步骤

  • 使用ls列出文件
  • 使用grep仅过滤.mp3个文件
  • 以uisng awk的必需格式打印