diff --git a/emacs.el b/emacs.el index 026bed7..d6861ef 100644 --- a/emacs.el +++ b/emacs.el @@ -27,6 +27,52 @@ ;; buffer-file-name))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Some macros for internals + +(defmacro safe-require-or-eval (feature) + "Require FEATURE if available. + +At compile time the feature will be loaded immediately." + `(eval-when-compile + (require ,feature nil t))) + +(defmacro autoload-eval-lazily (feature &optional functions &rest body) + "Define autoloading FEATURE that defines FUNCTIONS. +FEATURE is a symbol. FUNCTIONS is a list of symbols. If FUNCTIONS is nil, +the function same as FEATURE is defined as autoloaded function. BODY is passed + to `eval-after-load'. +After this macro is expanded, this returns the path to library if FEATURE +found, otherwise returns nil." + (let* ((libname (symbol-name (eval feature))) + (libpath (locate-library libname))) + (and libpath + `(progn + ,@(mapcar (lambda (f) + (unless (fboundp f) + `(progn + (message "Autoloaded function `%S' defined (%s)" + (quote ,f) + ,libpath) + (autoload (quote ,f) + ,libname + ,(concat "Autoloaded function defined in \"" + libpath + "\".") + t)))) + (or (eval functions) + `(,(eval feature)))) + (eval-after-load ,feature + (quote (progn + ,@body))) + (locate-library ,libname))))) + +(put 'autoload-eval-lazily 'lisp-indent-function 2) + +(when (autoload-eval-lazily 'tetris nil + (message "Tetris loaded!")) + (message "Tetris found!")) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; download library from web @@ -150,7 +196,7 @@ IF OK-IF-ALREADY-EXISTS is true force download." ) ) -(when (require 'package nil t) +(when (safe-require-or-eval 'package) ;; (add-to-list 'package-archives ;; '("ELPA" . "http://tromey.com/elpa/")) (add-to-list 'package-archives @@ -173,45 +219,6 @@ IF OK-IF-ALREADY-EXISTS is true force download." ;; (lazy-load-eval 'sudoku) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; autoload - -(defmacro autoload-eval-lazily (feature &optional functions &rest body) - "Define autoloading FEATURE that defines FUNCTIONS. -FEATURE is a symbol. FUNCTIONS is a list of symbols. If FUNCTIONS is nil, -the function same as FEATURE is defined as autoloaded function. BODY is passed - to `eval-after-load'. -After this macro is expanded, this returns the path to library if FEATURE -found, otherwise returns nil." - (let* ((libname (symbol-name (eval feature))) - (libpath (locate-library libname))) - (and libpath - `(progn - ,@(mapcar (lambda (f) - (unless (fboundp f) - `(progn - (message "Autoloaded function `%S' defined (%s)" - (quote ,f) - ,libpath) - (autoload (quote ,f) - ,libname - ,(concat "Autoloaded function defined in \"" - libpath - "\".") - t)))) - (or (eval functions) - `(,(eval feature)))) - (eval-after-load ,feature - (quote (progn - ,@body))) - (locate-library ,libname))))) - -(put 'autoload-eval-lazily 'lisp-indent-function 2) - -(when (autoload-eval-lazily 'tetris nil - (message "Tetris loaded!")) - (message "Tetris found!")) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; my-idle-hook @@ -301,7 +308,7 @@ found, otherwise returns nil." (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/save-window-size.el" t) - (require 'save-window-size nil t)) + (safe-require-or-eval 'save-window-size)) (defun reload-init-file () "Reload Emacs init file." @@ -410,7 +417,7 @@ found, otherwise returns nil." default-directory)) )) ;; this wont happen? (TMUX is not set, TERM is screen, not ssh-ed) - (and (require 'terminal-title nil t) + (and (safe-require-or-eval 'terminal-title) (terminal-title-mode))) (setq eol-mnemonic-dos "\\r\\n") @@ -435,7 +442,7 @@ found, otherwise returns nil." (display-time-update)) )) -(when (require 'time nil t) +(when (safe-require-or-eval 'time) (setq display-time-interval 29) (setq display-time-day-and-date t) (setq display-time-format "%a, %d %b %Y %T") @@ -534,7 +541,7 @@ found, otherwise returns nil." (add-hook 'input-method-inactivate-hook (lambda () (set-cursor-color "black")))) -(when (require 'paren nil t) +(when (safe-require-or-eval 'paren) (show-paren-mode 1) (setq show-paren-delay 0.5 show-paren-style 'parenthesis) ; mixed is hard to read @@ -573,7 +580,7 @@ found, otherwise returns nil." (font-lock-add-keywords nil my-jspace-face) )) -(when (require 'whitespace nil t) +(when (safe-require-or-eval 'whitespace) (add-to-list 'whitespace-display-mappings ; not work `(tab-mark ?\t ,(vconcat "^I\t"))) (add-to-list 'whitespace-display-mappings @@ -599,7 +606,7 @@ found, otherwise returns nil." (fetch-library "http://www.emacswiki.org/emacs/download/fill-column-indicator.el" t) - (require 'fill-column-indicator nil t) + (safe-require-or-eval 'fill-column-indicator) (setq fill-column-indicator)) ;; highlight current line @@ -655,7 +662,7 @@ found, otherwise returns nil." "https://raw.github.com/10sr/emacs-lisp/master/set-modeline-color.el" t) (progn - (require 'set-modeline-color nil t))) + (safe-require-or-eval 'set-modeline-color))) (let ((fg (face-foreground 'default)) (bg (face-background 'default))) @@ -671,7 +678,7 @@ found, otherwise returns nil." (and (fetch-library "https://raw.github.com/tarao/elisp/master/end-mark.el" t) - (require 'end-mark nil t) + (safe-require-or-eval 'end-mark) (global-end-mark-mode)) @@ -683,7 +690,7 @@ found, otherwise returns nil." ;; save cursor position (setq save-place-file (concat user-emacs-directory "places")) -(when (require 'saveplace nil t) +(when (safe-require-or-eval 'saveplace) (setq-default save-place t)) ;; http://www.bookshelf.jp/soft/meadow_24.html#SEC260 @@ -719,7 +726,7 @@ found, otherwise returns nil." (and (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/smart-revert.el" t) - (require 'smart-revert nil t) + (safe-require-or-eval 'smart-revert) (smart-revert-on)) ;; autosave @@ -727,7 +734,7 @@ found, otherwise returns nil." (and (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/autosave.el" t) - (require 'autosave nil t) + (safe-require-or-eval 'autosave) (autosave-set 2)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -800,7 +807,7 @@ found, otherwise returns nil." (defun my-load-scim () "Use scim-bridge.el as japanese im." ;; Load scim-bridge. - (when (require 'scim-bridge nil t) + (when (safe-require-or-eval require 'scim-bridge) ;; Turn on scim-mode automatically after loading .emacs (add-hook 'after-init-hook 'scim-mode-on) (setq scim-cursor-color "red") @@ -811,7 +818,7 @@ found, otherwise returns nil." (defun my-load-anthy () "Use anthy.el as japanese im." ;; anthy - (when (require 'anthy nil t) + (when (safe-require-or-eval 'anthy) (global-set-key (kbd "") (lambda () (interactive) (anthy-mode-off))) (global-set-key (kbd "") (lambda () (interactive) (anthy-mode-on))) @@ -824,7 +831,7 @@ found, otherwise returns nil." (defun my-load-mozc-el () "Use mozc.el as japanese im." (setq mozc-leim-title "[MZ]") - (when (require 'mozc nil t) + (when (safe-require-or-eval 'mozc) (setq defauit-input-method "japanese-mozc") )) @@ -877,7 +884,7 @@ found, otherwise returns nil." (not (equal (getenv "DISPLAY") "")) (executable-find "xclip") ;; (< emacs-major-version 24) - (require 'xclip nil t) + (safe-require-or-eval require 'xclip) nil (turn-on-xclip)) @@ -885,14 +892,14 @@ found, otherwise returns nil." (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/pasteboard.el" t) - (require 'pasteboard nil t) + (safe-require-or-eval 'pasteboard) (turn-on-pasteboard) (getenv "TMUX") (pasteboard-enable-rtun)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; https://github.com/lunaryorn/flycheck -(when (require 'flycheck nil t) +(when (safe-require-or-eval 'flycheck) (add-hook 'after-init-hook 'global-flycheck-mode)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -944,7 +951,7 @@ found, otherwise returns nil." (and (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/remember-major-modes-mode.el" t) - (require 'remember-major-modes-mode nil t) + (safe-require-or-eval 'remember-major-modes-mode) (remember-major-modes-mode 1) ) @@ -955,16 +962,16 @@ found, otherwise returns nil." '("python2" . python-mode)) ;; http://fukuyama.co/foreign-regexp -'(and (require 'foreign-regexp nil t) +'(and (safe-require-or-eval 'foreign-regexp) (progn (setq foreign-regexp/regexp-type 'perl) '(setq reb-re-syntax 'foreign-regexp) )) -(require 'session nil t) +(safe-require-or-eval 'session) (autoload-eval-lazily 'sql '(sql-mode) - (require 'sql-indent nil t)) + (safe-require-or-eval 'sql-indent)) (and (fetch-library "https://raw.github.com/10sr/emacs-lisp/master/gtkbm.el" t) @@ -1028,7 +1035,7 @@ found, otherwise returns nil." (defalias 'qcalc 'quick-calc) -(require 'simple nil t) +(safe-require-or-eval 'simple) (add-hook 'makefile-mode-hook (lambda () @@ -1228,11 +1235,11 @@ found, otherwise returns nil." (add-hook 'js-mode-hook 'flymake-jslint-load))) -(require 'js-doc nil t) +(safe-require-or-eval 'js-doc) (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation) -(when (require 'uniquify nil t) +(when (safe-require-or-eval 'uniquify) (setq uniquify-buffer-name-style 'post-forward-angle-brackets) (setq uniquify-ignore-buffers-re "*[^*]+*") (setq uniquify-min-dir-content 1)) @@ -1657,7 +1664,7 @@ found, otherwise returns nil." recentf-max-saved-items 30 recentf-show-file-shortcuts-flag nil) -(when (require 'recentf nil t) +(when (safe-require-or-eval 'recentf) (add-to-list 'recentf-exclude (regexp-quote recentf-save-file)) (add-to-list 'recentf-exclude @@ -1834,7 +1841,7 @@ the list." ;; reuse current dired buffer for the file to open (setq dired-ls-F-marks-symlinks t) - (when (require 'ls-lisp nil t) + (when (safe-require-or-eval 'ls-lisp) (setq ls-lisp-use-insert-directory-program nil) ; always use ls-lisp (setq ls-lisp-dirs-first t) (setq ls-lisp-use-localized-time-format t) @@ -2064,7 +2071,7 @@ C-x t to toggling emacs-text-mode ,@args) " ")) ;; (eshell-git-shell-command-to-string args) - (if (require 'git-command nil t) + (if (safe-require-or-eval 'git-command) (git-command (mapconcat 'shell-quote-argument args " "))