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

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

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

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

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

\,(+ \# 1)

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

参考

 

snake_case と CamelCase の変換

ググったらいろいろ関数作ってる人はいるみたいだけどこれといってメジャーなパッケージはないのかな?

結局これを使うことにした。
string-inflection: underscore -> UPCASE -> CamelCase conversion of names

 

数字をインクリメントしつつ行コピー、あるいは連番入力

連番の入力はcua-mode使ったりレジスタ使ったりなんやかんやでやり方はあるもののいまいち手になじまない。
もっとこう、excelみたいにザーっと簡単にインクリメントできたら楽なのに、と思っていたらドンピシャなやつを知った。

Emacs で Excel のオートフィルのようなことをする – ”E” for …

で、しばらく上記のsrepを愛用してたんだけど、なんかこう、ここまで高機能じゃなくていいからもっとお手軽にワンストロークでできないかな、とか思ってたらこんなのがあった。

EmacsWiki: Replace Count

これの中盤の another-line がまさに求めてたものでした。

1. hoge1

みたいな行にカーソル置いてM-oすると

1. hoge1
2. hoge2
3. hoge3
4. hoge4
...

という感じにポコポコインクリメントされた行を生成できる。べんり。

 

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

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

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

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

 

visual-regexp-steroids がいつのまにか使えなくなった(emacs24.3)

emacsでPerl風の正規表現を使うやつ で導入して快適に使用していた visual-regexp-steroids 、いつのまにかエラーが出るようになっていた。

void-function pcre2el error

pcre2elは問題なくインストールされている。んんん…?
と思っていたら、ちょっと前にパッケージのアップグレードをした際にpcre2elがアップグレードされており、
その中で with-eval-after-load が使われていたのでした。。。

これ、どうやらemacs24.4から使えるマクロらしい。
私のemacsは24.3。うん、これが原因っぽい。

というわけでpcre2elをダウングレード。無事動くようになりました。
こういうことがあるからアップグレードの際は古いパッケージを消さずに残しておくべきですね。
(package.elでバージョン固定とかの管理がうまいことできればいいんだけどなー)
(というかそろそろemacs24.4を入れるべきか)

 

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

たとえば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に書くのであってるんだろうか。。。