我正在处理一个YAML文件,它有一个整数作为ID,它每4-6行出现一次。我希望在这个文件的中间添加一条记录(为了可读性),以保持顺序编号的完整性。
文件格式如下。有什么想法吗?
- id: 1
type: string
option: diff_string
other: alt_string // note: 'other' option does not appear for all records
- id: 2
type: string
option: diff_string
//new record would go here as id: 3, increasing id: # of all following records by 1
- id: 3
type: string
option: diff_string
other: alt_string发布于 2012-01-19 01:07:18
我相信您可以通过将计数器(此处: variable g:I)设置为1来实现您想要的结果:
let g:I=1然后在与^- id: \d\+$匹配的每一行上执行替换
%g/^- id: \d\+$/ s/\d\+/\=g:I/|let g:I=g:I+1替代方法使用\= (请参阅:help sub-replace-expression)将\d\+替换为g:I的实际值。在替换之后,计数器递增(let g:I=g:I+1)。
使用g/^- id: \d\+$/,您可以确保只在与^- id: \d\+匹配的行上执行替换。
编辑如果要为其创建地图,可以将以下代码片段放入.vimrc中:
nnoremap resync :let g:I=1<CR>:%g/^- id: \d\+$/ s/\d\+/\=g:I/\|let g:I=g:I+1<CR>它允许通过在正常模式下键入resync来重新同步您的ids。
注意使用\对|进行转义,以及在需要按enter键的地方使用<CR>。
发布于 2012-01-19 00:50:24
为了从光标行+1开始递增所有后续in:
:.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)(nr2char(1)就像是按CTRL-A键)。
您还可以执行以下操作:
:.+1,$g/^- id: \d\+$/normal! 0^A在其中输入^A,按CTRL-V,然后按CTRL-A。请注意,我更喜欢第一个版本:您可以复制-粘贴它,代码中没有文字控制字符。
详细信息:
.+1,$是从下一行到文件末尾的范围。:help range.:g命令在遵守模式的所有行上运行。与之相反的是:v。:help :g/^- id: \d\+$/匹配一行开头的- id:,后跟一个或多个数字,然后是行尾(:help pattern):normal!播放常规命令:0转到行首,按CTRL-A递增下一个数字。如果你想要一个映射:
nnoremap <F1> :.+1,$g/^- id: \d\+$/exec 'normal! 0' . nr2char(1)<enter>把它放到你的vimrc中,现在享受在正常模式下按F1键,并观察光标行下面的所有in递增。
发布于 2012-01-19 10:25:43
我将使用以下简短而直接的替换命令。
:,$s/^- id: \zs\d\+/\=submatch(0)+1/https://stackoverflow.com/questions/8913958
复制相似问题