Skip to content

Instantly share code, notes, and snippets.

@fukamachi
Created February 15, 2010 02:59
Show Gist options
  • Select an option

  • Save fukamachi/304391 to your computer and use it in GitHub Desktop.

Select an option

Save fukamachi/304391 to your computer and use it in GitHub Desktop.
;;====================
;; Network
;;====================
(defun get-ip-address (&optional dev)
(let ((dev (or dev "eth0")))
(format-network-address (car (network-interface-info dev)) t)))
(defun mac-network-location ()
(substring
(shell-command-to-string "scselect 2>&1 | grep '^ ' 2>&1 | grep '*' | cut -f 2 -d '(' | cut -f 1 -d ')'")
0 -1))
;;====================
;; Functions
;;====================
(eval-when-compile (require 'cl))
(defun file-name-parent-directory (file-name)
(let ((idx (string-match "[^/]+/$" (file-name-directory file-name))))
(substring (file-name-directory (buffer-file-name)) idx -1)))
(defmacro add-hook-fn (name &rest body)
`(add-hook ,name #'(lambda () ,@body)))
(defmacro append-to-list (to lst)
`(setq ,to (append ,lst ,to)))
(defmacro req (lib &rest body)
`(when (locate-library ,(symbol-name lib))
(require ',lib) ,@body))
(defmacro lazyload (func lib &rest body)
`(when (locate-library ,lib)
,@(mapcar (lambda (f) `(autoload ',f ,lib nil t)) func)
(eval-after-load ,lib
'(progn
,@body))))
(defmacro global-set-key-fn (key args &rest body)
`(global-set-key ,key (lambda ,args ,@body)))
(defmacro defadvice-many (fn-lst class &rest body)
`(progn
,@(mapcar
(lambda (fn)
`(defadvice ,fn (,class ,(intern (concat (symbol-name fn) "-" (symbol-name class) "-advice")) activate)
,@body)) fn-lst)))
;;====================
;; General
;;====================
;; load-pathを追加
(loop for f in (directory-files "~/.emacs.d" t)
when (and (file-directory-p f)
(not (eq (file-name-nondirectory f) "..")))
do (add-to-list 'load-path f))
;; exec-path
(add-to-list 'exec-path "/usr/local/bin")
;; 自分の情報
(setq user-full-name "深町英太郎 (E.Fukamachi)"
user-mail-address "e.arrows@gmail.com")
;; テキストエンコーディングとしてUTF-8を優先使用
(prefer-coding-system 'utf-8)
;; 起動時のメッセージを非表示
(setq inhibit-startup-message t)
;; Tabの代わりにスペースでインデント
(setq-default tab-width 2
indent-tabs-mode nil)
;; C-kで行全体を削除
(setq kill-whole-line t)
;; "yes or no"を"y or n"に
(fset 'yes-or-no-p 'y-or-n-p)
;; minibufferでC-wで前の単語を削除
(define-key minibuffer-local-completion-map (kbd "C-w") 'backward-kill-word)
;; 範囲指定していないとき、C-wで前の単語を削除
(defadvice kill-region (around kill-word-or-kill-region activate)
(if (and (interactive-p) transient-mark-mode (not mark-active))
(backward-kill-word 1)
ad-do-it))
;; 終了時に自動でプロセスをkill
(setq process-kill-without-query t)
;; クリップボードにコピー
(setq x-select-enable-clipboard t)
;; 1行ずつスクロール
(setq scroll-conservatively 35
scroll-margin 0
scroll-step 1)
(setq comint-scroll-show-maximum-output t) ;; for shell-mode
;; beepを消す
(setq ring-bell-function 'ignore)
;; .emacs.elの保存時にbyte compile
(add-hook-fn 'after-save-hook
(if (string= (expand-file-name "~/.emacs.el")
(buffer-file-name))
(save-excursion
(byte-compile-file "~/.emacs.el"))))
;;; for Mac
;; Command-Key and Option-Key
(setq ns-command-modifier 'meta)
(setq ns-alternate-modifier 'super)
;; fullscreen
(defun toggle-fullscreen ()
(interactive)
(if (frame-parameter nil 'fullscreen)
(set-frame-parameter nil 'fullscreen nil)
(set-frame-parameter nil 'fullscreen 'fullboth)))
(global-set-key (kbd "C-c m") 'toggle-fullscreen)
;; よく使うモード
(defvar my-fav-modes
'((scheme-mode . "\\.scm$")
(clojure-mode . "\\.clj$")
(common-lisp-mode . "\\.cl$")
(malabar-mode . "\\.java$")
(php-mode . "\\.php[45]?$")
(yaml-mode . "\\.ya?ml$")
(js2-mode . "\\.js$")
(ruby-mode . "\\.rb$")
(text-mode . "\\.txt$")
(fundamental-mode . nil)
(LaTeX-mode . "\\.tex$")
(org-mode . "\\.org$")
(css-mode . "\\.css$")
(nxml-mode . "\\.\(xml\|svg\|wsdl\|xslt\|wsdd\|xsl\|rng\|xhtml\)$")
(markdown-mode . "\\.\\(md\\|markdown\\)$")))
;; auto-mode-alist
(loop for (k . v) in my-fav-modes
do (unless (null v) (add-to-list 'auto-mode-alist (cons v k))))
;; コメントアウト
(global-set-key "\C-x;" 'comment-region)
(global-set-key "\C-x:" 'uncomment-region)
;; 分割したウィンドウ間を移動
(define-prefix-command 'windmove-map)
(global-set-key (kbd "C-q") 'windmove-map)
(define-key windmove-map "h" 'windmove-left)
(define-key windmove-map "j" 'windmove-down)
(define-key windmove-map "k" 'windmove-up)
(define-key windmove-map "l" 'windmove-right)
;; windowを分割・削除したときに幅をあわせる+別のwindowに移動
(defadvice-many (split-window-vertically
split-window-horizontally) after
(balance-windows)
(other-window 1))
(defadvice delete-window (after delete-window-after-advice activate)
(balance-windows))
;; ウィンドウ内のカーソル移動
(global-set-key-fn (kbd "C-M-h") nil (interactive) (move-to-window-line 0))
(global-set-key-fn (kbd "C-M-m") nil (interactive) (move-to-window-line nil))
(global-set-key-fn (kbd "C-M-l") nil (interactive) (move-to-window-line -1))
;; goto-lineをM-gに
(global-set-key "\M-g" 'goto-line)
;; C-kで行が連結したときにインデントを減らす
(defadvice kill-line (before kill-line-and-fixup activate)
(when (and (not (bolp)) (eolp))
(forward-char)
(fixup-whitespace)
(backward-char)))
;; バックアップファイルを作らない
(setq make-backup-files nil)
(setq auto-save-default nil)
;; キーボードマクロ
(global-set-key [f5] 'call-last-kbd-macro)
;; 一括置換
(global-set-key (kbd "M-s") 'query-replace-regexp)
;;====================
;; Utilities
;;====================
;; hs-minor-mode
(req hideshow
(loop for (k . v) in my-fav-modes
do (add-hook (intern (concat (symbol-name k) "-hook"))
(lambda ()
(and (hs-minor-mode) (hs-hide-all)))))
(global-set-key (kbd "C-=") 'hs-toggle-hiding)
(global-set-key (kbd "C-\\") 'hs-hide-level))
;; undo-tree
(req undo-tree
(global-undo-tree-mode))
;; Growl
(defvar growl-program "/usr/local/bin/growlnotify")
(defmacro growl (title message &optional id stickyp)
(let ((args `("growl" "*growl*" ,growl-program
,title "-w")))
(or (null id)
(setq args (append args `("-d" ,id))))
(or (null stickyp)
(setq args (append args `("-s"))))
`(progn
(start-process ,@args)
(process-send-string "*growl*" (concat ,message "\n"))
(process-send-eof "*growl*"))))
;; uniquify
(req uniquify
(setq uniquify-buffer-name-style 'post-forward-angle-brackets))
;; tramp
(req tramp
(setq tramp-default-method "sshx"))
;; redmine
(lazyload (redmine-show-issues-all
redmine-show-activity
redmine-show-revisions
redmine-select-project) "redmine"
(load "redmine-conf"))
;; smart-compile+
(global-set-key "\C-x\C-x" 'smart-compile)
(lazyload (smart-compile) "smart-compile+"
(append-to-list smart-compile-alist
'(("\\.cl$" . "sbcl --noinform %f")
("\\.scm$" . "gosh %f")
("\\.clj$" . "clj %f"))))
;; auto-install
;; elispのインストールを簡単に
(lazyload (auto-install-from-url
auto-install-from-emacswiki
auto-install-from-dired
auto-install-from-directory
auto-install-from-buffer
auto-install-from-gist
auto-install-batch) "auto-install"
(setq auto-install-directory "~/.emacs.d/elisp/")
(auto-install-compatibility-setup))
;; 終了してもカーソル位置を記録
(req session
(add-hook 'after-init-hook 'session-initialize)
(setq session-initialize '(de-saveplace session keys menus places)
session-globals-include '((kill-ring 50)
(session-file-alist 500 t)
(file-name-history 10000))
session-globals-max-string 100000000
history-length t
session-undo-check -1))
;; redo
(req redo+
(global-set-key "\C-]" 'redo))
;; outputz
(req outputz
(setq outputz-uri "http://%s/emacs.%s")
(global-outputz-mode t)
(append-to-list outputz-modes (mapcar (lambda (m) (car m)) my-fav-modes))
(defadvice outputz (before outputz-setup-uri)
(setq outputz-uri
(format outputz-uri
(replace-regexp-in-string "-mode$" "" (symbol-name major-mode))
(system-name))))
(ad-activate-regexp "outputz-setup-uri")
(load "outputz-conf"))
;; anything
(req anything-startup
;; kill-ring一覧を表示
(global-set-key "\M-y" 'anything-show-kill-ring))
;; cua-mode
;; 矩形選択を簡単に
(cua-mode t)
(setq cua-enable-cua-keys nil)
;; auto-complete
;; 補完候補を自動ポップアップ
(req auto-complete
(global-auto-complete-mode t)
(append-to-list ac-modes '(js2-mode php-mode clojure-mode)))
;; auto-insert
;; ファイル形式に応じて自動でテンプレート挿入
(add-hook 'find-file-hooks 'auto-insert)
(setq auto-insert-directory "~/.emacs.d/templates"
auto-insert-alist
'((perl-mode . "perl-template.pl")
(html-mode . "html-template.html")
("base\\.css" . "base.css")
(css-mode . "css-template.css")
(".*\\.class\\.php$" . ["php-class-template.php" my-template])))
(defvar template-replacements-alists
'(("%file%" . (lambda () (file-name-nondirectory (buffer-file-name))))
("%file-without-ext%" . (lambda () (file-name-sans-extension (file-name-nondirectory (buffer-file-name)))))
("%name%" . user-full-name)
("%mail%" . user-mail-address)
("%directory-name%" . (lambda () (file-name-parent-directory (buffer-file-name))))))
(defun my-template ()
(time-stamp)
(mapc (lambda (c)
(progn
(goto-char (point-min))
(while (re-search-forward (car c) nil t)
(replace-match (funcall (cdr c))))))
template-replacements-alists)
(goto-char (point-max))
(message "done."))
;; shell-pop
;; C-tでshellをポップアップ
(lazyload (shell-pop) "shell-pop"
(shell-pop-set-internal-mode "ansi-term")
(shell-pop-set-internal-mode-shell "/bin/zsh")
(shell-pop-set-window-height 60)
(defvar ansi-term-after-hook nil)
(add-hook-fn 'term-mode-hook
(define-key term-raw-map "\C-t" 'shell-pop)
(define-key term-raw-map "\C-y" 'term-paste)
(define-key term-raw-map "\M-x" nil)
(define-key term-raw-map "\C-j" 'term-line-mode)
(define-key term-mode-map "\C-j"
(lambda () (interactive)
(term-char-mode)
(end-of-buffer)
(previous-line)))
(define-key term-raw-map "\C-q" nil)
(define-key term-raw-map "\C-z" nil))
(defadvice ansi-term (after ansi-term-after-advice (org))
"run hook as after advice"
(run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term))
(global-set-key (kbd "C-t") 'shell-pop)
;; SQL
(setq sql-user "fukamachi")
(setq sql-server "localhost")
;; ElScreen
;; EmacsでGNU screen風のインターフェイスを使う
(req elscreen
(setq elscreen-prefix-key "\C-z")
(setq elscreen-display-screen-number nil))
;; global
;; 関数定義に飛ぶ (gtags)
(lazyload (gtags-mode) "gtags"
(local-set-key "\C-cf" 'gtags-find-tag)
(local-set-key "\M-r" 'gtags-find-rtag)
(local-set-key "\M-s" 'gtags-find-symbol)
(local-set-key "\C-cp" 'gtags-pop-stack))
(add-hook-fn 'c-mode-common-hook
(gtags-mode t)
(eval-after-load "gtags-mode" '(gtags-make-complete-list)))
;; w3m
(lazyload (w3m w3m-browse-url w3m-find-file w3m-search) "w3m"
(setq w3m-use-cookies t
w3m-default-display-inline-images t
w3m-quick-start nil
w3m-home-page "http://www.google.com/"))
(setq browse-url-browser-function 'w3m-browse-url)
;; M-x occurで検索結果を一覧
(req color-moccur
(setq moccur-split-word t)) ;; 複数の検索語や、特定のフェイスのみマッチ
;; migemo
(req migemo
(load "migemo-conf")
(setq moccur-use-migemo t))
;; anything-c-moccur
(lazyload (anything-c-moccur-occur-by-moccur
anything-c-moccur-dmoccur
anything-c-moccur-dired-do-moccur-by-moccur) "anything-c-moccur"
(setq anything-c-moccur-anything-idle-delay 0.2 ;`anything-idle-delay'
anything-c-moccur-higligt-info-line-flag t ; `anything-c-moccur-dmoccur'などのコマンドでバッファ情報をハイライト
anything-c-moccur-enable-auto-look-flag t ; 現在選択中の候補の位置を他のwindowに表示
anything-c-moccur-enable-initial-pattern t)) ; `anything-c-moccur-occur-by-moccur'の起動時にポイントの位置の単語を初期パターンにする
(global-set-key (kbd "M-o") 'anything-c-moccur-occur-by-moccur) ;バッファ内検索
(global-set-key (kbd "C-M-o") 'anything-c-moccur-dmoccur) ;ディレクトリ
(add-hook-fn 'dired-mode-hook ;dired
(local-set-key (kbd "O") 'anything-c-moccur-dired-do-moccur-by-moccur))
;; twittering-mode
(lazyload (twit) "twittering-mode"
(twittering-jojo-mode t)
(setq twittering-username "nitro_idiot")
(setq twittering-retweet-format " RT @%s: %t"))
;; emacs-jabber
(lazyload (jabber-connect) "jabber"
(load "jabber-conf")
(setq jabber-message-alert-same-buffer nil)
(defun pg-jabber-growl-notify (from buf text proposed-alert)
"(jabber.el hook) Notify of new Jabber chat messages via Growl"
(when (or jabber-message-alert-same-buffer
(not (memq (selected-window) (get-buffer-window-list buf))))
(if (jabber-muc-sender-p from)
(growl (format "(PM) %s"
(jabber-jid-displayname (jabber-jid-user from)))
(format "%s: %s" (jabber-jid-resource from) text)
(format "jabber-from-%s" (jabber-jid-resource from)))
(growl (format "%s" (jabber-jid-displayname from))
text "jabber-from-unknown"))))
(add-hook 'jabber-alert-message-hooks 'pg-jabber-growl-notify)
;; Same as above, for groupchats
(defun pg-jabber-muc-growl-notify (nick group buf text proposed-alert)
"(jabber.el hook) Notify of new Jabber MUC messages via Growl"
(when (or jabber-message-alert-same-buffer
(not (memq (selected-window) (get-buffer-window-list buf))))
(if nick
(when (or jabber-muc-alert-self
(not (string=
nick (cdr (assoc group *jabber-active-groupchats*)))))
(growl (format "%s" (jabber-jid-displayname group))
(format "%s: %s" nick text)
(format "jabber-chat-%s" (jabber-jid-displayname group))))
(growl (format "%s" (jabber-jid-displayname group))
text "jabber-chat-unknown"))))
(add-hook 'jabber-alert-muc-hooks 'pg-jabber-muc-growl-notify))
;; erc
(lazyload (erc) "erc"
(setq erc-server "irc.tokyo.wide.ad.jp"
erc-nick-uniquifier "_"
erc-port "6667"
erc-prompt-for-password nil
erc-server-coding-system '(iso-2022-jp . iso-2022-jp))
(load "erc-conf"))
;;====================
;; Visual
;;====================
;; color-themeの設定
(req color-theme
(and (functionp 'color-theme-initialize) (color-theme-initialize))
(color-theme-arjen))
;; キーワードのカラー表示を有効化
(global-font-lock-mode t)
;; 選択範囲をハイライト
(setq-default transient-mark-mode t)
;; バッファ一覧を詳細に
(global-set-key "\C-x\C-b" 'bs-show)
;; 対応するカッコをハイライト
(show-paren-mode t)
;; 全角空白、Tab、改行表示
(req jaspace
(setq jaspace-alternate-jaspace-string "□"
jaspace-alternate-eol-string "↓\n"
jaspace-highlight-tabs t)
(append-to-list jaspace-modes (mapcar 'car my-fav-modes)))
;; カーソル行をハイライト
(defface hlline-face
'((((class color)
(background dark))
(:background "dark slate gray"))
(((class color)
(background light))
(:background "ForestGreen"))
(t
()))
nil :group 'font-lock-highlighting-faces)
(setq hl-line-face 'hlline-face)
(global-hl-line-mode)
;; 表示不要なマイナーモードを削除
(loop for m in '(outputz undo-tree auto-complete jaspace)
do (assq-delete-all (intern (concat (symbol-name m) "-mode")) minor-mode-alist))
;; モード行に行番号、桁番号を表示
(line-number-mode t)
(column-number-mode t)
;; モード行に時刻を表示
(setq display-time-string-forms '(24-hours ":" minutes))
(display-time)
;; モード行にバッテリ残量を表示
(display-battery-mode t)
;; 改行コードを表示
(setq eol-mnemonic-dos "(CRLF)"
eol-mnemonic-mac "(CR)"
eol-mnemonic-unix "(LF)")
;;====================
;; Window System
;;====================
(when window-system
(server-start) ;; Emacs serverを起動
(set-frame-parameter nil 'alpha 85) ;; フレームを透過
(menu-bar-mode 0) ;; メニューバーを消す
(tool-bar-mode 0) ;; ツールバーを消す
(toggle-scroll-bar nil)) ;; スクロールバーを消す
;;====================
;; Syntax
;;====================
;; Clojure
(setenv "CLOJURE_EXT" (concat (getenv "HOME") "/.clojure"))
(req clojure-mode
(setq clojure-src-root (expand-file-name "~/.clojure")))
;; Gauche
(lazyload (scheme-mode run-scheme) "cmuscheme"
(add-to-list 'process-coding-system-alist '("gosh" utf-8 . utf-8))
(setq scheme-program-name "gosh -i"))
;; Common lisp
;(setq inferior-lisp-program "/usr/local/bin/sbcl --noinform")
;; Java
(add-hook-fn 'malabar-mode-hook
(add-hook 'after-save-hook 'malabar-compile-file-silently nil t))
(lazyload (malabar-mode) "malabar-mode"
(req cedet)
(setq malabar-groovy-lib-dir "~/.emacs.d/elisp/malabar-mode/lib")
(append-to-list malabar-import-excluded-classes-regexp-list
'("^java\\.awt\\..*$"
"^com\\.sun\\..*$"
"^org\\.omg\\..*$")))
;; php-mode
(lazyload (php-mode) "php-mode")
(add-hook-fn 'php-mode-hook
(setq tab-width 2)
(c-set-offset 'substatement-open 0)
(c-set-offset 'block-open '+)
(c-set-offset 'case-label 1)
(c-set-offset 'statement-case-open 0)
(c-set-offset 'arglist-intro '+)
(c-set-offset 'arglist-close 0))
;; ruby
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
(lazyload (run-ruby inf-ruby-keys) "inf-ruby"
(add-hook-fn 'ruby-mode-hook (inf-ruby-keys)))
(lazyload (ruby-electric-mode) "ruby-electric")
(lazyload (ruby-block-mode) "ruby-block"
(setq ruby-block-highlight-toggle t))
(add-hook-fn 'ruby-mode-hook (ruby-electric-mode t) (ruby-block-mode t))
(lazyload (rubydb) "rubydb3x")
;; js2-mode
(lazyload (js2-mode) "js2"
(setq js2-basic-offset 2
js2-mirror-mode nil))
;; yaml-mode
(lazyload (yaml-mode) "yaml-mode")
;; css-mode
(lazyload (css-mode) "css-mode"
(setq cssm-indent-function 'cssm-c-style-indenter))
;; mmm-mode
(req mmm-auto
(setq mmm-global-mode 'maybe)
(mmm-add-classes
'((embedded-css
:submode css-mode
:front "<style[^>] *>"
:back "<style>")))
(mmm-add-mode-ext-class nil "\\.html\\'" 'embedded-css))
;; AUCTeX
(lazyload (japanese-latex-mode) "tex-site"
(setq TeX-default-mode 'japanese-latex-mode)
(setq japanese-LaTeX-command-default "platex")
(setq japanese-LaTeX-default-style "jarticle")
(setq kinsoku-limit 10)
(setq LaTeX-indent-level 4)
(setq LaTeX-item-indent 2)
(setq TeX-output-view-style '(("^dvi$" "." "pxdvi '%d'")))
(setq preview-image-type 'dvipng))
(add-hook-fn 'LaTeX-mode-hook
(require 'tex-jp)
(add-to-list 'TeX-command-list
'("ptex" "%(PDF)ptex %`%S%(PDFout)%(mode)%' %t"
TeX-run-TeX nil (plain-tex-mode) :help "Run ASCII pTeX"))
(add-to-list 'TeX-command-list
'("platex" "%(PDF)platex %`%S%(PDFout)%(mode)%' %t"
TeX-run-TeX nil (latex-mode) :help "Run ASCII pLaTeX"))
(add-to-list 'TeX-command-list
'("pdfview" "okular '%s.pdf' " TeX-run-command t nil))
(add-to-list 'TeX-command-list
'("pdfbuild" "dvipdfmx -V 4 '%s' " TeX-run-command t nil)))
;; nxml-mode
(setq nxml-slash-auto-complete-flag t)
;; git commit
(add-hook-fn 'server-visit-hook
(if (string-match "COMMIT_EDITMSG" buffer-file-name)
(set-buffer-file-coding-system 'utf-8)))
(lazyload (markdown-mode) "markdown-mode")
;;====================
;; Syntax Checking
;;====================
;; flymake
(defmacro def-flymake-init (name masks exec error)
(let ((init-name (intern (format "flymake-%s-init" name))))
`(eval-after-load "flymake"
(when (not (fboundp ',init-name))
,(unless (null masks)
`(setq flymake-allowed-file-name-masks
(append flymake-allowed-file-name-masks
',(mapc (lambda (x) (list x init-name)) masks))))
(defun ,init-name ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
,exec))
,(unless (null error)
`(setq flymake-err-line-patterns
(cons ',error flymake-err-line-patterns)))))
`(add-hook-fn (intern (format "%s-mode-hook" ',name)) (flymake-mode t))))
(lazyload (flymake-mode) "flymake"
(global-set-key "\C-cd" 'flymake-display-err-menu-for-current-line))
;; JavaScript
(def-flymake-init js ("\.js$")
`("jsl" ("-process" ,local-file))
("\(.+\)(\([0-9]+\)): \(?:lint \)?\(\(?:Warning\|SyntaxError\):.+\)" 1 2 nil 3))
;; PHP
(def-flymake-init php ("\.php[345]?$")
`("php" ("-f" ,local-file "-l"))
("\(\(?:Parse error\|Fatal error\|Warning\): .*\) in \(.*\) on line \([0-9]+\)" 2 3 nil 1))
;; Ruby
(def-flymake-init ruby ()
`("ruby" ("-c" ,local-file)) nil)
;;; This was installed by package-install.el.
;;; This provides support for the package system and
;;; interfacing with ELPA, the package archive.
;;; Move this code earlier if you want to reference
;;; packages in your .emacs.
(when
(load
(expand-file-name "~/.emacs.d/elpa/package.el"))
(package-initialize))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment