Xcode Source Editor Extension を使って、空白を除去するプラグインを作る

Xcode Source Editor Extension を使って、空白を除去するプラグインを作る

Clock Icon2016.09.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Xcode Source Editor Extension で何か実用的なものを…

「Xcode Source Editor Extension」は、Xcode 8 から作れるようになった Xcode の Source Editor の機能拡張のことです。Xcode の Source Editor を拡張するような機能を、誰でも実装し提供することができます。

Xcode Source Editor Extension の基本は、以下の記事で紹介しています。

Xcode Source Editor Extension を使った Xcode プラグインの作り方

せっかく覚えたので、何か実用的なものを…と思い、ソースコード上の末尾の空白を除去するプラグインを簡単ですが作りました。Xcode ではすでにスペースのみの行を空行にする設定がありますが、これのスペースのみじゃないバージョン、といった位置付けです。

実装

Xcode Source Editor Extension のプロジェクトの作成などはこちらの記事で紹介していますので、割愛します。実装は XCSourceEditorCommand プロトコルに準拠したクラスの perform:with:completionHandler: メソッドで実装します。

import Foundation
import XcodeKit

class SourceEditorCommand: NSObject, XCSourceEditorCommand {
    
    func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
        let textBuffer = invocation.buffer
        let lines = textBuffer.lines
        
        let lineCount = lines.count
        for lineIndex in 0..<lineCount {
            if let string = lines[lineIndex] as? String {
                var replaced = String(string.characters.dropLast())
                while replaced.characters.last == " " {
                    replaced = String(replaced.characters.dropLast())
                }
                lines.replaceObject(at: lineIndex, with: replaced)
            }
        }
        completionHandler(nil)
    }
    
}

invocation.buffer.lines の配列の中に、表示中のソースコードが1行ずつ分割されて入っています。この1行ずつを対象に、末尾が空白であるか比較し、空白であった場合に dropLast で削ります。はじめに一度 dropLast を行っているのは、改行コードを削るためです。

使ってみる

末尾に空白がある行を用意します。

xcode-drop-space-01

コマンドを実行します。

xcode-drop-space-02

消えました!

xcode-drop-space-03

まとめ

非常に簡単な実装ではありますが、ちょっと役立つ (かもしれない) プラグインが簡単にできました。ネットサーフィンをしてみると、= のインデントを揃えるプラグインや、突然の死の AA に変換するプラグインなど、役立つものから面白いものまで、いろいろなプラグインが作られているようでした。私も、引き続きプラグイン開発に挑戦していきたいと思います。

何かできたら、またブログでご紹介します。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.