4

Я ищу способ определения или просмотра и изменения того, какие символы считаются границами слов в GNOME, аналогично символам «выбор по слову», используемым в терминале GNOME (связанный вопрос) или ножам в rxvt.

Например, когда я использую gedit, я могу набрать abc123xyz и дважды щелкнуть, но будут выбраны только три символа, так как числа по умолчанию считаются границами. Я вижу такое же поведение в Tomboy и, по крайней мере, в нескольких других приложениях GNOME/GTK+, которые я тестировал. Это также присутствует - и особенно раздражает - в строке адреса (но не на внутренних страницах) Google Chrome. Firefox кажется нормальным, я полагаю, поскольку его пользовательский интерфейс написан на XUL, который делает свое дело.

Обратите внимание, что я ищу общее решение, если оно существует - я уже знаю, что есть плагины для gedit, в частности, и, возможно, другие настройки для каждого приложения, но я хочу знать, можно ли это сделать таким образом, чтобы затрагивает большинство или все программы, которые наследуют это поведение от оконного менеджера (я полагаю?).

2 ответа2

1

Видимо, это было исправлено в версии 1.34.1. Проверьте журнал git и фиксации между тегами 1.34.0 и 1.34.1. Ubuntu 13.04 имеет версию 1.32.5 libpango1.0-0, такую же, как sid. Так что пока нет радости для дистрибутивов на основе Debian. Если вам нужна библиотека, вы можете скомпилировать ее из источников.

Это проблема с PangoLogAttr() , из-за которой никто не сообщил об ошибке, жалующейся на нее. Выпуск восходит к 2003 году до настоящего времени. Appart почты, которые вы поставляете там:

Если моя интерпретация руководящих принципов верна, то ожидается, что слово, содержащее цифры, ограничено теми же числами, что и пробелы и символы, за исключением символа ' .

Чтобы сообщить об ошибках в панго, просто перейдите по этой ссылке https://bugzilla.gnome.org/enter_bug.cgi?product=pango

0

Для 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;

Готово, вам не нужно перезагружать вашу систему.

Примечание: это также будет обрабатывать подчеркивание как часть слова (найдите 0x005F в отредактированном коде).

Рекомендации:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .