Как получить визуально выделенный текст в VimScript

Вы не можете использовать "шаблонное определение типа", но можно использовать класс/структуру удобства с внутренним типом:

template<typename T>
struct TypeHelper{
    typedef std::vector<T,gc_allocator<T> > Vector;
};

и затем используют в Вашем коде

TypeHelper<MyType>::Vector v;
TypeHelper<MyType>::Vector::iterator it;

И что-то подобное для карты:

template<typename K,typename V>
struct MapHelper{
    typedef std::map<K, V, gc_allocator<K,V> > Map;
};

РЕДАКТИРОВАНИЕ - @Vijay: Я не знаю, существует ли другое возможное обходное решение, это - то, как я сделал бы это; макрос мог бы дать Вам более компактную нотацию, но лично я не хотел бы его:

#define GCVECTOR(T) std::vector<T,gc_allocator<T> >

РЕДАКТИРОВАНИЕ - @chmike: Обратите внимание на то, что TypeHelper решение не делает , требуют, чтобы Вы переопределили конструкторов!

45
задан guillermooo 7 October 2009 в 19:57
поделиться

2 ответа

Я не совсем уверен насчет контекста, потому что getpos () действительно может принимать метки (например, '< и ' > ) в качестве аргументов.

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

Изменить: я нашел их в : help line () ; несколько функций, включая line () и getpos () , имеют одинаковый набор возможных аргументов.

Edit: Я думаю, вы ' Возможно, он просто спрашивает, как поместить текст между двумя произвольными метками, а не построчно ... (т.е. это не относится конкретно к визуальному режиму). Я не думаю, что на самом деле есть способ. Да, это кажется довольно вопиющим упущением. Вы должны иметь возможность подделать это, найдя метки с помощью getpos () , получив все строки с помощью getline () , а затем отрубив первую и последнюю в соответствии с положением столбца (с делом в зависимости от того, многострочный он или нет). Извините, это не настоящий ответ, но вы, по крайней мере, можете обернуть его функцией и забыть об этом.

Вы должны иметь возможность подделать это, найдя метки с помощью getpos () , получив все строки с помощью getline () , а затем отрубив первую и последнюю в соответствии с положением столбца (с делом в зависимости от того, многострочный он или нет). Извините, это не настоящий ответ, но вы, по крайней мере, можете обернуть его функцией и забыть об этом.

Вы должны иметь возможность подделать его, найдя метки с помощью getpos () , получив все строки с помощью getline () , а затем отрубив первую и последнюю в соответствии с положением столбца (с делом в зависимости от того, многострочный он или нет). Извините, это не настоящий ответ, но вы, по крайней мере, можете обернуть его функцией и забыть об этом.

7
ответ дан 26 November 2019 в 20:56
поделиться

Лучший способ, который я нашел, - это вставить выделение в регистр:

function! lh#visual#selection()
  try
    let a_save = @a
    normal! gv"ay
    return @a
  finally
    let @a = a_save
  endtry
endfunction
16
ответ дан 26 November 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: