[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow でファイルを保存する,あるいは meadow で編集中のファイルを他のソフトで保 存されたなど,ファイルの保存に関連した設定です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Meadow で編集しているファイルを他のソフトで書き換えても, Meadow で開いているファ イルの内容は変わりません.
その場合には再度,読み込み直したりする必要があります.ここではそのための機能や設 定を紹介します.
24.1.1 ファイルを読み込み直す (2003/09/23) 24.1.2 ファイルを開き直す (2003/08/07) 24.1.3 他のソフトでファイルが更新されたら (2003/11/14) 24.1.4 ファイルを開く/保存/読み込み直しを簡単に ― disk (2003/09/21)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
他のソフトで保存した内容を読み込むためには,M-x revert-buffer とします.こ うすると,確認の後でファイルを読み込み直します.
ただし,一度読み込み直したら,それを取り消すことはできません.これまでのアンドゥ 情報もなくなりますので,注意してください.
さらに,頻繁に他のソフトで書き換える場合には,M-x auto-revert-mode あるい は M-x turn-on-auto-revert-mode があります.これは,文字通り自動で revert-buffer を行ってくれるものです.ただし,確認なしで読み込まれますので,注意 が必要です.
この M-x auto-revert-mode は今表示しているバッファのみ有効ですが,すべての バッファで有効にするためには,M-x global-auto-revert-mode とします.こうし ておくと,すべてのファイルバッファで同様のことをしてくれます.
以下,設定サンプルです.
;; 起動時から global-auto-revert-mode を有効にする (global-auto-revert-mode 1) ;; 特定のモードでのみ有効にする (add-hook 'c-mode-hook 'turn-on-auto-revert-mode) ;; global-auto-revert でも特定のモードでは無効にする (add-hook 'text-mode-hook (lambda () (setq global-auto-revert-ignore-buffer t))) ;; global-auto-revert でも特定のモードでは無効にする (setq global-auto-revert-ignore-modes '(text-mode)) ;; auto-revert-mode のモードライン表示を変更 (setq auto-revert-mode-text " ARev") ;; global-auto-revert でのモードライン表示を変更 (setq global-auto-revert-mode-text "") |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
いやな日記 より.
CVS では commit するとファイル内のバージョン情報を書き換えてくれます. CVS 以外 でも,外部エディタ等でファイルを編集することがあると思います.
しかし,既にそのファイルを Meadow で開いていると,一度 kill-buffer してから 開き 直したり, revert-buffer を利用する必要があります.しかし,これでは面倒だし,そ れまでの変更を取り消すことができなくなってしまいます.
そこで,以下のような設定が便利です.以下を .emacs に追加しておくと,C-x C-r でファイルを開き直すことができます.中を見れば分かるように,バッファの内容 を消して (erase-buffer) ,ファイルを挿入 (insert-file) しているだけなので,アン ドゥで元に戻すこともできます.
;; http://namazu.org/~satoru/diary/?200203c&to=200203272#200203272 ;; 編集中のファイルを開き直す ;; - yes/no の確認が不要;; - revert-buffer は yes/no の確認がうるさい ;; - 「しまった! 」というときにアンドゥで元のバッファの状態に戻れる ;; - find-alternate-file は開き直したら元のバッファの状態に戻れない ;; (defun reopen-file () (interactive) (let ((file-name (buffer-file-name)) (old-supersession-threat (symbol-function 'ask-user-about-supersession-threat)) (point (point))) (when file-name (fset 'ask-user-about-supersession-threat (lambda (fn))) (unwind-protect (progn (erase-buffer) (insert-file file-name) (set-visited-file-modtime) (goto-char point)) (fset 'ask-user-about-supersession-threat old-supersession-threat))))) (define-key ctl-x-map "\C-r" 'reopen-file) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
2ch より
ファイルを一度バッファに読み込み,他のソフトでそれを更新した時,開いたバッファは そのままで,新しいファイルを開く方法です.
あるいは以下を .emacs に追加
(defadvice revert-buffer (before current-buffer-copy () activate) (let ((buf (get-buffer-create ;;(generate-new-buffer-name (buffer-name)) (format "*%s backup*" (buffer-name)))) (mode major-mode)) (save-excursion (set-buffer buf) (erase-buffer) (funcall mode)) (widen) (copy-to-buffer buf (point-min) (point-max)))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルの編集中によくするのは保存ですし,他のソフトで編集した後であれば読み込み 直しをやることが多いでしょう.
しかし,これらの操作はそれぞれ異なり,不便です.
M-x diskとするだけで,
と自動的に適当な操作を選択して実行してくれます.
Emacs Wikiから disk.el を ダウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(autoload 'disk "disk" "Save, revert, or find file." t) |
ファイル編集中などにM-x diskとすると,利用できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルの保存に関係した設定などを紹介します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
まずは基本から. ファイルの保存は C-x C-s でできます.
複数のファイルを編集していて,変更したファイルをすべて保存したい時にはC-x s とします.バッファ毎に保存するか確認されますので, y か n で答えます.全部保 存したければ ! とします.これで,! と入力した以降のファイルはすべて保存されます. 中断は q です.
いちいち確認されるのが面倒なら,C-u C-x s とします.これなら確認なしに全バッ ファを保存できます
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs は「ファイル名~」と「#ファイル名#」の 2 種類のバックアップファイルを作ります. その違いを紹介します.
OS が落ちた時,ファイルの保存をしていないと,そのデータは消えてしまいます.そこ で, Meadow はそのようなことを避けるためにバックアップファイルを作成します.
Meadow によって作成されるバックアップファイルには 2 種類あります.一つはファイル 名に ~ がついたもの.もう一つはファイル名に#がつくものです.
~ がついたバックアップファイルはテキストを保存する際に作成されます. これにより, 変更はしたけれど, やっぱり取り消したいという時に,変更を取り消すことができます.
# がついたバックアップファイルはファイルを編集すると作成されます.ファイルを保存 するとなくなりますが, OS が落ちたりした時には消されずに残ります.このファイルに は,編集途中のファイル情報が入っており,その情報をもとに編集中だったファイルを復 元することができます.その方法は,M-x recover-file とし,復元したいファイ ル名 (# がついていないファイル名) を入力します.
また,どのファイルのバックアップファイルが残っているのか分からないという時には M-x recover-sessionとします.こうすると,復元できるファイルなどの一覧が表 示されます.その中に,「 2556-WINXP~」のようなものがあります.このファイルには, 編集中のファイル名と,バックアップファイル名が記録されてますので,カーソルをこの ファイルへ移動し,C-c C-cとします.そうすると,バックアップファイルを自動 で探して,復元してくれます.
このように, Meadow では 2 種類のバックアップファイルが作成されますが,両方とも 編集中のファイルと同じ場所に作成されます.# がつくバックアップファイルは保存時に 消えるので問題はないですが,~ がついたバックアップファイルは編集中のファイルと同 じ場所に必ずできてしまい,かなり邪魔です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
~ がついたバックアップファイルの保存場所は以下のようにして変更できます.
Meadow 1.15 ならば,以下の設定を .emacs に追加します.この設定ではバージョンコン トロールのファイルは変更されません.
(setq backup-by-copying t) (fset 'make-backup-file-name '(lambda (file) (concat (expand-file-name "~/bak/") (file-name-nondirectory file)) )) (if (file-exists-p "~/bak/") (setq auto-save-list-file-prefix "~/bak/")) |
Meadow 1.99 以降ならば,以下の設定を追加します.
(setq make-backup-files t) (setq backup-directory-alist (cons (cons "\\.*$" (expand-file-name "~/bak")) backup-directory-alist)) |
この設定だと,すべてのバックアップファイルが ~/bak に保存されます.条件を追加す ることにより,特定のファイルのバックアップは別ディレクトリに保存ということもでき ます.また,バージョンコントロールのファイルもここに保存されます.
バックアップファイルに関しては
(setq make-backup-files nil) |
と設定すれば作成しないようにすることもできます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacs には標準で簡易なバージョンコントロール機能があります.
使い方は簡単で
(setq version-control t) |
としておくだけです.これで保存すると,.emacs.~1~,.emacs.~2~ という風に保存され, 古いものも残るようになります. Meadow 1.15 では 元ファイルと同じ場所に作成されま す. Meadow 1.99 では特定のフォルダに固定することができます.
また,バージョンをいくつまで保存しておくかは以下のように設定できるので,必要に応 じて変更します.デフォルトは両方とも 2 です.
;; 新しいものをいくつ残すか (setq kept-new-versions 2) ;; 古いものをいくつ残すか (setq kept-old-versions 2) |
デフォルトでは古いバージョンを消す際に尋ねられるので,以下のようにして尋ねずに消 去するようにしています.
(setq delete-old-versions t) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルを開いて,以前の続きを編集するには,その場所までカーソルを移動させなけれ ばなりません.この操作を毎回行うのは面倒です.
Meadow なら,前回編集していた場所を記憶し,ファイルを開いた時にそこへカーソルを 移動させることができます
そのために, saveplace という Lisp を利用します.
これは Meadow に標準で附属しています.
.emacs に以下を追加します.
(load "saveplace")
(setq-default save-place t)
|
これで,ファイル保存時に,カーソル位置を保存してくれます.そして,ファイルを開く と, 前回編集していた場所にカーソルを移動してくれます. save-place の変数を設定す ることで, ファイルやモードによって切り替えることも可能です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
参考サイト:Emacs でファイルの自動保存 (auto-save-buffers)
自動的に編集中のファイルを保存
パソコンがフリーズしてデータが消えてしまったという経験は,ほとんどの人が体験して いることと思う.
それを防ぐ方法はまめに保存することしかありません.しかし,しばらくすると,保存す るのを忘れてしまい,結局データが消えてしまうことになります.
指定した時間が経過すると自動的にファイルを保存してくれます.
以下を.emacs に追加します.
これで, 1 秒ごとにファイルが保存されます.
;; ;; このコードは山岡克美氏が書いてくださった (ELF:01128) ;; ;; (require 'auto-save-buffers) ;; (run-with-idle-timer 0.5 t 'auto-save-buffers) ; アイドル 0.5 秒で保存 ;; ;; auto-save-buffers で対象とするファイルの正規表現 (defvar auto-save-buffers-regexp "" "*Regexp that matches `buffer-file-name' to be auto-saved.") (defun auto-save-buffers () "Save buffers if `buffer-file-name' matches `auto-save-buffers-regexp'." (let ((buffers (buffer-list)) buffer) (save-excursion (while buffers (set-buffer (car buffers)) (if (and buffer-file-name (buffer-modified-p) (not buffer-read-only) (string-match auto-save-buffers-regexp buffer-file-name) (file-writable-p buffer-file-name)) (save-buffer)) (setq buffers (cdr buffers)))))) (provide 'auto-save-buffers) ;; ;; Emacs 21 以降で Makefile の編集時に "Suspicious line XXX. Save anyway" ;; というプロンプトを出さないようにするためのおまじない ;; (add-hook 'makefile-mode-hook (function (lambda () (fset 'makefile-warn-suspicious-lines 'ignore)))) |
自動的に保存されるファイルは auto-save-buffers-regexp と auto-save-reject-buffers-regexp で制御できます.オリジナルは auto-save-buffers-regexp のみでしたが, auto-save-reject-buffers-regexp も追加し ました.
私が実際に使っているのは,もう少し変更した以下のような設定.自動保存が邪魔な時も あるので,以下のようにして,M-x auto-save-buffers-toggle で自動保存のオン・ オフを切り替えることができるようにしています
不満点は SKK などミニバッファに情報を表示している時に自動保存されると,ミニバッ ファの情報が消えてしまうこと.何とか制御できないものか...
(defvar auto-save-buffers-regexp "" "*Regexp that matches `buffer-file-name' to be auto-saved.") (defvar auto-save-buffers-toggle t) (defvar auto-save-reject-buffers-regexp "\.texi" "*Regexp that matches `buffer-file-name' to be auto-saved.") (defun auto-save-buffers () "Save buffers if `buffer-file-name' matches `auto-save-buffers-regexp'." (let ((buffers (buffer-list)) buffer) (save-excursion (while buffers (set-buffer (car buffers)) (if (and buffer-file-name (buffer-modified-p) (not buffer-read-only) auto-save-buffers-toggle (string-match auto-save-buffers-regexp buffer-file-name) (not (string-match auto-save-reject-buffers-regexp buffer-file-name)) (file-writable-p buffer-file-name)) (save-buffer)) (setq buffers (cdr buffers)))))) (defun auto-save-buffers-toggle () (interactive) (setq auto-save-buffers-toggle (not auto-save-buffers-toggle))) (run-with-idle-timer 0.5 t 'auto-save-buffers) ;; ;; Emacs 21 以降で Makefile の編集時に "Suspicious line XXX. Save anyway" ;; というプロンプトを出さないようにするためのおまじない ;; (add-hook 'makefile-mode-hook (function (lambda () (fset 'makefile-warn-suspicious-lines 'ignore)))) |
現在では http://homepage3.nifty.com/oatu/emacs/misc.html#asb の奥山さんの 設定を参考に以下のような設定で使っています.これなら, SKK などでミニバッファに 文字が表示されても消えるようなことはありません.
;; ;; To: ELF at ml.gentei.org ;; Subject: (ELF:01128) 続: auto-save-visited-file-name ;; From: Katsumi Yamaoka ;; Date: Thu, 12 Jul 2001 12:27:16 +0900 ;; ;; 参考:http://homepage3.nifty.com/oatu/emacs/misc.html#asb (defvar auto-save-buffers-regexp "" "*Regexp that matches `buffer-file-name' to be auto-saved.") (defvar auto-save-buffers-toggle t) (make-variable-buffer-local 'auto-save-buffers-toggle) (defvar auto-save-reject-buffers-regexp "\\(\.texi\\|/[0-9]+$\\|spam\\)" "*Regexp that matches `buffer-file-name' to be auto-saved.") (fset 'original-write-region (symbol-function 'write-region)) (defun auto-save-buffers () "Save buffers if `buffer-file-name' matches `auto-save-buffers-regexp'." (let ((buffers (buffer-list)) buffer) (unwind-protect (save-excursion (fset 'write-region 'auto-save-buffers-write-region) (while buffers (set-buffer (car buffers)) (when (and buffer-file-name (buffer-modified-p) (not buffer-read-only) (not (buffer-base-buffer)) auto-save-buffers-toggle (not (string-match auto-save-reject-buffers-regexp buffer-file-name)) (string-match auto-save-buffers-regexp buffer-file-name) (file-writable-p buffer-file-name)) (basic-save-buffer) (set-visited-file-modtime) (set-buffer-modified-p nil)) (setq buffers (cdr buffers)))) (fset 'write-region (symbol-function 'original-write-region))))) (defun auto-save-buffers-toggle () (interactive) (setq auto-save-buffers-toggle (not auto-save-buffers-toggle))) (defun auto-save-buffers-write-region (start end filename &optional append visit lockname mustbenew) (original-write-region start end filename append (cond ((stringp visit) visit) ((not visit) nil) (t 'BeQuiet)) lockname mustbenew)) (run-with-idle-timer 0.5 t 'auto-save-buffers) ;; ;; Emacs 21 以降で Makefile の編集時に "Suspicious line XXX. Save anyway" ;; というプロンプトを出さないようにするためのおまじない ;; (add-hook 'makefile-mode-hook (function (lambda () (fset 'makefile-warn-suspicious-lines 'ignore)))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
全部内容を消してしまって,内容が 0 になったファイルを削除する設定.
日記などのファイルを整理していて,内容が 0 になってしまうことがあります.当然, そのファイルを消そうと思うわけですが, dired で開いてたくさんのファイルの中から 探すのも面倒です.
ファイルの内容が無くなったら,ファイルを削除してくれます.
以下を.emacs に追加します.
(if (not (memq 'delete-file-if-no-contents after-save-hook)) (setq after-save-hook (cons 'delete-file-if-no-contents after-save-hook))) (defun delete-file-if-no-contents () (when (and (buffer-file-name (current-buffer)) (= (point-min) (point-max))) (when (y-or-n-p "Delete file and kill buffer?") (delete-file (buffer-file-name (current-buffer))) (kill-buffer (current-buffer))))) |
ファイルの内容を全部消してしまうと,消すかどうかを尋ねられます. y とすると,ファ イルとバッファを削除します.
以下のようにすると,いちいち尋ねずにファイルを削除します.バッファは削除しません.
(if (not (memq 'delete-file-if-no-contents after-save-hook)) (setq after-save-hook (cons 'delete-file-if-no-contents after-save-hook))) (defun delete-file-if-no-contents () (when (and (buffer-file-name (current-buffer)) (= (point-min) (point-max))) (delete-file (buffer-file-name (current-buffer))))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ファイルのメジャーモードを保存し,次回に開くときに復元します.
Windows は拡張子で開くソフトを決定します.Emacs もほとんどの場合,拡張子で開くモー ドを決定します.このため,Emacsで特定のモードにするために拡張子を適当に変えてし まうと,Windows側にも拡張子の設定を追加しなければなりません.
ファイルバッファのメジャーモードを保存し,次回開く時には以前と同じメジャーモード にします.
save-majormode.el をダウン ロードし,ロードパスの通ったところへ置きます.
以下を.emacsに追加します.
(setq-default save-major-mode t) (require 'save-majormode) |
普通にファイルを開いて編集するだけで,自動的にメジャーモードを記録し,次回開く時 に復元してくれます.
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |