在 vimscript 中创建目录

pla*_*etp 5 vim

我想创建一个目录来存储 Vim 的交换文件在我的.vimrc. 我找到了几种方法来做到这一点,例如:

call mkdir($HOME . "/.vim/swap", "p", 0700)
silent! call system('install -dm 700 ~/.vim/swap')
Run Code Online (Sandbox Code Playgroud)

哪种方式更好,为什么?

fil*_*den 9

前者:

call mkdir($HOME . "/.vim/swap", "p", 0700)
Run Code Online (Sandbox Code Playgroud)

比后者更好:

call system('install -dm 700 ~/.vim/swap')
Run Code Online (Sandbox Code Playgroud)

内置mkdir()更好的一些原因:

  • 更高效:从 Vim调用内置函数,Vim 只需使用系统调用mkdir()直接创建目录即可。mkdir()这非常简单而且便宜。另一方面,调用system()意味着 Vim 必须生成一个单独的进程,在大多数情况下是一个 shell,然后它必须解释命令行,然后解释exec()外部二进制文件(在本例中为install),以便它可以使为您提供的目录。

  • 更便携: Vim 内置功能mkdir()可在非 Unix/Linux 或类 Unix 系统(特别是 Windows)上使用。(在这种特殊情况下,由于.vim目录上的名称,您可能会在使用 Windows 时遇到问题,但要点是,Vim 内置函数可以在非 Unix/Linux 平台上工作。)与可移植性相关的另一点是后者取决于install可用的二进制文件,而在裸机系统上可能并非如此。此外,某些系统具有二进制文件,例如install采用不同的非标准命令行选项,并且可能无法识别您使用的选项。鉴于 Vim 可以运行的不同平台多种多样,对此进行测试非常困难。

  • 更安全:运行外部 shell 命令需要正确转义参数,这可能很难正确转义,因为正常情况(没有空格或特殊元字符)通常无需特殊预防措施即可工作。这对于内置函数来说不是问题mkdir(),它将目录名称作为单个参数,并且不会遇到空格或元字符的问题。

  • 更好的错误处理:在您的示例中,您已经用于silent!生成外部命令的情况(大概是在运行命令时跳过任何“按 Enter”提示)...但这意味着如果出现问题(例如,在一种阻止创建目录的方法),您不会看到一条错误消息让您知道这一点。另一方面,如果内置mkdir()失败,您应该有一个明确的错误消息,指示发生了什么以及为什么。