[英]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)
在這種情況下, expr
是getline(l)
,其中l
是被迭代的行的編號。 getline()
返回行的內容,因此這就是要解析的內容。 模式是正則表達式\\s
,它匹配任何單個空白字符。 它被替換為''
,即空字符串。 標志g
使得它重復替換,因為在線上找到了空格。
替換完成后, len()
給出非空白字符的數量,並將其添加到char_count
的當前值+=
。
我從您的示例中更改了一些內容:
:help user-functions
) count
重命名為char_count
因為你不能擁有一個與函數同名的變量而count()
是一個內置函數 line
:我將其重命名為l
l
初始化為1 <=
而不是<
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.