Vim编辑远程文件

Vi/Vim作为我最值得炫耀的编辑器(没有之一),与它的对手Emacs相比,经常被提到的一个优点就是:这个世界上几乎所有的*nix服务器,都会自带Vi/Vim。这个优点带来的方便之处在于,只要会用Vi/Vim,你就可以在任何一台*nix服务器上使用神乎奇技的手法来编辑文件,而不用额外安装软件(Emacs去哭吧)。这个优点几乎在我所有的服务器操作中都用到过,但在今天,似乎略有不便。

我有一台VPS,这基本上是众所周知的事情了。但中美网速的差别与两国国民生活水平一样大,导致我娴熟的指头在服务器上用Vim直接修改文件时,遇到了十分强烈停顿感。这深深地挫伤了我文思如泉涌的灵感。便想把远程文件下载到本地,修改后再上传,就像Emacs一直以来无奈的做法一样。当然这事必须不能手工去做,不然不仅不能给Vimer长脸,还会被认为是其它阵营派来给Vim抹黑的。

本文的主角是netrw.vim,它可以让Vim直接编辑网络上的文件(当然是netrw已经把该文件下载到临时文件里了),并且还支持保存到网络上(如果有写权限的话)。不知道从什么开始,它便成为Vim默认自带的插件了。在大多数现代GNU/Linux发行版里,安装Vim时都会顺便把它给装上了。

netrw使用起来也很简单。在终端里可以直接:

$ vim ftp://user@some_url/path/filename

这样便可以编辑一个远程文件,其它操作,便与编辑本地文件无异,该’:w’或’:q’时都悉听尊便。

但并不是所有的远程文件都能这么方便的访问,像我今天修改的那个文件,只有通过ssh才能访问到,并且ssh还是有key认证的。但是呢,对于我而言丝毫不影响,因为我还可以这样:

$ vim scp://t@tigerlee.me/path/target_file

也许你这样做,并不会成功,当然不成功的原因是多样的,最主要原因可能是你不能顺利地(不用输入密码,没有任何交互的提示)使用

$ scp://t@tigerlee.me/path/target_file .

来将target_file拷贝到本地。如果能做到顺利,那么你也会成功的。要实现顺利地使用scp,无外乎就是去掉一些不必要的认证过程,使用不带密码的key是最方便的了。详细使用参见netrw的文档:‘netrw-ssh-hack’,有Vim的哥们呢,就直接使用’:h netrw-ssh-hack’来看好了。

当远程文件拥有一个冗长的路径时,直接输入全部路径可能比较麻烦,因为它又不能使用Tab补全。这时可以先输入:

$ vim scp://t@tigerlee.me/

然后再在稍后出现的路径列表里慢慢选了。

netrw共支持三种使用模式:远程编辑,远程浏览(包括浏览目录内容),远程写入。不同的模式,支持的协议也不同。这是理所当然了,不然对于HTTP地址的文件,怎么写入啊?以下是不同模式支持的协议:

远程编辑
:e dav://machine[:port]/path                    uses cadaver
:e fetch://[user@]machine/path                  uses fetch
:e ftp://[user@]machine[[:#]port]/path          uses ftp   autodetects <.netrc>
:e http://[user@]machine/path                   uses http  uses wget
:e rcp://[user@]machine/path                    uses rcp
:e rsync://[user@]machine[:port]/path           uses rsync
:e scp://[user@]machine[[:#]port]/path          uses scp
:e sftp://[user@]machine/path                   uses sftp

远程浏览
:Nread ?                                        give help
:Nread "machine:path"                           uses rcp
:Nread "machine path"                           uses ftp   with <.netrc>
:Nread "machine id password path"               uses ftp
:Nread "dav://machine[:port]/path"              uses cadaver
:Nread "fetch://[user@]machine/path"            uses fetch
:Nread "ftp://[user@]machine[[:#]port]/path"    uses ftp   autodetects <.netrc>
:Nread "http://[user@]machine/path"             uses http  uses wget
:Nread "rcp://[user@]machine/path"              uses rcp
:Nread "rsync://[user@]machine[:port]/path"     uses rsync
:Nread "scp://[user@]machine[[:#]port]/path"    uses scp
:Nread "sftp://[user@]machine/path"             uses sftp

远程写入
:Nwrite ?                                       give help
:Nwrite "machine:path"                          uses rcp
:Nwrite "machine path"                          uses ftp   with <.netrc>
:Nwrite "machine id password path"              uses ftp
:Nwrite "dav://machine[:port]/path"             uses cadaver
:Nwrite "ftp://[user@]machine[[:#]port]/path"   uses ftp   autodetects <.netrc>
:Nwrite "rcp://[user@]machine/path"             uses rcp
:Nwrite "rsync://[user@]machine[:port]/path"    uses rsync
:Nwrite "scp://[user@]machine[[:#]port]/path"   uses scp
:Nwrite "sftp://[user@]machine/path"            uses sftp
http: not supported!

小总结一下:

  • 网速慢,文件小的情况下,可以使用此法编辑远程文件。
  • 网速快,文件大的情况下,那就远程编辑文件吧。
  • 网速慢,文件大或网速快,文件小的情况下,你应该明白怎样做吧?

有关梦想的事

最近两天,在下班回家的路上,我又不由自主地想起了那个问题:“什么时候去找个地方支教呢?去什么地方呢?呆多久呢?”。回到家后,躺在椅子上仔细地思考了好一会,想写点什么东西下来。

有时候,会从网络上浏览到一些好的贴子。像旅行、户外、探险、爱心援助等,让人一看就能立即产生心旷神怡的向往。于是幻想着自己有朝一日也能像那些主角们一样,可以浪迹天涯、跋山涉水、舍生入死、仗义疏财。但浏览完毕,联想到实际的种种,便告诫自己:“醒醒,这只是你的梦想,你的生活就是工作,赚钱,成家,立业,生子,养子,直到最后老死(当然,在本朝,老死不一定是唯一的死法)”。是啊,我孑然一身,事业未有,尚未娶妻,更无生子,百事待兴,不应有其它想法才是。在多数人(仅为个人推测,至少我曾经也如此想过)眼中看来,要想有个舒适、自在的生活,工作赚钱才是第一,成家立业才是王道,当家事已定,事业有成,这时再去实现其它理想和目标,才不显得too young too simple, sometimes naive。

在以前,我一直都觉得面包总是会有的,我想要做的事情也总会实现的。但当我越往将来想,我心里便越不安。把如果现在有能力实现它,何必要去透支将来的时间呢,并且将来是那么的捉摸不定。往事物发展好的一面想,我可能在工作若干年后,经过一番努力,终于发达了。可以去世界上任何想去的地方,可以做世界上任何好玩的事情。可是在那个时候,我不一定还有一颗像现在一样充满着渴望与激情的心。更加可能的现实是,随时间的逝去,澎湃的心如同温水煮青蛙般被现实生活慢慢蒸干,渴望和激情逐渐被遗憾和后悔趁虚而入。往事物发展不好的一面想,我可能还来不及实现梦想,就因为各种人祸天灾,连拥有遗憾和后悔的感觉都没有了。退一步,往事物发展正常的一面想。一生可能就被找对象,结婚,买房、还房贷、养小孩等等随之而来的一系列正常历程所充满。而这段历程,都不是目前的梦想所能滋生的土壤。

我现在已经发现有很多事情当初没有去做,错过了那段光阴,就只剩下后悔了。所以我不希望在若干年后,当我看着年轻的人们在实现他们梦想的时候,心头会涌上一股带着后悔的醋意;听着他们讲述实现梦想的故事,我只能喃喃地说:“啊,我原来也想……,可是……,只好……”这般纯属怨念的话语。我知道梦想众多,不能全都实现。所以只想能在以后少一些遗憾和后悔;如果可能的话,还可以同他们一起交流,讲述自己年轻时候为实现类似的梦想所遇到的可爱人物和经历过的有趣故事。

好像从小时候到长大,我一直都有个习惯:如果我有一些糖果或是其它吃的,我会把好吃的留到最后。可是我现在想到:为什么不把喜欢的先吃了呢?我那么喜欢它,为什么要先经历那些没它好吃的,最后才细细品尝它呢?是所谓苦尽甘来么?如果我先吃喜欢的,再吃不喜欢的,可能最后不一定会将那些不喜欢的吃完(这有点类似于由简入奢易,由奢入简难的意思吧)。换个情境:假定人的一生,只允许一次好的事情发生,那么在少年、青年、中老年三者中,我们会怎么选择呢?至少我会选择青年,因为少年时也许还不能体会好的事情,而中老年时,可能已经没有像青年时的激情来享受好的事情了。

人生短暂,及时行乐。既然做出了选择,那就趁着还年轻,趁着牵挂不多,趁着还有自由,趁着还有激情,一股作气,将那些美丽的梦想一一实现吧!

——立此存照,待到明年,必定践行!