Всенаправленное завершение Vim: продолжайте вводить, чтобы выбрать желаемый элемент

Рассмотрим сценарий, когда я набрал:

file.f

Когда я набираю Ctrl-X Ctrl-O отображается всплывающее окно полного завершения и выбирается первый элемент. Вот что я вижу:

file.fileno
       ---------
       fileno()  <-- highlighted
       flush()
       ---------

Обратите внимание, что набранный мной текст ("file.

Я создал функцию для установки или очистки определенного количества бит в DWORD. Моя функция работает. Мне не нужна помощь, чтобы это работало. Однако мне интересно, является ли выбранный мной метод наиболее быстрым из возможных.

Мне довольно сложно объяснить, как это работает. Есть два массива, содержащие DWORD, которые заполнены битами слева и справа от DWORD (со всеми двоичными единицами). Он создает маску со всеми заполненными битами, кроме тех, которые я хочу установить или очистить, а затем устанавливает их с помощью побитовых операторов на основе этой маски. Это кажется довольно сложным для такой простой задачи, но кажется, что это самый быстрый способ, который я мог придумать. Это намного быстрее, чем настраивать их по крупицам.

static DWORD __dwFilledBitsRight[] = {
        0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF,    0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
    };

static DWORD __dwFilledBitsLeft[] = {
        0x0, 0x80000000, 0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000, 0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000,    0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0, 
        0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE, 0xFFFFFFFF
    };

    // nStartBitFromLeft must be between 1 and 32... 
    // 1 is the bit farthest to the left (actual bit 31)
    // 32 is the bit farthest to the right (actual bit 0)
    inline void __FillDWORDBits(DWORD *p, int nStartBitFromLeft, int nBits, BOOL bSet)
    {
        DWORD dwLeftMask = __dwFilledBitsLeft[nStartBitFromLeft - 1]; // Mask for data on the left of the bits we want
        DWORD dwRightMask = __dwFilledBitsRight[33 - (nStartBitFromLeft + nBits)]; // Mask for data on the right of the bits we want
        DWORD dwBitMask = ~(dwLeftMask | dwRightMask); // Mask for the bits we want
        DWORD dwOriginal = *p;
        if(bSet) *p = (dwOriginal & dwLeftMask) | (dwOriginal & dwRightMask) | (0xFFFFFFFF & dwBitMask);
        else *p = (dwOriginal & dwLeftMask) | (dwOriginal & dwRightMask) | 0;

    }
6
задан oldSkool 25 January 2011 в 23:58
поделиться