Настройте Vim для вставки текста для строк кода - PullRequest
0 голосов
/ 11 марта 2011

Я использую Vim для редактирования всех программ, и у меня есть стандартный заголовок, который я использую в верхней части всех моих файлов исходного кода.У меня есть файл .vimrc, настроенный для обновления определенных полей в этом заголовке (например, Last Modified), когда я сохраняю любые изменения, используя: w

Мой вопрос заключается в том, как добавить функцию для подсчета строк кода, следуя базовому правилу, что подсчитываются только непустые строки?

Я знаю, что в открытом буфере vim я могу использовать

:%s/\n//gn 

для подсчета всех строк и

:%s/\n\n//gn 

для подсчета пустых строк (обычно подсчитывают, сколько раз в строке появляются две новые строки, указывающие на пустую строку).Но как мне поместить это в мой файл .vimrc?

Вот фрагмент кода из моего .vimrc, который обновляет поля заголовка:

function! LastModified()
  if &modified
    let save_cursor = getpos(".")
    let n = min([20, line("$")])
    keepjumps exe '1,' . n . 's#^\(.\{,10}Last Modified:\).*#\1' .
          \ strftime(' %a %b %d, %Y  %I:%M%p') . '#e'
    keepjumps exe '1,' . n . 's#^\(.\{,10}Filename:\).*#\1' .
          \ ' ' . @% . '#e'
    keepjumps exe '1,' . n . 's#^\(.\{,10}LOC:\).*#\1' .
          \ ' ' . '' . '#e'
    call histdel('search', -1)
    call setpos('.', save_cursor)
  endif
endfun

Кроме того, я просто хотел бы добавить,Я знаю, что существует множество других способов сделать это (например, использовать wc -lines из оболочки), но мне интересно узнать, как по-настоящему настроить мой редактор (поэтому назовите это обучающим упражнением).

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Вы на самом деле не должны использовать :s здесь:

function! CountNonEmpty()
    return len(filter(getline(1, line('$')), '!empty(v:val)'))
endfunction

Кстати, я бы использовал getline + map + setline для реализации вашего средства обновления заголовка:

function! LastModified()
    if &modified
        " If number of buffer lines is < 20, then getline(1, 20)"
        " will return only existing lines without any errors "
        call setline(1, map(getline(1, 20), 'substitute(substitute(substitute(v:val, '.
        \'"^\\v(.{,10}Last Modified:).*", "\\1 ".strftime("%s %b %d, %Y  %I:%M%p"), ""),'.
        \'"^\\v(.{,10}Filename:).*",      "\\1 ".escape(@%, "&\\~"), ""),'.
        \'"^\\v(.{,10}LOC:).*",           "\\1 ", "")'))
    endif
endfunction
1 голос
/ 11 марта 2011

Это может помочь:

function! CountNonEmpty()
  redir => g:nonblank
  silent %s/^.\+$/&/n
  redir END
  return substitute(g:nonblank, '\n\s*\(\d\+\)\D.*$', '\1', '')
endfunction
  • : redir => Сохраняет выходные данные следующих ex-команд в заданной переменной. Смотри :help :redir
...