簡體   English   中英

配置Vim為代碼行插入文本

[英]Configure Vim to insert text for Lines of Code

我正在使用Vim進行所有程序編輯,並且在所有源代碼文件的頂部都使用了標准標頭。 當我使用:w保存任何更改時,我設置了一個.vimrc文件來更新此標頭中的某些字段(例如Last Modified)。

我的問題是,如何遵循僅計數非空白行的基本規則,如何放入一個函數來計算代碼行?

我知道在打開的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),但是我有興趣學習如何真正配置編輯器(因此稱之為學習練習) )。

您實際上不應該在這里使用: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

這可能會有所幫助:

function! CountNonEmpty()
  redir => g:nonblank
  silent %s/^.\+$/&/n
  redir END
  return substitute(g:nonblank, '\n\s*\(\d\+\)\D.*$', '\1', '')
endfunction
  • :redir =>將以下ex命令的輸出存儲到給定變量中。 參見:help :redir

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM