如何快速将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)
使用方法:
- 将上述代码保存为
convert_snippets.py - 运行命令:
python convert_snippets.py ~/.vim/bundle/vim-snippets/snippets ~/.vim/UltiSnips - 等待转换完成即可,脚本会自动保留原文件的语言分类、触发词、描述和代码内容,占位符格式UltiSnips原生兼容无需额外修改。
内容的提问来源于stack exchange,提问作者Pham Hung
相关产品推荐
相关产品推荐

