Paepoi

Paepoi » macOS Tips » Atom を Gedit のように使う

Atom を Gedit のように使う

# 最終更新日 2020.02.16

- shift+tab でカーソル行のインデント戻し
- option(alt)+上下矢印キーで行の入れ替え
- command(fn)+左矢印キーでインデントの先頭にジャンプ

という筆者には必須な機能は Atom でもカスタマイズで可能でした。
他にも筆者が Fedora の Gedit でやっていることのほとんどが再現できました。
以下 1.44 時での内容です。

拡張子の無いファイル
macOS では GUI で実行パーミッションを利用するには拡張子を外す必要がある。
Atom は拡張子が無くてもシバンからファイル形式を判別してくれる。
#!/bin/sh, #!/usr/bin/env python3 は当然として。
#!/usr/bin/osascript -l JavaScript

function run(argv) {
    for (let s of argv) {
        console.log(s);
    }
}
何が素晴らしいかって、上記を JavaScript だと認識してくれやがったこと。
これで JXA にて小物スクリプトを作るのに小細工とかいらなくなるぞと。

vim-modeline パッケージを導入で vim モードラインも使えます。
拡張子判別しかできないエディタを UNIX 系で使う人なんていない。

デフォルトパッケージの設定
git を使わないなら設定のパッケージにて github で検索し全部無効にする。
Xcode をインストールしていない場合は起動毎に Xcode を入れろと出てウザい。
筆者は Xcode を使う予定は無い、PyObjC で十分。

auto* で始まるデフォルトパッケージは全部無効に。
いや autocomplete-snippets だけは必要なので有効にしておく。
それだけでイライラするポップアップは出なくなる。
ポップアップしないだけでスニペットは使える、Gedit 等と同じ。

後、閉じ括弧自動補完を無効にするには
bracket-matchar の設定から Autocomplete-Brackets を off にする。
スペルチェックやツリービューもウザいだけ。

~/.atom/config.cson から以上を抜き出したもの。
"*":
  "bracket-matcher":
    autocompleteBrackets: false
  core:
    disabledPackages: [
      "autocomplete-css"
      "autocomplete-html"
      "autoflow"
      "autosave"
      "github"
      "open-on-github"
      "autocomplete-plus"
      "autocomplete-atom-api"
      "spell-check"
      "tree-view"
    ]
フォントサイズは 12 にした、後はお好みで。

必須なパッケージ(スクリプト実行、モードライン)
japanese-menu は日本人は全員入れていると思う。
script を使っていたけどバグで動かなくなったので atom-runner に乗り換え。
でもデフォルト状態ではイマイチなので以下のように改造しています。

Atom: Script to atom-runner | Paepoi Blog

atom-runner はシバンを見て振り分けしてくれる。
Windows でなければシバンさえ書けば何も設定する必要が無い。
#!/usr/bin/env python3

# カレントディレクトリの確認

import os
print(os.getcwd())

# fstring はシバンを python(Python2) に書き換えると例外

s = 'SUZUKI'
print(f'{s} のバイクはかっこいい')
実行パーミッションは不要、Python2 と 3 の振り分けに困ることは無い。
vscode のように「ディレクトリで開く」を行う必要は無いし小細工もいらない。
ペインを閉じるのは esc を使う。

ただこのパッケージも zsh 等では初期化設定が無視され日本語を上手く扱えない。
~/.atom/init.coffee に以下を追記すれば問題なく使えるようになる。
ただし spell-check がエラーになるので無効にするのを忘れずに。
process.env.LANG = 'ja_JP.UTF-8';

vim-modeline はそのまんま vim のモードラインが使えます。
下記の python を js や c に書き換え、ts は tab を押下した時の幅を指定。
control+option+V で適用されるのでどういうものか解ると思う。
# ex: ft=python ts=4
# 上記を二行目、又は最終行に書く
拡張子を外さないとコマンドにならない macOS では必須。
vscode にも似たものがありますがアレは全体設定を上書きするゴミ。
emacs, kate 形式は残念ながら現在は利用する手段が無いようです。

JXA をやるなら language-javascript-jxa も入れておこう。
$ に色が付いてスニペットが少し増える程度ですけど。
上記 vim-modeline を有効にして最終行に以下を書いておけば適用される。
// ex: ft=js.jxa

<>& をエスケープするとかは関数追加で簡単に作れるので必要ありません。
下記にて解説。

コードスニペット
特定の文字列をタイプした後に tab キーを叩くと補完してくれる機能です。
*.py を開いて env3 とタイプして tab キーを叩いてみましょう。

自分で追加してみましょう。
たとえば、このページで使っている SyntaxHighlighter のタグを prep で補完させる。
それを *.php のファイルで下書きする場合。
~/.atom/snippets.cson を開いて下記を書き込む。
 '.text.html.php':
   'Hilite':
     'prefix': 'prep'
     'body': '<pre class="brush: ${1:py}">$0</pre>'
   'Pre':
     'prefix': 'pre'
     'body': '<pre>$0</pre>'

.php ではなく .text.html.php で指定する。
.php だとここでは動作しない
<?php
ここではどちらでも動作する
?>
.text.html.php 指定なら PHP タグ外でも動作します。
変数は残念ながら使えないようです。

キーボードショートカットで補完させる手段もあります。
init.coffee に関数を作って keymap.cson にてキーを指定という流れです。

Keymaps for inserting code snippets? - support - Atom Discussion
Allow $SELECTION$ variable to create a snippet that surrounds code · Issue #200 · atom/snippets · GitHub

上記を参考に以下の関数を作ってみた (coffeescript)

※ <br /> の流し込み @ editor:insert-br
※ #=> の流し込み @ editor:insert-gt
※ 選択範囲を <span> で囲んで色指定 @ editor:html-color
※ 筆者が Gedit Plugin で公開している <>& をエスケープ @ editor:html-escape
※ Terminal.app のカレントディレクトリを編集中ファイル位置にして開く @ editor:open-terminal

init.coffee
process.env.LANG = 'ja_JP.UTF-8';

atom.commands.add 'atom-text-editor', 'editor:insert-br', ->
    atom.workspace.getActiveTextEditor()?.insertText('<br />')

atom.commands.add 'atom-text-editor', 'editor:insert-gt', ->
    atom.workspace.getActiveTextEditor()?.insertText('#=&gt; ')

atom.commands.add 'atom-text-editor', 'editor:html-color', ->
    snippet = atom.packages.activePackages.snippets.mainModule
    editor = atom.workspace.getActiveTextEditor()
    text = editor.getLastSelection().getText()
    snippet.insert('<span style="color: ${1:red}">' + text + '</span>$0')

atom.commands.add 'atom-text-editor', 'editor:html-escape', ->
    editor = atom.workspace.getActiveTextEditor()
    text = editor.getLastSelection().getText()
    escape = text.replace(/[<>&]/g, (match) ->
        {'&': '&amp;', '<': '&lt;','>': '&gt;'}[match])
    editor.insertText(escape)

atom.commands.add 'atom-text-editor', 'editor:open-terminal', ->
    path = atom.workspace.getActivePaneItem()?.buffer?.file?.path
    dirname = require('path').dirname(path)
    require('child_process').exec "open -a Terminal \"#{dirname}\""

init.coffee は起動時に読み込みなので書き換え後は Atom の再起動を忘れずに。
キー割付は以下で、動作すると確認できるはずです。

キーボードショートカットを Gedit 風に
やはり command+N が新規ファイルなんだけど実際は新規タブなんだよな...
違和感が凄いので Gedit と同じように command+T に変更する。
command+H を置換にしたいのは完全に Gedit での手癖です。

option は alt で指定、command は cmd で指定。
Macbook Pro を意識しているのか Function キーはデフォルトでは使っていない。
しかし指定すれば Function キーも使える。
command+N: 新規ウインドウ
command+T: 新規タブ
command+H: 置換
option+Up: カーソル行の上下入れ替え
option+Down: カーソル行の上下入れ替え
option+command+Down: 一行下にカーソル行の流し込み
option+command+B: (自作)<br /> の流し込み
option+command+G: (自作)#=> の流し込み
option+command+R: (自作)選択範囲を <span> で囲んで色指定
option+command+E: (自作)選択範囲の <>& をエスケープ
option+command+T: (自作)Terminal.app の起動
F5: (パッケージ)スクリプトのシバン実行

keymap.cson は以下のようになった。
'body':
    'cmd-n': 'application:new-window'
    'cmd-t': 'application:new-file'
'.platform-darwin':
    'cmd-h': 'find-and-replace:show-replace'
'atom-workspace atom-text-editor:not([mini])':
    'alt-up': 'editor:move-line-up'
    'alt-down': 'editor:move-line-down'
    'alt-cmd-down': 'editor:duplicate-lines'
    'alt-cmd-b': 'editor:insert-br'
    'alt-cmd-g': 'editor:insert-gt'
    'alt-cmd-r': 'editor:html-color'
    'alt-cmd-e': 'editor:html-escape'
    'alt-cmd-t': 'editor:open-terminal'
'.platform-darwin atom-text-editor':
    'f5': 'run:file'

最後に
筆者が Fedora にて Gedit でやっていることのほとんどが再現できました。
むしろ Gedit 用に Ctrl+Esc でボトムパネルを閉じるプラグインを作ってしまった。
開発者をイライラさせるだけの余計な補完をしないのでとても快適になりました。
「ディレクトリで開く」をしなくても開いているスクリプトが実行できるのはやはり便利。
関数を書いて拡張が比較的簡単。
秀丸でマクロを書いたり Gedit でプラグイン自作しているような人は Atom もいいよ。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2020.