简体   繁体   中英

vim and sudo vim using different settings on openSUSE

I want vim to save folded code after I've closed the file. I've added the following code to both /etc/vimrc and ~/.vimrc:

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview

When I open a file as a regular user (vim file) it works as expected. If I instead open with sudo vim file it doesn't save folded code.

I know /etc/vimrc is being read. My theme is set at the bottom of that file and is working fine. I ran into a similar problem last week installing the vim surround plugin. When that was installed in ~/.vim it only applied to vim file. To get it working with sudo I had to install it separately in /usr/share/vim/current. What could be causing this?

Prolog

In fact you answered your question, so this is indeed the same issue you had before. It is caused by the algorithm Vim uses to find its configuration (see :help initialization ). But I wouldn't call your solution a correct one. See :help $VIM for information how you can use your configuration in sudo environment (eg being root ).

As for your current issue.

See the following quotes from the documentation. :help :mkview :

:mkvie[w][!] [file] ...
        When [file] is omitted or is a number from 1 to 9, a
        name is generated and 'viewdir' prepended.
                    ...

And :help 'viewdir' :

 'viewdir' 'vdir'   string (default for ... for Unix: "~/.vim/view", ...

So after doing sudo all views are stored by Vim at /root/.vim .

Solution

Make viewdir point to your ~/.vim/view directory, with something like the following in /root/.vimrc :

:set viewdir=/home/user/.vim/view

Though, this approach has some issues itself:

  1. Updating views saved by root will cause permission errors.
  2. You wont be able to pass stored views for files under /root or /home/user , because Vim generates file names with tilde instead of full paths.

The first issue can be solved by running chown or chmod on new view file right after executing :mkview command. It should be something like:

execute '!chown user:group' eval('&viewdir').'/'.substitute(expand('%:p:~'), '/', '+=', 'g').'='

But I don't know good solution for the second issue, can only suggest writing a script to convert file names to full paths.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM