Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

EmacserがVimに飛び移ろうとして諦め, Spacemacsに着地した話

$
0
0

Spacemacsの解説記事ではありません. タイトル通りのポエムです. 生産性の向上を期待しないでください.

あらまし : キーバインドのはなし

自分はEmacs使いです. 自分でゴリゴリチューニングして環境自体には満足していました. しかしかねてから気になっていたことがありました. キーバインドです.

「VimのほうがEmacsよりも優れたキーバインドを持っている」という論調はよく見かけますが, その逆はおもしろいほど見かけません.いやマジで. 限りなくゼロに近いと言って良いかと.

もちろんEmacsをまともに使っている人でキーマップを全く変更せずに使っている人は皆無だと思います. それでもやはり基本というものはあって,C-f C-b C-n C-pC-x C-sなどの基本となるキーを変更している人は少ないでしょう. Vimmerのよくある主張である「Ctrl/Alt押しながら...なんてありえない!」から解き放たれたEmacserは居ないでしょう. 闇堕ちしたユーザーを除いては...

どうにもVimに入信した面々は一様に口を揃えて「Vim最高!」と叫ぶ風潮がある. これは果たして単なるトレンドなのか, それともマジなのか. 確かめたくなったのでVimに浮気してみることにしました.

いやいや, あくまで浮気ですよ. 心中するつもりはありません.

よもやま話

個人的な話です. スルーして頂いて構いません. いやそんなこと言ったらこの記事自体スルーしても構わないことになりますが.

その1 : あるOLのはなし(私のことではありません)

あるところにひとりのOLがいました.

そのOLの会社のお偉いさんは60をとうに過ぎた年配の方で, PCが全く使えない人でした.

そのお偉いさんから降りてくる資料はすべて手書きの紙媒体なので, 部署ではそれをデジタル化する作業がいつも付きまとってきます.

そんな業務に追われているときにお偉いさんはやってきて, 部署を見渡してこう言いました.

「パソコンなんか使ってるからお前らはダメなんだよ」

こういう大人にならないためにはどうすればいいでしょうか? 僕は「古いものに拘泥せず新しいものを勉強する」のがいいのかなと思いました. 我々にとってパソコンは使えて当たり前の道具ですが, 年配の方にとっては「勉強」というモチベーションをもってしないと習得できない類のモノでしょう. 自分もこれからどんどん年齢を重ねていきますが, 常に新しいことを勉強する気持ちを忘れないでいたいものです. つまり何を言いたいのかというと, Vimの浮気もその一環だということです.

え? Vimも古いって?

その2 : Emacsのキーストロークについての弁明

Vimmerさんに「覚えにくい」だの「長い」だの批判されまくってるEmacsのキーストロークですが, 自分は言うほどヤバいものではないと考えてます.

まず「覚えにくい」ですが, 覚えてしまえば関係ありません.各エディタをそこそこ使いこなしている人はキーバインドを思い出しながら編集しているのではなく, 体に染み付いているのです. 染み付いてしまえば「ペーストはp, アンドゥはu. 覚えやすくね?」には意味がなくなります. EmacserにはC-f C-b C-n C-pのカーソル移動が当たり前のごとく身についています. キーが遠いとか, もはやどうでもいい話です. 確かに初学者に優しいかどうかはわかりません. でもモードという概念がそもそも初学者に優しいものではないのでどっこいどっこいだと思います.

次に「キーストロークが長い」ですが, これはある程度受け入れざるを得ません. 矩形選択した範囲を置換するのはC-x r tですが, さすがに冗長すぎると思います. 全部左手. でもこれだってキーバインドを変更すればいいだけです. Emacsはカスタマイズこそ正義. 聖域など存在しない.その極致がEvilなのでしょう. ただひとつ言わせて頂きたい.

C-x C-sなんてワンストロークです.

結論

結局, 完全にVimに移行するのは難しいと判断しました. え, あの, いや, 最初からEmacsに戻ってくるつもりでしたよ?

理由はプラグインです. EmacsにあるものはだいたいVimにもあるだろうと思っていて, 実際そうなのでしょうが, 替えの利かないものがいくつかありました.

Helm

僕のEmacs生活を根底から変えてくれた子です. ファイル・バッファ・文字列...Emacsで扱うありとあらゆるものを統一的な優れたインターフェイスでインクリメンタルに検索できるようになります. 最初はとっつきにくい印象を受けましたが, とあるドキュメントを読んで勉強したところすごい子であることがわかりました. 拙い日本語訳を書いたので興味があれば是非:

初心者〜初級者のためのEmacs-Helm事始め : 前編
初心者〜初級者のためのEmacs-Helm事始め : 後編

自分がよく使ってるのは
- helm-find-files
- helm-for-files
- helm-swoop
- helm-semantic-or-imenu
- helm-apropos
でしょうか. 特にhelm-swoopは異様に便利です.

Vimmerさんは「unite.vimあるじゃん」と思われるかもですが, helmと同じような使用感にするための設定はいかにも大変そうです.

pdf-tools

Emacsは画像表示に対応しており, それを応用してPDFを表示することができます. つまり, LaTeXを書いてタイプセットしたものをEmacs上で閲覧できるのです. synctexを使えば便利さ倍増. Vimでは難しいでしょう.

PDFくらい別ツールで表示すれば...と思うかもしれませんが, 引きこもりこそがEmacsの文化であり美徳であると声を大にして主張したい. そして, その考え方が自分には取り返しのつかないレベルで染み付いているのでした.

Org-mode

Emacs純正のアウトラインプロセッサ. メモ書きやらスケジューリングやら表計算やらなんでもできる子. まさにEmacs文化を体現しておられます. さらに書いたドキュメントをMarkdownやらHTMLやらLaTeX(PDF)やらいろんなものに変換できます. GithubのREADMEもorgに対応しています. ビバ!Org引きこもり!

天はSpacemacsに二物を与えた

結局Vimで生活するのは無理でしたが, Vimキーバインドは試してみたい. Evilもいいのですが, テキスト編集以外のキーバインドがどうなるのかがよくわからないので心配. ということでSpacemacsをはじめてみることにしました. 彼は「Emacs + Vim = 最強」を掲げたイケメンプロジェクトです. 土台がEmacsで, デフォルトのキーバインドはVim. Emacsの無骨な外見を捨て去りかっこよくなってます. イケメンは正義.

実は以前に触ったことがあるのですが, レイヤーの仕組みがよくわからず挫折しました. 原因はEmacsの設定をそのままSpacemacsに持ち込もうとしてレイヤーの設定と衝突して???になってしまったことです. 今回はVimキーバインドを試すつもりなので設定はほぼデフォルトのままにしました.

さてプラグインなのですが, ここからがヤバい. 自分が過去に使っていた必須とも言えるプラグインのほぼすべてがデフォルトで入っていた.いやコレは凄いことです. helmflycheckが入ってるのは想定内として, pdf-toolsがあったのはビビった. 導入に随分苦労したプラグインだったんだけどなあ...追加で入れたのは migemoくらいなもんです. Spacemacsはイケメンかつ有能だった.

かつその大量にあるデフォルトプラグインの中には, 便利ツールだけでなく見目を麗しくするタイプのプラグイン(spacelineorg-bulletsなど)も多く含まれています. イケメンに隙無し.

さらにほぼすべての機能にSpaceキーを起点にしてアクセスできます. つまるところ which-keyなのですが, Vimキーバインドにマッチした良い設計になっています. デフォルトでほぼ完成されていると言ってもよい.

かくしてSpacemacsに着地したのでした.

で, 結局?

肝心のVimキーバインドはどうだったのかというと, 現状何が良いのかさっぱりわからんです.いちいちモードを切り替えるのが大変だし, 日本語入力との相性がよくないし. いや, 思った以上につらい.

とはいえ, この手のものは1-2週間も使っていれば次第に慣れてくるものなのでもう少しがんばるつもりです. 果たして2週間後には「Vimキーバインド最高!」と叫ぶトレンディなVimクラスタになっているのか, はたまた母なるEmacsに還っていくのか.

spacemacs1.png


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>