Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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.

share|improve this question

6 Answers 6

up vote 7 down vote accepted

in your main .vimrc file:

source otherVimScriptFilePath.vim

then just put your variable statement in that file:

" otherVimScriptFilePath.vim
let whoami = "user1"
share|improve this answer
    
This works great! Thanks. –  Nathan Long Dec 22 '10 at 15:09
    
FYI - In my situation, it was helpful to do let whoami = "" right before the source line, so that if it fails to load the external file, the variable exists and I get the error message we had set up previously for the variable not being set. –  Nathan Long Dec 22 '10 at 15:10
1  
@GorillaSandwich: I use this to source my vimrc on my windows machine since windows doesn't have symbolic links. I have an SVN folder that contains this and all my other dot-files. So I just have an _vimrc that sources the real one in the svn folder. –  Robert S Ciaccio Dec 22 '10 at 17:01
    
@GorillaSandwich: see my answer for the silent! source part –  akira Dec 23 '10 at 7:25

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

share|improve this answer
1  
and some other places underneath ~/.vim (after, autoload) –  akira Dec 22 '10 at 6:52

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

share|improve this answer

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.

share|improve this answer
    
whoami does not work on windows –  akira Dec 22 '10 at 8:02
    
@akira: True, but GorillaSandwich is using Unix, not Windows. $USER doesn't work with Windows, either, at least not Windows XP. –  garyjohn Dec 23 '10 at 6:24
    
just saying, on windows its $USERNAME. mainpoint is: whoami spawns a new process, when you open your editor it should be fast and not (useless) doing work several times again. –  akira Dec 23 '10 at 7:24

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 
share|improve this answer

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.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.