如何相对于文件来源文件?

时间:2017-10-26 21:57:37

标签: vim

我试图将vimrc分成多个文件 - init.vimkeybindings.vimui.vim等等 - 但我无法做到让Vim获取相对于init.vim的源文件(而不是相对于我从哪里发起Vim的源。

这就是我在init.vim顶部所获得的:

source keybindings.vim
source ui.vim

如果我从与这些文件相同的目录运行vim,它可以正常工作;如果我从任何其他目录运行它,我会收到以下错误:

Error detected while processing /path/to/vimrc:
line 1:
E484: Can't open file keybindings.vim
line 2:
E484: Can't open file ui.vim
Press ENTER or type command to continue

编辑:值得注意的是我使用的是NixOS,因此我不知道绝对路径是什么,也不知道如果我发现它们会不变。

7 个答案:

答案 0 :(得分:3)

Source需要完整路径,但您可以使用以下内容简化它:

let path = expand('%:p:h')
exec 'source' path . '/keybindings.vim'

您可以在此处查看我的内容 - https://github.com/dhruvasagar/dotfiles/blob/master/vim/vimrc以供参考。

答案 1 :(得分:2)

我认为你可以使用

runtime keybindings.vim

答案 2 :(得分:1)

如果订单不重要,您只需将脚本放入~/.vim/plugin/,它们将在~/.vimrc之后提供。您可以检查:scriptnames输出以查看何时获取来源。

您可以通过插件文件名稍微影响排序。例如,我有~/.vim/plugin/00plugin-configuration.vim配置Vim插件; 00...确保首先获取此内容。

为了获得更好的控制,我会将脚本放入~/.vim/。 Vim会在那里忽略它们,但可以通过:runtime轻松解决它们,它会查找所有运行时路径,而~/.vim/通常包含在'runtimepath'中:

# .vimrc
runtime init.vim
runtime keybindings.vim
...

相关帮助页面::help .vimrc:help load-plugins

答案 3 :(得分:0)

在Dhruva的回答基础上,你可以提供一个帮助解决这个问题的功能

function! SourceLocal(relativePath)
  let root = expand('%:p:h')
  let fullPath = root . '/'. a:relativePath
  exec 'source ' . fullPath
endfunction

然后你就像

一样使用它
call SourceLocal ("yourScript.vim")

答案 4 :(得分:0)

这些都是很好的解决方案,而这正是我最终使用的。

let home = expand('~')
exec 'source' home . '/.config/nvim/prettierConfig.vim'

答案 5 :(得分:0)

我在Neovim中遇到了与您完全相同的问题。我将大的init.vim文件分割成几个小的vim脚本,我想在init.vim中获取它们。 这是我根据@Dhruva Sagar的链接最终得到的:

let g:nvim_config_root = stdpath('config')
let g:config_file_list = ['variables.vim',
    \ 'options.vim',
    \ 'autocommands.vim',
    \ 'mappings.vim',
    \ 'plugins.vim',
    \ 'ui.vim'
    \ ]

for f in g:config_file_list
    execute 'source ' . g:nvim_config_root . '/' . f
endfor

答案 6 :(得分:0)

由于没有任何解决方案可以真正替代 source 在全球范围内工作(在任何脚本上,甚至源自 vimrc),我最终得到了这个解决方案并决定在这里分享,它可以在相对支持的情况下用作 source 的替代品,简单如下:

Rsource /home/me/.vim/your/file/path
Rsource $HOME/.vim/your/file/path
Rsource your/file/path
Rsource ../your/file/path

要使用它,必须先在您的 vimrc 或任何源自它的文件中定义它,然后才能使用 Rsource

if !exists('g:RelativeSource')
    function! g:RelativeSource(file)
        let file = expand(a:file)

        " if file is a root path, just source it
        if stridx(file, '/') == 0
            exec 'source ' . file
            return
        endif

        let sfile = expand('<sfile>:p:h')

        " If this is called outside this script, it will contains this script
        " name, this function name, a script_marker then the executing script name
        " In this case we extract just the last part, the script name which called
        " the this function
        let script_marker = '..script '
        let path_index = strridx(sfile, script_marker)

        if path_index == -1
            let path_index = 0
        else
            let path_index += len(script_marker)
        endif

        let path = strpart(sfile,path_index)
        let absolute_path = resolve(path . '/'. file)

        exec 'source ' . absolute_path
    endfunction

    command! -nargs=1 Rsource :call g:RelativeSource(<q-args>)
endif

这可以安全地用于任何脚本或插件。