Kateの機能拡張(KDE4.10)

タグ: KDE4.10   KATE  

Kateにはいわゆるマクロが無いので、そこは欠点でしょうね。

現状、調べたことをメモ代わりに残しておきます。

拡張の種類

大きく分けて2種類あります。スクリプトとプラグインです。

スクリプトとは開いているウィンドウ、つまりファイルの内容について操作するものです。基本カーソルをウィンドウ内で移動したり、特定の行を変更したり、フィルタリングしたりするために使用します。

複数のウィンドウを行き来するとか、どこかのファイルを開くとか、テキストの内容以上の変更や、ウィンドウ、ペイン操作が必要なものはプラグインで作成します。

プラグイン

プラグインも2つあるようです。

KDEの中で、KATEは編集コンポーネントのようにも動作します。他のプログラムの編集に関わる部分をKateに担当させているものもあります。逆にKateはKonsoleをコンポーネントとして利用し、下部で利用できますね。

一つのプラグインはKate専用です。もうひとつは上記のKateをコンポーネントとして利用しているものであれば、どこでも使用できるものです。

どの様に作り分けるのかまで詳細に調べてはいません。基本、プラグインはC++を使用した本格的な作り込みになるようです。

スクリプト

もっとお手軽であれば、プラグインを作成したいのですが、資料を探すのがえらく大変なため、今回はパスしました。

とりあえず、やりたいことはSedの置換用にエスケープしてくれる簡単なショートカットを作成したいだけなのです。いちいちバックスラッシュを手動でタイプするのは面倒だからです。

スクリプトには2種類あります。一つがインデントタイプ、もうひとつがスクリプトタイプです。

正直、インデントタイプのスクリプトは、上記のリンク先の例以外にどの様に使用できるのか、把握できませんでした。

スクリプトタイプであれば、古いものの例が上記記事以外にも紹介されています。

私が個人用に作成したSedの置換文字列をエスケープするサンプルを載せておきます。まだ、完成品ではありません。どの様に書いたら良いかのヒントにはなるでしょう。

保存場所は$KDEHOME/share/apps/katepart/script/commandsです。$KDEHOMEが定義されていない場合は/etc/KDE4/share...となるようです。

/* kate-script
 * author: Hirohisa Kawase. <hirokws@gmail.com>
 * license: MIT
 * revision: 1
 * kate-version: 4.10.0
 * type: commands
 * functions: sedup
 * i18n-catalog: sedup
 *
 * A line without colon ':' stops header parsing. That is, you can add optional
 * text here such as a detailed license.
 */

require("range.js");

function help(cmd)
{
    if (cmd == "sedup") {
        return "SED置換エスケープ";
    }

}

function action(cmd)
{
    var a = new Object();
    if (cmd == "sedup") {
        a.text = "SED置換エスケープ";
        a.icon = "";
        a.category = "翻訳";
        a.interactive = false;
        a.shortcut = "Ctrl+e";
    }
    return a;
}

function sedup()
{
    var selectionRange = view.selection();
    if (view.hasSelection()) {
        if (selectionRange.isValid()) {
            var fromLine = selectionRange.start.line;
            var toLine = selectionRange.end.line;
            var fromColumn = selectionRange.start.column;
            var toColumn = selectionRange.end.column;

            repText = view.selectedText().replace(/\\/g, '\\\\');
            repText = repText.replace(/\./g, '\\.');
            repText = repText.replace(/\+/g, '\\+');
            repText = repText.replace(/\*/g, '\\*');
            repText = repText.replace(/\^/g, '\\^');
            repText = repText.replace(/\$/g, '\\$');
            repText = repText.replace(/\{/g, '\\{');
            repText = repText.replace(/\}/g, '\\}');
            repText = repText.replace(/\[/g, '\\[');
            repText = repText.replace(/\]/g, '\\]');
            repText = repText.replace(/^\s+|\s+$/g, '');
            repText = 's+' + repText + '\\s*++';

            document.editBegin();
            document.removeText(fromLine, fromColumn, toLine, toColumn);
            document.insertText(fromLine, fromColumn, repText);
            document.editEnd();
        }
    } else {
        var line = view.cursorPosition().line;
        var endColumn = document.lineLength(line);

        repText = document.line(line).replace(/\\/g, '\\\\');
        repText = repText.replace(/\./g, '\\.');
        repText = repText.replace(/\+/g, '\\+');
        repText = repText.replace(/\*/g, '\\*');
        repText = repText.replace(/\^/g, '\\^');
        repText = repText.replace(/\$/g, '\\$');
        repText = repText.replace(/\{/g, '\\{');
        repText = repText.replace(/\}/g, '\\}');
        repText = repText.replace(/\[/g, '\\[');
        repText = repText.replace(/\]/g, '\\]');
        repText = repText.replace(/^\s+|\s+$/g, '');
        repText = 's+' + repText + '\\s*++';

        document.editBegin();
        document.removeText(line, 0, line, endColumn);
        document.insertText(line, 0, repText);
        view.setCursorPosition(line+1, 0);
        document.editEnd();
    }
}

Javascriptです。多言語化のコードはややこしくなるため抜いてあります。個人で使用するなら不必要です。

動作は、選択している場合はその範囲を、選択していない場合はカーソル位置の行を処理対象として、エスケープする文字に\をつけているだけです。まあ正直、エディターの正規表現を使い一発で行うこともできるでしょうが、ショートカットでお手軽にやりたい気持ちがたっぷりで、わざわざ作っているものです。

どの様なプロパティにアクセスでき、メソッドがあるのか検索してもなかなか見つかりませんでした。結局KDEのヘルプで見つけましたが、それと同じ内容は前記したリンク先のWebページにもあるようです。

オブジェクトのメソッドの説明は書かれていますが、細かいプロパティに関する情報が全くなく、手探り状態作成しました。

名前が動作を表しているため、読んでいただけば何をしているが一目瞭然です。

唯一、editBeginとeditEndがわかりづらいですが、これはUndoをする場合に同時に戻す範囲を指定するものです。これによりUndo(通常はCtrl+Zですが)を行えば、一発でスクリプト実行前に戻せるわけです。

なにせSed用で翻訳の用途に合わせたエスケープなため、汎用性には乏しいですが、自分用のスクリプトを作成する場合の参照用としては分かりやすいかと思います。