2015-03-09アーカイブ

f.elに関するメモ

Emacsのモダンなライブラリ4+1選 で紹介されていたf.elパッケージについて、少し勉強したのでその内容をメモ的に残しておきます。

このページの存在は少し前に知っていましたが、 るびきち様 にパッケージと関数を教えて頂いたので自分でも調べてみました。

ファイルに関する関数

f-で始まる関数がf.elパッケージで提供されている関数です。

関数名が短かくて分かりやすくなるとともに ~を自動で展開 (expand-file-name)してくれるものが多いため プログラムが簡潔になりそうです。

また、ファイルの拡張子を変更するf-swap-ext関数は非常に便利かもしれません。

(require 'f)
(setq file "~/.emacs.d/init.el")

;;; ファイル
;; 絶対パス(フルパス)
(expand-file-name file)          ; => "/home/ara/.emacs.d/init.el"
(f-expand file)                  ; => "/home/ara/.emacs.d/init.el"
;; ファイル名(ディレクトリ以外)
(file-name-nondirectory file)    ; => "init.el"
(file-name-nondirectory
 (directory-file-name file))     ; => "init.el"
(f-filename file)                ; => "init.el"
;; ファイルのベースネーム
(f-base file)                    ; => "init"
;; 拡張子
(file-name-extension file)       ; => "el"
(f-ext file)                     ; => "el"
;; 拡張子なしのパス
(file-name-sans-extension file)  ; => "~/.emacs.d/init"
(f-no-ext file)                  ; => "~/.emacs.d/init"

;;; ファイル => ディレクトリ(末尾の/なし)
(directory-file-name
 (file-name-directory file))     ; => "~/.emacs.d"
(f-dirname file)                 ; => "/home/ara/.emacs.d"
;;; ファイル => ディレクトリ(末尾の/あり)
(file-name-directory file)       ; => "~/.emacs.d/"
(f-slash (f-dirname file))       ; => "/home/ara/.emacs.d/"

;; パスの結合(/の有無は自動で処理される)
(f-join "~/.emacs.d" "init.el")  ; => "/home/ara/.emacs.d/init.el"
(f-join "~/.emacs.d/" "init.el") ; => "/home/ara/.emacs.d/init.el"

;; 拡張子の変更
(f-swap-ext file "elc")          ; => "~/.emacs.d/init.elc"

ディレクトリに関する関数

  • 末尾の/を外すのがf-long
    • 内部でf-expandを呼び出しているだけ(f-expandで十分かも)
  • 末尾の/をつけるのがf-full
    • f-longの後にf-slashを適用している
(require 'f)
(setq dir1 "~/.emacs.d")
(setq dir2 "~/.emacs.d/")

;;; 絶対パス(フルパス)
(expand-file-name dir1)          ; => "/home/ara/.emacs.d"
(expand-file-name dir2)          ; => "/home/ara/.emacs.d/"
(f-expand dir1)                  ; => "/home/ara/.emacs.d"
(f-expand dir2)                  ; => "/home/ara/.emacs.d"

;;; ディレクトリ
;; ディレクトリ(末尾の/なし)
(directory-file-name dir1)       ; => "~/.emacs.d"
(directory-file-name dir2)       ; => "~/.emacs.d"
(f-long dir1)                    ; => "/home/ara/.emacs.d"
(f-long dir2)                    ; => "/home/ara/.emacs.d"
;; ディレクトリ(末尾の/あり)
(file-name-as-directory dir1)    ; => "~/.emacs.d/"
(file-name-as-directory dir2)    ; => "~/.emacs.d/"
(f-slash dir1)                   ; => "~/.emacs.d/"
(f-slash dir2)                   ; => "~/.emacs.d/"
(f-full dir1)                    ; => "/home/ara/.emacs.d/"
(f-full dir2)                    ; => "/home/ara/.emacs.d/"

その他の関数

f-readあるいはf-read-textは非常に便利そうです。

with-temp-buffer => insert-file-contents のような作業を内部で行ってくれます。結果がバッファへの挿入ではなく文字列として返ってくるのだけが異なりますが、それでもプログラムが非常に簡潔になりそうです。

;; ファイルを文字列として読み込む(codingは省略可能:デフォルトは'utf-8)
(f-read path coding)
(f-read-text path coding)

;; 文字列をファイルに保存(codingは省略可能:デフォルトは'utf-8)
(f-write text coding path)
(f-write-text text coding path)

;; このファイルのフルパスを得る
(f-this-file)