如何获取当前文件的名称和扩展名?


24

有没有办法使用vimscript获取文件的名称和扩展名?

如果是这样,我想分别输入名称和扩展名。


“一份文件”?哪个文件?当前缓冲区中的那个?搜索路径中某处的文件?
muru

用户通过`vim <文件名>打开的文件
iProgram 2015年


我不想要完整的路径。我只想要文件的名称和扩展名。不是路径,我也想在vimscript中使用它。
iProgram

是的,这两个答案实际上都在链接的问题中(特别是CharlesL的答案)...
Martin Tournoij 2015年

Answers:


27

来自:he filename-modifiers

    :t      Tail of the file name (last component of the name).  Must
            precede any :r or :e.
    :r      Root of the file name (the last extension removed).  When
            there is only an extension (file name that starts with '.',
            e.g., ".vimrc"), it is not removed.  Can be repeated to remove
            several extensions (last one first).

    :e      Extension of the file name.  Only makes sense when used alone.
            When there is no extension the result is empty.
            When there is only an extension (file name that starts with
            '.'), the result is empty.  Can be repeated to include more
            extensions.  If there are not enough extensions (but at least
            one) as much as possible are included.
Examples, when the file name is "src/version.c", current dir
"/home/mool/vim":
  :p                    /home/mool/vim/src/version.c
  :t                                       version.c
  :t:r                                     version
  :e                                               c

您可以使用该expand函数来扩展它们并获取它们的值:

:let b:baz=expand('%:e')

例如:

$ vim '+ exe ":normal i" . expand("%:t") . "^M" . expand("%:e")' +wqa foo.bar; cat foo.bar
foo.bar
bar

:t必须在任何:r或:e之前,”但:e“仅在单独使用时才有意义”。通过示例,我会支持后者,但有趣的是文档在那里相互矛盾。
SnoringFrog 2015年

@SnoringFrog我相信这意味着您不能做:e:t,但:t:e被允许,即使没有意义。
muru

哦,我知道怎么可以这样读。那是有道理的。
SnoringFrog 2015年

10

可以使用expand(),请参见:h expand()

在脚本中,您可以执行以下操作来获取文件名:

let file_name = expand('%:t:r')

要扩展,您可以执行以下操作:

let extension = expand('%:e')

expand()功能可以扩展通配符和特殊符号。在这里,我使用%了扩展到当前文件名的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.