【问题标题】:How to create a syntax file for text files?如何为文本文件创建语法文件?
【发布时间】:2026-02-20 13:35:01
【问题描述】:

我希望我可以在标准文本文件中格式化文本。
我想选择一个短语或一个单词,调用一个简单的命令,并使用以下格式对其进行格式化:

  • 粗体
  • 斜体
  • 下划线
  • 红色字体颜色
  • 黄色背景色

这可能吗? (类似于 vim 文件中的语法突出显示,但在我的情况下是选定的文本)

我知道 vim 中有一个 Txtfmt 插件,过去几年我尝试了 2 次,但每次都卸载它。
这就是为什么:

  1. 无法直观地选择文本并对其进行格式化,您必须在命令行中插入开始代码写入文本并在命令行中插入结束代码。
  2. 您无法复制文本,因为 Txtfmt 插件会在文本中插入隐藏的格式代码
  3. 在命令行中插入开始代码和结束代码太复杂(调用通用命令后),代码太复杂

【问题讨论】:

    标签: vim text formatting


    【解决方案1】:

    需要在您的文本中插入一种标记。 Vim 在纯文本上运行,它没有像文字处理器那样单独的元数据层。通过语法高亮和新的 conceal 功能,您可以部分使 Vim 看起来是 WYSIWYG,但实际上您仍在对原始文本进行操作。

    如果您对这个限制没有问题并希望坚持使用 Vim 来完成您的编辑任务,我建议您使用现有的标记解决方案,而不是从头开始发明一个新的标记解决方案。到目前为止,有多种语法可供选择,Markdown 可能是最喜欢的。 (在 Stack Overflow 上也使用了它!)使用现有语法,您可以利用所有现有的插件/映射/命令,甚至一些外部工具(例如,用于转换为 HTML)。

    【讨论】:

    • 我不太明白你的意思。你的意思是我必须找到一个插件来将文本标记为 html?
    • 转换为 HTML 只是一个额外的好处。基本上,:setl filetype=markdown 在你的缓冲区中并开始使用 Markdown 语法;它允许粗体、斜体等。
    • 不错。我安装了 markdown 插件 (vim.org/scripts/script.php?script_id=1242) 对吗?然后我在命令行中输入命令 ':setl filetype=markdown' 并可以使用 markdown。那是对的吗?但是现在我的文本中有 ´*´ 和 ´#´ 字符不是吗?
    • 是的,你明白了。 Vim 7.3 甚至已经带有 Markdown 语法。是的,你现在有了标记字符,但正如我所暗示的,元数据必须去某个地方。
    【解决方案2】:

    这可能是我认为您想要的最简单的实现。它允许使用您描述的颜色/样式在当前缓冲区中突出显示自定义字符串。您选择突出显示的自定义字符串无法在 Vim 会话之间保存。

    首先,为您的定制突出显示定义突出显示组SpecialTxt

    au ColorScheme * hi SpecialTxt guibg=yellow guifg=red gui=bold,underline,italic
    

    (请注意,这必须通过 autocmd 完成,以便加载新的配色方案不会覆盖它)。

    现在您可以选择任何正则表达式来继承此颜色:

    call matchadd( 'SpecialTxt', [YOUR_REGEX], 1 )
    

    或者你可以写一个简单的命令来设置匹配:

    command! -nargs=1 Special :call matchadd('SpecialTxt',"<args>",1)
    

    或者创建一个地图,以便双击一个单词将其设置为这种颜色:

    nnoremap <silent> <2-LeftMouse> :call matchadd('SpecialTxt',expand('<cword>'),1)<CR>
    

    希望对您有所帮助。抱歉,如果它不是您所追求的。

    【讨论】:

    • 非常好,但仍然不能完全满足我的要求。 1)您的解决方案将文本中的所有单词匹配为我双击的单词。 2)我仍然无法选择一段文本(几个单词或短语)并突出显示它。 3)另一个问题是重新启动后所有突出显示都消失了。 (当我使用 p.e. vim 语法时,情况并非如此)。
    • 你希望在哪里存储突出显示(如果不是作为文本本身的标记)?!