Emacs CVS customization

1. 固然,先用命令行 check out 出源碼拷貝

      $ cd ~/work
      $ cvs -d :pserver:user@host:/path/to/repository co MODULE

2. 從 Emacs 開始

   幾個命令均可以進入 PCL-CVS 中,例如用 cvs-examine:

      M-x cvs-examine RET path/to/MODULE RET

   RET 表示回車鍵;path/to/MODULE,源碼複本的目錄,cvs-examine 缺省爲當前
   目錄。此時 Emacs 打開名爲 *cvs* 的緩衝,就是 PCL-CVS 的主界面。

   PCL-CVS 只是命令行 cvs 的前端界面。在 *cvs* 緩衝中的命令,基本只須要按
   一兩下鍵盤,Emacs 將其翻譯爲 cvs 控制命令。每執行一次,Emacs 會在緩衝
   底部顯示對應的 cvs 命令,以供參考。

3. 在 cvs 緩衝中經常使用的命令

   n, p   移動光標。

   f, o, RET 打開當前文件。

   M-s    列出全部文件的當前狀態。
   x      在緩衝中去掉全部是 Up-To-Date 的狀態的文件,這樣比較乾淨。

   M-u    更新本地拷貝。

   U      放棄所作的改動,當心別把你沒有提交的工做弄沒了。

   m      標記文件,用於對多個文件同時操做。u 去掉標記並下移;Backspace
          去掉標記並上移;M-Backspace 同時去掉 buffer 中全部標記。% 用正
          則表達式標記文件。

   c      準備提交所作的改動,會彈出一個 *cvs-commit* 緩衝,用來寫修改的
          日誌,寫完完按 C-c C-c,執行提交。若是有標記,同時對所標記的所
          有文件相庫提交。

   C      和 c 相似,可是清除上次提交時留在 *cvs-commit* 緩衝中的內容,不
          過若是當前目錄裏的 ChangeLog 文件中有相關內容,會自動插入。

   d      有一個提示,詢問用哪一種方式 diff。此時經常使用的多是:

          d d  或 d =,比較文件,本地拷貝和最後一次提交時的修訂版;
          d h  比較本地拷貝和當前源碼庫中最新版;
          d b  比較本地拷貝和該文件的備份;
          d e  用 ediff 比較文件,本地拷貝和最後一次提交時的修訂版。
      d y  和前一天的比較

   r      刪除文件,從當前拷貝的工做目錄中刪除,須要提交。

   a      添加文件,添加到當前拷貝的工做目錄中,須要提交。

   i      把某個文件的名字添加到 .cvsignore 文件,這樣在運行 cvs 命令時,
          cvs 再也不理會此文件。編輯 .cvsignore 文件,每一行一個或一類文件。
          下面是一個 .cvsignore 文件的例子。有些類型的文件 cvs 缺省就是忽
          略的,好比 .o 文件。

   t      設置 tag,提示輸入 tag 名字。

   l      查看一個文件,所標記的多個文件,或目錄文件的 log 信息。

   s      經過 cvs status 命令查看文件或目錄的狀態,會彈出一個漂亮的
          *cvs-info* 緩衝,列出文件的狀態信息。

   z, q   關閉 *cvs* 緩衝。

4. cvs buffer 中幾種狀態的說明(括號中是此時可能須要用到的命令):

   cvs buffer 中按一下 M-s 能夠列出全部文件。每一個一行,分別列出了當前的
   CVS 狀態、修訂版和文件名。

   "Up-to-date" 文件和庫中文件一致,也就是說,目前是最新的修訂版,並且沒
   有被改動過。(按 f 或 RET,進入文件進行編輯,l 看修改歷史,+ 看 tag 信
   息)

   "Need-Update" 文件相對於源碼庫,不是最新的,須要更新。(M-u 更新,d h
   比較當前文件和源碼庫中的區別)

   "Modified" 文件已經被改動過,但尚未提交到源碼庫。(c/C 提交,d d 比
   較,d e 用 ediff 比較,U 放棄修改,當心使用)

   "Added" 用 cvs add 命令新添加的文件,添加了新文件只在本地有效,須要提
   交到源碼庫。(c/C 提交)

   "Removed" 用 cvs 的 remove 命令刪除的文件,同 add 同樣,須要提交到源碼
   庫。(c/C 提交)

   "Needs-Merge" 你編輯文件的時候,別人又向源碼庫提交過,所以本地的改動,
   和源碼庫中的須要合併。(先 M-u 更新,若是發生衝突,手工修改,再 c/C 提
   交,d b 和原來的備份比較,d h 和庫中比較)

   "Conflict" 你的提交和源碼庫中當前的狀態有衝突,須要手工修改,並再提交
   一次。(手工修改,再 c/C 提交)

   "Unknown" 源碼庫中沒有該文件,這或許不是你想要的,或許是剛剛新建的。
   (若是想讓 cvs 忽略此文件,按 i;想添加到源碼庫,按 a,再提交;用 r 刪
   除)

   "Missing" 源碼庫中有,但是本地拷貝中卻沒有了。(M-u 更新,能夠重新從源
   碼庫獲得拷貝)

5. 用 Emacs 的前綴參數修改 cvs 命令的選項

   不少 cvs 命令能夠給一個前綴參數,改變缺省的行爲。多數的前綴參數都是
   C-u,而多數改變的行爲,就是修改傳遞給 cvs 的默認選項。

   每執行一次操做,pcl-cvs 的 *cvs* 緩衝底部都會顯示實際執行的 cvs 命令,
   這些命令每每帶有一些參數,如何修改這些參數呢?就經過給 pcl-cvs 的命令
   加前綴 C-u。通常的,一個 C-u 只改變當前命令所用的 cvs 選項,若是前綴兩
   個 C-u,則是永久改變所用選項。

   例如,d d 缺省比較當前拷貝和庫中你check out時的修訂版。

       若是用 C-u d d 會提示輸入 cvs 的選項,此時你能夠給任意的 cvs diff
       選項,用以進行各類各樣靈活的比較。好比,輸入 -r1.10 -r2.3 RET,此
       次比較的就是源碼庫中當前文件修訂版 1.10 和 2.3 之間的區別。

       若是 C-u C-u d d,輸入 -r1.10 RET,之後的 d d 命令都會帶着 -r1.10
       彷彿永久修改了默認選項。固然,能夠再 C-u C-u d d 修改回去。

   再如,cvs add 命令添加二進制文件須要 -kb 選項,用 C-u a 則提示輸入cvs
   add flags,輸入 -kb RET,OK。

6. 查看一些信息

   在一個文件或目錄上,或標記了一些文件,按 l 能夠在 *cvs-info* 緩衝中看
   到這些文件的 log 信息,就是提交到源碼庫中的更新日誌;按 s 能夠看到狀態
   信息;按 + 也是狀態信息,可是 tag 表爲樹型結構。

   按 l 查看 log 信息時,*cvs-info* 緩衝的狀態爲 (Log-View CVS)。此時,有
   不少方便的操做,好比比較兩個修訂版之間的不一樣,修改源碼庫中的 log 信息,
   打開某個文件任意的修訂版。好比,在 *cvs* 的某個目錄上面按了 l,而後轉
   到 *cvs-info* 緩衝中,這裏面列出的時該目錄中全部文件的 log 信息,此時
   的經常使用命令以下。

       n, p    移動光標,在一個文件內的不一樣修訂版之間
       N, P    移動光標,在不一樣的文件之間,M-n, M-p 一樣

       m       設置 mark
       d       和設置 mark 的那個修訂版進行 diff

       e       修改當前 log,編輯完,C-c C-c 提交

       f, o, RET
               這幾個都是打開當前的修訂版,稍有區別。用 f 的時候若是提示
               vc-find-version 沒有定義,手工加載一下 vc 庫
               M-x load-library RET vc RET。

       z       關閉該緩衝

   若是在 *cvs* 的目錄裏按 s,此時的 *cvs-info* 緩衝爲(CVS-Status CVS)狀
   態,在這個緩衝中,也能夠作相似的一些操做:

       N, P   在文件之間移動, M-n, M-p 一樣
       n, p   上一行,下一行

       f, o, RET
              把光標移動到某個 tag 的名字上,則能夠直接打開那個 tag 所在
              的修訂版

       T, t   把每一個文件所列的 tag 錶轉爲樹型結構,T 爲橫向的樹,t 爲豎向
              的樹

   diff 命令產生的 *cvs-diff* 緩衝中也相似,N/P 在文件之間移動,n/p 在不
   同的 diff 之間移動。此外,在任何一行代碼的未知按 o 或 RET 能夠直接轉到
   文件中的實際未知,很方便的。

7. Emacs 的 VC 的方便之處

   在 PCL-CVS 中,幾乎能夠作任何 CVS 相關的操做。但有時候未免有些麻煩,配
   合 Emacs 的 VC (Version Control) 會方便不少。

   Emacs 的 VC 模式的做者就是著名的 Eric S. Raymond。VC 的功能很強大,而
   且方便靈活。可使用在三種版本管理系統中:RCS、CVS、SCCS,操做方式一致。
   和 PCL-CVS 不一樣的是,VC 使用 C-x v 前綴完成大部分功能,不像PCL-CVS 使
   用一個主界面,這使 VC 顯得更方便。

   幾個主要的命令:

   C-x v v    vc-next-action
              顧名思義,執行下一個動做,下一個動做是什麼就執行什麼,若是
              是 Unknown 就 cvs add,若是是 Modified 就 commit,若是是
              Up-to-date 就什麼都不用作了。最方便的是隻需在當前 buffer 中
              執行。

   C-x v m    vc-merge
              將庫中別人所作的改動與本地的改動合併,和庫中的版本保持一致。

   C-x v a    vc-update-change-log
              更新更改日誌文件 ChangeLog。若是源碼庫或本地拷貝中尚未,
              試一下這個,它會根據 cvs 的提交日誌,自動產生 ChangeLog,如
              果已經有了,但已經有一段時間沒有更新過,它會自動更新
              ChangeLog 文件到最新的一條記錄。

   C-x v ~    vc-version-other-window
              PCL-CVS 也能夠方便的查看某個歷史版本,不過都須要轉到相應的
              控制界面(*cvs* 或 *cvs-info* buffer)中。而 VC 的這個命令可
              以在當前緩衝中用,會提示輸入版本號,而後顯示在另外一個窗口中,
              並保存在當前目錄,文件名爲 FILENAME.~REV~。

   有時候,用 CVS 管理的東西不須要總體的控制,好比本身的筆記、隨筆之類,
   用 Emacs 設置上 bookmark,打開就寫點,寫完立刻就提交,每每沒必要打開
   PCL-CVS,偏偏 VC 這些靈活的命令很是合適。

   繼續瞭解 VC:

   C-x v =    vc-diff
              比較文件。若是用了前綴參數,會詢問和哪一個文件的哪一個版本比較。

   C-x v u    vc-revert-buffer
              放棄沒有提交的改動,恢復原狀,也就是你的本地拷貝的版本,並
              無論庫中的最新改動。若是想同時和庫中別人所作的改動保持一致,
              用 C-u 做爲前綴參數。

   C-x v g    vc-annotate
              看看你的每行代碼的狀態(編輯歷史)。每行的顏色用來表示這行代
              碼的新舊程度,藍色的時間最長,紅色的最短,其餘的居中。默認
              的最長時間爲一年,超過一年的都顯示爲藍色。用前綴參數能夠修
              改所顯示的版本和默認最長時間。

              這個緩衝中還有一些有趣的功能,能夠直接轉到某個修訂版。每行
              的最前面爲當前行最後一次修改的修訂版,在這行上按 J,整個緩
              衝中的內容全都替換爲這個修訂版;按 N (或 P) 爲緩衝中當前的
              後一個(前一個)修訂版;按 A 轉到當前行上次被修改的版本。N/P
              按修訂版歷史瀏覽,A 按當前行修改歷史瀏覽,J 跳轉該行所指修
              訂版,W 回到該文件的當前修訂版。注意,模式行上文件名的後面
              標註了緩衝當前內容的修訂版。另外,D 能夠比較當前行上的修訂
              版和前一修訂版的區別,N/P 可使用前綴參數。

   C-x v d    vc-directory
              打開一個帶版本控制功能的 Dired buffer,功能和 pcl-cvs 的
              *cvs* buffer 有些相似。或許對非 CVS 的版本管理比較有用。

8. 相關配置

   由 CVS 管理的模塊中都有 "CVS" 目錄,打開 cvs-dired-use-hook 時,在
   "CVS" 目錄上按 F,直接進入該模塊的 *cvs* buffer:
     (setq cvs-dired-use-hook 'always)

   給 cvs-examine 一個方便的綁定:
     (define-key global-map "\C-xve" 'cvs-examine) 綁定到 C-x v e。
相關文章
相關標籤/搜索