scss-modeでインデントが効かない場合
前回、試した時は上手く行かなかったのだけど、原因判明。
結論からいうと、Emacs-lispのパスの通ったところにデフォルトのcss-modeではない『css-mode.el』ファイルが置いてあった。
init.elで設定をしなくても、これを読み込んでしまうのが原因。
ケアレスミス。
EmacsのCSS-MODE
Lars version
数年前はEmacsでCSSというと、このcss-mode.elがよく使われてた。
デフォルトのcss-mode
いつの間にかEmacsの数バージョン前から、別のcss-modeがデフォルトで入るように。
しかし、デフォルトのcss-modeは喧々諤々してるらしく、ver23のはcss-modeが入っているけど初期状態で設定はオフになってるみたい。
ややこしいので Lars version の css-mode.el はパスの通ってないところへ引退していただくことにした。
scss-mode設定
前提としてauto-completeとyasnippetの設定済みで。
それからちょっとカスタム
- パスの通ったところにscss-mode.elを置く。
- cssとscssどちらもscss-modeで開くように。
- auto-completeのcss-modeの補完を使えるように、ac-dictの『css-mode』ファイルをコピーして『scss-mode』とリネーム。
- それからオムニ補完も
- すべてのバッファから補完
- インデントを2に
- flymakeで構文チェック*1
- 『;』を入力すると『;+改行』に
- 『{』を入力すると下記のように
body //<- ここで『M-{』押すと
body { //<- ここにカーソルがくる(ネストしてても) }
;; ;; CSS (defun my-css-electric-pair-brace () (interactive) (insert "{")(newline-and-indent) (newline-and-indent) (insert "}") (indent-for-tab-command) (previous-line)(indent-for-tab-command) ) (defun my-semicolon-ret () (interactive) (insert ";") (newline-and-indent)) ;; ;; scss-mode ;; ;; https://github.com/antonj/scss-mode (autoload 'scss-mode "scss-mode") ;; (add-to-list 'auto-mode-alist '("\\.scss\\'" . scss-mode)) (add-to-list 'auto-mode-alist '("\\.\\(scss\\|css\\)\\'" . scss-mode)) (add-hook 'scss-mode-hook 'ac-css-mode-setup) (add-hook 'scss-mode-hook (lambda () (define-key scss-mode-map "\M-{" 'my-css-electric-pair-brace) (define-key scss-mode-map ";" 'my-semicolon-ret) (setq css-indent-offset 2) (setq scss-compile-at-save nil) (setq ac-sources '(ac-source-yasnippet ;; ac-source-words-in-same-mode-buffers ac-source-words-in-all-buffer ac-source-dictionary )) (flymake-mode t) )) (add-to-list 'ac-modes 'scss-mode)
とりあえずこんな感じで。
*1:20120111