我有一份文件列表
file1.ext
file2.ext
...
如果我的光标位于 file2.ext 内,我该如何创建名为 file2.ext 的文件。有点像gf
只用于创建新文件(这是一个假设的情况,只是觉得将来可能会有用)。
答案1
我想到的第一件事是使用touch
带有光标下的文件名作为参数的命令:
:map <silent> <leader>cf :!touch <c-r><c-p><cr><cr>
但是有一个纯 Vim 解决方案,可以跨平台移植。内置函数将writefile
列表的内容逐行写入文件。当然,当输入列表为空时,它会创建一个空文件。(:help writefile()
有关详细信息,请参阅。)我们可以利用这个副作用:
:map <silent> <leader>cf :call writefile([], expand("<cfile>"), "t")<cr>
请注意,可以使用不同的模式来调整文件名提取expand
(请参阅:help expand()
)。
顺便说一句,如果不想创建文件,而只是打开它进行编辑,可以定义一个更简单的gf
映射:
:map <leader>gf :e <cfile><cr>
其中该命令可以被或类似的命令:e
替换。:tabe
答案2
我采纳了上面 ib 的优秀答案,并对其进行了如下扩展。我的目标是使用 vim 根据 wiki(在本例中为 Gollum wiki)的需要创建新的 markdown 文件
我首先尝试:
map <silent> <leader>cf :call writefile([], expand("<cfile>"), "t")<cr>`
上述方法确实有效,正如答案中所述。但是,起初我以为它不起作用,因为我实际上没有看到文件在 vim 中打开。使用下面的第二段代码将打开一个新文件 - 这更符合我的要求。所以我将它们组合起来并尝试:
map <leader>cf :e <cfile><cr>
但这对于 wiki 不起作用,因为当您尝试使用类似[[the-new-file]]
wiki 的语法在 wiki 中创建新文件时,语法不允许在括号中使用文件的扩展名。但是,Vim 需要在创建新文件时知道扩展名才能正常工作。在这种情况下,我使用了:
map <leader>cf :e <cfile>.md<cr>
这样我就可以创建新的 markdown 文件。有办法进一步自定义它(例如,不对扩展进行硬编码),但上面的方法可以满足我的需求。如果我需要另一个扩展(例如,保存 .wiki 文件),我可能会采取简单的方法并制作另一个地图,如下所示:
map <leader>cwf :e <cfile>.wiki<cr>
作为一个附带好处,您可以使用相同的命令来打开已经存在的 markdown 文件(标准gf
命令在这里不起作用,因为缺少文件扩展名)。