O problema é que desde que o comando global permite que você faça vários comandos com o |
entre eles, os comandos após o comando global são considerados parte do comando global. Por exemplo, você pretendia isso:
%g// "On every line containing lblfig:
yank M "Yank into register 'M'
"then AFTERWARDS:
| new | exe "normal! \"mp" "Paste it into a new buffer.
Aqui está o que o vim está realmente fazendo:
%g// "On every line containing lblfig:
yank M | new | exe "normal! \"mp" "Yank into register AND Paste it into a new buffer.
A correção é bem simples. Apenas envolva seu comando global em uma instrução "execute".
let @m=@_ | exe '%g//yank M' | new | exe "normal! \"mp"