如何根据我在 vim 中访问的当前文件夹创建条件函数?

How create a conditional function based on the current folder that I am accessing in vim?

我有时在 linux 内核代码上工作,几乎每次我在编辑内核源代码时都忘记在 vim 上设置 :set noexptab

我的默认 vimrc 将制表符扩展为空格,但我希望有一个功能可以区分我当前是否正在编辑内核源代码,并相应地设置 expandtab

基本上内核源码都在linux-x.x.x目录下,根目录在哪里我打开的目录是vim。我相信这是起点。

有很多插件和其他方法可以处理项目特定的设置。我通常会强烈支持插件方法,因为它不会聚集你的 vimrc。但在您的情况下,这意味着将项目设置文件复制到每个新的内核文件夹。所以在这种情况下,我会使用以下自动命令:

autocmd BufNewFile,BufRead /path/to/folder/linux-*/* set noexpandtab

我经常为每个项目(更普遍的是每个客户)设置一些设置,因此使用一种通用的方法来指定每个客户的设置对我很有用。我在我正在处理的任何项目的根目录中创建了一个名为 local.vimrc 的文件(或更一般地说,命名为 <client-name>.vimrc 和符号链接),然后让它发挥它的魔力...

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        let l:file = fnamemodify(l:file, ":p")
        execute "source" l:file
        execute "nnoremap <buffer> <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

然后 local.vimrc 使用 map <buffer> ...setlocal 将映射和设置保存在使用它们的缓冲区本地(因为我有时会在不同的选项卡中加载来自不同客户端的文件).

(在上面的代码片段中,我正在重新映射 F8 以在新选项卡中打开我的 vimrc 和 local.vimrc;s:this_file 在其他地方捕获作为 expand("<sfile>").)