トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
Emacs
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ PREFERENCE


___

■ 文字列(string)

___

■ delete-char

SYNTAX (delete-char NUMBER) DESC Cursor 直後の N 文字を削除
___

■ following-char

SYNTAX (following-char) DESC Cursor 位置の 文字を Code 値として返す
___

■ mapcar

SYNTAX (mapcar FUNC SEQUENCE) DESC SEQUENCE の各要素に FUNC をあてる
    ;; (3 5 7)
    (mapcar '1+ '(2 4 6))

___

■ boundp

SYNTAX (boundp SYMBOL) DESC Symbol の値が void でないかどうかかえす
  ;; symbol "foobar" が 定義されているかどうかしらべる
  (if (boundp 'foobar)
    (message "foobar is not void")
    (message "foobar is void")
    )


___

■ zerop

SYNTAX (zerop NUMBER) DESC 引数が 0 かどうかかえす
___

■ insert-rectangle

insert-rectangle '("aaa" "bbb" "ccc")) SYNTAX (insert-rectangle list ;; string list ) DESC 現在のポイント位置に list の文字列を矩形に挿入する
    (insert-rectangle '("aaa" "bbb" "ccc"))
___

■ make-string

SYNTAX (make-string NUMBER)
    ;; RET: "aaa"
    (make-string 3 ?a)
___

■ int-to-string

SYNTAX (int-to-string NUMBER) DESC 数値から文字列変換 (number-to-string) の別名
___

■ 文字列(string)

___

■ string-match

SYNTAX (string-match "n" "tanuki") DESC
  (looking-at "tanuki")
___

■ string-match

SYNTAX (string-match "regexp" "string") DESC regexp 検索
___

■ file-name-nondirectory

SYNTAX (file-name-nondirectory) DESC Directory 名削除
___

■ Buffer

___

■ buffer-string

SYNTAX (buffer-string) DESC buffer 全体文字列を返す
___

■ buffer-file-name

SYNTAX (buffer-file-name) DESC buffer名
___

■ pop-to-buffer

SYNTAX pop-to-buffer DESC 新しい window に buf 生成
    (pop-to-buffer "foo")
___

■ 検索(Search)

___

■ re-search-forward

SYNTAX (re-search-forward REGEXP &opt BOUND NOERROR COUNT) DESC REGEXP にマッチした文字の直後に point を移動

  ;; abc の後ろに移動
  (re-search-forward "abc")

  ;; tab 検索
  (re-search-forward "\t")

  ;; ERROR
  ;;  "\\t" ではない -> "\t" という REGEXP はなし -> だから "t" を検索
  (re-search-forward "\\t")

  ;; MultiByte 文字も 文字クラスに指定できる
  (re-search-forward "[あい]")   ;; あい


  ;; c の直後( "d" )に point が移動
  abcd


  WARNING
    現在の point の文字も検索対象になる

    (re-search-forward "a")

;;  []
    abca

;;  末尾の a に移動するつもりだが, b に移動してしまう




___

■ re-search-backward

SYNTAX (re-search-backward REGEXP &opt BOUND NOERROR COUNT) DESC REGEXP にマッチした文字の先頭に point を移動

  ;; a に point が移動
  abc

  (re-search-backward "abc")

___

■ buffer-substring

SYNTAX (buffer-substring s e) DESC point 位置 s 以上 , e 未満の Buffer 文字列をかえす

  abcdefghijk

  ;; RET: abcde
  (buffer-substring 1 6)

___

■ file-name-directory

SYNTAX (file-name-directory path) DESC パスから Directory 部分をかえす
    (file-name-directory  "d:/foo.txt")
    (file-name-directory  "d:/bar/")
___

■ switch-to-buffer

SYNTAX DESC EX WARNING
___

■ file-name-extension

TIP (file-name-extension) DESC Query SYNTAX (y-or-n-p "string") DESC 文字列の長さを取得. SYNTAX (length "string") DESC 文字列結合 SYNTAX (concat "string" ...) DESC 文字列比較 SYNTAX (string-equal "str1" "str2") ret t | nil DESC 部分文字列 SYNTAX (substring "str" idxS, idxE ) TIP idxE = -n で 最後の n 文字削除 DESC file 読み込み(存在)確認 SYNTAX (file-readable-p "file") DESC file 挿入 SYNTAX (insert-file "file") DESC buf の名前( file full path をかえす ) SYNTAX (buffer-file-name) ret d:/foo/bar/foo.cpp DESC 現在時刻をかえす
___

■ current-time-string

SYNTAX (current-time-string) DESC 現在時刻 DESC 指定 regexp を含むかcheck
___

■ string-match

SYNTAX (string-match "regexp" name) DESC buf の編集状態を終了させる.
___

■ set-buffer-modified-p

SYNTAX (set-buffer-modified-p nil) DESC 任意の数のリスト引数を連結する
___

■ list

___

■ append

SYNTAX (append list...)
  ;; ~/mylisp を load-path に追加
  (append load-path (list "~/mylisp"))
___

■ cons

SYNTAX (cons atom ...) (cons CAR CDR) DESC リストの先頭に要素を追加する Constructure RET 作成した list

  ;; list 構造に便利

  (cons "~/mylisp" load-path)
  (cons 1 (list 2 3 4 5))

  ;; PUSH
    (setq calc-stack (cons x calc-stack))
  ;; POP
    (setq calc-stack (cdr calc-stack))

___

■ defcustom

SYNTAX (defcustom SYMBOL VALUE DOC &rest ARGS) DESC カスタム可能な Symbol を定義. ( Default 値つき ) Declare SYMBOL as a customizable variable that defaults to VALUE. DOC is the variable documentation.
   (defcustom perl-indent-level 2
     "*Indentation of Perl statements with respect to containing block."
     :type 'integer
     :group 'perl)

   :type    VALUE should be a widget type for editing the symbols value.
   :options  VALUE should be a list of valid members of the widget type.
   :group    VALUE should be a customization group.
___

■ where-is-internal

SYNTAX (where-is-internal cmd) DESC cmd に bind されている Key list をかえす. ある cmd の keybind を変更する際に便利
___

■ read

SYNTAX (read tkn) DESC token を symbol に変換
___

■ set-buffer

SYNTAX DESC 編集に利用する buf を指定 LISP code のみ有効 WARNING (getenv "USER")
___

■ defun

DESC 関数を定義する関数 ret 関数名
___

■ let

DESC 変数の宣言. セット 2. Block の定義 SYNTAX (let ((var1 value1)...) state-block) TIP 変数宣言しない(setq) は global
___

■ save-excursion

DESC cursor 位置を保存
___

■ condition

DESC 条件文 SYNTAX (while condition state-block) (following-char)aaa (delete-char 1) TIP c-g : 中止
___

■ message

DESC min buf に出力 書式命令: %s %d %c %e %f %g
___

■ lisp関数をemacsCommand.にする

Lisp Interaction Mode : c-j : eval-print-last-sexp 登録する (interactive "prompt-string") arg を関数にわたす. prompt-string: arg に格納される n : 整数 s : 文字列 \n: argument 区切り文字 "document" : c-h f で表記 TIP * (interactive "r") : 引数を point , mark にセット
___

■ lisp基本関数

DESC 算術 [ +-*/ % 1+ 1- max min ] : arg が浮動小数点ならば float 扱い 比較 [ > < >= < = /= = equal] 論理 [ and not or ]
___

■ ERROR

Q. symbols value as variable is void // 空 A. 変数を初期化しないとでる ERR.
___

■ 制御構文

___

■ if

SYNTAX (if cond true-case false-block) TIP true-case : 単文 false-blcok: 複文
___

■ cond(while)

SYNTAX (cond (cond1 state-block) (cond2 state-block) ... ) TIP switch ( foo ) { case: .. } と思おう.
    (defun howmany (cnt)
      (cond

      // zero p( 述語 ) == arg に基づいて t, nil をかえす
       ((zerop cnt) "no")
       ((= cnt 1) "one")
       ((= cnt 2) "two")
       (t "many")
       )
      )
___

■ 複文

SYNTAX (progn state-block) DESC {} {} ( Block と考えるとわかりやすい ) (let (var1 var2 ...) state-block)
    (let (foo (coo 10) bar) (message "foo %s bar %s %d" foo bar coo))
    nil に初期化
(defun goto-pct (pct) (interactive "nGoto percent: ") (goto-char (/ (* (point-max) pct) 100)) ) (defun pluralize (word cnt &optional plural) (if (= cnt 1) word (if (null plural) (concat word "s") plural ) ) ) (defun count-words-buffer (nr num) ("this is my first lisp function ") (interactive "nEnter integer: \nnEnter Second: ") (let ((cnt 0)) (save-excursion (goto-char (point-min)) ; top (while (< (point) (point-max)) (forward-word 1) (setq cnt (1+ cnt)) ) (message "buf contanis %d word arg %d arg %d" cnt nr num) ) ) ) (let () (if (equal (getenv "USER") "usr") (setq width 10)(setq width 20)) (message "width %d" width) )
___

■ 便利な組み込み関数

// 文字位置 point // mark 位置 mark // 最小文字位置 point-min // 行頭にあるか // b of line ? bolp // 行末にあるか eolp : bobp : buf 先頭 eobp : buf 先頭 (insert) : point に挿入 number-to-string: 10 -> "10" string-to-number: "100" -> 100 char-to-string: substring: (substring "this is a pen" 0 4) aref: 配列参照 (aref "test" 3)
___

■ REGEXP

DESC emacs での 正規表現です // [a-c] の文字 [a-c] $ | ' : 行末 WARNING regexp 文字を指定するには [\\] 2個必要 Emacs Interpreter が解釈するため
   * にマッチするには \\*
     ;; Lisp interpriter が \\ -> \ として解釈 [\*] を lisp 関数にわたす
     (search-forward-regexp "foobar\\*")  -> [foobar*]
WARNING: 上記の仕様は regexp の関数のみ意味をもつことを忘れないこと (search-forward "test*test") // 通常文字の "test*test"検索 実験するなら次を利用する (search-forward-regexp) (replace-regexp)
___

■ LIST

DESC quot して meta chara 扱い
  [()|]
* quot しないで meta chara 扱い
  [+*.]
 *   : 直前の文字の 0 回以上の繰り返し
 +   : 直前の文字の 1 回以上の繰り返し
       : 任意の文字
 []  : 文字セット [^]
       REGEXP
  [  : NRML \\[
       -> [*?.] // 通常文字あつかい

 ()  : group
       REGEXP \(  :: NRML (
 |   : 選択
       REGEXP \|  :: NRML |

 ^$< >: 文脈指定 ( 日本語でも Token の指定できる )

 \w : 単語を構成する文字
 \w : 単語を構成しない文字

 \b : 単語の境界








VAR::sentence-end regexp の参考になる (defun del-header-outline () "this is rm *" (interactive) (replace-regexp "^\\*+" "") ) \\* == アスタリスク
    [^A-z]
    (replace-regexp "^aaaa\nbbbb" "")  // 改行こみ
___

■ CVS


___

■ 管理人

___

■ Repositoryを初期化( cvs init )

SYNTAX cvs -d /srv/cvs init DESC Repository の場所を決めたら一度だけする WARNING Repository Directory のアクセス権がそのまま 各ユーザが CVS を使ってアクセスするときの権利になる
    # Group に Repository への R/W の権利をあたえておく
    chmod /srv/cvs g+rw

    # 試してみる
    #      Write 禁止にする
    chmod -R a-w /srv/cvs/

    # RET:
    #      cvs [commit aborted]: could not open lock file `/srv/cvs/proj/,foo.txt,': Permission denied
    cvs commit -m "test" /proj/foo.txt

___

■ Repository.へのアクセス手段をきめる


  ;; 開発者が 一箇所で作業をする
   local   : Local FileSystem , NFS におく

  ;; UNIX の password 認証を利用した network アクセス
   pserver : password 認証を必要とする network 経由でのアクセス

  ;;
   ext     : rsh, ssh を使用する network 経由でのアクセス

  

  # Repository の場所を CVS におしえる
  export CVSROOT=:local:/srv/cvs
  Server の設定は root 権限がいる

  inetd 経由でき cvs を daemon として動作させる

  /etc/services
  /etc/inetd.conf 

  に記述

  
  cvspserver   2401/tcp  # CVS network server
  cvspserver   2401/udp  # CVS network server

  cvspserver   stream  tcp  nowait  root  /usr/local/bin/cvs
  cvs --allow-root=/usr/cvs/pserver


  # client からの Access
  #
  export CVSROOT=:pserver:host:/usr/cvs
  
  cvs login
  CVS password: ***

  # 後はいつもとおり

  
  # 
  #
  ps ax  | grep  inetd  | grep -v grep

  # SIGHUP を inetd におくる
  #    これで 設定 File を reload する
  kill -HUP 249 


___

■ Project.を.Import.する( cvs import )

SYNTAX cvs import [-m "msg"] projName vendorName releaseTag TIP projA/file ... : cd proj; cvs import projA
    # /home/project を VC する
    # project 以下の file を "project" という名前で管理開始
    cd /home/project

    # import
    cvs import -m "init" project xxx rev_init

    # Original Directory 削除
    cd ../
    rm -Rf project

    # REP から WORKFILE Checkout
    cvs checkout project
___

■ checkout

SYNTAX cvs checkout project DESC 指定した project を checkout する

    # checkout する Directory へ移動
    cd d:

    # projA という Directory がつくられて Repository からファイルがコピーされる
    #
    cvs checkout projA

    # Rivision を指定する
    cvs checkout projA  -r 1.1

    # 日付指定
    cvs checkout -D xxx projA

WARNING Rivision を指定すると Stickey Tag がついて commit できない commit できるのは none || branch tag のみ
    # Stickey を取り, 最新に
    cvs update -A
    
___

■ 利用者

___

■ 全体の流れ


  cvs update

  edit

  cvs update

  confict がおきたら merge

  Program の動作検証

  cvs commit


___

■ update

SYNTAX cvs update [-d] [file...] TIP working file にないものは -d fileName 状態を確認したいときも使える

  cd /home/pl

  # foo.pl を更新
  cvs update foo.pl

  # file を指定しないと Current Directory 以下すべてが対象
  cvs update

# RET # M foo.pl # M bar.pl
___

■ commit

SYNTAX cvs commit [-m "msg"] [file...] DESC cvs を Commit する TIP fileName.指定なしで ModifyFile すべて -> Message をうつのメンドイ ! WARNING commit する前に update が必須 -> ERROR になる
___

■ File.を追加

SYNTAX cvs add [-k keywordflag] [-m "cmt"] file ... TIP cvs add は file に追加予約( ie. CVS に記述するのみ) dir も file 同様. WARNING 再帰的に追加できない
    // index.htm を追加状態にする
    cvs add index.htm
___

■ File.をけす

SYNTAX cvs delete [file ...] WARNING 先に WorkingFile を消さなくてはならない # cvs remove: file `foobar still in working directory # cvs remove: 1 file exists; remove it first
  # WorkFile があっても削除する
  cvs -f remove -f bar.class
  cvs -f remove -f /work/log/htm/private/tax.hym_bk
  cvs -f remove -f /work/log/htm/public/cmd.htm_bk
  cvs -f remove -f /work/log/htm/public/__tmp__
___

■ cvs remove

TIP # 削除予約をする cvs delete foobar # cvs remove: scheduling `foobar for removal # cvs remove: use `cvs commit' to remove this file permanently # Repository 側を削除する cvs commit -m "delete file" foobar cvs commit -m "delete file" /log/ WARNING cvs delete xxx を忘れると cvs update 時におちてくる
___

■ Directory.をけす

DESC Directory には cvs delete は無い
      /ProjectX/nhk/foo.htm
      /ProjectX/nhk/bar.htm

    # 中の file を消す
    cd /ProjectX/nhk/
    cvs remove -f *.htm

    # 反映
    cvs commit -m "del"

    # ひとつ↑へ ( ここ重要 ! )
    cd ../

    # ( prune: 枝刈り )
    cvs update -P
___

■ Module(Project)を消す

DESC 専用のコマンドがないかもしれないので Repository のファイルを直接けす REF http://www.thinkit.co.jp/images/tech/3/12/9.gif

  # cd $CVSROOT
  cd /srv/rep
  rm -Rf ProjectX

  # 中に "v," というファイルがある
___

■ WorkingFile.の編集を終了する

SYNTAX cvs release dirName DESC 編集終了を CVS に通知する TIP Lock する仕組みではないため, Local を削除するだけでもOK

  /home/projA という WORKFILE を VC からはずす

  cd /home

  #
  cvs release projA

  # 消す
  rm -Rf projA

  # release と同時に Local Copy 消す
  cvs release -d projA


TIP CVS は checkout している人のなどの記録をとっている ( $CVSROOT/CVSROOT/history ) ごみとなる記録を消すため 作業を終えたら 明示的に release するのがいい 変更忘れを防止するためにも使える もし更新しているファイルがあったら教えてくれる

    cvs checkout projA


    # 変更する
    cd projA
    echo bar >> ./foo.txt


    cd ..
    cvs release projA

    # M foo.txt
    # You have [1] altered files in this repository.
    # Are you sure you want to release directory `projA':

___

■ Confict を解決する

DESC 同一行が変更されていると, Confict をおこす

    main.c が Confict をおこす

    # workingfile の backup がつくられる
    .#main.c.1.2

Confict をおこした file は次のように衝突箇所が明記される
    < < < < < < < < < < < <  main.c
      printf("riv 1.2");
    ======
      printf("riv 1.3");
    >>>>>>>>>>>> 1.3
___

■ 現在の.Rivision.に名前をつける

REF http://www.sodan.org/~penny/vc/cvs-ja_4.html#SEC48 DESC 特定のリビジョンに名前 (タグ名) を付けることができます キリのいいときに, 複数のファイルに名前をつけておくと便利 ( ver_alpha とか ) 各バージョンのファイルはそれぞれ一意なリビジョン番号をもつ リビジョン番号はピリオドで分けられた偶数個の十進整数です 初期設定ではファイルの最初のリビジョンは 1.1 で 新しくなると一番右の番号が1つ増えます こんな感じ ---------- ver_alpha ---------- main.c : riv 1.4 sub1.c : riv 1.2 sub2.c : riv 1.3 sub3.c : riv 1.2 SYNTAX cvs tag [op] tagName [file...]
    # 現在の Rivision を ver_alpha という名前にする
    cd project
    cvs tag ver_alpha

    # log を見ると Rivision と Pair になっている
    cvs log

    > symbolic names:
    >  ver_alpha : 1.5

    # ある日 ver_alpha を見たくなったら
    cvs update -r ver_alpha
OP # Branch をつくるときも Tag をうつ b : branch tag 生成 TIP cvs tag version-1_0 WARNING Tag 名に SPACE はだめらしい
___

■ Rivsion.をくらべる

SYNTAX cvs diff [opFormat] [-r srcRev [-r tgtRev]] file... DESC revision 間の差を比較 CVS は すべての変更履歴をとっているため, 差分をみれる
    // WorkingFile と 最新 Rivision の比較
    cvs diff /work/log/htm/private/tax.htm

    // 2 つの Rivision の比較
    cvs diff -r1.1 -r1.8 /work/log/htm/private/tax.htm

    // 指定 Rivision と WorkingFile の比較
    cvs diff -r1.1 /work/log/htm/private/tax.htm

    cvs diff -u -r1.20 /work/log/htm/private/book.htm

    # Format Option は diff の format
    #    Unified 形式
    cvs diff -u -r1.1 /work/log/htm/private/tax.htm


  DESC
    rev 間の差分を比較
      2. tgtRev == NULL -> tgtRev = working file
      3. tgtRev == NULL -> srcRev = newest rev; tgtRev = working file
___

■ Rivision 間の diff をとる

SYNTAX cvs rdiff [op] [src [dst]] module DESC 指定 module の Rivision 間の diff をつくる TIP CVS は差分情報を管理するため, 2 つの Rivision を用意せずに差分をとれる

    # 比較元 1.1   比較先 1.2 の差分をとる
    cvs -r 1.1 -r1.2 projA


    # dst がなければ WorkingFile との比較
    cvs rdiff -r 1.1 projA


    # Unified 形式
    cvs rdiff -u -r1.1 projA

___

■ 現在の状態をみる( cvs status )

SYNTAX cvs status DESC 変更されているか, 変更元の Rivision, Repository の Revision がわかる
    # Recursive
    cvs status -R
                              
    # Verpose
    cvs status -v

    # 現在の Local Directory のみ 
    cvs status -l

    cvs status foo.txt

    ===================================================================
    File: foo.txt          Status: Locally Modified   # 変更状態

       Working revision:  1.132  2010-06-25 07:04:24 +0900   # 変更元の Rivision
       Repository revision:  1.132  /srv/cvs/projA/foo.txt,v  # Repository Rivision
       Commit Identifier:  gZknrvbTj6ak74Eu
       Sticky Tag:    (none)
       Sticky Date:    (none)
       Sticky Options:  (none)

___

■ remote の Repository へログインする

SYNTAX cvs login cvs logout DESC remote の Repository へアクセスするときは login, logout をする
    # ~/.cvspass という file が作成される
    #    これを元に pserver と通信する
    cvs login



___

■ annotate

SYNTAX cvs annotate [file ...] DESC 各行の編集履歴の表示

  cvs annotate

    Annotations for emacs.htm
    ***************

    1.13         (usr   03-May-08):
    1.124        (usr   21-Jun-10):   m-x animate
    1.124        (usr   21-Jun-10):   m-x zone
    1.124        (usr   21-Jun-10):   m-x dunnet
    1.124        (usr   21-Jun-10):   m-x blackbox

___

■ file.の修正履歴(rev.の確認)( cvs log )

SYNTAX cvs log [op] [file ...] DESC file の 修正履歴をみる 行数単位で追加, 削除がわかる

  # RCS file の場所もわかる
  RCS file: /srv/cvs/projA/test.txt,v
  Working file: ~/test/cvs/projA/test.txt
  head: 1.1
  branch: 1.1.1
  locks: strict
  access list:
  symbolic names:

___

■ 編集履歴をみる

SYNTAX cvs history [op] DESC 変更履歴を見る CVSのアクセスログを表示する checkout の状況をみたり,
    # 指定した Project の履歴をみる
    cvs history -m projA

    # O :
    # F : Finish

    O 2007-09-29 15:18 +0000 usr projA =projA= /cygdrive/d/work/log/htm/*
    O 2007-09-29 15:22 +0000 usr projA =projA= /dust/tako/*
    O 2007-10-02 15:19 +0000 usr projA =projA= /log/*
    O 2010-06-24 21:54 +0000 usr projA =projA= /dust/cvs/*


    # 指定ファイルの commit 履歴を見る
    cvs history -c foo.txt


    M 2010-06-24 22:04 +0000 usr 1.132 foo.txt public == /log
    M 2010-06-24 22:28 +0000 usr 1.133 foo.txt public == /log
    M 2010-06-24 22:44 +0000 usr 1.134 foo.txt public == /log
    M 2010-06-24 22:44 +0000 usr 1.135 foo.txt public == /log
    M 2010-06-24 22:45 +0000 usr 1.136 foo.txt public == /log
    M 2010-06-24 22:46 +0000 usr 1.137 foo.txt public == /log
    M 2010-06-24 22:46 +0000 usr 1.138 foo.txt public == /log


___

■ 過去の rivision にタグを打つ

SYNTAX cvs rtag [op] module DESC cvs tag は 現在の Working File に rivision をうつ # 指定 rivision の module に "test_rtag" という名前のタグをつける cvs rtag -r 1.1 test_rtag public WARNING # file 単位ではだめらしい ? cvs rtag -r 1.1 test_rtag2 emacs.htm
___

■ Branch.をつくる

REF Branch DESC 枝 (branch) として知られる別の開発ラインをわける 枝のファイルを変更しても、幹や他の枝には影響しない こういうときに便利 ver1.0 をリリース 致命的なバグが見つかる 現在のバージョンは進行中で, お客さんにだせるものではない そこで ver1.0 のときに 枝(branch)を作成しておけばバグ修正をすることで対応できる また branch で追加した bug fix を Trunk に Merge もできる

  Trunk
    |
    | / bug fix version
    |/
    | ver1
    |

SYNTAX cvs tag tagName # branch 用の Tag を打つ # branch ( 枝 )を作成( ここの名前は Project-branch とかがいい ) cvs tag -b branchtag cvs tag: Tagging . T test.txt cvs status -v Existing Tags: branchtag (branch: 1.2.2) # branch Tag ( Rivision 番号もひとつ階層が追加 ) branch_test (revision: 1.2) # branch 元のタグ yyy (revision: 1.1.1.1) xxx (branch: 1.1.1) # branch に対する編集をする -> Trunk と WorkingCopy と重複しないように Local の場所を移動 cd another cvs checkout -r branchName # branch を Checkout ( 以後, 編集は branch に影響する -> branch が伸びる ) cvs checkout -r branchtag projA cvs checkout: Updating projA U projA/test.txt # 編集して Commit echo "branch_edit" >> test.txt Working revision: 1.2.2.1 2010-07-19 18:44:45 +0900 Repository revision: 1.2.2.1 /srv/cvs/projA/test.txt,v Commit Identifier: kXWovHy8wzQLddHu Sticky Tag: branchtag (branch: 1.2.2) # Sticky Tag を見れば編集中の Branch がわかる # 2 回目 echo "branch_edit2" >> test.txt Working revision: 1.2.2.2 2010-07-19 18:46:16 +0900 Repository revision: 1.2.2.2 /srv/cvs/projA/test.txt,v # CVS Directory の中に "Tag" というファイルがあり, Branch 名が記述されている cat ./CVS/Tag Tbranchtag # POINT # branch Tag を指定して落とすときは, Branch を指定するのであって # branch 生成時の Rivision ではない cd another cvs checkout -r branchtag projA cat projA/test.txt ... rev1 rev2 branch_edit branch_edit2
    |   / < - ここが落ちる
    |  /
    |/
    |
# Branch に HEAD をとりこむ cvs update -j HEAD cvs update: Updating . RCS file: /srv/cvs/projA/test.txt,v retrieving revision 1.2 retrieving revision 1.4 Merging differences between 1.2 and 1.4 into test.txt # Branch 元( 1.2 ) から HEAD( 1.4 )までの分をとりこみ rcsmerge: warning: conflicts during merge # conflict はしたが 取り込みは成功 rev1 < < < < < < < test.txt rev2 branch_edit branch_edit2======= rev2 rev3 rev4>>>>>>> 1.4 # 手で編集して Commit ( Branch として rivision が増加 ) /srv/cvs/projA/test.txt,v < -- ~/test/cvs/branch/projA/test.txt new revision: 1.2.2.3; previous revision: 1.2.2.2 # さらに Trunk 側に Tag を打ち, 次の Merge が必要最小限になるようにする # cvs rtag -r HEAD branchmerge1

       ここまで   |       
                 |      / < - 未来の merge
                 |     /
                 |   /
      ここから   |   /< - 今回の merge 
                 |  /
                 |/
                 |
# これを繰り返せば, Trunk と並行して branch が作成できる cvs update -j branchmerge1 -j HEAD # Trunk に Branch を取り込むには Branch Tag を指定する( Branch の最新が Merge される ) cvs update -r branchtag cvs update: Updating . U test.txt # Stickey Tag # Branch Tag 以外を 指定した場合は Commit ができない # # Branch の芽がないところで 伸ばそうとすると Error になる cvs commit: sticky tag `branch_test' for file `~/test/cvs/projA/test.txt' is not a branch cvs status Working revision: 1.2 2010-07-19 19:28:54 +0900 Repository revision: 1.2 /srv/cvs/projA/test.txt,v Sticky Tag: branch_test (revision: 1.2) # # Stickey Tag を解除 && 最新版に Update cvs status -A Working revision: 1.4 2010-07-19 19:33:03 +0900 Repository revision: 1.4 /srv/cvs/projA/test.txt,v Sticky Tag: (none) # Stickey がない状態( 幹 )なら Commit できる
    # 現在の WorkingFile の Rivision に対して ver_alpha という名前のブランチをつくる

    # POINT
    #    枝はリポジトリに作成するのであり、作業コピーに作成されているの ではない
    #   作業コピーを新しい枝に切り換えることはしない
    cd project
    cvs tag -b ver_alpha


    # WorkingFile ではなく, Rivision を指定して枝をつくる
    # -r tag-1' はこの枝がタグ `tag-1' に対応するリビジョンを根であることを指定する
    # 最新のリビジョンでなくても OK
    #      古いリビジョンから枝を生やすことが役に立つことがしばしばあります


    # (例えば、他の部分は安定していることが知られている過去のリリースのバグ を修正するとき)
    cvs rtag -b -r tag-1 ver_alpha
Branch を編集方法は 2 つ

    # Repository から枝をとりだす
    cvs checkout -r project-ver-alpha tc

    # 既に作業コピーがあれば、`update -r' で任意の枝に切り換えれる
    cvs update -r project-ver-alpha tc


    # 作業コピーが元々幹にあったか他の枝にあったかは関係なし
    # 上のコマンドはそれを指定された名前の枝に切り換えます
    # 普通の `update' コマンドと同様に、`update -r' は全ての変更をマージし
      衝突がどこ で起こったかを知らせます

    # 一度特定の枝に結び付けられた作業コピーを手に入れると
      指示しない限りそこに残り続けます
      これは、作業コピーから格納された変更はその枝に新しいリビジョンを加えますが
      幹と他の枝には影響を及ぼさないということ

    # 作業コピーがどの枝であるかを知るために
      コマンド `status' を使う ことができます
      その出力で、`Sticky tag' という名前の場所を探してください
      それは現在の作業ファイルに、もし枝があれば
      それを教える CVS の方法です

      WorkingFile は Repository からの Copy にすぎないから
      同一ディレクトリに ブランチが異なるファイルがあっても OK
      ( Build するときはエラーになるけど )

      cvs update -r ver_alpha bun.el

    # ってことは Current の Branch という状態があるわけね !

    # Sticky を確認
    # Sticky Tag:    version_alpha (revision: 1.2)

    # Trunk は何もつかない
    Message:    Sticky Tag:    (none)

    #  問題は branch をきりかえると, 最新版が落ちてこない

# Rivision はこんな感じ
       +-----+    +-----+    +-----+    +-----+    +-----+
       ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
       +-----+    +-----+    +-----+    +-----+    +-----+
# それぞれの枝には枝番号 があり、 # . で分けられた奇数個の10進 整数から成ります # 枝番号は枝が分岐した元の枝に対応するリビジョン番号に整数を追加することによって作成されます # # 枝番号により、特定のリビジョン から 1 つ以上の枝を枝分かれすることができます。 # 枝をつくると, 子供の index がつく ( 親子だと思えば OK )
    # 枝の全てのリビジョンは枝番号に普通の数字を追加することで形成されます
    #  枝番号が作成される厳密な詳細は普通は気にしなくて良い
    # CVS が枝番号を作成するときは、2 から始まる最初の未使用の偶数を選びます
    # ので リビジョン 6.4 から枝を作成したいとき は、それは 6.4.2 という番号になるでしょう
    零で終わる全ての枝番号 (6.4.0 のように) は CVS の内部で使用されます
                                                         +-------------+
                           Branch 1.2.2.3.2 ->        ! 1.2.2.3.2.1 !
                                                    / +-------------+
                                                   /
                                                  /
                 +---------+    +---------+    +---------+
Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
               / +---------+    +---------+    +---------+
              /
             /
+-----+    +-----+    +-----+    +-----+    +-----+
! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !  < - The main trunk
+-----+    +-----+    +-----+    +-----+    +-----+
                !
                !
                !   +---------+    +---------+    +---------+
Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !
                    +---------+    +---------+    +---------+
WARNING trunk 用 dir の場合は 別 dir で行う
___

■ 古い.Revision.をとる

SYNTAX cvs update -rNR file // p: stdout cvs update -r1.2 foo.txt cvs update -p -r1.2 foo.txt cvs update -r1.8 /work/log/htm/private/tax.htm cvs update -r1.8 /work/log/htm/private/tax.htm cvs update -r1.79 /log/pro_tip.htm cvs update -A /log/pro_tip.htm # tag 名で指定する cvs update -r tag_xxx WARNING // Sticky がつくので , 最新版をとりたいときは cvs update -A /work/log/htm/private/tax.htm cvs update -A /log/cmd.htm TIP Sticky の目的は 最新でない Rivision を Comit させない目印 // u-n 再度 uddate しても 怒られる( ここは別途対処 ) cvs update -C -r 1.64 /work/log/htm/private/tax.htm DESC 2. ファイル名を変更 mv old new cvs remove old cvs add new cvs commit -m "add new" new WARNING new rev 1.0
___

■ FAQ

* http://www.mikamama.com/CVSBook/Q_and_A.html#Q5
___

■ Rivision.を指定して.Update.したら最新が落ちなくなった

// Rivision 1.8 から おとす cvs update -r 1.8 /home/project/test.htm // 最新版がおちてこない ! cvs update /home/project/test.htm // 状態をしらべてみる cvs status /home/project/test.htm =================================================================== File: test.htm Status: Up-to-date Working revision: 1.8 2009-12-20 15:25:11 +0900 Repository revision: 1.8 /srv/cvs/project/test.htm,v Commit Identifier: G9QZcIl4lctsv9eu Sticky Tag: 1.8 Sticky Date: (none) Sticky Options: (none) // Sticky Tag を削除する cvs update -A
___

■ diff-modeで変更箇所がみれます

= : m-x : cvs-mode-diff RET : diff-goto-source // 変更箇所へ jump
___

■ FrontEndとしてのVC

WARNING vc mode が利用できないなら明示的に load する
    (load-library "vc")
emacs は backend に複数の VC をもつ frontend VC をもつ. [未登録] -> [登録 && lockなし] < -> [編集可能 < -> lockあり] c-x v v : m-x : vc-next-action c-x v u : m-x : vc-revert-buffer // comment buf の編集は 次の3 pattern check in lock の奪取 file 登録 -> c-c c-c 作業終了. -> m-p, m-n : buf 移動.
___

■ VCcommand

c-x v v : m-x vc-next-option : 次の管理状態へ c-x v d : m-x vc-directory : 登録すみファイル表示. -> cur dir 以下のすべての版管理すみの file 表示に便利 -> しかも dired mode c-x v = : vc-diff : rev の差分を表示 差分 report が作成できるよ c-u c-x v = で rev 指定. Etr key で空指定ならば 最新rev と workfile の差分. dir 指定で 以下のすべての 差分作成可能. patch format で出力される. c-x v ~ : vc-version-other-window: 指定 rev を表示. -> file.ext~rev~ として保存される. c-x v l : vc-print-log file 変更履歴( rlog の結果が *vc* Buffer に表示 ) c-x v i : vc-register : file を版管理にする -> 非平行管理 では checkout もされる c-x v h : vc-insert-headers : file に version 管理ヘッダ挿入 -> 最終更新者 , 日付がセットされる. -> 登録済み && 編集可能でOK c-x v r : vc-retrieve-snapshot : 名前つきのprojectをcheckoutする -> snapshot とは 複数の rev に対する tag ie. grouping する. きりのよいところで tag をうつと便利. -> SVN はすべの rev が snapshot に相当. 指定した SS名に対応する file を checkout c-x v s : vc-create-snapshot : 名前つきのprojectのsnapshot作成 -> 作成した SS は rev名を指定する際に代用 OK c-x v a : vc-update-changelog : ChangeLog file に RCS の履歴を元に AutoUpdate c-x v c : vc-cancel-revision : 保存すみ revision を破棄する.
___

■ vc mode のマーク説明.

modeline に 版管理の内容が記述. [-] : file 未変更 [:] : file 変更
___

■ 版管理システムを選択する

版管理の指定は master file を見て判断する -> master file とは 変更履歴を含んだファイルのこと VC が master をさがす手順. working file と同一 dir (RCS | SCCS | CVS | .svn) dir を検索 -> VAR:vc-handled-backends に 検索順番があるよ -> (RCS | CVS | SCCS) の順番.
___

■ VC.管理下のファイル名をかえる

いろいろメンドイ RCS ならば master も変更する必要あり -> m-x: vc-rename-file で変更可能 CVS はもっとメンドイらしい SVN は workfile の rename が簡単な設計目標があったらしい http://shimaki-hp.hp.infoseek.co.jp/cvs/x161.html # ばか正直に 古いのを消して, 新規に登録する

  cd project

  # けす
  cvs remove foo.cpp

  # たす
  cvs add bar.cpp

  # コミット
  cvs commit

# log を残したいとき # REPOSITORY を rename する

  cd $CVSROOT

  # 名前を変更
  mv project/foo.cpp,v  project/bar.cpp,v

  # update して おちてくるのを確認
  cd project
  cvs update

  U: bar.cpp

___

■ Lock.がかかった

* network ごしの master ではなく, local に キャッシュしておく [ lock情報... ] * なにかの拍子に cvs の transaction が abort すると commit するたびに次のメッセージがでる * 複数の人が cvs command を利用しているときに Lock がかかる File Lock とは別
  cvs commit: [07:10:47] waiting for XXX's lock in /home/yokoyama/CVS_DB/public_html
* こんなときは REPOSITORY にある次のファイルを消す #cvs.rfl.hostname.pid EX #cvs.pfl.USR.696
___

■ 登録しないファイルの指定(cvsignore)

DESC "cvsignore" というファイルに 無視する パターンを記述 Directory 単位かな ?
    # obj file と backup file 無視

    *.obj
    *_bk
___

■ VC を制御する変数

vc-handled-backends: VC が使用する, backend ( CVS に変更してみる ) vc-display-status nil : modeline での VC 表示 ONOFF vc-backend-header vc-CVS-header == $Id: emacs.htm,v 1.169 2012-06-17 13:32:26 tomita Exp $ vc-keep-workfiles VC は checkin 時に readonly の file を cp する vc-mistruct-permissions VC に file権限をあてにしないようにする. vc-suppress-confirm t: 確認 prompt をとめる. vc-initial-comment t: checkin 時にコメントをもとめる. diff-switches diff にわたす command line option WARNING file をひとつの sub tree 以下で管理する必要あり
___

■ Ediff による比較

Ediff は VC の interface から起動される. Ediff を使うことで, conflict を検出した際に便利 m-x : ediff-revision RET -> default ( 最新rev, workfile ) control window で各種制御をする -> SVN みたいなもの ? buf をスクロールさせて, 相違点を探すこと. 発見した相違点を修復する control window から 次の command を打つ. -> *Ediff Control Panel* ができています ? : reference を表示させるとさらに便利. n : ediff-next-diffrence p : ediff-previous-diffrence j : ediff-jump-to-diffrence < > : ediff-scroll-horizontally vV : ediff-scroll-vertically | : ediff-toggle-split m : ediff-toggle-wide-display a : ediff-copy-A-to-B b : ediff-copy-B-to-A r a r b : ediff-restore-diff -> copy する前の状態に戻す. A. B : ediff-toggle-read-only w : ediff-save-buffer q : ediff-quit ! : ediff-update-diffs E : ediff-documentation z : ediff-suspend S-idBuf : 読み込み専用にする.
















NINJAIDX 5