我试图将vimrc
分成多个文件 - init.vim
,keybindings.vim
,ui.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,因此我不知道绝对路径是什么,也不知道如果我发现它们会不变。
答案 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
这可以安全地用于任何脚本或插件。