gpt4 book ai didi

c - vim 自定义 c 语法折叠

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:28 25 4
gpt4 key购买 nike

Vim 支持基于语法的 C 代码折叠,效果很好。然而,函数名称不是折叠的一部分,只是 { 和 } 之间的部分。

给出这个示例代码:

static inline bool uFuzzyCompare(double p1, double p2)
{
return (uAbs(p1 - p2) <= 0.000000000001 * uMin(uAbs(p1), uAbs(p2)));
}

static inline bool uFuzzyComparef(float p1, float p2)
{
return (uAbsf(p1 - p2) <= 0.00001f * uMinf(uAbsf(p1), uAbsf(p2)));
}

static inline bool uFuzzyIsNull(double d)
{
return uAbs(d) <= 0.000000000001;
}

static inline bool uFuzzyIsNullf(float f)
{
return uAbs(f) <= 0.00001f;
}

折叠起来是这样的:

static inline bool uFuzzyCompare(double p1, double p2)
+-- 3 lines: {----------------------------------------------------------------------------------------------------------------------------------------------------------------

static inline bool uFuzzyComparef(float p1, float p2)
+-- 3 lines: {----------------------------------------------------------------------------------------------------------------------------------------------------------------

static inline bool uFuzzyIsNull(double d)
+-- 3 lines: {----------------------------------------------------------------------------------------------------------------------------------------------------------------

static inline bool uFuzzyIsNullf(float f)
+-- 3 lines: {----------------------------------------------------------------------------------------------------------------------------------------------------------------

我更喜欢这个:

+-- uFuzzyCompare(...) (5 lines)
+-- uFuzzyComparef(...) (5 lines)
+-- uFuzzyIsNull(...) (5 lines)
+-- uFuzzyIsNullf(...) (5 lines)

这意味着将函数声明和空行一起包含到折叠中,并将函数名称显示为折叠文本。

这有可能吗?也许使用 foldmethod 表达式,但我不知道在不编写完整的 C 解析器的情况下创建此表达式的好方法。所以使用语法解析器是最好的,但我找不到任何配置选项。

问候,格哈德

最佳答案

这将助您一臂之力。它目前只折叠顶级功能。把这个放在 ~/.vim/ftplugin/c.vim

function! CFold()
if getline(v:lnum - 1)[0] ==# '}'
return '<1'
elseif getline(v:lnum + 1)[0] ==# '{'
return '>1'
endif
return '='
endfunction

function! CFoldText()
let line = getline(v:foldstart)
let sub = substitute(line, '.*\<\(\w\+\)(.*).*', '\1(...)', 'g')
return '+-- ' . sub . ' (' . (v:foldend - v:foldstart + 1) . ' lines)'
endfunction

setlocal foldmethod=expr
setlocal foldexpr=CFold()
setlocal foldtext=CFoldText()
setlocal fillchars-=fold:-

示例文本的输出

+-- uFuzzyCompare(...) (5 lines)
+-- uFuzzyComparef(...) (5 lines)
+-- uFuzzyIsNull(...) (5 lines)
+-- uFuzzyIsNullf(...) (5 lines)

这是如何运作的。当您将 foldmethod 设置为 expr 时,vim 使用 foldexpr 中的表达式来确定它应该如何折叠。我所做的只是检查当前行之后的行是否包含 {在第一列中,如果是,我们将折叠级别设置为 >1这表示开始折叠 1 级。它在 } 行结束. <1说结束 level 1 的折叠。

要设置折叠文本,我们只需提取函数并将参数替换为 ... (对于参数为多行的行,这可能会中断)。然后我们返回一个格式良好的字符串。 v:foldstartv:foldend是变量集,表示折叠在哪一行开始和结束。

删除 fold:- from fillchars 删除折叠文本后的破折号。

相关帮助页面 :h 'foldmethod' , :h foldexpr , :h foldtext , 和 :h 'fillchars'

关于c - vim 自定义 c 语法折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com