逆引きxyzzy lisp(ディレクトリ) - circleratio/xyzzy GitHub Wiki
- ディレクトリの作成
- 中身が空でないディレクトリを削除する
- ディレクトリ名を変更する
- ディレクトリの詳細情報を得る
- ディレクトリのファイルモードを変更する
- ディレクトリの所有者とグループを変更する
- ディレクトリの最終アクセス時刻と最終更新日時を変更する
- カレントディレクトリの取得と変更
- ディレクトリ内のファイル名を得る
- ディレクトリ内のファイル名のソート(大文字・小文字の区別あり)
- ディレクトリ内のファイル名のソート(大文字・小文字の区別なし)
- ディレクトリかどうかを確認する
- ワイルドカードにマッチした全ファイルに対して処理を行う
- ディレクトリ内の全ファイルに対して処理を行う
- ディレクトリ内の全ファイルに対して処理を行う
(create-directory "c:/temp/test")
=> t
ディレクトリは再帰的に作ることができる. すなわち,"c:/temp" が空ディレクトリの状態から
(create-directory "c:/temp/test/test2/test3")
を実行しても問題なくディレクトリを作成できる.
(delete-directory "c:/temp/test")
=> t
ファイル名を変更する|逆引きxyzzy lisp(ファイルアクセス)に同じ.
ファイルの詳細情報を取得する|逆引きxyzzy lisp(ファイルアクセス)に同じ.
できない.
できない.
(set-file-write-time "c:/temp/test2" (get-universal-time))
=> t
xyzzyはバッファごとに作業ディレクトリを持つ.
(default-directory)
=> "C:/usr/xyzzy/"
(cd "..")
=> t
(default-directory)
=> "C:/usr/"
directory関数を使う.
(directory "c:/temp")
=> ("test.txt" "testib2c.log")
(directory "c:/temp" :file-info t)
=> (("test.txt" 32 3506167444 9 nil) ("testib2c.log" 32 3506168144 0 nil))
(directory "c:/temp/*.log" :wile t)
=> ("testib2c.log")
指示できるオプションは以下の通り.
- absolute: 結果をフルパスで取得する.
- recursive: サブディレクトリを検索する.
- depth: recursive指定時の再帰の深さ.
- wild: ワイルドカード指定.リストも可.
- file-only: ファイルのみ検索.
- directory-only: ディレクトリのみ検索.
- show-dots: ディレクトリとして "./" と "../" を加える.
- count: 表示されるファイルの個数を制限する.
- callback: 見つかったファイルを引数にして funcall する.
- file-info: ファイル属性を取得する.get-file-info で得られるものと同じ.
(sort (directory "c:/cygwin") #'string<)
=> ("Cygwin.bat" "Cygwin.ico" "bin/" "cygdrive/" "dev/" "etc/" "home/" "lib/" "tmp/" "usr/" "var/")
(sort (directory "c:/cygwin") #'string-lessp)
=> ("bin/" "cygdrive/" "Cygwin.bat" "Cygwin.ico" "dev/" "etc/" "home/" "lib/" "tmp/" "usr/" "var/")
(file-directory-p "c:/temp")
=> t
(defun action-match (path action)
(let ((dir (directory-namestring path)))
(mapcar (lambda (f)
(let ((p (concat dir f)))
(if (file-directory-p p)
nil
(funcall action p))))
(directory path))))
=> action-match
(action-match "c:/cygwin/cyg*" 'print)
=> "c:/cygwin/Cygwin.bat"
"c:/cygwin/Cygwin.ico"
(nil "c:/cygwin/Cygwin.bat" "c:/cygwin/Cygwin.ico")
「ワイルドカードにマッチした全ファイルに対して処理を行う」で定義した action-match 関数を使う。
(action-match "c:/cygwin/*" 'print)
Common Lisp のパス名では "**" という表現で任意の数のディレクトリにマッチさせることができる…はずが、xyzzy では動かない様子。
そこで次のようにする。
(defun action-match-recur (path action)
(mapcar (lambda (f)
(let ((p (concat path f)))
(if (file-directory-p p)
(action-match-recur p action)
(funcall action p))))
(directory path)))
=> action-match-recur
(action-match-recur "c:/cygwin/home/" 'print)