如何在SSH上使用.vimrc?

我的工作往往涉及使用SSH连接到各种机器,然后使用vim编辑这些机器上的文件。 问题是我必须不断复制我的.vimrc文件。 打开vim并没有任何设置是非常烦人的。 是否有可能将我的vim设置在机器之间随身携带,而无需手动将其复制到任何地方?

我感受到你的痛苦。 我拥有版本控制下的所有〜/.* rc文件(Subversion),自1998年开始使用CVS以来,效果很好。 一种方法是,当你站在你的主目录时,检查你所有的rc文件:

 svn co svn+ssh://user@host/path/to/repo/trunk/home/user . A .signature A .vimrc A .bashrc A .screenrc A .psqlrc [...] Checked out revision 7645. 

这样,当你运行svn update的时候,configuration文件也将在不同的计算机上被同步和更新。

为了不需要将.vimrc带到每个需要处理的服务器,为什么不从本地vim编辑远程文件:

在vim / gvim中,运行:

 :e scp://[email protected]//path/to/document 

或者像这样启动vim:

 vim scp://[email protected]//path/to/document 

这将打开文件(实际上是在本地复制文件),并保存时,它会将编辑后的文件发送回服务器。

它要求一个ssh密码,但是这可以通过ssh密钥简化。

正如其他人所提到的,这种方法的唯一缺点就是不像在直接在机器上工作那样获得path/文件竞争。

有关更多信息, 请查看以下教程 。

每次login时,您都可以使用bash脚本自动将其复制,如下所示:

 #!/usr/bin/env bash scp ~/.vimrc $1: ssh $1 

例如,你可以把它叫做ssh_vim。 这不是一个理想的解决scheme,但将解决您的问题。

你可以改进它,先检查是否已经存在。 如果你不总是从同一台机器上运行ssh,你可以改变脚本从另一台机器上的scp中获取文件。

EDIT1

在相关说明中,您也可以使用sshfs挂载远程计算机的文件系统。 这样你就可以从你的环境和工具中获益(不仅仅是.vimrc),而且你还有shell完成(你没有使用scp://)。

EDIT2

我刚刚发现你可以使用scp://获取.vimrc文件,如下所示:

 :source scp://you@your_computer//yourpath/.vimrc 

这从vim命令行工作,但目前我不知道如何自动化。 它似乎没有与'-u'开关,也没有在.vimrc也没有$ VIMINIT。

EDIT3

我find了! 你可以通过从你的主机引用的.vimrc来启动vim。

 vim -c ':source scp://you@your_computer//yourpath/.vimrc' 

选项'-c'在启动vim后立即执行命令。

你可以在你select的shell中创build一个别名来避免input。 在bash中会是这样的:

 alias vim="vim -c ':source scp://you@your_computer//yourpath/.vimrc'" 

几个解决scheme:

1)为您的主文件夹创build一个NFS共享,并将其映射到多个位置。

2)创build一个小脚本,将你的.vimrc文件推送到你要连接的服务器上。 它可能看起来像这样(伪代码):

 connectString = arg0 #username@ipaddress scp -i ~/.ssh/indentity connectString:~/ ~/.vimrc ssh -i ~/.ssh/indentity connectString 

与sunny256完全相同的答案,但使用git而不是SubVersion。

保留一个主分支与所有计算机通用的文件,并为每个新计算机有一个分支。

这样,你可以在大多数计算机上拥有几乎相同的文件,而且还不会感到困惑。

如果你使用公共密钥authentication,你可以在你的~/.ssh/config

 Host * PermitLocalCommand yes LocalCommand bash -c 'scp -P %p %d/.vimrc %u@%n: &>/dev/null &' 

我喜欢它比上面提到的脚本技巧更好,因为它不会混淆ssh命令的调用(当指定额外的参数时等)

我使用https://github.com/andsens/homeshick来pipe理我的点文件,并将它们存储在github上。

Homeshick是用100%bash编写的,帮助你pipe理只包含/ home /目录的git仓库。 它有命令将现有的点文件移动到repo中,并用符号链接replace它们。 将符号链接中的所有文件链接到新计算机上的主目录中。

所以一般的想法是保持你的dotfiles在一个版本控制系统,并从实际path符号链接到他们。 这样你的回购不需要从你的主目录开始,并包含大量你不想添加的文件。

如果你和我一样,并且有许多开发机器(虚拟机),你可以结合使用ssh密钥,智能bash_profile和你select的RCS。

我会第二次使用nfs / samaba / sshfs。 一个缺点是,如果你一直没有networking访问,那么你不能访问你所需要的(飞行,没有WiFi,防火墙,路由问题等)。 我保持同步的机器并不都是可以同时访问的,但我想在它们之间共享信息。

以下是我如何从互联网上借鉴很多想法。

.bash_profile可以有这样的东西

 $HOME/bin/shell_ssh_agent 

我从几个地方得到了这个,但现在找不到链接。 shell_ssh_agent文件:

 #!/bin/bash SSH_ENV=$HOME/.ssh/environment #echo "starting" function start_agent { #echo "reaping agents" killall ssh-agent #echo "Initialising new SSH agent..." /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV} #echo succeeded chmod 600 ${SSH_ENV} . ${SSH_ENV} /usr/bin/ssh-add; } # Source SSH settings, if applicable if [ -f "${SSH_ENV}" ]; then . ${SSH_ENV} #echo "sourced ssh env" ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null || { start_agent; } else start_agent; fi 

现在第一次login你设置你的密钥。 注销和进入,它只是使生活更轻松。

把所有的脚本放在一个RCS中,这样可以让开发机器更容易同步。 我用git。 使用git进行身份validation是通过SSH,所以SSH密钥也在这里帮助。 注意在这一点上你可以使用像nfs这样的东西。 我仍然是RCS的粉丝,因为我在下面提到。

用例是

  1. 第一次login,键进入设置
  2. 如果没有设置RCS,请检查您的个人脚本(并在需要时更新/合并,如果需要,甚至可以将其作为.bash_profile的一部分)
  3. 编辑vimrc,特殊脚本等,并提交它们
  4. 当login到其他机器进行更新/合并/结帐。 这使所有的东西保持同步。 即没有更多的复制文件,有时你跺脚,你不想。
  5. 作为一个附带的好处,你获得了RCS的力量。 我有时会对脚本或configuration做出不利的改变,需要回滚等等。

我想要尝试的东西是将初始login/安装程序包装在一个生成文件中,我将其复制到新机器上。 makefile然后可以完成你的密钥,RCS等的设置。显然这里有一些开销,但是如果你最终设置了很多机器,这是:

  1. 节省时间
  2. 更容易保持开发机器的configuration和个人脚本同步
  3. pipe理对脚本和configuration的更改。

我使用了一个包含所有服务器的列表的makefile,当我在本地机器上进行更改时,会使用makefile自动运行make,这会更新所有服务器的更改或任何插件

我知道这是一个古老的线程,但我这样做的一个方法是使用sshfs将文件系统安装在保险丝上。 本地vim执行所有的编辑,所以没有理由复制.vimrc文件。

这是不利的,另一个terminal将不得不开放任何需要在远程服务器上运行的命令,但编辑我觉得这是最好的。

它还具有可以使用系统剪贴板的好处。

您可能会考虑一个EXPECT脚本,它允许您在按下某个按键时设置您的path和环境(如EXRCvariables)。 在有人发布类似的脚本之前,不要太长。

当你的服务器农场数量超过几十(想想成千上万),然后有一个很容易地在“处女”盒子上设置你的环境是一个真正的救星

通常当我login到一个盒子,它首次创build我的homedir!

sshrc解决了这个问题。 你把你的.vimrc放到〜/ .sshrc.d /中,然后把export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"加到`/.sshrc。