見出し画像

InDesignで「control + K」を実装するスクリプト

macOSのFinderや(アドビ製品を除く)多くのアプリケーションでは「Emacsキーバインド」と呼ばれるキーボードショートカットによるカーソル移動などがサポートされています。

この中には「挿入ポイントから、行または段落の末尾までの範囲にあるテキストを削除する」キーボードショートカットとしてcontrol + Kキーが用意されています。KはKillに由来します。

InDesignで編集時、Killを実行したいことがよくあるのですが、InDesignには用意されていません。

ChatGPTとやりとりしたところ、サクっと可能になりましたので共有します。

現時点での不具合

・表のセル内ではうまく動きません。
・ストーリーの最終段落にカーソルがある場合、1文字残ってしまいます。

クリップボードに残すバージョン

いったん選択してからカットします。カットしたテキストはクリップボードに残ります。

/**
 * このスクリプトは、カーソルのある箇所から段落の最後の文字までを選択し、削除するためのものです。
 * 段落末の改行は残されます。
 * 
 * 作成日:2024-08-15
 */

(function() {
    // アクティブなドキュメントを取得
    var doc = app.activeDocument;
    // 現在の選択を取得
    var sel = app.selection[0];

    // 選択がテキストフレームまたはテキスト内であることを確認
    if (sel && sel.hasOwnProperty("baseline")) {
        // 現在のインデックスを取得
        var startIndex = sel.insertionPoints[0].index;
        // 段落の最後のインデックス(改行前まで)を取得
        var endIndex = sel.paragraphs[0].characters[-2].index;

        // 範囲を選択
        sel.parentStory.characters.itemByRange(startIndex, endIndex).select();
        // 選択範囲を削除
        app.cut();
    } else {
        // 選択がテキストフレーム内でない場合、警告を表示
        alert("テキストフレーム内にカーソルを置いてください。");
    }
})();

クリップボードに残さないバージョン

カーソルから末尾までを選択せずに削除します。少しだけ早く完了します。

/**
 * このスクリプトは、カーソルのある箇所から段落の最後の文字までを選択せずに直接削除するものです。
 * 段落末の改行は残されます。
 * 
 * 作成日:2024-08-15
 */

(function() {
    // アクティブなドキュメントを取得
    var doc = app.activeDocument;
    // 現在の選択を取得
    var sel = app.selection[0];

    // 選択がテキストフレームまたはテキスト内であることを確認
    if (sel && sel.hasOwnProperty("baseline")) {
        // 現在のインデックスを取得
        var startIndex = sel.insertionPoints[0].index;
        // 段落の最後のインデックス(改行前まで)を取得
        var endIndex = sel.paragraphs[0].characters[-2].index;

        // 削除範囲の文字列を取得し削除
        sel.parentStory.characters.itemByRange(startIndex, endIndex).remove();
    } else {
        // 選択がテキストフレーム内でない場合、警告を表示
        alert("テキストフレーム内にカーソルを置いてください。");
    }
})();

Yankには対応できる?

Killコマンドを実行すると、クリップボードとは別の領域に入り、control + Y(Yank)でペーストできます。

上記のスクリプトでは対応していません。

段落末尾の「。」を残す

少し運用したところ、段落末尾の「。」を残すとよさそうです。

/**
 * このスクリプトは、カーソルのある箇所から段落の最後の文字までを選択し、削除するためのものです。
 * 段落末の改行は残され、「。」が改行の直前にあればそれも残されます。
 * 
 * 作成日:2024-08-15
 */

(function() {
    // アクティブなドキュメントを取得
    var doc = app.activeDocument;
    // 現在の選択を取得
    var sel = app.selection[0];

    // 選択がテキストフレームまたはテキスト内であることを確認
    if (sel && sel.hasOwnProperty("baseline")) {
        // 現在のインデックスを取得
        var startIndex = sel.insertionPoints[0].index;
        // 段落の最後のインデックス(改行前まで)を取得
        var lastChar = sel.paragraphs[0].characters[-2];
        var endIndex = lastChar.index;

        // 改行前が「。」であるかを確認
        var preservePeriod = lastChar.contents === "。";

        // 範囲を選択(「。」を残す場合は、その前まで選択)
        if (preservePeriod) {
            sel.parentStory.characters.itemByRange(startIndex, endIndex - 1).select();
        } else {
            sel.parentStory.characters.itemByRange(startIndex, endIndex).select();
        }
        
        // 選択範囲を削除
        app.cut();
    } else {
        // 選択がテキストフレーム内でない場合、警告を表示
        alert("テキストフレーム内にカーソルを置いてください。");
    }
})();

ダウンロード

スクリプトファイル

段落末尾の「。」を残すバージョン


Keyboard Maestroマクロ


ここから先は

0字
月に10-20本くらいの記事を投稿しています。定期購読されると、更新のお知らせを受け取ったり、マガジン限定記事やサンプルファイルをダウンロードできます。 購読を開始した月に更新された記事から読むことができます(初月無料)。

DTP Transit 定期購読マガジン

¥100 / 月 初月無料

マガジン限定記事やサンプルファイルをダウンロードできます。

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5