LoginSignup
3
4

More than 5 years have passed since last update.

AtomのタブキーをEmacsライクな動作にする

Posted at

なかなか苦戦したので備忘録

動機

Emacsでは,行の途中でtabキーを押しても行全体がインデントされるんですが,Atomではカーソルの場所にtabが挿入されます.

しかし,Atomにはオートインデントのコマンドが存在するので,これをtabキーに割り当てればいいじゃないかと思い,割り当ててみました.

確かに,上で指摘した動作にはなるのですが,カーソルが行頭にあるときはカーソルはその位置のまま留まります.

僕的にはその行の最初の文字までカーソルが動いて欲しい…!
ctrl-a使えばいいじゃんって話
てことで,そこも解決できるように練習がてら作ってみました.

練習ついでにパッケージにして作りました.
これがどんどんemacsのinit.elのように肥大化していくんだろうなぁ

パッケージの作成

Package > Package Generator > Generate Atom Package

を選ぶだけでひな形が作成されます.

今回は,パッケージの名前を"my-package"としました.

Keymaps

キーバインドの設定

my-package.cson
'atom-text-editor:not([mini])':
  'tab': 'unset!'
  'tab': 'my-package:indent'

元のキーバインドを解除,新しく定義したものをセット

menus

右クリックのメニュー(コンテキストメニュー)や,メニューバーでの振る舞い?の設定のようです.

label,commandらを適宜書き換える.
(今回は使わないので単にコメントアウトしました.)

lib

本体

my-package.coffee
module.exports =
  subscriptions: null

  activate: ->
    @subscriptions = new CompositeDisposable
    @subscriptions.add atom.commands.add 'atom-workspace',
      'my-package:indent': => @indent()

  deactivate: ->
    @subscriptions.dispose()

  indent: ->
    if editor = atom.workspace.getActiveTextEditor()
      for cursor in editor.getCursors()
        if cursor.getBufferPosition().column == 0
          cursor.moveToFirstCharacterOfLine()
      for selection in editor.getSelections()
        selection.autoIndentSelectedRows()

やってることは,

こんな感じ
if カーソルが行の先頭
    then 行の最初の文字まで移動
選択行を自動インデント

詳しくは以下を参考に

Atom Documentation

ひぃひぃとドキュメント見ながら実装したわけだけど,各メソッドがどのクラスのメンバ関数なのかが読み取れずに苦労しました.

どこに書いてあるんだろう.

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4