一种解决方案是采用更实用(而不是命令式)的方法,例如这个特定任务(和许多其他任务)可以通过替换来完成:
G:s/\v([aeiou])|./\=strlen(submatch(1)) ? 1 : 0/g<CR>gggJ
IE:
G " go to the first non-blank character on the last line
" replace each vowel with 1 and everything else with 0
:s/\v([aeiou])|./\=strlen(submatch(1)) ? 1 : 0/g<CR>
gg " go to the first line
gJ " and append the line below
根据任务的不同,您可能会发现插件(例如abolish.vim)以比放入 vimscript 更方便的方式打包逻辑。
另一种方法是按照此处:global
所述使用,再次将任何附加逻辑移动到方便/必要的命令中。如果要处理的文本尚未采用正确的格式(基于行),则可以将其拆分为行,使用 进行操作,然后重新组合/恢复。:g
:g
您还可以将一系列不重叠的命令与|
( :help :bar
) 捆绑在一起以近似if/else
链,例如转换:
DMY: 09/10/2011 to 10/11/2012
DMY: 13/12/2011
MDY: 10/09/2011 to 11/10/2012
MDY: 12/13/2011
到:
DMY: 2011-10-09 to 2012-11-10
DMY: 2011-12-13
MDY: 2011-10-09 to 2012-11-10
MDY: 2011-12-13
为清晰起见进行了格式化(有关:execute
用法,请参见此处):
:exe 'g/^DMY:/s/\v(\d\d)\D(\d\d)\D(\d{4})/\3-\2-\1/g' |
g/^MDY:/s/\v(\d\d)\D(\d\d)\D(\d{4})/\3-\1-\2/g