Vim: Columnvise Инкремент внутри и снаружи? - PullRequest
1 голос
/ 24 марта 2012

Снаружи мне нужны решения, которые не используют взлом сценариев Vim, но пытаются повторно использовать некоторые базовые * ix инструменты. Сотрудники Inside Vim запрашивают решения, позволяющие получить приращение столбца с такими компонентами, как скрипты.

1           1 
1           2 
1           3 
1   --->    4
1           5
1           6
.           .
.           .

В Vim есть скрипт, который увеличивает столбцы, VisIncr . Он собрал около 50/50 взлетов и падений, возможно, немного попробовав заново. Как вы увеличиваете столбцы в Vim, не используя такой скрипт? Тогда другой вопрос: как вы увеличиваете столбцы без / вне Vim?

Самый элегантный, многоразовый и желательно маленький выигрывает гонку!

Ответы [ 3 ]

3 голосов
/ 24 марта 2012

Оптимальный выбор техники сильно зависит от реальных обстоятельств трансформации. Есть как минимум две вариации реализация:

  1. Являются ли строки для работы единственными в файле? Если не, диапазон строк, определенный контекстом (то есть разделенный пробелом) строки, как абзац) или это произвольно и должно быть указано Пользователь

  2. Являются ли эти строки уже содержат числа, которые должны быть изменены или Нужно ли вставлять новые, оставляя текст в строках в такте?

Поскольку информации для ответа на эти вопросы нет, ниже мы попытаемся построить гибкое решение.

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

:'<,'>s/^\d\+/\=line(".")-line("''")+1/

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

:%s/^\d\+/\=line('.')/

В любом случае, если номер должен быть просто вставлен в начале линии (без изменения уже существующих), можно изменить шаблон от ^\d\+ до ^ и, при необходимости, добавление разделителя:

:'<,'>s/^\d\+/\=(line(".")-line("''")+1).' '/

или

:%s/^/\=line('.').' '/

соответственно.

Для решения, основанного на инструментах командной строки, можно рассмотреть использование потока редакторы, такие как Sed или инструменты для извлечения текста и отчетности, такие как AWK .

Для нумерации каждой строки в файле с помощью Sed выполните команды

$ sed = filename | sed 'N;s/\n/ /'

Чтобы сделать то же самое в AWK, используйте команду

$ awk '{print NR " " $0}' filename

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

$ awk '{print (2<=NR && NR<=8 ? ++n " " : "") $0}' filename

Интересует, как команды похожи на команды из скрипта, связанного в постановка вопроса реализована, можно использовать следующую команду как ссылка.

vnoremap <leader>i :call EnumVisualBlock()<cr>
function! EnumVisualBlock() range
    if visualmode() != "\<c-v>"
        return
    endif
    let [l, r] = [virtcol("'<"), virtcol("'>")]
    let [l, r] = [min([l, r]), max([l, r])]
    let start = matchstr(getline("'<"), '^\d\+', col("'<")-1)
    let off = start - line("'<")
    let w = max(map([start, line("'>") + off], 'len("".v:val)'))
    exe "'<,'>" 's/\%'.l.'v.*\%<'.(r+1).'v./'.
    \   '\=printf("%'.w.'d",line(".")+off).repeat(" ",r-l+1-w)'
endfunction
3 голосов
/ 24 марта 2012

Я не вижу необходимости в скрипте, простой макрос может сделать

 "a   yyp^Ayy

, затем воспроизведите его или карту, чтобы воспроизвести его.

Конечно, всегда есть вероятность, что я неправильно понял вопрос ...

1 голос
/ 24 марта 2012

Если вы хотите изменить 1 1 1 1 ... на 1 2 3 4 ....(Эти цифры должны быть в разных строках.)

:let i=1 | g/1/s//\=i/g | let i+=1

Если некоторые из 1 1 1 1 ... находятся в одной строке:

:let g:i = 0

:func! Inc()
:    let g:i+=1
:    return g:i
:endfun

:%s/1/\=Inc()/g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...