非程序员的GNU Emacs使用心得......Shell Mode 第8集 彻底超越拷贝和粘贴

我在前面曾经提到过,拷贝和站贴绝对是个脏活和累活。很多人平常都小看了这个事情,因为他们没有太注意过需要几百数千次从一个地方向另一个地方拷贝粘贴时 候的那种烦躁。其实事情就是这么简单,你们有兴趣试一下就有体会了。现在我们要做的事情就是去搞订它,让这种事情以后再也不是一个麻烦。

拷 贝和站贴看似就是两个很简单的动作,其实这里面隐含着很多很复杂的动作。我们来把它分解开来看一看。是的,粘贴这个动作的确是蛮简单的,主要的复杂性表现 在拷贝的部分。拷贝之前,任何人都免不了要花很多的时间和精力,把自己想拷贝的东西精确的选择出来,这个过程就是牵扯到手眼身法步,哦,没有步,的一个很 复杂的行为。看到这里有人可能会说了,哪有那么复杂啊,双击一下不就选中一个词了嘛。问题是生活中哪有那么多便宜的事情,你想选中的正好就是一个词啊?

闲 话不说了,let's make some money。呵呵,前段时间看了一部HBO的战争片,自认为学会了这么一句话。我们要做的就是写一个扩展,让他来负责选中我们要用的内容,并且把这个内容 拷贝到 Emacs 的 kill-ring 里面,救我们于水火之中。不过在这里你们所看到的这段代码已经不是最初的那个样子了,因为 Emacs 23 的时候,有人在 EmacsWiki 上面留言说你为什么不试试 thing-edit?我就去看了一眼,原来在 Emacs 23 里面内置了一个叫做 thingatpt.el 的东西,那么本着尽量靠近正统的这个原则,我就把原来的代码用 thing-edit 的方式重写了一下,不过貌似看起来要比原来复杂的多了。



上面这些基本还属于基础。要用 thingatpt.el做事,基本上都得先写上这么一些东西。然后就是自己要做的事情了。。。不过,稍等一下,我们到底要做的事情是什么?刚才有几个事情打岔,搞的我有点儿不记得了。哦,对了,我们要做的就是写一个扩展,让他来负责选中我们要用的内容,并且把这个内容拷贝到 Emacs 的 kill-ring 里面,救我们于水火之中。是的,这是我们最想要做的事情,但是这不是全部。如果我们已经可以做到这一点了,那么为什么不再多要一点呢?为什么这个拷贝出来的内容不能够自动粘贴到我们想要他去的地方呢?换句话说,拷贝已经自动化了,如果粘贴也能够自动搞定,那我们不是更舒服了吗?

没错,这才是我们真正想要做的。我们不但要让 Emacs 负责我们选中和拷贝我们想要的东西,还要让 Emacs去负责帮我们把拷贝的东西粘贴到我们想要的地方。反正她又没有长嘴,她又不会抱怨。我们当然乐的靠在椅背上,抱着一杯碧螺春,慢慢的品饮了。。。

下面就是 Emacs 要干的事情



就 是这个函数,让我们可以只要把光标放在一个 string 上面,不管什么位置,就可以自动的把这个 string 拷贝到 kill-ring 里面,然后,或者说“并且”,还会把这个 string 直接粘贴到我们预先指定的位置上去。那么,怎么指定这个粘贴位置呢?这里就要说说 Emacs 的可爱之处了,我们只需要指定一个 mark,然后去把我们的光标放到想要的内容上面,当我们移动光标的时候,我们移动的只是 point,那个 mark 还在我们当初放他的那个位置。就是这样,一切都搞定了。

当然,实际的代码比这做的还要多一些。第一个是专门针对 shell-mode,在 shell-mode 当中,通常当我们拷贝某些东西的时候,多数都是想要使用之前命令的某些参数,或者输出,来作为当前命令的参数使用。在这种基本固定的使用模式当中,在要求 每次都要指定一个 mark,未免太繁琐了。所以我们的代码就可以自己判断一下,当前 mode 是不是 shell-mode,如果是的话,就不再寻找用户指定的 mark 位置了,直接把内容贴到 comint-next-prompt 那个位置就 OK 了。

那么还有一个 bonus 就是,如果现在我真得只想要一个拷贝,我没想粘贴,那么我怎么使用这个命令呢?如果他自己自作主张的就给我粘贴了,随后我还得在花力气去把他删掉,那不是 很麻烦吗?当然是不需要的啦。我只需要在执行这个命令之前加上一个 prefix,换句话说就是数字前缀啦,无所谓是几,我就可以只是得到一个自动化的拷贝,然后由我自己决定什么时候,在什么地方,我要把它粘贴回去。如果 我还是没有能够说清楚的话,那么这样说吧,就是 Ctrl-u 1, 或者直接就是 Ctrl-2 之后再 M-x thing-copy-string-to-mark 你就可以得到一个拷贝而不是粘贴了。

在我的 Emacs 里面这个命令被绑定在 Ctrl-c s 组合键上面。

posted on 2010-08-10 21:16  David Young 杨博华  阅读(960)  评论(0编辑  收藏  举报

导航