VIM - самый быстрый способ дергать неудобный текстовый блок - PullRequest
3 голосов
/ 07 февраля 2011

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

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

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

Ответы [ 5 ]

8 голосов
/ 07 февраля 2011

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

:%!awk '{ print $3 }'

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

3 голосов
/ 07 февраля 2011

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

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

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

1 голос
/ 07 февраля 2011

Вы можете использовать плагин под названием 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 голосов
/ 13 февраля 2011

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

  1. qeq (очистить регистр "e")
  2. qa03w"Eywjq (чтобы зарегистрировать макрос, тянущий имя)
  3. 200000@a (повторять макрос много раз)

И тогда ваши имена будут в регистре "е". Введите "ep, чтобы просмотреть их!

Примечания:

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

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

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