You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速将vim-snippet格式的代码片段批量转换为UltiSnips格式?

批量转换vim-snippets到UltiSnips格式的解决方案
  • 方案1:直接加载无需转换(优先推荐)
    UltiSnips原生兼容snipMate格式(也就是vim-snippets使用的格式),不需要手动转换格式即可直接使用,只需要在你的vim配置文件(.vimrc/init.vim)中添加以下两行配置即可:
" 开启snipMate格式片段支持
let g:UltiSnipsEnableSnipMate = 1
" 添加vim-snippets库的存储路径到片段搜索目录,根据你的实际路径修改
let g:UltiSnipsSnippetDirectories = ['~/.vim/bundle/vim-snippets/snippets', 'UltiSnips']

配置完成后重启vim即可直接调用所有vim-snippets中的代码片段。

  • 方案2:批量转换为原生UltiSnips格式
    如果你需要将片段统一转换为UltiSnips原生格式方便后续自定义修改,可以使用以下Python脚本批量处理:
import os
import re
import sys

def convert_file(input_path, output_path):
    with open(input_path, 'r', encoding='utf-8', errors='ignore') as f:
        content = f.readlines()
    
    output = []
    i = 0
    n = len(content)
    current_desc = ""
    while i < n:
        line = content[i].rstrip('\n')
        # 匹配注释行作为描述
        if line.startswith('#'):
            current_desc = line.lstrip('#').strip()
            i += 1
        # 匹配snippet开头行
        elif line.startswith('snippet '):
            trigger = line.split(' ', 1)[1].strip()
            output.append(f'snippet {trigger} "{current_desc}" b\n')
            i += 1
            # 读取片段内容,直到遇到非缩进行
            while i < n and (content[i].startswith('\t') or content[i].startswith('    ') or content[i].strip() == ''):
                # 去掉开头的一级缩进(snipMate的片段内容默认缩进一级)
                content_line = content[i].rstrip('\n')
                if content_line.startswith('\t'):
                    content_line = content_line[1:]
                elif content_line.startswith('    '):
                    content_line = content_line[4:]
                output.append(content_line + '\n')
                i += 1
            output.append('endsnippet\n\n')
            current_desc = ""
        else:
            i += 1
    
    os.makedirs(os.path.dirname(output_path), exist_ok=True)
    with open(output_path, 'w', encoding='utf-8') as f:
        f.writelines(output)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("用法: python convert_snippets.py <vim-snippets源目录> <输出UltiSnips目录>")
        sys.exit(1)
    src_dir = sys.argv[1]
    dst_dir = sys.argv[2]
    for root, dirs, files in os.walk(src_dir):
        for file in files:
            if file.endswith('.snippets'):
                input_path = os.path.join(root, file)
                rel_path = os.path.relpath(input_path, src_dir)
                output_path = os.path.join(dst_dir, rel_path)
                print(f"转换中: {input_path} -> {output_path}")
                convert_file(input_path, output_path)

使用方法:

  1. 将上述代码保存为convert_snippets.py
  2. 运行命令:python convert_snippets.py ~/.vim/bundle/vim-snippets/snippets ~/.vim/UltiSnips
  3. 等待转换完成即可,脚本会自动保留原文件的语言分类、触发词、描述和代码内容,占位符格式UltiSnips原生兼容无需额外修改。

内容的提问来源于stack exchange,提问作者Pham Hung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:45:02