Сложность в том, что данные не являются простым файлом типа CSV, где первая строка - это имена столбцов, а остальные строки - данные столбцов по строкам.
Здесь у вас есть имя_столбца=данные_столбца, разделенные символами ;
. Моим решением было бы использование языка типа Python для чтения файла построчно. Я бы создал dict() из каждой строки и пару K:V для каждого поля. Затем я бы добавил этот dict к списку() всех строк.
Получив его, я могу обработать список. Если я нахожусь на первой строке, я выведу имена столбцов, затем значения, в остальных случаях я выведу только значения.
Я думаю, что метод будет аналогичным, какой бы язык вы ни использовали, но это определенно выполнимо.
Вот быстрый пример на Python, который использует OrderedDicts для сохранения порядка "колонок":
#!/usr/bin/python
''' a quick example of a script to parse '=' delimited fields in
';' delimited columns of a text file.
prints tab delimited columnar data with headers to STDOUT
'''
from collections import OrderedDict
with open('data', 'rb') as infile:
FLINES = infile.read().split()
DATA = []
for line in FLINES:
fields = line.split(';')
d = OrderedDict()
for field in fields:
if '=' in field:
col, value = field.split('=')
d.update({col: value})
DATA.append(d)
L = 0
for D in DATA:
if L == 0:
print '\t'.join(D.keys())
print '\t'.join(D.values())
L += 1
Вы можете использовать команду keepjumps
. Из :h :keepjumps
:
*:keepj* *:keepjumps*
:keepj[umps] {command}
Moving around in {command} does not change the |''|,
|'.| and |'^| marks, the |jumplist| or the
|changelist|.
Useful when making a change or inserting text
automatically and the user doesn't want to go to this
position.
Итак, в вашем случае вам нужно
nnoremap } :keepjumps normal! }<cr>
nnoremap { :keepjumps normal! {<cr>
Или, если вы хотите, чтобы он работал и в визуальном режиме (что вы, вероятно, делаете):
xnoremap } :<C-u>keepjumps normal! gv}<cr>
xnoremap { :<C-u>keepjumps normal! gv{<cr>