2017-09-14 85 views
1

我有一個文件,其中,下面是內容。在vim中摺疊重複的行

甲 甲 甲 甲 甲 甲 甲 甲 甲 。 。 。 A 一段代碼... A A A 。 。 甲

我想是這樣的使用VIM

  • 的代碼
  • 甲 件甲

2倍通過摺疊重複行創建摺疊。 這應該會在我打開文件時自動發生。在vimrc中可以做到嗎?

回答

1

它應該是通過使用setlocal foldmethod=expr可能在那裏你可以編寫自己的功能:

setlocal foldmethod=expr 
setlocal foldexpr=CustomFold(v:lnum) 

function! CustomFold(lnum) 
    if getline(a:lnum) == getline(a:lnum-1) || getline(a:lnum) == getline(a:lnum+1) 
    return '1' 
    endif 

    return '0' 
endfunction 

但是這是未經測試,你不會想這樣做的所有文件。但它應該指向正確的方向。它也不會100%匹配您的條件,但一旦你有一個具體的問題,你可以隨時要求再次

2

這個怎麼樣:help fold-expr

setlocal foldenable foldmethod=expr 
let &l:foldtext = 'printf("+-%s %d times: %s", v:folddashes, (v:foldend - v:foldstart + 1), getline(v:foldstart))' 
let &l:foldexpr = 'getline(v:lnum) ==# getline(v:lnum + 1) && v:lnum < line("$") ? 1 : (getline(v:lnum - 1) ==# getline(v:lnum) ? "<1" : 0)' 
+1

我認爲這將是值得一提的是什麼的'的行爲==#'是針對這種情況。所以我知道你Ingo很熟悉它,但是我爲其他用戶添加它:'==#'總是區分大小寫。如果你不希望你可以使用'==?'。使用普通的'=='就像*一些*這裏的人已經做了答案通常是一個壞主意=)。根據「ignorecase」設置,它區分大小寫或不敏感。 –

+2

@DoktorOSwaldo感謝您添加該筆記。實際上,我認爲這裏'=='是有意義的:如果用戶具有':set ic',他可能也希望摺疊比較不區分大小寫。但我從來沒有使用過這種設置,所以這是一個純粹的猜測。 –

+0

抱歉再次打擾你,但我想聽聽你的意見:在我(非常有限)的經驗中,沒有人使用'ic'設置,這就是爲什麼我認爲你應該避免使用它。這似乎是有道理的,但我認爲它是給出的文件(類型)。這取決於文件如果將小寫字母行解釋爲與大寫字母行相同的功能。所以我認爲你應該在foldexpr中明確地設置它。你對這種東西有什麼經驗? –