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

Atom や Sublime Text で日本語の単語移動を可能にする(Vim化プラグインでも有効)

$
0
0

概要

エディタで文章を書いているとき、Mac だといろんなところ(Cocoaアプリのテキストフィールド)で単語ごとにカーソル移動(option + 矢印キー/ctrl+pnbf)ができてとても便利である。英語はもちろんのこと、日本語であれば形態素解析による文節ごとの移動が可能なのがすごい。論文や仕様書を書いているときにこの機能が使えるか否かは非常に重要な問題である。

ところが、Atom や Sublime Text といった GUI エディタは日本語における単語移動をサポートしてくれない。Sublime Text には LaTeXToolsという、高機能で開発も活発な LaTeX 向け拡張機能があって愛用していたが、この単語移動ができないのがつらすぎて Vim に移るなどしていた。というのも、素の Vim であれば(形態素解析ではなく、漢字・ひらがな・カタカナの文字種ごとではあるが)ノーマルモードで wで日本語における単語移動ができるからである(TextObject にもなっているので diwも効く)。

しかし、Vim を触り始めたところプラグイン沼にハマってしまい、環境構築だけで無為に時間が消費されてしまう。さらに、最近エディタ界隈で認知が高まっている Spacemacsも、Evil による Vim 実装で単語移動ができるが、全体的に重く、英語ですら入力が少しもたつくのが辛くなってきた(日本語入力はもっとひどい)。

Atom や Sublime Text といったモダンなエディタで、Vimくらいの実装でよいから単語移動ができればと思っていたところ、公式の設定項目を見つけたので記事にする。イチオシポイントは、Atom や Sublime Text を Vim 化するプラグインでも機能するところ。

方法

Atom や Sublime Text は単語境界を設定することができる。
単語境界とは、スペース以外に単語を区切る可能性のある文字のことで、両エディタのデフォルトは次のようになっている。

/\()"':,.;<>~!@#$%^&*|+=[]{}`?-…

これに、日本語で単語を区切る(ことの多い)文字を入れてしまえばよい。

、。「」【】『』()!? てにをはがのともへでや

「て」の前には全角スペースも入っていることに注意。
こんなもんでいいのかと思われるかもしれないが、実用的にはかなりちょうどよい。また、あんまり律儀に助詞を足すと思わぬひらがなで立ち止まるようになる。
(とはいえ、他にも入れておくとよい記号・助詞があればご指摘ください!)

Atom

設定に Non Word Charactersというのがあるので、そこに上記日本語文字列を足す。

Sublime Text

設定ファイルに word_separatorsの項目を足す。デフォルトの単語境界を消さないように注意。Sublime Text では JSON を使うので、デフォルトの単語境界の一部がエスケープされている。

Preferences.sublime-settings
{//その他の設定…"word_separators":"./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~? 、。「」【】『』()!?てにをはがのともへでや",//その他の設定…}

補足

以上の設定により、日本語でもおおむね単語レベルで移動するようになった。Atom の vim-mode-plusや Sublime Text の Vintageousでも単語移動が可能になり、もっというとテキストオブジェクトとしても日本語の単語を扱えるようになる。

ちなみに、この簡単な Hack を思いつく前は、Sublime Text で MultiByteWordというプラグインを使っていた。はじめのうちは満足していたけど、後に Vim のキーバインドを覚えていくうちに Vim と同じように単語移動したくなったのだが、どうあがいても Vintageous の w motion に割り当てられないので、しばらく諦めていた。

それにしても、Atom が ver.2 に でもなれば、エディタで悩む時代は終わるんだろうか……。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



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