当前位置: 首页 > 知识库问答 >
问题:

vim - Vim 编辑器自定义语法折叠规则遇到问题,如何设置 'if endif' 折叠?

小牛23139
2024-08-23

求助:vim 自定义语法折叠
vim的折叠方式有好几种,但想自己写个语法折叠。

看帮助文档里面,只有简单的介绍一个例子:
"fold" 参数使得本项目的折叠级别加 1。示例: >
:syn region myFold start="{" end="}" transparent fold
:syn sync fromstart
:set foldmethod=syntax
这使得每个 {} 块形成一个折叠。
然而,将{}替换成其他的,例如 if endif ,均不成功,只有花括号才成功。
请教一下有哪位知道要怎么设置?例如设置成 "if" "endif" 之类的

共有1个答案

苏鹏鹍
2024-08-23

在 Vim 中设置基于 ifendif 的语法折叠,你需要使用 Vim 的语法高亮(syntax highlighting)和折叠(folding)功能。由于 Vim 的语法文件(通常是 .vim 文件)定义了如何高亮和折叠代码,你需要编写或修改一个语法文件来识别 ifendif 之间的区域作为折叠区域。

以下是一个简化的步骤和示例,说明如何为 Vim 创建一个基本的语法折叠规则,用于识别 ifendif 的代码块:

  1. 创建或修改语法文件
    首先,你需要一个语法文件(.vim 文件),这个文件定义了如何识别你的代码结构。假设你的文件名为 mylang.vim,并放在 Vim 的 syntax 文件夹中(或者在你的 ~/.vim/syntax 文件夹中,如果你使用的是个人 Vim 配置)。
  2. 定义折叠区域
    在语法文件中,你可以使用 syn region 命令来定义一个区域,这个区域从 if 开始到 endif 结束。但是,由于 Vim 的语法引擎不直接支持跨行匹配(如从 ifendif),你需要使用其他技巧,如匹配 if 并使用 syn sync 来尝试同步到 endif,但这通常不直接支持。

    一个更实用的方法是使用 Vim 的 foldmethod=markerfoldmethod=expr,但如果你坚持使用 foldmethod=syntax,你可能需要定义多个区域或使用正则表达式来近似匹配。

    然而,这里有一个简化的示例,它使用 foldmethod=expr 来实现基于 if/endif 的折叠,因为 foldmethod=syntax 直接处理可能较为复杂:

    " 在你的 vimrc 或类似的配置文件中设置
    autocmd FileType mylang setlocal foldmethod=expr foldexpr=GetMyLangFold(v:lnum)
    
    " 定义一个 Vim 函数来返回折叠级别
    function! GetMyLangFold(lnum)
      let line = getline(a:lnum)
      if line =~? '^if\s'
        return '>1'
      elseif line =~? '^endif\s'
        return '<1'
      else
        return '='
      endif
    endfunction

注意:上面的示例使用了 Vim 脚本(VimL)来定义一个函数 GetMyLangFold,该函数根据行内容返回折叠级别。这要求你设置 foldmethod=expr 并指定 foldexpr 为这个函数。

  1. 应用语法文件
    确保 Vim 能够找到并加载你的语法文件。你可以通过在你的 .vimrc 文件中添加 autocmd 来自动为特定文件类型设置语法和折叠方法。

请注意,上述示例使用了 foldmethod=expr 而不是 foldmethod=syntax,因为 foldmethod=syntax 通常需要语法文件内部定义折叠区域,这在使用 if/endif 时较为复杂。使用 foldmethod=expr 提供了更大的灵活性,但可能需要更多的 Vim 脚本知识。

 类似资料:
  • 当文件内容为大文本时,折叠功能将非常有用。使用此功能,只能显示选定的文件部分。 在使用编程语言时,此功能特别有用。 在本章中,将讨论以下主题内容 - 激活和停用折叠功能 各种折叠操作 1. 折叠激活和停用 要激活折叠使用以下命令 - 要停用折叠,请使用以下命令 - 2. 折页操作 关闭折页 要折叠代码,请转到任何方法并执行以下命令 - 例如,下图显示了此操作的结果 - 打开折页 要打开折页使用以下

  • Vim 是超经典的文本编辑器。 安装 可以直接用 软件管理器 安装Vim。 安装完成之后,可以点 “开始菜单” -> “附件” —> “Vim” 中打开,Gnome Do 也可以正确识别 vim。

  • 本节介绍vim的Rust支持配置,在阅读本节之前,我们假定你已经拥有了一个可执行的rustc程序,并编译好了racer。 我的vim截图 应邀而加 使用vundle vundle是vim的一个插件管理工具,基本上算是本类当中最为易用的了。 首先我们需要安装它 linux or OS X mkdir -p ~/.vim/bundle/ git clone https://github.com/Vu

  • 但当我输入它时,它就会出现在对象体中。

  • Vim提供了许多命令,使编辑功能非常强大。 在本章中,将讨论以下主题内容 - 插入 附加 打开新行 替换 更改 更换 加入 1. 在光标前插入文本 要在光标之前插入文本执行以下步骤 - 打开Vim 切换到插入模式 在行的开头插入文本 假设位于行的中间,并且希望在当前行的开头插入文本,然后执行以下步骤 - 切换到命令模式 激活插入模式 此操作将光标移动到当前行的开头并在插入模式下切换Vim。 在光标

  • 展开或者收起table cell的某一行。类似于QQ折叠的那种效果。 [Code4App.com]

  • Vim 本课程中有不少地方需要在终端下使用 Vim 编辑文件,对于初学者来说 Vim 可能不是那么好用,但是这是一个优秀程序员必备的技能。 这里推荐大家学习一下陈皓的一篇简明 VIM 练级攻略,只需要学习掌握到第二级就可以满足日常工作需求。 这可能需要你花费几天的时间来熟悉,但相信我,这绝对值得。

  • 在 Linux 中,就像任何类 Unix 操作系统,一切都只是文件。而 Unix 哲学指出,配置文件必须是人类可读和可编辑的。在几乎所有的情况下,它们只是纯文本。所以,首先,你必须学习如何编辑文本文件。 为此,我强烈建议你学习 vim 的基础知识,这是在 Linux 中处理文本的最强大的工具之一。Vim 是由 Bill Joy 于 1976 年编写的,vi 的重新实现。vi 实现了一个非常成功的概