カテゴリー別アーカイブ: メモ

数字をインクリメントしつつ置換

数字をインクリメントしつつ行コピー と似たような感じで、
複数行のテストデータなんかをインクリメントしつつコピペできたら楽なのになあ、と調べていたら
正規表現置換(query-replace-regexp)で連番機能が使えることを知った。

GNU Emacs Manual(日本語訳): Regexp Replace

置換先の文字列中に”\#”を書けば、その部分がゼロ始まりの連番になる。

というか連番に限らず普通にS式が使えるのか。
たとえばゼロ始まりじゃなく1始まりにしたいなら、

\,(+ \# 1)

使いこなせる気がしないけど使えたら便利なんだろうな…

参考

 

テーマをいじらずに一部分だけ色を変える

「ここの色が気に食わないな」という部分にカーソルを置いて

M-x describe-char

するとカーソル位置の文字情報が表示される。

その中の下の方にfaceの情報があるのでリンクを辿るとfaceの詳細情報が表示される。

「customize this face」からFaceを編集する。

Applyで適用、Apply and Save でinit.elのcustom-set-variablesに保存される。

 

use-package で prefix つきのキーマップを定義する

init.elを徐々にuse-packageで書き直していて、
キーバインドはbind-keyの機能を使って

(use-package hoge
  :bind(("C-c 1" . func1)
        ("C-c 2" . func2))
)

みたいに書けたりするんだけど、これだとglobal-mapへの割り当てしかできない。

ローカルなマップに割り当てたいときは:bindじゃなくて:initを使うといいらしい。

(use-package multiple-cursors
  :commands (mc/mark-next-like-this mc/mark-previous-like-this mc/mark-all-dwim)
  :init
  (bind-keys :map mode-specific-map
             ("C->" . mc/mark-next-like-this)
             ("C-< " . mc/mark-previous-like-this)
             ("M-R" . mc/mark-all-dwim))
  :config
  ;; multiple-cursorsの設定
  )

(参考:Emacs - use-packageで可読性の高いinit.elを書く - Qiita)

さらにこれにプレフィクスキーを使ったマップを設定したい。
bind-keyを使わない場合、

(defvar my-original-map (make-sparse-keymap) "My original keymap binded to C-q.")
(defalias 'my-original-prefix my-original-map)
(define-key global-map (kbd "C-q") 'my-original-prefix)

(参考:Emacs は外部 elisp がなくても強い (Emacs Advent Calendar jp: 2011 5日目) – 備忘録)

これをbind-keyでやる場合、:prefix-map を使う。

(use-package hoge
  :init
  (defvar hoge-map (make-sparse-keymap))
  (bind-keys :prefix-map hoge-map
             :prefix "<f8>"
             ("1" . func1)
             ("2" . func2)
             ))

うーん。なんかいろんなやりかたがあってややこしいなー。

 

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

たとえば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
の部分を省略できる。
後半の確認ダイアログは省略できないけど、まあこれくらいはあった方がいい気もするしいいか。

 

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

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パッケージ管理

 

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

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

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

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)

これで連打もできるよ!