mtomokazu
11/22/2012 - 10:37 AM

Emacs setting example for PHP development

Emacs setting example for PHP development

;; .emacs

;; turn on font-lock mode
(when (fboundp 'global-font-lock-mode)
  (global-font-lock-mode t))

(load-library "term/bobcat")
(when (fboundp 'terminal-init-bobcat)
  (terminal-init-bobcat))

(setq inhibit-startup-message t)
(line-number-mode t)
(column-number-mode t)

(setq load-path
      (cons "~/lib/emacs" load-path))

(global-set-key "\C-xy" 'goto-line)
(global-set-key "\C-xw" 'what-line)

;; 行末のスペースを削除する
(add-hook 'before-save-hook
	  (lambda ()
	    (delete-trailing-whitespace)))

;; japanese
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)

(require 'install-elisp)
(setq install-elisp-repository-directory "~/lib/emacs")

;;;
;;;  anything.el
;;;
(if (> emacs-major-version 21)
    (require 'anything)
    ;(require 'anything-config)
)

;;;
;;;  GNU GLOBAL
;;;
(autoload 'gtags-mode "gtags" "" t)
(setq gtags-mode-hook
      '(lambda ()
         (local-set-key "\M-t" 'gtags-find-tag)
         (local-set-key "\M-r" 'gtags-find-rtag)
         (local-set-key "\M-s" 'gtags-find-symbol)
         (local-set-key "\C-t" 'gtags-pop-stack) ))

;;
;; PHP
;;
(autoload 'php-mode "php-mode")
(setq auto-mode-alist
      (cons '("\\.php\\'" . php-mode) auto-mode-alist))
(add-to-list 'auto-mode-alist '("\\.ctp$" . php-mode)) ; CakePHP

(setq php-mode-force-pear t)
(add-hook 'php-mode-hook
         (lambda ()
               (setq indent-tabs-mode nil)
               (setq tab-width 4)
               (c-set-style "stroustrup")
	       (setq c-comment-only-line-offset -4) ; コメントの前に出さないときは 0
               (setq c-basic-offset 4)
	       (c-set-offset 'arglist-close 0)
	       (when (string-match "\\.ctp\\(\\..+\\)?$" (buffer-file-name))
		 ; .ctp のときだけ
		 (progn
		   (setq c-auto-newline nil)    ; 全自動インデントを無効
		   (setq c-tab-always-indent t) ; [TAB]キーでインデント実施
		   (setq-default c-electric-flag nil)))
	       (setq php-manual-path "/usr/local/share/php/php-chunked-xhtml")
	       (setq php-manual-url "http://www.phppro.jp/phpmanual/")
	       ;; CakePHP
	       (add-to-list 'load-path "~/lib/emacs/cake-mode")
	       (when (require 'cake nil t)
		 (cake-set-default-keymap))
	       ;;
	       (require 'php-completion)
	       (php-completion-mode t)
	       (define-key php-mode-map (kbd "C-o") 'phpcmp-complete)
	       (when (require 'auto-complete nil t)
		 (make-variable-buffer-local 'ac-sources)
		 (add-to-list 'ac-sources 'ac-source-php-completion)
		 (auto-complete-mode t))))

;;
;; JavaScript
;;
(add-hook 'javascript-mode-hook
         (lambda ()
               (setq indent-tabs-mode nil)
               (setq tab-width 4)
               (c-set-style "stroustrup")
	       (setq c-comment-only-line-offset -4)
               (setq c-basic-offset 4)
	       (c-set-offset 'arglist-close 0)
	       (setq c-auto-newline nil)    ; 全自動インデントを無効
	       (setq c-tab-always-indent t)) ) ; [TAB]キーでインデント実施

;; flymake (Emacs22から標準添付されている)
(if (> emacs-major-version 21)
    (when (require 'flymake nil t)
      (require 'flymake-cursor)
      (global-set-key "\C-cd" 'flymake-display-err-menu-for-current-line)

      ;; PHP用設定
      (when (not (fboundp 'flymake-php-init))
	;; flymake-php-initが未定義のバージョンだったら、自分で定義する
	(defun flymake-php-init ()
	  (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))))
	    (list "php" (list "-f" local-file "-l"))))
	(setq flymake-allowed-file-name-masks
	      (append
	       flymake-allowed-file-name-masks
	       '(("\\.php[345]?$" flymake-php-init))))
	(setq flymake-err-line-patterns
	      (cons
	       '("\\(\\(?:Parse error\\|Fatal error\\|Warning\\): .*\\) in \\(.*\\) on line \\([0-9]+\\)" 2 3 nil 1)
	       flymake-err-line-patterns)))

      ;; JavaScript用設定
      (when (not (fboundp 'flymake-javascript-init))
	;; flymake-javascript-initが未定義のバージョンだったら、自分で定義する
	(defun flymake-javascript-init ()
	  (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))))
	    ;;(list "js" (list "-s" local-file))
	    (list "jsl" (list "-process" local-file))
	    ))
	(setq flymake-allowed-file-name-masks
	      (append
	       flymake-allowed-file-name-masks
	       '(("\\.json$" flymake-javascript-init)
		 ("\\.js$" flymake-javascript-init))))
	(setq flymake-err-line-patterns
	      (cons
	       '("\\(.+\\)(\\([0-9]+\\)): \\(?:lint \\)?\\(\\(?:warning\\|SyntaxError\\):.+\\)" 1 2 nil 3)
	       flymake-err-line-patterns)))

      ;; エラー、ウォーニング時のフェイス
      (set-face-background 'flymake-errline "red4")
      (set-face-foreground 'flymake-errline "black")
      (set-face-background 'flymake-warnline "yellow")
      (set-face-foreground 'flymake-warnline "black")

      ;; エラーをミニバッファに表示
      ;; http://d.hatena.ne.jp/xcezx/20080314/1205475020
      (defun flymake-display-err-minibuf ()
	"Displays the error/warning for the current line in the minibuffer"
	(interactive)
	(let* ((line-no             (flymake-current-line-no))
	       (line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no)))
	       (count               (length line-err-info-list)))
	  (while (> count 0)
	    (when line-err-info-list
	      (let* ((file       (flymake-ler-file (nth (1- count) line-err-info-list)))
		     (full-file  (flymake-ler-full-file (nth (1- count) line-err-info-list)))
		     (text (flymake-ler-text (nth (1- count) line-err-info-list)))
		     (line       (flymake-ler-line (nth (1- count) line-err-info-list))))
		(message "[%s] %s" line text)))
	    (setq count (1- count)))))

      (add-hook 'php-mode-hook
		'(lambda() (flymake-mode t)))
      (add-hook 'javascript-mode-hook
		'(lambda() (flymake-mode t))))
)

;; eof