ファイル操作

Last modified: "2019/01/02 17:49:36"

Table of contents


知っていると便利な辺り

文字コードを指定してファイルを開く / 開きなおす。

文字コードを指定してファイルを開く --- C-u C-x C-f

文字コードを指定してファイルを開きなおす --- C-u C-x C-v

Encoding: と聞かれたら、TAB 押してそれらしきものを探す。


そのファイルを hoge-mode として読み込む。

ファイルの先頭に、こんな感じで書いておく。

-*- Mode: HOGE -*-

「HOGE」の部分は、そのモードの mode-name で、 モード行の左の方に表示されている (xxx) の部分のことと思う。 こういうのを File Variables と呼ぶらしい。 Emacs のマニュアルによると、そのファイルに対応したローカル変数とその値を指定することができるそう。


create-archive の使い方

リファレンス、xyzzy Part7 350、xyzzy Part7 351 より。

第一引数:作成/追加 する書庫ファイル名(存在すれば追加/なければ新規作成)
第二引数:アーカイブするファイルのリスト(必ずフルパスで)
第三引数:基準ディレクトリ

書庫ファイルを作成するフォルダを指定する場合は、第一引数をフルパスで指定する。

第三引数の意味は例えば、

(create-archive "D:/hoge.lzh"
                '("D:/foo/foo.txt" "d:/foo/bar.txt")
                "D:/")

なら書庫ファイルには、

foo/foo.txt
foo/bar.txt

に。

(create-archive "D:/hoge.lzh"
                '("D:/foo/foo.txt" "d:/foo/bar.txt")
                "D:/foo")

なら書庫ファイルには、

foo.txt
bar.txt

になるみたいね。


カレントバッファのファイルサイズを取得

xyzzy Part7 436 より。

(file-length (get-buffer-file-name (selected-buffer)))

いろいろ

カーソル位置にあるパスを解釈してファイルを開いたりする

[xyzzy:07422](サイトウさん)より。

(defun open-cursor-path ()
  (interactive)
  (let (path (skip-words "-a-zA-Z0-9_/~.#@%?&=+(),'$!*:"))
    (save-excursion
      (skip-chars-backward skip-words)
      (setq path (buffer-substring (point)
                                   (progn
                                     (skip-chars-forward skip-words)
                                     (point))))
      )
    (if (file-exist-p path)
        (find-file path nil t)
      (message "~A はファイルなのか?" path)
      )
    )
  )

最近使ったファイル一覧

xyzzy Part6 332 より。abbreviate-display-string の引数を 40 から 68 にしたら、 「ファイル」→「最近使ったファイル」で、C:/... となって見えなかったファイルも表示されるようになって、 ちょっとうれしい。

(defun list-recents ()
  (interactive)
  (let (hlist filename)
    (setq hlist (mapcar #'(lambda (x)
                            (list (abbreviate-display-string x 60 t) x))
                        *minibuffer-file-name-history*))
    (multiple-value-bind (result data)
        (dialog-box
         '(dialog 0 0 286 162
           (:caption "最近使ったファイル")
           (:font 9 "MS Pゴシック")
           (:control
            (:listbox flist nil #x50b10111 7 7 216 148)
            (:button IDOK "OK" #x50010001 229 7 50 14)
            (:button IDCANCEL "キャンセル" #x50010000 229 24 50 14)))
         (list (cons 'flist hlist))
         `((flist :must-match t :enable (IDOK))))
      (when result
        (setq filename (car (cddr (assoc 'flist data))))
        (find-file filename)
        (add-history filename '*minibuffer-file-name-history*)))))
[2003/01/21]
・abbreviate-display-string の引数を 68 → 60 に戻した。(-_-)
[2003/01/20]
・このダイヤログから開いた場合にも、このリストの上位にくるようにした。
・abbreviate-display-string の引数を 60 → 68 にした。

読み取り専用のバッファを読み書き両用に

xyzzy Part5 230 より。open-writable と open-writable-with-change-attribute に分けた。 しかし、open-writable-with-change-attribute は、.xyzzy に書かないと、 file-error がエラーになる。何故?

;; 読み取り専用のバッファを読み書き両用に
(defun open-writable ()
  (interactive)
  (toggle-read-only nil))

;; 開いたファイルが読み取り専用の場合に一発で読み書き両用に
;(add-hook '*find-file-hooks* 'open-writable)

;; 読み取り専用のバッファを読み書き両用に(ファイル属性まで変更)
;;   return-from が siteinit.l コンパイル時にエラーをおこす。
(defun open-writable-with-change-attribute ()
  (interactive)
  (let ((filename (get-buffer-file-name (selected-buffer))))
    (when filename
      (handler-case
          (modify-file-attributes
           filename (logand (+ #x800 #x20 #x10 4 2)
                            (get-file-attributes filename)) 1)
        (file-error (c) (message "書き込み禁止だ")
          ;(return-from open-writable nil)
   (return-from open-writable-with-change-attribute nil))
        (:no-error (v)
         (when v (message "読み取り属性外したYO"))))))
  (toggle-read-only nil))

find-file 時にディレクトリが作れるように

(defun make-directory-unless-directory-exists (filename)
  (unless (valid-path-p filename)
    (let ((d (directory-namestring filename)))
      (when (yes-or-no-p "~a~%ディレクトリがないけど作る?"  d)
        (create-directory d))))
  nil)
; ファイルを開く前に実行
(add-hook '*before-find-file-hook*
          #'make-directory-unless-directory-exists)

find-file 時に指定したファイル名を挿入

どこかから、いただいたもの。

C-x C-f C-s で、xyzzy/site-lisp/siteinit.l を挿入する。

(define-key minibuffer-local-completion-map #\C-s
    #'(lambda () (interactive)
        (delete-region (point-min) (point-max))
        (insert (concat
                 (merge-pathnames "site-lisp/siteinit.l" (si:system-root)) ""))))

C-x C-f C-x で、xyzzy/.xyzzy を挿入する。

(define-key minibuffer-local-completion-map #\C-x
    #'(lambda () (interactive)
        (delete-region (point-min) (point-max))
        (insert (concat
                 (merge-pathnames ".xyzzy" (si:system-root)) ""))))

emacs-write-file 時に対応するモードに変更

emacs-write-file でファイル保存後に、ファイル名に対応するモードに変更する。 emacs-write-file と find-file-process-params をくっつけたもの。 xyzzy Part7 510 より。

(defun emacs-write-file (filename)
  (interactive "FWrite file: "
    :title0 "Write File" :default0 *default-write-file-directory*)
  (and (rename filename)
       (save-buffer)
       (dolist (x (reverse *auto-mode-alist*))
         (when (string-matchp (car x) filename)
           (if (get (cdr x) 'decode-auto-mode)
               (funcall (cdr x) last-buffer)
             (funcall (cdr x)))))))
[2003/02/14]
・*auto-mode-alist* を reverse して、後から設定したほうが有効になるようにしてみた。 例えば、hoge.html で保存すると、html+-mode でなく、html-mode になってしまうため。 これでいいかな?

save-buffer 時にファイルがないときは訊く

[xyzzy:04312]、[xyzzy:04313]、[xyzzy:04314]より。 write-file より emacs-write-file の方が使いやすい気もした。

(defun save-file-apart ()
  (interactive)
  (if (get-buffer-file-name)
      (save-buffer)
    (call-interactively 'emacs-write-file)))