web-dev-qa-db-ja.com

GNOME / GTK +のテキストにシステム全体のWord区切り文字を構成する方法はありますか?

GNOMEターミナルで使用される "select-by-Word"文字 と同様に、GNOMEによってWordの境界と見なされる文字を定義または表示および変更する方法を探しています( 関連question )またはrxvtのcutchars。

たとえば、geditを使用している場合は、abc123xyzと入力してダブルクリックできますが、デフォルトでは数字が境界として扱われるため、3文字のみが選択されます。 Tomboy、および私がテストした他の少なくともいくつかの他のGNOME/GTK +アプリケーションでも同じ動作が見られます。また、Google Chromeのロケーションバー内(ページ内ではない)にも存在し、特に煩わしいものです。 Firefoxは問題ないようです。UIはXULで書かれているので、独自の機能を果たしていると思います。

一般的な解決策が存在する場合は、それを探していることに注意してください gedit用のプラグイン 、特に他のアプリケーションごとの調整があることはすでに知っていますが、これが存在するかどうかを知りたいですウィンドウマネージャーからこの動作を継承するほとんどまたはすべてのプログラムに影響を与える方法で実行できます(私は推測しますか?)。

6
Noyo

どうやら、これはバージョン1.34.1で修正されました。 git log を確認し、1.34.0から1.34.1のタグの間でコミットします。 Ubuntu 13.04には、sidと同じlibpango1.0-0のバージョン1.32.5があります。したがって、Debianベースのディストリビューションには今のところ喜びはありません。ライブラリが必要な場合は、ソースからコンパイルできます。

これはPangoLogAttr()関数の問題であり、バグを訴える人は誰も報告していないようです。この問題は2003年から現在までさかのぼります。あなたが提供するメールのアパートは次のとおりです。

ガイドラインの私の解釈が正しければ、数字を含む単語であると予想されます。単語は、'を除いてスペースや記号と同じ数字で制限されます。

Pangoに対するバグを報告するには、このリンクにアクセスしてください https://bugzilla.gnome.org/enter_bug.cgi?product=pango

2
Braiam

Debian 7(Wheezy)の場合:

Debianからソースファイルをダウンロードして自分で変更を加えてから、作成した.debパッケージを再コンパイルしてインストールできます。

ルートターミナルを開きます。

apt-get install dpkg-dev;
apt-get build-dep libpango1.0-0;
exit;

通常のターミナルを開きます。

cd; mkdir patch-libpango; cd patch-libpango;
apt-get source libpango1.0-0;

次に、ホームフォルダに移動してファイルpatch-libpango/pango1.0-1.30.0/pango/break.cを開き、次のコードブロックを見つけます。

/* ---- Word breaks ---- */

/* default to not a Word start/end */
attrs[i].is_Word_start = FALSE;
attrs[i].is_Word_end = FALSE;

if (current_Word_type != WordNone)
{
    /* Check for a Word end */
    switch ((int) type)
    {
    case G_UNICODE_SPACING_MARK:
    case G_UNICODE_ENCLOSING_MARK:
    case G_UNICODE_NON_SPACING_MARK:
    case G_UNICODE_FORMAT:
        /* nothing, we just eat these up as part of the Word */
        break;

    case G_UNICODE_LOWERCASE_LETTER:
    case G_UNICODE_MODIFIER_LETTER:
    case G_UNICODE_OTHER_LETTER:
    case G_UNICODE_TITLECASE_LETTER:
    case G_UNICODE_UPPERCASE_LETTER:
        if (current_Word_type == WordLetters)
        {
            /* Japanese special cases for ending the Word */
            if (JAPANESE (last_Word_letter) ||
                    JAPANESE (wc))
            {
                if ((HIRAGANA (last_Word_letter) &&
                            !HIRAGANA (wc)) ||
                        (KATAKANA (last_Word_letter) &&
                            !(KATAKANA (wc) || HIRAGANA (wc))) ||
                        (KANJI (last_Word_letter) &&
                            !(HIRAGANA (wc) || KANJI (wc))) ||
                        (JAPANESE (last_Word_letter) &&
                            !JAPANESE (wc)) ||
                        (!JAPANESE (last_Word_letter) &&
                            JAPANESE (wc)))
                attrs[i].is_Word_end = TRUE;
            }
        }
        else
        {
            /* end the number Word, start the letter Word */
            attrs[i].is_Word_end = TRUE;
            attrs[i].is_Word_start = TRUE;
            current_Word_type = WordLetters;
        }

        last_Word_letter = wc;
        break;

    case G_UNICODE_DECIMAL_NUMBER:
    case G_UNICODE_LETTER_NUMBER:
    case G_UNICODE_OTHER_NUMBER:
        if (current_Word_type != WordNumbers)
        {
            attrs[i].is_Word_end = TRUE;
            attrs[i].is_Word_start = TRUE;
            current_Word_type = WordNumbers;
        }

        last_Word_letter = wc;
        break;

    default:
        /* Punctuation, control/format chars, etc. all end a Word. */
        attrs[i].is_Word_end = TRUE;
        current_Word_type = WordNone;
        break;
    }
}
else
{
    /* Check for a Word start */
    switch ((int) type)
    {
    case G_UNICODE_LOWERCASE_LETTER:
    case G_UNICODE_MODIFIER_LETTER:
    case G_UNICODE_OTHER_LETTER:
    case G_UNICODE_TITLECASE_LETTER:
    case G_UNICODE_UPPERCASE_LETTER:
        current_Word_type = WordLetters;
        last_Word_letter = wc;
        attrs[i].is_Word_start = TRUE;
        break;

    case G_UNICODE_DECIMAL_NUMBER:
    case G_UNICODE_LETTER_NUMBER:
    case G_UNICODE_OTHER_NUMBER:
        current_Word_type = WordNumbers;
        last_Word_letter = wc;
        attrs[i].is_Word_start = TRUE;
        break;

    default:
        /* No Word here */
        break;
    }
}

そしてそれをこれに置き換えます:

/* ---- Word breaks ---- */

/* default to not a Word start/end */
attrs[i].is_Word_start = FALSE;
attrs[i].is_Word_end = FALSE;

if (current_Word_type != WordNone)
{
    /* Check for a Word end */
    switch ((int) type)
    {
    case G_UNICODE_SPACING_MARK:
    case G_UNICODE_ENCLOSING_MARK:
    case G_UNICODE_NON_SPACING_MARK:
    case G_UNICODE_FORMAT:
        /* nothing, we just eat these up as part of the Word */
        break;

    case G_UNICODE_LOWERCASE_LETTER:
    case G_UNICODE_MODIFIER_LETTER:
    case G_UNICODE_OTHER_LETTER:
    case G_UNICODE_TITLECASE_LETTER:
    case G_UNICODE_UPPERCASE_LETTER:
        if (current_Word_type == WordLetters)
        {
            /* Japanese special cases for ending the Word */
            if (JAPANESE (last_Word_letter) ||
                    JAPANESE (wc))
            {
                if ((HIRAGANA (last_Word_letter) &&
                            !HIRAGANA (wc)) ||
                        (KATAKANA (last_Word_letter) &&
                            !(KATAKANA (wc) || HIRAGANA (wc))) ||
                        (KANJI (last_Word_letter) &&
                            !(HIRAGANA (wc) || KANJI (wc))) ||
                        (JAPANESE (last_Word_letter) &&
                            !JAPANESE (wc)) ||
                        (!JAPANESE (last_Word_letter) &&
                            JAPANESE (wc)))
                attrs[i].is_Word_end = TRUE;
            }
        }

        last_Word_letter = wc;
        break;

    case G_UNICODE_DECIMAL_NUMBER:
    case G_UNICODE_LETTER_NUMBER:
    case G_UNICODE_OTHER_NUMBER:

        last_Word_letter = wc;
        break;

    default:
        if (wc == 0x005F) break; //underscore
        /* Punctuation, control/format chars, etc. all end a Word. */
        attrs[i].is_Word_end = TRUE;
        current_Word_type = WordNone;
        break;
    }
}
else
{
    /* Check for a Word start */
    switch ((int) type)
    {
    case G_UNICODE_LOWERCASE_LETTER:
    case G_UNICODE_MODIFIER_LETTER:
    case G_UNICODE_OTHER_LETTER:
    case G_UNICODE_TITLECASE_LETTER:
    case G_UNICODE_UPPERCASE_LETTER:
        current_Word_type = WordLetters;
        last_Word_letter = wc;
        attrs[i].is_Word_start = TRUE;
        break;

    case G_UNICODE_DECIMAL_NUMBER:
    case G_UNICODE_LETTER_NUMBER:
    case G_UNICODE_OTHER_NUMBER:
        current_Word_type = WordNumbers;
        last_Word_letter = wc;
        attrs[i].is_Word_start = TRUE;
        break;

    default:
        /* No Word here */
        break;
    }
}

通常のターミナルに戻ります。

cd ~/patch-libpango/pango*;
dpkg-buildpackage -rfakeroot -uc -b;

次に、ホームフォルダに移動してpatch-libpangoフォルダを開くと、そこに.debファイルがいくつか見つかります。 debugパッケージとdocパッケージ(ファイル名に-dbgと-docが含まれているパッケージ)を除くすべてをインストールします。

これで、patch-libpangoディレクトリを削除して、通常のターミナルに戻ることができます。

cd; rm -rf patch-libpango;

完了しました。システムを再起動する必要はありません。

注:これは、アンダースコアもWordの一部として扱います(編集されたコードで0x005Fを見つけます)。

参照:

0
Brahim Raddahi