月別アーカイブ: 2015年11月

他のエディタ等で変更されたファイルを現在のバッファで上書き保存する

たとえばgitでpullなりrebaseなりしてファイルを更新した、けどやっぱり現在emacsのバッファ上に開いてるやつの方が正しいからそっちで上書きしたい、みたいな状況の時、
emacs上でそのままC-xC-sしようとしても (No changes need to be saved) って言われて保存できない。

仕方なく1文字変更して元に戻す
→このファイルは他の場所で変更されたけど本当に変更していいかい?
→yes
→保存
→このファイルは他の場所で変更されたけど本当に保存していいかい?
→yes

っていう手間をかけるのが面倒なので何かやり方ないか調べてみた。

How to force Emacs to save even if it thinks (no changes need to be saved) – Stack Overflow

(defun save-buffer-always ()
  "Save the buffer even if it is not modified."
  (interactive)
  (set-buffer-modified-p t)
  (save-buffer))

これだと (No changes need to be saved) が出ないので
> 仕方なく1文字変更して元に戻す
> →このファイルは他の場所で変更されたけど本当に変更していいかい?
> →yes
の部分を省略できる。
後半の確認ダイアログは省略できないけど、まあこれくらいはあった方がいい気もするしいいか。

 

emmetにて展開時にindent-tabs-modeが効かない

zencoding-modeがいつのまにかemmet-modeに変わっていたようなので設定しなおした。

そしたらindent-tabs-modeがtになってるにもかかわらずなぜかインデントをタブ文字にしてくれない。
ググってみたけど古いバージョンの情報っぽいのしか見つからなかった。

Respect indent-tabs-mode · Issue #11 · smihica/emmet-mode · GitHub
Emacsのemmet-modeでindent-tabs-modeが効かない件について : GPG ralu-neko

結局emmet-indent関数を上書きして対応。

(use-package emmet-mode
  :config
  (add-hook 'web-mode-hook 'emmet-mode)
  (setq emmet-indentation 4)
  ;; indent-tabs-modeが効かないのを修正
  (defun emmet-indent (text)
    (if text
        (replace-regexp-in-string "\n" (concat "\n" "\t") (concat "\n" text))
      nil))
  :bind(("C-z" . emmet-expand-yas))
  )

最近use-package使い始めたけどいまいち書き方がわかってない。defunは:configに書くのであってるんだろうか。。。

 

カレントバッファのファイルをリネーム

C-xC-wで別名保存してから古いファイルを消したりdired経由でリネームしたりしてたけどなんかもっと楽なやり方ないのかなと思って調べた。意外とありそうでないのよなー。

StackOverflowでいくつかやり方を発見。とりあえずこの方法でうまくいったので使ってみる。
http://stackoverflow.com/questions/384284/how-do-i-rename-an-open-file-in-emacs

;; source: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-file-and-buffer (new-name)
  "Renames both current buffer and file it's visiting to NEW-NAME."
  (interactive "sNew name: ")
  (let ((name (buffer-name))
        (filename (buffer-file-name)))
    (if (not filename)
        (message "Buffer '%s' is not visiting a file!" name)
      (if (get-buffer new-name)
          (message "A buffer named '%s' already exists!" new-name)
        (progn
          (rename-file name new-name 1)
          (rename-buffer new-name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil))))))