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

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))))))
 

キーバインド教えてくれるやつ

むかしone-keyってのを少し使ってみていまいちあわなくてやめたんだけど、
その後guide-keyってのができてさらに改良されてwhich-keyってのになってたらしい。

ためしにwhich-key入れてみた。これはいいかも。素早く入力したら何も出ないし、ミニバッファにちょっと出るだけだからそれほど邪魔にならないし。
一覧が出ると普段使ってない機能も目に触れるから「あ、こんなのあったんだ~」って発見があったりしてなかなか良いですね。しばらく使ってみる。

 

emacsのパッケージ管理は結局どれがいいのか…

今までauto-installとかel-getとかいろいろあったけどemacs24ではpackageに統一されるのか?
…と思ってたらどうもそうでもないっぽい。
packageでは扱えないものが多いからやっぱりel-getがいいのか?caskってのも一時期よく聞いたけどどうなのか?

私の場合packageでほとんどは事足りてるしpackageのインタフェースそこそこ使いやすいから基本これで、足りない奴は手動で入れてるけど、el-getも併用した方が便利なんだろうか。ううむ。

参考
Caskはもう古い、これからはEl-Get – いまどきのEmacsパッケージ管理

 

emacsでPerl風の正規表現を使うやつ

emacs visual-regexp-steroids.el : 【正規表現革命】isearchや置換でPerl/Pythonの正規表現を使おうぜ! | MELPA Emacs Lisp Elisp パッケージ インストール 設定 使い方 スクリーンショット | るびきち「日刊Emacs」

(require ‘visual-regexp-steroids)
(setq vr/engine ‘pcre2el)
(global-set-key (kbd “C-M-%”) ‘vr/query-replace)

以前 foreign-regexp を導入しようとしたけどWindows上ではなんかうまくいかなくて諦めたんですがこれはちゃんと動いた。
今まで正規表現置換はなんだかんだ使いこなせなくて外部ツールに頼ってたんだけどこれでemacs上で完結できる予感…!

 

半角カタカナを全角に変換する(ただし半角英数は置換しない)

カンマなどの記号やアルファベットはそのままで半角カナだけ変換したいんだよなーと思ってググったら完璧な情報が出てきた。

アルファベットまで置換したくないときは次のコマンドを実行。

C-u M-x japanese-zenkaku-region

そうそうそれそれ。便利ー!

 

[HTML]リージョン内の各行をリストタグで囲む

べた書きテキストの各行をHTMLのリストタグ<li></li>で囲みたい、というシチュエーションがよくあるんですがいまいちこれといった方法がわからず、
結局いつも改行を「</li><li>」に置換するという泥臭い手法をとっていたのですが
いい加減面倒になってきたので関数作ってみました。

html-modeかweb-modeあたりを探せば似たような機能がありそうな気はするんだけど見つけられなかったので…

(defun li (beg end)
  "リージョン内の各行を<li></li>で囲む"
  (interactive "r")
  (save-excursion
    (goto-char beg)
    (let* ((num-lines (count-lines (point) end))
           (line-num 0))
      (while (< line-num num-lines)
        (back-to-indentation) ;; お好みで(beginning-of-line)でも
        (insert "<li>")
        (end-of-line)
        (insert "</li>")
        (setq line-num (1+ line-num))
        (next-line)
        ))))

タグ名を入力させるようにしたらより汎用的かも。でも今のところli以外で囲むことってあまりないからとりあえずこれでいいや。

 

選択範囲のインデントを1レベル下げる

要は選択範囲の先頭にTab1つぶん挿入したい。

標準機能そのままでやるなら

  • indent-rigidly を使う
    C-u 4 C-x [TAB] ;; “4”の部分は各自の設定に応じて変更
  • open-rectangle を使う
    空白(タブ)を挿入したい部分を選択した状態で C-x r o
  • string-rectangle を使う
    C-x r t → C-q TAB → ENTER

どれもストローク多いなー。。。
2つ目が一番スマートだけど選択範囲の設定がちょっと面倒。

というわけで1つ目を関数化。

;; "4"の部分は各自の設定に応じて変更
(defun my-indent-rigidly()
  (interactive)
  (indent-rigidly (region-beginning) (region-end) 4))
(global-set-key [(control tab)] 'my-indent-rigidly)

これで連打もできるよ!

 

Emacsで重複行の削除

Emacs24.4からは標準でできるようになるのね。ソートしなくていいのは何気に便利。
24.3以前だと C-u M-| sort | uniq が楽かな…。覚えきれんから関数化しとく。

(defun uniq()
  "重複行の削除"
  (interactive)
  (save-excursion
    (shell-command-on-region (point) (mark) "sort | uniq" nil t)))