如何将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
相关产品推荐
相关产品推荐

