Vim是一个文本编辑器,并且文本编辑器经常是对文本文件进行操作。
文本文件是在文件系统里进行管理的,我们需要通过文件路径来指定文件。
当你需要对路径进行操作的时候,vim提供了一些很有用的内置函数。
绝对路径
有些时候外部脚本取得某些文件的路径是很简单的。运行下面的命令:
:echom expand('%')
:echom expand('%:p')
:echom fnamemodify('foo.txt',':p')
第一条命令用来显示你当前在编辑的文件的相对路径。%代表“当前文件”。vim里还有很多可以用expand()来进行替换的字符串。
第二条命令会输出当前文件的全路径。字符串里的:p用来告诉vim取文件的全路径。vim里也有很多这样的修饰符可以使用。
第三条命令根据当前路径显示foo.txt文件的绝对路径,而不用考虑这个文件是否存在。
fnamemodify()是一个vim函数,它比expand()函数更加灵活,因为它可以指定任何文件,不仅仅只是expand()的特殊字符。
列出文件
有时候你会需要取得某个目录下的文件列表。运行下面的命令:
:echo globpath('.','*')
Vim会列出当前目录下的所有文件。globpath()函数返回一个字符串,包含所有的文件名,文件名之间用回车分割。如果想要拿到第一个列表的话,你可以自己用split来切分。运行下面的命令:
:echo split(globpath('.','*'),'\n')
这次vim会输出一个包含所有文件的列表。
golbpath函数的通配符基本上也是按照你所认为的方式去工作的。运行下面的命令:
:echo split(globpath('.','*.txt'),'\n')
Vim输出当前目录的下所有的以.txt结尾的文件的列表。
你可以通过\*\*
来递归地列举当前文件夹下的所有文件。运行下面的命令:
:echo split(globpath('.','**'))
Vim会输出当前文件夹下的所有文件和文件夹。
globpath的功能非常强大,在你完成本章的练习之后,你会学到更多东西。
fnamemodify
:help filename-modifiers
可用选项如下:
:echo fnamemodify("main.c", ":p:h")
:_%: ::8 ::p ::. ::~ ::h ::t ::r ::e ::s ::gs ::S
%:8 %:p %:. %:~ %:h %:t %:r %:e %:s %:gs %:S
各种效果如下:
Examples, when the file name is "src/version.c", current dir
"/home/mool/vim": >
:p /home/mool/vim/src/version.c
:p:. src/version.c
:p:~ ~/vim/src/version.c
:h src
:p:h /home/mool/vim/src
:p:h:h /home/mool/vim
:t version.c
:p:t version.c
:r src/version
:p:r /home/mool/vim/src/version
:t:r version
:e c
:s?version?main? src/main.c
:s?version?main?:p /home/mool/vim/src/main.c
:p:gs?/?\\? \home\mool\vim\src\version.c
Examples, when the file name is "src/version.c.gz": >
:p /home/mool/vim/src/version.c.gz
:e gz
:e:e c.gz
:e:e:e c.gz
:e:e:r c
:r src/version.c
:r:e c
:r:r src/version
:r:r:r src/version
练习
- Read :help expand().
- Read :help fnamemodify().
- Read :help filename-modifiers.
- Read :help simplify().
- Read :help resolve().
- Read :help globpath().
- Read :help wildcards.