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

如何将LilyPond音高替换的正则命令集成到Vim函数中

将LilyPond音高替换逻辑集成到Vim函数中

需求场景

我们需要给LilyPond文件中的音高添加升八度标记('),例如将以下行:

c cis d2. disis4 d8 beses16 fes64 gis aes16

替换为:

c' cis' d'2. disis'4 d'8 beses'16 fes'64 gis' aes'16

已知通过Vim替换命令可以实现该效果:

:s/\([a-g]\(is\|es\)\{0,2\}\)\(\('\|\,'\)*\)\(\s\|[0-9]\{1,2\}\)/\1'\3\5/g

接下来我们将这个替换逻辑封装成可复用的Vim函数。

实现方案

基础版:全缓冲区替换

定义一个函数,默认对整个文件的所有行执行替换:

function! AddOctaveTick()
    " 对当前缓冲区所有行应用替换规则
    %s/\([a-g]\(is\|es\)\{0,2\}\)\(\('\|\,'\)*\)\(\s\|[0-9]\{1,2\}\)/\1'\3\5/g
endfunction

使用方法:在Vim命令行输入 :call AddOctaveTick() 即可完成全文件替换。

进阶版:支持范围替换

如果需要支持可视化选中区域或指定行范围的替换,可以给函数添加range属性:

function! AddOctaveTick() range
    " 对指定行范围(可视化选中区域或手动指定的行)应用替换规则
    execute a:firstline . ',' . a:lastline . 's/\([a-g]\(is\|es\)\{0,2\}\)\(\('\|\,'\)*\)\(\s\|[0-9]\{1,2\}\)/\1'\3\5/g
endfunction

使用方法:

  • 普通模式下输入 :call AddOctaveTick() 依然会替换全文件
  • 选中可视化区域后,输入 :call AddOctaveTick() 仅替换选中的行
  • 也可以手动指定行范围,比如 :5,10call AddOctaveTick() 替换第5到10行

快捷键绑定(可选)

为了更便捷使用,可以在你的~/.vimrc(或init.vim)中添加快捷键映射:

" 普通模式下按 <leader>ot 执行全文件替换
nnoremap <leader>ot :call AddOctaveTick()<CR>
" 可视化模式下选中区域后按 <leader>ot 执行范围替换
vnoremap <leader>ot :<C-U>call AddOctaveTick()<CR>

注:Vim默认<leader>键为反斜杠\,你可以通过let mapleader = ','修改为其他按键。

内容的提问来源于stack exchange,提问作者Stefan Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:20:03