[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルが大きくなってきたり, 何人かで同じファイルを変更したりすると, どこをなぜ 変更したのかが分からなくなってきます. そんな時に便利なものを紹介します
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
まずは,どこを変更したのか表示する方法から紹介します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
変更前のファイルと変更後のファイルがあって,どこが違うのかを知るにはどうすればいいでしょうか.
そのために, unix には変更箇所を表示するコマンドが用意されています. Cygwin がインストールされていれば, Windows でも利用できます.
cmp
最初に変更が見つかった場所を表示する. ファイルが一緒か違うかを判断するコマンド.
例:
~/www/soft> cmp meadow.texi meadow.texiold meadow.texi meadow.texiold 異なります: バイト 372 、行 15
comm 元ファイル 新ファイル
変更箇所を表示します. 出力は 3 列からなり, タブで区切られています. 第 1 列には元 ファイルだけにしか含まれない行を, 第 2 列には新ファイルだけにしか含まれない行を, そして第 3 列には両方のファイルに共通に含まれている行がそれぞれ出力されます.た だし,使い勝手はいまいちです.特に,行が増えてくると訳が分からなくなります.オプ ションとして,-[123] を与えると,指定した列を出力しないようにできます.また, ファ イル名を-とすると標準入力と比較します.
例:
~/tmp> comm -1 ./test1.dat ./test2.dat 1,2 2,3 3,4 5,4
diff file1 file2
ファイルの変更箇所を表示するコマンドとしては最も便利なコマンドです.例の file1, file2 はディレクトリでも可能で,複数のファイルの変更箇所も表示してくれます.ただ し, 両方に同じファイル名のファイルがないと実行できません.
diff dir1/file dir2
と指定すると dir1/file と dir2/file を比較します.
例:3 種類の引数で実行した例です.
~/www/soft> diff meadow.texi.orig meadow.texi 2962c2962 < $Lastupdate: 2004/01/18 12:32:16 $ --- > $Lastupdate: 2004/01/18 12:32:16 $ 3514a3515 > ファイルの変更箇所を表示する. ~/www/soft> diff -c meadow.texi.orig meadow.texi *** meadow.texi.orig Fri Nov 8 13:05:15 2002 --- meadow.texi Fri Nov 8 13:05:40 2002 *************** *** 2959,2965 **** @subsection time-stamp を入力する関数 ! $Lastupdate: 2004/01/18 12:32:16 $ という行があれば探して, 更新時間を書き換えてくれます. --- 2959,2965 ---- @subsection time-stamp を入力する関数 ! $Lastupdate: 2004/01/18 12:32:16 $ という行があれば探して, 更新時間を書き換えてくれます. *************** *** 3512,3517 **** --- 3512,3518 ---- @item diff file1 file2 + ファイルの変更箇所を表示する. @end table ~/www/soft> diff -u meadow.texi.orig meadow.texi --- meadow.texi.orig 2002-11-08 13:05:15.000000000 +0900 +++ meadow.texi 2002-11-08 13:05:40.000000000 +0900 @@ -2959,7 +2959,7 @@ @subsection time-stamp を入力する関数 -$Lastupdate: 2004/01/18 12:32:16 $ +$Lastupdate: 2004/01/18 12:32:16 $ という行があれば探して, 更新時間を書き換えてくれます. @@ -3512,6 +3512,7 @@ @item diff file1 file2 + ファイルの変更箇所を表示する.
この diff -u meadow.texi.orig meadow.texi の出力がパッチと呼ばれます. 実際には
diff -u meadow.texi.orig meadow.texi > patch.txt
として作成します. 順番が大事です. 必ずオリジナルを先に新しい方を後にします. ディレクトリ単位のパッチであれば
diff -crN olddir newdir > patch.txt
として作成します (r はサブディレクトリも対象にする. N は存在しないファイルも対象にする意味). unix の情報を調べると「パッチを当てる」という言葉を見ると思いますが, これはこの差分と古いファイルを見ながら, 新しいファイルを作ることを意味します.
patch < patch.txt
として当てます.
また, パッチの先頭行が
--- soft/meadow.texi.orig 2002-11-08 13:05:15.000000000 +0900 +++ soft/meadow.texi 2002-11-08 13:05:40.000000000 +0900
となっていると, patch はカレントディレクトリ下の soft/meadow.texi というファイルを探します. しかし, soft というディレクトリがない時には
patch -p1 < patch.txt
として当てます. こうすると soft/meadow.texi は meadow.texi と見なされます (/が 1 個無視される. -p2 だと usr/local/src => src となります).
以下, diff のメモ
以下, patch のメモ
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
diff ファイルを表示するためのモードです. pcl-cvs にも附属してますので, pcl-cvs を使っているなら,特に入れ直す必要はありません.設定も pcl-cvs の設定で紹介して ますので,特に何もしなくても diff モードが使えるはずです.また, Meadow 1.99 以 降にも附属しています.
pcl-cvs を使っていないならば, ftp://rum.cs.yale.edu/pub/monnier/diff-mode/ からダウンロードし,ロードパ スの通ったところへ置き,以下を追加します.
(autoload 'diff-mode "diff-mode" "Diff major mode" t) (add-to-list 'auto-mode-alist '("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)) |
これで, diff ファイルを開くと diff-mode になります.ただ,ほとんど色がつかなくて寂しいので,色を変更してしまいましょう.設定は黒背景用ですので,適当に変更してください.
(add-hook 'diff-mode-hook (lambda () (set-face-foreground 'diff-file-header-face "light goldenrod") (set-face-foreground 'diff-index-face "thistle") (set-face-foreground 'diff-hunk-header-face "plum") (set-face-foreground 'diff-removed-face "pink") (set-face-background 'diff-removed-face "gray26") (set-face-foreground 'diff-added-face "light green") (set-face-background 'diff-added-face "gray26") (set-face-foreground 'diff-changed-face "DeepSkyBlue1") )) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
diff コマンドで違いは分かりますが,結局ファイルの該当箇所を見直したりする必要があり使い勝手はいまいちです.
そこで, 便利なのが ediff です.これを使うと スクリーンショット のように,各ファイルの変更箇所が表示されますので非常に便利です.
このスクリーンショットを見ると, 右上に小さなウィンドウがあるのが分かりますね. フォーカスもここへ移り, nやpで変更を次々と見ていくことができます. ?でヘルプが出ますので, 分からなければこれを見るといいでしょう.
この ediff は Meadow に付属してますので, 設定などは不要です. 使い方も簡単, M-x ediff や M-x ediff-buffers, M-x ediff-filesとするだけです. ただし, diff が利用できないと使うことができません.
3 つのファイルの比較はM-x ediff-buffers3やM-x ediff-files3を利用します.
ファイルを並べて見たいならM-x ediff-mergeとすればいいでしょう. ディレクト リ単位の比較はediff-directoriesやediff-directories3でできます.
デフォルトでは, ediff 実行時に小さなウィンドウが出ますが,これを消すには
(setq ediff-window-setup-function 'ediff-setup-windows-plain) |
とします.
ediff はバッファの変更箇所をハイライトして非常に分かりやすく、便利です。 しかし、あまりにも変更箇所が多いと、変更箇所はハイライトされません。こ れは
(setq-default ediff-auto-refine-limit 10000) |
のようにすることで、調節できます。この例だと変更箇所が 10000byte までな らハイライトされます。デフォルトは 1400 です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
編集前と編集後のファイルの diff を自動で取ってくれるものです.
auto-diff.elからダウンロードできます.
(require 'auto-diff) (add-to-list 'auto-diff-directory-regexp (expand-file-name "~/mylisp/.*\.el")) |
のようにしておくと,指定したディレクトリのファイル編集時に,編集前のファイルが保存され,ファイル編集後に保存し,編集終了時に diff を取ってくれます.短いものなので,用途に合わせて,適当にプログラムをいじった方が使いやすいかもしれません.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ネタ元:http://www.mdcnet.co.jp/~keiichi/meadow-tips-ja.shtml
現在編集中の状態と保存されたファイルとの diff を取ることができます
ファイルを変更したところ,どこを変更したのか分からなくなるということはよくありま す.記憶力が悪いだけと言われればそうかもしれんが,変更点を見ることができれば便利 です.
保存されているファイルと編集中の状態との diff を取ることができます. ediff も可能な ので,変更箇所が判り易くなります.
以下を.emacs に追加します
ちなみに, diff-with-original は後藤さん, ediff-with-original は鈴木さんが書かれ たものです.
(defun diff-with-original (ediff) "Examin diff of current buffer with original file. If with prefix, do interactive merge using `ediff-with-original'. " (interactive "P") (if ediff (ediff-with-original) ;; simple diff view with diff-mode (require 'ediff) (let ((diff-buf (get-buffer-create (format "*diff %s*" (buffer-file-name)))) (ediff-diff-options "-u") ;; is it your favourite? (tmpfile (ediff-make-temp-file (current-buffer)))) (save-excursion (set-buffer diff-buf) (setq buffer-read-only nil) (buffer-disable-undo) (erase-buffer)) (ediff-make-diff2-buffer diff-buf (buffer-file-name) tmpfile) (delete-file tmpfile) (set-buffer diff-buf) (if (< (buffer-size) 1) (message "No differences with original file.") (condition-case nil (progn (require 'diff-mode) (diff-mode)) (error)) (goto-char 1) (pop-to-buffer diff-buf))))) (defun ediff-with-original () (interactive) ;; interactive merge using ediff (let ((file buffer-file-name) (buf (current-buffer)) (orig-buf (get-buffer-create (concat "*orig " buffer-file-name "*")))) (set-buffer orig-buf) (setq buffer-read-only nil) (buffer-disable-undo) (erase-buffer) (insert-file file) (setq buffer-read-only t) (set-buffer-modified-p nil) (ediff-buffers orig-buf buf))) |
ファイルを編集中にM-x diff-with-originalあるいはM-x ediff-with-originalとします.
そうすると,保存されているファイルと編集中の状態との差を表示してくれます.
あくまで,保存されたファイルと編集中の保存していない状態との差分です.そのため, 自動保存などを使っていると意味がありません.
その場合には標準コマンドのM-x diff-backup が役立ちます.これは,バックアッ プと現在のファイルとの diff を行ってくれるものです.これなら,バックアップが作成 された時と現在との変更点を見ることができます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを変更中に変更箇所が多くなってくるとどこを変更したのか分からなくなってきます.
そこで, 変更箇所を表示してくれるのが change-mode です.これを使うと,ファイルに文字を追加したり,削除したりするとその文字に色がつき,どこを編集したのかが簡単に分かるようになります.
change-mode は http://www.anc.ed.ac.uk/~stephen/emacs/ell.htmlから辿れますので, コピーして change-mode.el の名前でロードパスの通ったところへ置いてください.
設定は以下の通り
(autoload 'change-mode "change-mode" "Show changes in a distincive face" t) (autoload 'change-mode-next-change "change-mode" "\ Move to the beginning of the next change, if minor-mode change-mode is in effect." t) (autoload 'change-mode-previous-change "change-mode" "\ Move to the beginning of the previous change, if minor-mode change-mode is in effect." t) (autoload 'compare-with-file "change-mode" "Compare this saved buffer with a file, showing differences in a distinctive face" t) (autoload 'change-mode-remove-change-face "change-mode" "\ Remove the change face from the region. This allows you to manually remove highlighting from uninteresting changes." t) (autoload (quote global-change-mode) "change-mode" "\ Turn on or off global Change mode.\" `change-mode-global-modes'." t nil) ;;(global-set-key '[C-right] 'change-mode-next-change) ;;(global-set-key '[C-left] 'change-mode-previous-change) |
後は, ファイルを開いたらM-x change-modeで change-mode になります. 最後の 2 行のコメントを外すと, Ctrl-カーソルキーで変更箇所を移動できます. ただし, 単語単位での移動はできなくなるので, 各モード別に local-set-key で割り当てた方がいいでしょう.
変更箇所の色を消すには, 消したい部分をリージョンで選び, M-x change-mode-remove-change-faceとします. 全部消すなら, C-x h M-x change-mode-remove-change-faceとすればできます.
また,M-x change-mode-rotate-colours とすると,変更箇所の色が変化します.この色のリストは change-mode-colours で設定できます.保存時に実行するようにしておくと,まだ保存していない変更箇所がすぐに分かるようになります.
私は texinfo-mode で change-mode を使い,黒背景向きに色を換えるためにこんな設定を入れています.
(setq change-mode-colours '( "SkyBlue" "LightPink1" "CadetBlue2" "plum1" "dark orange" "dark turquoise")) (setq change-delete-face-foreground "pink") (setq change-face-foreground "pink") (add-hook 'texinfo-mode-hook (lambda () (add-hook 'local-write-file-hooks 'change-mode-rotate-colours) (change-mode) (local-set-key "\C-^" 'change-mode-next-change) )) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを変更したものの,また戻したいということはよくあること.だけど,そのため に,同じような名前のファイルを多数作るのもバカバカしいですね.そんな時に便利なも のを紹介します.
44.2.1 pcl-cvs − バージョン管理 (2003/11/17)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
cvs を Emacs から操作し,ファイルのバージョンを管理することができます.
ファイルを頻繁に更新していると,以前の状態に戻したいことがあります.しかし,普通 に編集していると,そのようなことはできません.そこで,バックアップを取っておき, そこから復元することがあります.
しかし,この方法ではどうしてもファイルが多くなってしまい,目的のデータを探すのが 大変です.
バージョン管理ソフトとはプログラムや文書の変更した場所を記録しておくソフトのこと です. それにより,別のフォルダへ保存することなく,いつでも以前の状態に戻すことが できます.
バージョン管理ソフトで有名なものは cvs や rcs があり, Unix では一般的に使われてい ます.しかし,これらはコマンドラインでコマンドを入力する必要があり,面倒です.
そこで, pcl-cvs を使います.これを使うと, Meadow から簡単に cvs を利用できるよ うになります.
当然ですが cvs をインストールして,設定しておく必要があります.61.1 CVS (2004/12/19) を参考 にインストールしておいてください.
以下の説明では, cvs を使うことのできる環境と知識があることを前提としています.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
以下のインストールや設定の説明は Meadow 1.15 向けです. Meadow 1.99 では標 準で附属しています..
pcl-cvs はftp://rum.cs.yale.edu/pub/monnier/pcl-cvs/よりダウンロードして, インストールしておきます. ただし, elib も必要なので,これもインストールしてくだ さい,
設定は以下の通り.
(load "pcl-cvs-startup") (setq cvs-cvsroot ":local:/cygdrive/c/home/CVSROOT") ;;要変更 (add-hook 'cvs-mode-hook (lambda () (collection-set-goal-column cvs-buffer-name 38))) (autoload 'diff-mode "diff-mode" "Diff major mode" t) (add-to-list 'auto-mode-alist '("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)) ;; log はどのコードで書くか決めて (modify-coding-system-alist 'process "cvs" '(undecided . sjis)) ;; pserver ではなく local repository を使うための設定. 詳細は ;; meadow-users-jp メーリングリストの ;; Subject: about pcl-cvs X-ML-COUNT: 1870 ;; Date: Sat (if (featurep 'meadow) (define-process-argument-editing "/cvs\\.exe\\'" (lambda (x) (let ((command (car x)) (argument (cdr x))) (setq argument (cygnus-process-argument-quoting argument)) (concat (unix-to-dos-filename command) " " (unix-to-dos-argument (mapconcat (function concat) argument " ") nil nil nil nil)))))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
以下のインストールや設定の説明は Meadow 1.99 向けです.
Meadow 1.99 には pcl-cvs と同じことのできる vc が附属しています.そのため,イン ストールは不要です.
設定も Meadow 1.15 よりも少なく,以下の設定で使うことができます.
(setq cvs-cvsroot ":local:/cygdrive/c/home/CVSROOT") ;;要変更 (autoload 'diff-mode "diff-mode" "Diff major mode" t) (add-to-list 'auto-mode-alist '("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)) ;; log はどのコードで書くか決めて (modify-coding-system-alist 'process "cvs" '(undecided . sjis)) ;; pserver ではなく local repository を使うための設定. 詳細は ;; meadow-users-jp メーリングリストの ;; Subject: about pcl-cvs X-ML-COUNT: 1870 ;; Date: Sat (if (featurep 'meadow) (define-process-argument-editing "/cvs\\.exe\\'" (lambda (x) (let ((command (car x)) (argument (cdr x))) (setq argument (cygnus-process-argument-quoting argument)) (concat (unix-to-dos-filename command) " " (unix-to-dos-argument (mapconcat (function concat) argument " ") nil nil nil nil)))))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
まず,M-x cvs-checkout で cvs で管理しているものを適当なディレクトリに checkout しておきます.そして,ファイルを編集後,M-x cvs-examine とします. すると,変更点があるものの一覧を表示できます.変更点がなければファイルの名前は表 示されません.
スクリーンショット.
Modified とあるのが変更されているファイルなので, nで特定のファイルにカーソ ルを移動して, commit などを行います.
よく使う関数は以下.
各ファイルの状態を見るのは M-x cvs-status でできます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow 1.99 に附属しているものを使っているならば,上記に加えて,ファイル編集中に 以下のキーを使うことができます.
CVS を使っている方なら関数名を見れば大体分かるでしょう.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
何回か保存したら自動的に CVS にコミットします.
CVS は便利なのですが,ファイルを変更しても CVS は実行しなかったりということがありま す. CVS のデータをアップデートしないと,結局以前のデータに戻すことができなくなっ てしまいます.
何回か保存すると自動的に CVS にコミットします.これにより,ある程度の変更があれば, その途中経過が CVS に残り以前の状態に戻しやすくなります.
auto-vc-checkin.elをダウン ロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(require 'auto-vc-checkin) ;; 自動でコミットされる頻度を制御 ;; この例だと, 3 度保存すると,コミットする (setq auto-vc-checkin-full-count 3) ;; 自動コミットを使うバージョン管理ソフトを指定 (setq auto-vc-checkin-backend '(RCS CVS SVN)) |
vc がオンになれば,モードラインに CVS:1.12 のようにバージョンが表示されます.この時, auto-vc-checkin が有効になっていれば,「 CVS:1.12+ 」のように「 + 」がバージョンの後 に表示されます.
この状態で編集を行い,保存を「 auto-vc-checkin-full-count 」で指定した回数行うと, CVS に接続しコミットを行います.
M-x auto-vc-checkinでオン/オフができるので,一度オフにして,再度オンにして みてください.
結構好き嫌いの分かれる Elisp かな.面倒なことは何でも自動でやってという人と,自分 の把握しないところでコミットされるのは嫌という人がいると思いますから.もし,あな たが前者であれば,便利だと思います.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
どこをなぜ変更したのかをメモしておかないと,変更箇所が分かっても意味がありません. そこで,変更理由をメモする方法について紹介します.
44.3.1 Chanelog を書こう ― add-change-log-entry (2003/07/20)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを編集して放っておくとすぐに忘れてしまうものです. どうしてこんなことして るんだろう. . . 自分で良いと思ってやったはずなのに, 真剣に悩んでしまう. そんな経 験は誰にでもあるはず. そんな時, Changelog があると, なぜ変更したのかが分かって便 利です.
といってもなかなか面倒で書く気にはならないもの. そんな面倒な Changelog を少しで も便利にしようとするのがこの関数です.
ファイルを編集し終わったら, M-x add-change-log-entryと入力します (モードに よっては C-x C-a に割り当てられています). すると, デフォルトの編集中のファ イルと同じフォルダに Changelog ファイルを作成し, それを開きます. すると, 自動的 に
2002-09-12 root <[email protected]> * meadow.texi (add change log): |
と入力してくれるので, 後はコメントを書くだけです. 毎回, どのファイルを編集したか などは自分で書く必要はありません.
デフォルトのファイル名は
(setq change-log-default-name "Changelog.txt")
|
と指定できます.
また,名前や メールアドレスは
(setq user-full-name "name")
(setq user-mail-address "mail address")
|
で指定できます.ただし,
(setq add-log-full-name "name") (setq add-log-mailing-address "mail address") |
があると,そちらが有効になります.
時間のフォーマット指定方法などは add-log.el に書いてあります.
最後に,お勧めサイト.横着プログ ラミング Unix のメモ技術. Changelog でメモをとる方法について書かれてます. ChangeLog メモを試 してみよう も参考になります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを変更すると,直前に変更した場所に移動したいなんてこともあるもんです.そ んな時に便利なものを紹介します.
44.4.1 変更箇所へ移動 ― goto-chg (2008/09/20)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを開いてから変更を行った時に,変更した箇所へカーソルを移動できる.
テキストを編集していると,ちょっと前に変更した場所にカーソルを移動したい時があり ます.しかし,単語で検索をして探すのも面倒なものです.
変更した箇所にカーソルを簡単に移動できます.
設定していませんので,インストールなどが必要です.
goto-chg.el からダウン ロードしてロードパスの通ったところへ置きます.
以下を .emacs に追加します
(require 'goto-chg) (global-set-key [(control ?.)] 'goto-last-change) (global-set-key [(control ?,)] 'goto-last-change-reverse) |
キーバインドは環境に合わせて変更ください.設定済み Meadow では,このキーバインド では,別機能にぶつかります.
ファイルを開いて変更していきます.で,M-x goto-last-change か設定したキー バインドで 1 個前の変更箇所に移動できます.何度も実行すると,さらに戻っていくこと ができます.
M-x goto-last-change-reverse で,逆方向に戻っていきます.
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |