2012-04-09 101 views
3

在我的.vimrc我有自定义代码折叠线使用vim代码折叠标记生成指数(内容)

:set foldmethod=marker 
:set foldmarker=SECTION:,ENDSECTION: 

。在我的文件中,尊重语言中的注释字符先于代码折叠标记,后面跟着相应部分的标题。例如。

# SECTION: First Section 
some code 
# SECTIION: Subsection 
some more code 
# ENDSECTION: 
# ENDSECTION: 

# SECTION: Second Section 
some other code 
# ENDSECTION: 

这种结构有所有什么需要产生像

First Section 
    Subsection 
Second Section 

该文件的内容(理想情况下该指数具有类似于VIM帮助系统标志,所以我可以跳到轻松相应部分;我不知道如何做到这一点)。 我能想到一个简单的perl脚本来生成这个文本,但我会根据一个vim脚本来提供一个解决方案,该脚本在新窗口中显示索引。也许有一个解决方案已经这样做?

回答

2

将其放入您的vimrc并运行:MkIdx<leader>z。您也可以将范围传递给命令,但默认情况下是整个缓冲区。

function! MkIdx() range 
     let items = filter(getline(a:firstline, a:lastline), 'v:val =~ ''\C^\s*#\s\+SECTION''') 
     new 
     call setline(1, map(items, 'substitute(v:val, ''^\(\s*\)[^:]\+:\(.\+\)'', ''\1\2'', '''')')) 
     " Mapping to jump to section: 
     nnore <silent><buffer><leader>x :<C-U>call Go2Section()<CR> 
endfunction 

function! Go2Section() 
     let section = matchstr(getline('.'), '^\s*\zs.*') 
     quit 
     call search('\C# SECTION:\s\+'.section, 'cw') 
endfunction 

command! -bar -range=% MkIdx <line1>,<line2>call MkIdx() 
" Mapping to build the index: 
nnore <silent><leader>z :<C-U>MkIdx<CR> 

编辑:把索引放在一个新的缓冲区。

编辑2:不要留空行。

编辑3:允许跳回到<leader>x的部分。

+0

看起来不错,似乎工作。任何想法如何实现缩进或跳转标记? – highsciguy 2012-04-10 20:59:46

+0

您想如何使用缩进工作?因为它应该保留来源的缩进。你如何期望使用跳标?新的索引缓冲区是否持久?你需要它在多个缓冲区上工作吗? – Raimondi 2012-04-11 13:54:53

+0

是的,我看到在上面的例子中的缩进将被保留,但我会优先使用嵌套SECTION ENDSECTION结构建议的缩进...但我看到这更复杂。如果我将光标放在索引缓冲区中的某个单词上并按下快捷键,则跳转标记会将我带到主缓冲区中的相应部分。现实吗? – highsciguy 2012-04-11 16:52:31