彻底解决vim打开文件时不会跳转到上次光标所在处

彻底解决vim打开文件时不会跳转到上次光标所在处



背景



  • 这个说大不大说小不小的问题无论是在Mac上还是Linux上都已经在最近困扰过我好久了,印象中几年前曾经解决过一次, 最近又故态重发,刚好今天闲来无事Google一下,解决解决这个问题。


环境



  • OS Linuxmint19.2
  • Vim 8.0


参考



  • http://eunsetee.com/eMJX


第一步



  • 第一步呢,要先找到vim系统级的配置文件在哪里,因为要取消里面的几行关于打开文件跳转到上次光标所在处的代码注释,代码如下:


" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif


上面的我已经把注释取消了,现在问题来了,这个系统级的vim配置在哪里呢,我们可以打开终端执行一下vim --version, 然后会看到输出里面有下面几行字:

   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/share/vim"


可是当你echo $VIM的时候却没有任何输出,这时候我只能说find大法好了, 我们执行下面的命令:

$ sudo find / -name vimrc
[sudo] password for sharp:
find: ‘/proc/1501/task/1501/net’: Invalid argument
find: ‘/proc/1501/net’: Invalid argument
/usr/share/vim/vimrc
/home/sharp/.vim/bundle/Vundle.vim/test/vimrc
find: ‘/mnt/hgfs/D/System Volume Information’: Permission denied
find: ‘/run/user/1000/doc’: Permission denied
find: ‘/run/user/1000/gvfs’: Permission denied
/etc/vim/vimrc


很显然最后一行的路径是我们要找的系统级VIM配置文件,赶紧打开后取消上面提到的代码的注释吧。

第二步



  • 做到这里,想必读者你以为已经做完了一切的工作,跃跃欲试的找个文件用vim打开两次看看第二次打开的时候光标有没有调到第一次退出的地方, 很抱歉,对于笔者这里的情况来说,光标并没有跳转到我想要的位置,那问题出在哪里呢? 其实是不知道什么原因,家目录下的有一个叫.viminfo的文件的属组被改为root:root了,如下所示:


-rw-------  1 root  root  3.2K Oct 27 22:33 .viminfo


这里呢,你只需要把它重新改为你自己的用户名就行了,比如我的是下面这个:

sudo chown sharp:sharp ~/.viminfo


做完这一步恭喜你,你再随便找个文件打开两次,第二次打开的时候光标一定在你第一次退出的地方了。

写在最后



有人知道为什么.viminfo的属组会被改成root:root了么,以及为什么把属组改正确后一切就正常了呢,还有以后怎么规避这个问题呢? 如果有大佬知道欢迎在评论区留言哦~

6 评论 在 “彻底解决vim打开文件时不会跳转到上次光标所在处

  1. 怎么说呢。正确的姿势应该是用你自己的 vimrc 覆盖系统的配置。
    至于为什么会变成 root 组,是因为那个 .viminfo 文件是你编辑系统 vimrc 的时候创建的。编辑的时候是 root ,编辑完创建 .viminfo 当然也是 root。之后再从普通用户去打开文件,没权限读写这个 root 的 .viminfo 当然就没法跳转到正确的位置了。
    最后怎么解决?请看第一行。
    既然想到了用户组,为什么不多想一步呢?毕竟用户组和权限管理关系这么紧密。
    最后的最后,为什么 root 创建的 .viminfo 会出现在你自己的 HOME 目录下呢?要不要思考一下?

    1. 我编辑系统vimrc的时候一般是用sudo,没有切换到root用户去编辑过,刚刚测试了一下用sudo编辑系统vimrc,发现属组并没有变成root:root,至于为什么 root 创建的 .viminfo 会出现在你自己的 HOME 目录下,那应该是切换用户的时候没有加’-‘把环境变量和家目录一块切过去,可是问题来了,我压根儿就没有切换到root去编辑系统vimrc呀~

      1. 按你的操作流程走一遍。

        1. 你的 home 目录没有 viminfo
        2. 你用 sudo 编辑了系统 vimrc 以支持 viminfo
        3. 保存时,你的身份是 root (因为是sudo),但是 home 目录是你自己的用户的 home
        4. vim 要创建 viminfo 。于是用 root 身份 + 你自己的 home 目录,创建了一个 viminfo
        5. sudo结束,你用普通用户打开 vim ,这时候要去读自己 home 目录下的 viminfo ,但这个文件是 root 创建的,没权限
        6. 修改权限组,把文件所有者改成当前用户,解决了问题

        1. 可是我测试过用sudo编辑系统vimrc,发现属组并没有变成root:root呀~

          1. 从来都没有“变成”这种说法。只有“这个文件不存在时,编辑/创建这个文件的人是谁”这种说法。

            你编辑系统vimrc没有改变用户组,因为本来就不会改变。但你第一次编辑的时候你home目录下可是没有viminfo的。(因为一开始你并没有打开这个功能)

            随着你编辑保存,这个文件才同时被创建。这时候你的身份是root,但home目录还是自己的目录。所以才会很奇怪的在你自己的home目录下创建了一个属于root的文件。

            并不是你home目录下的viminfo被设置成了root组和root用户。而是你以root身份在自己的home目录下“创建了”一个viminfo。

            以root身份创建,那用户组和所有者都是root就合情合理了。

          2. 谢谢你的解答,我首先是google了一下viminfo文件的作用,发现就是用来在第二次访问文件时跳转到上次的位置的,然后我删除了viminfo,再接着随便用sudo打开了一个文件并保存,发现viminfo的用户组果然变成了root,再次感谢你的解答!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

captcha