我在前面曾經提到過,拷貝和站貼絕對是個髒活和累活。很多人平常都小看了這個事情,因為他們沒有太注意過需要幾百數千次從一個地方向另一個地方拷貝粘貼時
候的那種煩躁。其實事情就是這麼簡單,你們有興趣試一下就有體會了。現在我們要做的事情就是去搞訂它,讓這種事情以後再也不是一個麻煩。
拷
貝和站貼看似就是兩個很簡單的動作,其實這裡面隱含著很多很複雜的動作。我們來把它分解開來看一看。是的,粘貼這個動作的確是蠻簡單的,主要的複雜性表現
在拷貝的部分。拷貝之前,任何人都免不了要花很多的時間和精力,把自己想拷貝的東西精確的選擇出來,這個過程就是牽扯到手眼身法步,哦,沒有步,的一個很
複雜的行為。看到這裡有人可能會說了,哪有那麼複雜啊,雙擊一下不就選中一個詞了嘛。問題是生活中哪有那麼多便宜的事情,你想選中的正好就是一個詞啊?
閑
話不說了,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 按鍵組合上面。