Складання за схемою пошуку за допомогою регулярного вибору


13

У мене вийшов звичайний текстовий файл із стовпцями значень, розділених пробілом. Подобається це:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

Я також отримав цей регулярний вираз, який буде відповідати будь-якому сусідньому рядку з однаковим значенням у першому стовпці (припустимо, файл відсортовано за першим стовпцем), крім останнього:

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(або щоб зробити його менш "волохатим"):

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

Чи можна скласти лінії по лінії, яка не була відповідна? Маючи такий результат:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

Відповіді:


14

Зробіть set foldmethod=exprі використовуйте 'foldexpr'для встановлення виразу скрипту vim, який визначатиме початкові точки складання.

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

Це виглядає складніше, ніж це є, тому що ми не можемо легко використовувати пробіли в :set, але з пробілами та новим рядком або 2, це виглядає так:

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

Огляд

В основному це порівнює перше слово кожного рядка з попереднім рядком. Якщо слова різні , то лінія почати складки, >1. В іншому випадку вона зберігає той же рівень фолд, =.

Слава деталей

  • set foldmethod=expr сказати Vim використовувати вираз скрипту vim для визначення складок
  • 'foldexpr' опція містить вираз сценарію vim
  • Оцінка умови за допомогою потрійного верстата, який повертається, >1коли слід починати складку і =коли рівень складки повинен тривати
  • v:lnum- це поточний рядок, який 'foldexpr'працює для оновлення складок
  • Отримайте вміст поточного рядка ( v:lnum) та попереднього рядка ( v:lnum - 1) черезgetline()
  • Розділіть кожен рядок на слова через split()
  • Використовуйте get()для отримання першого індексу свіжорозділених слів
  • Використовуйте значення за замовчуванням ''у випадку порожнього рядка. напрget(words, 0, '')
  • Порівняйте перше слово поточного рядка з першим словом попереднього рядка в умові частини потрійного

Примітка. Цей метод може мати певні проблеми з продуктивністю дуже великих документів

Докладнішу інформацію див.

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.