Solist Work Blog

Software engineer note

複雑になった時使うツール

作業をしていて複雑な状況になってくるとミスが多くなります。 そういう時に使うツールは普段から使っておいて手になじませておかないと、 いざ複雑な状況になったときに使えなくなります。 想定することができるありがちな事態への対処はあらかじめ準備しておくことが大事かもしれません。

Deadgrep

複雑な状況になったときに使えるgrep系ツールとして最も使いやすかったのはdeadgrepです。まさに私のなかではgrepは死んだという認識になりました。 まずはdeadgrepをインストールしましょう。

M-x package-install deadgrep

deadgrepはバックエンドにripgrepを利用するのでインストールします。

sudo pacman -S ripgrep

準備が整ったのでさっそく使ってみることにしましょう。

M-x deadgrep

起動してemacsを検索している画面です。

deadgrepで検索しているところ

プロジェクト内(gitリポジトリ)でemacsと書かれているもの全てが一覧に現れます。 左の数字は行数で該当行でEnterを押すと該当行にジャンプします。 emacsを消してvimに修正したあとでdeadgrepバッファでgを押すと, 修正がdeadgrepに反映されるので上から順番につぶしていきたいときなどに便利です。

deadgrep上でswiperを使っているところ

deadgrepの画面でメインの進捗を確認しながらswiper-isearchで気になるもの(vim)を検索すれば複雑な状況にも対処できます。

deadgrepの検索履歴を利用しているところ

deadgrepを起動した直後の画面でM-pを押せば赤い四角のようになります。 M-pを連打するとdeadgrepで調べたものを遡っていくことができます。 deadgrepが過去の履歴を覚えてくれているので、 綴りを覚えていない単語(例えばalgorithm)を覚えておく必要はありません。 2つ前に調べたものと頭で記憶しておくだけでよいので脳のメモリを節約することができます。 脳のメモリを節約できれば複雑な作業のときのミスを減らすことができると思います。 なるべく簡単にできる方法を身につけることが大事なのではないでしょうか。

;; deadgrep-mode
(with-eval-after-load 'deadgrep
  (bind-keys :map deadgrep-mode-map
	     ("n" . next-line)
	     ("p" . previous-line)
	     ("j" . deadgrep-forward)
	     ("k" . deadgrep-backward)))

deadgrepの設定はemacsで小指に負担をかけないように なるべくCtrlキーを使わないで済むように設定しています。

smerge-ediff

よく起こる面倒な状況といえばコンフリクトでしょう。git mergeしたりgit rebaseするとよく起きます。 コンフリクトしたときに使うツールはsmerge-ediff(vc-resolve-conflicts)がお勧めです。 実際に試してみるためにgit-merge-sandboxを使ってコンフリクトした状況を作ります。

git clone https://github.com/eiel/git-merge-sandbox
cd git-merge-sandbox
bin/restart

これでコンフリクトした状態になるのでさっそくsmerge-ediff(vc-resolve-conflicts)を使ってみましょう。

magitでコンフリクトしていることを確認

magitで見てみるとsample.txtとsample2.txtがコンフリクトしています。

コンフリクトしているファイル

これがコンフリクトしているファイルです。この状態で

M-x smerge-ediff(vc-resolve-conflicts)

すると以下のような画面になります。

smerge-ediffを起動した画面

nを押すと次の差分に移動します。 aを押すと左側のmasterの変更が選択されます。 右側のfeatureの変更は破棄されます。

smerge-ediffの説明

nを押して次の差分に移動した画面です。 ここではfeatureの変更を選択したいのでbを押します。 左側のmasterの変更は破棄されます。 このファイルのコンフリクトはもうないのでqを押すと

コンフリクトが解消した画面

コンフリクトが解消されたファイルができあがります。 同じ要領でsample2.txtも作業します。 コンフリクトしたファイルを解消する作業が楽になるのでとてもお勧めです。 smerge-ediffの使い方はこんな感じです。

M-x smerge-ediff(vc-resolve-conflicts)
n:次の差分
p:前の差分
a:左を採用
b:右を採用
r:差分を元に戻す
q:編集を終える

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ