2013-09-21 2 views
1

Почему я не могу сортировать нижнюю таблицу в ее третьем столбце?Vim сортировка по виртуальной колонке

Колонка 1 сорта хорошо с :sort /.*\%1v/:

Audi  ***  ****  ** 
BMW  ***** ***  ***** 
Mercedes **** *****  *** 
Opel  ***  ***  * 

Колонка 2 также сортирует в порядке с :sort /.*\%2v/:

BMW  ***** ***  ***** 
Mercedes **** *****  *** 
Opel  ***  ***  * 
Audi  ***  ****  ** 

Но колонка 3 не сортирует с :sort /.*\%3v/:

BMW  ***** ***  ***** 
Audi  ***  ****  ** 
Opel  ***  ***  * 
Mercedes **** *****  *** 

Что я делаю не так?

ответ

3

Вас обманывает неправильное представление: атом \%v указывает символ столбцов (но не использует их как совпадение); Я думаю, что вы хотите сортировать на основе текста, разделенного пробелами, который называется «столбцы» в газете или таблице.

I.e. ваш первый пример сортирует символы B, A, O и M; второй на M, u, p, e, не на * (в зависимости от вашего языка, прописные буквы сортируются до нижнего регистра).

Если у вас есть :set ruler, вы видите текущую колонку в правом нижнем углу. В вашем примере, третий столбец текста начинается в положении 20, так что вам придется использовать

:%sort /.*\%20v/ 

сортировать по колонке третьего текста.

Для Vim, виртуальная колонка означает столбцы экрана, измеренные тем, что занимает один (одна ширина) символ. Также есть столбец, что означает (несколько неинтуитивно) байтовые подсчеты представления персонажа. Это различие имеет значение для не-ASCII, непечатаемого и символа <Tab>.

+1

Хм, хорошо. Я постараюсь улучшить скорость набора текста в следующий раз ;-) – romainl

+0

Спасибо, Инго. Вы прибили его. Но вот мой следующий вопрос: возможно ли в Виме сделать вид, который я буду после, т. Е. «Газетной колонкой»? Что, если я выберу блок звездочки с помощью Ctrl-G и сделаю '<,'> sort'? Будет ли это работать? –

+0

Это не так просто.Вы можете вставить текущий столбец в команду с помощью команды « = virtcol ('.') '. Посмотрите плагин [csv.vim] (http://www.vim.org/scripts/script.php?script_id=2830); он имеет команду ': Sort'. –

2

Что вы делаете неправильно рассматривает

** 
***** 
*** 
* 

как "виртуальный столбец".

«Виртуальная колонка» представляет собой столбцы с одной ячейкой.

В своем первом фрагменте, эти столбцы соответствуют:

\%1v \%2v \%3v 

A  u  d 
B  M  W 
M  e  r 
O  p  e 

Так что ваши линии не упорядоченный по количеству звездочек, но в алфавитном порядке.

Я пробовал следующие команды для заказа по номерам звездочек, но они не кажутся надежными.

:%sort /.*\%12c.*\%16c/ 
:%sort /.*\%20c.*\%24c/ 
:%sort /.*\%30c.*\%34c/ 
+2

Мне нравится ваше «визуальное» объяснение! Причина, по которой ваша попытка сортировки не срабатывала, заключается в том, что вы, похоже, не заметили, что '/ {pattern} /' (unintuitively) покрывает ту часть, которая является _skipped_. –

+0

@IngoKarkat: Да, полностью пропустил эту часть. Спасибо! – romainl

Смежные вопросы