2595


sublime text2をWindows7やLinux(CentOS 6.5)上で使用しています。 Shift_JISに対応するためプラグイン
「ConvertToUTF8」を入れています。

Ctrl+Rで関数のリストを表示してジャンプした時に時々ですが、日本語が文字化けしてしまう時があります。
この場合、ファイルを保存すると元に戻せなくなり困るので、その時点で編集中のものを破棄して対応しており、使い勝手が悪いです。

こういう現象は他の方でもでてますでしょうか？ 問題が出ない方法が知りたいと思います。

＜2014/12/24追記＞

文字化けとなる手順がわかりました。以下の順で実行すると確実に文字化けします (Windows7 Proで確認)。

  1. ShiftJISの日本語を含むファイルをCtrl+Sにて保存する
  2. Ctrl+Rを実行する

Ctrl+Rを押して関数のリストが表示された段階で文字化けになっているようです。


CC BY-SA 3.0
2014-12-20T00:44:33.520
2176
2014-12-26T10:03:12.787
2014-12-24T05:54:48.340
4840
4840
question
sublimetext 文字化け
Sublime Text2でCtrl+Rで日本語文字化けする


とりあえずの回避策を見つけました。

Ctrl+Rで関数リストを表示するのでなく、以下の手順で関数ジャンプすると文字化けは起きないようです。

  1. Ctrl+Sでファイル保存する
  2. Ctrl+P (Goto Anything)
  3. @を入力して関数リストを表示
  4. リストから関数を選択する

手順が長くなりますが、文字化けするよりはまだましです。

なお、一度手順2-4を実行して次のファイル保存するまではCtrl+Rを使っても文字化けしないようです。 ファイル保存直後のみ、上記手順が安全のようです。


CC BY-SA 3.0
2014-12-24T05:51:58.730
2471
2014-12-24T05:51:58.730
4840
2176
answer


(12/26 新規)

windows 8.1ですが、確かに再現しました。

で、ちょっと違うアプローチなのですが、`ctrl+r`にあたる機能を自前でプラグインにしてみたところ、
再発しなくなったので、もしよければ試してみてください。  
おまけ程度のものですのでサポートなどはありません。

（ホントは
`ctrl+p`と何か追加で`ctrl+r`相当にしようとなんとなくやり始めたら、なにもせずとも問題が起きなくなったという、若干腑に落ちない感じの一品です。）

プラグイン作成経験がなくても簡単に作れると思います。

## プラグイン本体の作成

メニューから

`Tool` > `New Plugin`

で、プラグインのひな形を作成します。

デフォルトは以下の様な感じですので、変更します。とくにクラス名はこれが呼び出すためのコマンド名に直結しますので注意してください。とりあえずクラス名は好みがあってもPascalケース(先頭大文字単語区切りごとに大文字）にします。

[code]

    import sublime, sublime_plugin
    
    class ExampleCommand(sublime_plugin.TextCommand):
      def run(self, edit):
        self.view.insert(edit, 0, "Hello, World!")
    
[/code]

これを以下の様にします。

[code]

    import sublime, sublime_plugin
    import time
    
    class MyGotoSymbol(sublime_plugin.TextCommand):
      def run(self, edit):
        # time.sleep(0.1)
        self.view.window().run_command("show_overlay", {"overlay": "goto", "text": "@"})
    
[/code]

（run_commandの部分はデフォルトのキーマップ設定開いて ctrl+r を探してみればそれと同じ様な呼び出しであることがわかると思います）。
sleepはわざとコメントアウトしています。  
pythonなのでインデントにも注意してください(インデントにタブとスペースの混在しない方がいいと思います)。

これを保存します。 多分、New Pluginで開いたタブのデフォルトの保存先は "～\Packages\User"
だと思いますので、そのディレクトリに(サブディレクトリ作らず)そのまま名前を付けて保存します。ファイル名は何でも構いません。クラス名と同じ方がわかりやすいです。

もし、"～\Packages\User" ではない場合は、`Preferences` > `Browse Packages`
で開かれたディレクトリの中にある”User”ディレクトリ直下に保存してください。

※ もし動作しなかった場合は、エラーなどはコンソール（`ctrl+``）に表示されるのでヒントになるかもしれません。
Packagesディレクトリでも動作しますのでPackagesに置いて動作するようであればそれでも構いません（コメント参照）。ただし、区分けとしてはユーザーの領域ではない場所なので別途バックアップなど取っておく方が安心です（上書きされる事は無いと思いますが念のため）

## 動作確認

この状態でもSublimeのコマンド実行できるウィンドウ(`ctrl+``)で

[code]

    view.window().run_command("my_goto_symbol")
    
[/code]

とすると試してみることができます。

上記で指定しているように、コマンド名はクラス名をスネークケースにしたものになります。
gotoのTを大文字にしていたら、そこもアンダースコアで区切る必要があります。

## ショートカットキーにバインド

確認までできたら、ショートカットキーにバインドします。

`Preferences` > `key bindings - user` で開きます。

まだ一度もユーザーショートカットキーを設定したことが無ければ `[]` が表示されていると思います。 以下の様にすれば、ctrl+r に
先ほど作成したプラグインが設定されます。 複数のキー設定がある場合はカンマで区切って追加します（defaultのキー設定が参考になります）。

[code]

    [
    { "keys": ["ctrl+r"], "command": "my_goto_symbol" }
    ]
    
[/code]

なお、もともとのctrl+rはこちらのユーザー設定で上書きされるのでそのままにしておいて問題ありません。 上書き保存して完了です。

## 最後に

再発しなかった原因がよくわからないですが、オーバーレイが表示されるまでに時間があればいいのかもしれないと思い、sleepを仕込んであります。私の環境＆サイズの小さいファイルではコメントアウトしていても問題ありませんでしたが、もし上手くいかない場合はsleepのコメントを解除（先頭の
# を削除）して調整してみてください。単位は秒です(0.1なら0.1秒)。


CC BY-SA 3.0
2014-12-25T17:51:16.643
2595
2014-12-26T10:03:12.787
2014-12-26T10:03:12.787
728
728
2176
answer