2011-02-07 3 views
3

Я использую VIM 7.1.314 и хотел бы подержать имена (chris, robert, ben) в коде, показанном ниже, как можно быстрее - как бы я это сделал? Обратите внимание, что имена всегда выровнены (независимо от числа пользователей).VIM - Самый быстрый способ вытащить неудобный текстовый блок

user 1: chris (05/04/1984) 
user 2: robert (11/12/1991) 
user 3: ben (5/25/1993) 

Также обратите внимание, что я ищу решение, в котором есть сотни имен, поэтому важна масштабируемость.

+3

Что вы хотите делать с именами? Что-то вроде 'cut' или' sed' может работать лучше, в зависимости от того, что вы хотите сделать. –

+0

вставьте их в другой редактор vim как ключи для хэша :) - также имена всегда буквенно-цифровые без пробелов. –

+0

Знаете ли вы длину самого длинного имени (или, по крайней мере, ограничение на него)? –

ответ

8

Простой способ сделать это - выложить внешнюю программу, чтобы помочь. Например:

:%!awk '{ print $3 }' 

Это заменит весь буфер редактирования с результатами работы, что awk команда на содержимое текущего буфера. Затем вы можете скопировать результат в другой файл или что угодно, и u легко возвращает исходный буфер обратно в прежнее состояние.

+0

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

+0

Обновление: я глуп, это очень хорошо, thx –

3

Учитывая, что ваши имена не будут длиннее 16 символов, используйте поиск и замену регулярных выражений, чтобы добавить 16 пробелов после каждого имени, а затем используйте режим визуализации блоков для копирования. Во-первых, делать (в командной строке):

:%s/: [^ ]*/&    /

Эта пустая площадь составляет 16 мест. Затем перейдите к началу первого имени и нажмите Control-V, затем перейдите 15 символов вправо и в последнюю строку списка имен и нажмите Y, чтобы скопировать, затем в буфер назначения и нажмите P.

+0

Спасибо, Это сработало отлично - я действительно надеялся, что Я мог бы сделать что-то вроде блок-визуализации, выбрать первую букву каждого имени, а затем сделать все, чтобы скопировать все слова :) –

1

Вы можете использовать плагин под названием Tabularize, который вы можете получить от https://github.com/godlygeek/tabular. В случае, если перечисленные вы могли бы сделать

:Tabularize /(.* 

и это изменит ваш текстовый файл, чтобы выглядеть следующим образом:

user 1: chris (05/04/1984) 
user 2: robert (11/12/1991) 
user 3: ben (5/25/1993) 

Тогда вы можете просто использовать визуальный блок, чтобы потянуть текст. Это отличный плагин, который экономит невероятное количество времени.

0

Вот чистый VIML решение, которое оставляет исходный буфер неизменным:

:let names= [] 
:g/^user \d/let names+= matchstr(getline('.'), 'user \d\+:\s*\zs\S\+') 
:new 
:put=names 
0

Я хотел бы использовать макросы.

  1. qeq (очистить "е" регистр)
  2. qa03w"Eywjq (зарегистрировать макрос дергает имя)
  3. [email protected] (повторить макросу много времени)

А потом ваши имена находятся в регистре «e». Тип «ер, чтобы просмотреть их

Примечания:

  • возможно yw не является правильным, может быть, уг (или что-то, в зависимости от имен
  • :set lazyredraw может помочь с макро-производительность.!