Edited at

ATOM でファイルを開いたら自動文字コード判定を行う

More than 3 years have passed since last update.

ATOM でファイルを開いたら自動文字コード判定を行う


はじめに

encoding-selector パッケージで文字コード判定ができるが、

わざわざcntl+shift+uを押して判定させるのは面倒。

ということで、ファイルを開いたら自動的に文字コード判定を行わせることにしてみた。

なお、環境はWindows7。


設定環境

ATOMインストールフォルダが、

C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0


ATOM設定フォルダが、

C:¥Users¥HOGEHOGE¥.atom


パッケージの参照設定


  • 管理者権限でコマンドプロンプトを開く

  • node_modulesフォルダを作成

    mkdir C:¥Users¥HOGEHOGE¥.atom¥node_modules

  • iconv-liteのシンボリックリンクを作成

    mklink C:¥Users¥HOGEHOGE¥.atom¥node_modules¥iconv-lite C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0¥resources¥app¥node_modules¥iconv-lite

  • jschardetのシンボリックリンクを作成

    mklink C:¥Users¥HOGEHOGE¥.atom¥node_modules¥jschardet C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0¥resources¥app¥node_modules¥encoding-selector¥node_modules¥jschardet

ATOM ver.0.187.0のフォルダを指定しているので、バージョンアップには対応できてない。。なんかうまく参照する方法はないのかな?

もしくは、npmでiconv-liteとjschardetをインストールだけでもよいとのこと


init.coffeeの修正


  • init.coffee を編集するには、ATOMのFileメニューから[Open Your Init Script]を選択

  • 次のコードを追加

fs = require('fs')

atom.workspace.onDidOpen ->
editor = atom.workspace.getActiveTextEditor()

try
filePath = editor.getPath()
catch error
return
return unless fs.existsSync(filePath)

jschardet = require 'jschardet'
iconv = require 'iconv-lite'
fs.readFile filePath, (error, buffer) =>
return if error?
{encoding} = jschardet.detect(buffer) ? {}
encoding = 'utf8' if encoding is 'ascii'
return unless iconv.encodingExists(encoding)

encoding = encoding.toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, '')
editor.setEncoding(encoding)

コードは、encoding-selectorパッケージのencoding-selector-list-view.coffeeのdetectEncodingメソッドを参考。


ATOMの再起動


  • ctrl+Alt+r


効能

これで、とりあえずはShiftJISとUTF-8の混在するWindows環境でもイラッとせずに済みそう。