簡體   English   中英

簡單的Vim編程(vimrc文件)

[英]Simple Vim Programming (vimrc file)

我正在嘗試學習如何使用自己的函數配置我的.vimrc文件。

我想編寫一個遍歷文件中每一行的函數並計算字符總數,但忽略所有空格。 這是一個編程練習,也是更復雜程序的踏腳石(我知道還有其他方法可以使用Vim或外部程序獲得這個示例值)。

這是我到目前為止所擁有的:

function countchars()
    let line = 0
    let count = 0
    while line < line("$")
        " update count here, don't count whitespace
        let line = getline(".")
    return count
endfun

我可以用哪個功能代碼替換該注釋行?

如果我正確理解了這個問題,那么你需要計算一行中非空白字符的數量。 一個相當簡單的方法是刪除空格並查看結果行的長度。 因此,這樣的事情:

function! Countchars()
    let l = 1
    let char_count = 0
    while l <= line("$")
        let char_count += len(substitute(getline(l), '\s', '', 'g'))
        let l += 1
    endwhile
    return char_count
endfunction

問題答案的關鍵部分是使用替代品。 命令是:

substitute(expr,pattern,repl,flags)

在這種情況下, exprgetline(l) ,其中l是被迭代的行的編號。 getline()返回行的內容,因此這就是要解析的內容。 模式是正則表達式\\s ,它匹配任何單個空白字符。 它被替換為'' ,即空字符串。 標志g使得它重復替換,因為在線上找到了空格。

替換完成后, len()給出非空白字符的數量,並將其添加到char_count的當前值+=


我從您的示例中更改了一些內容:

  • 函數名稱以大寫字母開頭(這是用戶定義函數的要求:請參閱:help user-functions
  • 我已將count重命名為char_count因為你不能擁有一個與函數同名的變量而count()是一個內置函數
  • 同樣對於line :我將其重命名為l
  • 文件中的第一行是第1行,而不是第0行,所以我將l初始化為1
  • while循環計數但不包括最后一行,我假設您想要文件中的所有行(這可能與從1開始的行編號有關):我將您的代碼更改為使用<=而不是<
  • 塊不是基於vim中的縮進,因此while需要endwhile
  • 在你的函數中,你let line = getline('.')
  • 我加了一個! function定義上,因為它使增量開發更容易(每次重新獲取文件時,它將使用新版本覆蓋函數,而不是吐出有關它的錯誤消息)。
  • 通過文件遞增工作略有不同......

在你的函數中,你let line = getline('.') 忽略變量名稱,此實現仍存在一些問題。 我認為你的意思let l = line('.') ,它給出了當前行的行號。 getline('.')給出當前行的內容,因此while行的比較將比較當前行的內容與最后一行的數量,這將失敗。 另一個問題是你實際上並沒有在文件中移動,因此當你調用函數時,當前行將是你所在的行,並且永遠不會改變,從而導致無限循環。 我已用一個簡單的+= 1代替它來逐步執行該文件。

有一些方法可以使當前行成為一種有用的方法,例如,如果你正在編寫一個帶有一系列行的函數,但我認為我已經寫了足夠的內容了,上面的內容將有希望得到你現在去 stackoverflow上有很多人可以幫助解決任何問題!

看一下:

:help usr_41.txt
:help function-list
:help user-functions
:help substitute()

以及:help后跟我在函數中使用的各種東西( getline()line()let+= etc)。

希望這很有幫助。

此方法使用列表:

function! Countchars()
  let n = 0
  for line in getline(1,line('$'))
    let n += len(split(line,'\zs\s*'))
  endfor
  return n
endfunction

我想你已經找到了解決方案。

僅供參考:我使用它來計算Vim中沒有空格的字符: %s/\\S/&/gn

暫無
暫無

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

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