35

I'd like to modify my .vimrc to read the value of a variable from an external file. How can I do this?

Specifically, a friend and I share a git repo with our .vim files, but there are a few small differences in what we want in our configs. So most of the file is common, but we use if statements to determine whether to load user-specific sections, like this:

let whoami = "user2"
if whoami == "user1"
...

After checking our common .vimrc out of source control, we each have to change the let whoami assignment so our own section will be loaded. Instead, I'd like to keep a separate file, which can be different for each of us, and from which vim will load that variable value.

Maybe another angle on this is: Will vim automatically read all the files in my .vim directory? If so, we could each put a symlink in there called username.vim, and link that to an external file that would be different for each of us.

Nathan Long
  • 27,435

6 Answers6

47

in your main .vimrc file:

source otherVimScriptFilePath.vim

then just put your variable statement in that file:

" otherVimScriptFilePath.vim
let whoami = "user1"
Robert S Ciaccio
  • 1,660
  • 4
  • 20
  • 25
7

Using a try/catch

Since asking this question, I've come up with another use case for loading an external file: machine-specific tweaks.

Since I may or may not need to make tweaks on a given machine, I'm using a try/catch to load the external file; if there's no such file, I let it fail silently.

" If there are any machine-specific tweaks for Vim, load them from the following file.
try 
  source ~/.vimrc_machine_specific
catch
  " No such file? No problem; just ignore it.
endtry 
Nathan Long
  • 27,435
5

To answer the last question, files in ~/.vim are not automatically loaded, but all files in ~/.vim/plugin are.

Heptite
  • 20,411
5

You can have your ~/.vimrc load another file using the :source command. For example, you could each put your unique commands in ~/.myvimrc and load those commands with

source ~/.myvimrc

Or, as you were thinking, you could each put your name in that file like this:

let user = "user1"

and then put this in your ~/.vimrc:

source ~/.myvimrc
if user == "user1"
    " do this
elseif user == "user2"
    " do that
else
    echo "Invalid user"
endif

Rather than put your names in files, though, you could use $USER as akira suggested, or set user using whoami, like this:

let user = substitute(system('whoami'), '\n', '', '')

The substitute() function is needed because the output of system() usually has a '\n' tacked on the end.

garyjohn
  • 36,494
2

the name of the logged-in user is available in the $USER environment variable. you can access that variable easily:

:echo $USER

so, just use

execute "silent! source vimrc." . $USER

in your vimrc and put your user specific settings into

vimrc.joe

or whatever your login-name is

akira
  • 63,447
0

I'm not sure what your vimrc looks like so this may not be feasible, but if there are large parts that you and your friend share, you might want to break them up into separate plugins. You can add files to the ~/.vim/plugin directory to have them loaded on startup. (They're loaded in alphabetical order -- use :scriptnames to check.)

That way you can each have a vimrc that's completely unique, but all of your common configuration are in plugins. If you break them up logically, then it makes it easy to share with others too.

idbrii
  • 1,298