VIM: номера нулевой индексированной строки в: заданный номер

Используя VIM, легко отобразить номера строк для любого заданного файла с помощью:

:set number

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

Как изменить нумерацию строк vim для компенсации, чтобы просмотр номеров в буфере vim соответствовал ошибкам, предоставляемым инструментом, и, кроме того, переход к определенному числу соответствует значению инструмента.

То есть, если инструмент сообщает мне, что в строке 98 есть ошибка, я хочу перейти к этой строке, набрав "98G", а не "97G", и я хочу эту строку (которая действительно является линией 97 в vim), чтобы отобразить "98" в списке номеров линий.

Изменить:

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

Ответ 1

Я не думаю, что это возможно; однако если предположить, что выход вашего внешнего инструмента - это просто текст, вероятно, довольно легко будет отфильтровать вывод таким образом, чтобы нумерация была проиндексирована на 1, чтобы соответствовать Vim. Можете ли вы привести пример вашего вывода?

Изменить

В качестве альтернативы, если вы вызываете внешнюю команду из Vim, вы можете сделать что-то вроде (в основном, добавить пустую строку, запустить внешнюю команду, а затем удалить пустую строку):

command! RunMyExternalProgramme call RunMyExternalProgramme()

func! RunMyExternalProgramme()
    " Save the old setting of makeprg
    let s:savedMakePrg = &makeprg

    " Save the screen layout
    let s:savedView = winsaveview()

    if config_file != ''
        " Put a blank line at the start of the file
        :1put! =''
        " Save
        write
        " Change makeprg and run it
        let &makeprg = '/path/to/programme -options etc'
        make
        " Delete the blank line
        1d
        " Save
        write
    endif

    " Restore the screen layout (optional)
    call winrestview(s:savedView)

    " Restore the old setting of 'makeprg'
    let &makeprg = s:savedMakePrg
endfunc

Ответ 2

Я предлагаю обернуть ваш инструмент небольшим script. В script скопируйте исходный код и добавьте пустую строку вверху источника или, используя awk, чтобы исправить выход (проанализируйте сообщения об ошибках и добавьте 1).

Единственный способ сделать число строк vim, начиная с 0, - исправить исходный код и создать новую опцию (скажем lno для смещения номера строки) и добавить это значение к номеру строки. Вам нужно будет исправить это в нескольких местах (отображение, команды goto, шаблоны поиска и т.д.). Не нужно больше одного-двух лет, чтобы заставить его работать:) Удачи в том, чтобы заставить автора Vim принять это как патч.