Entering text in snippet fields uses wrong charact

2019-07-30 00:08发布

I am using a custom keymap using langmap option in vimrc.

I am trying to use snipmate but I am running into trouble. When I type a word and hit tab it allows me to edit the parameter. The problem is that the first character is the remapped one, while I want it to be the actual key.

For instance, I'll type this:

for

and hit tab to expand the snippet:

for (i = 0; i < COUNT; ++i)

The i is highlighted which means I can edit it. I type "aaa":

for (baa = 0; i < COUNT; ++i) 

It comes out baa even though I typed aaa. This is because I remapped a and b.

How can I fix this?


Here is my keymapping:

set langmap=nj,N},ek,E{,il,IL,{^,}$,lb,LB,uw,UW,ye,YE,jg,JG,\\;z,f\\.,F\\,,zu,ZU,.?,\\,/,/v,?    V,ta,TA,si,SI,ro,RO,ac,AC,wr,WR,xx,XX,dd,DD,bs,BS,gf,GF,pt,PT,kn,KN,cy,CY,vp,VP,o\\;

It won't make much sense to others, and I haven't finalized how I want it to look.

标签: vim snipmate
3条回答
家丑人穷心不美
2楼-- · 2019-07-30 01:05

This has now been fixed in vim 7.4.1150. See https://github.com/vim/vim/issues/572 for details.

查看更多
兄弟一词,经得起流年.
3楼-- · 2019-07-30 01:08

C program which outputs mappings similar behavior to langmap but not for select:

/* input:
lhs rhs optional-descripton
lhs rhs ...
*/

#include <stdlib.h>
#include <stdio.h>

int main() {
  FILE *fi = fopen("in.txt", "r");
  FILE *fo = fopen("out.txt", "w");
  char lc[8], rc[8];
  while (fscanf(fi, "\n%s %s", lc, rc) != EOF) {
    fprintf(fo, "nnoremap %s %s\n", lc, rc);
    fprintf(fo, "xnoremap %s %s\n", lc, rc);
    fprintf(fo, "onoremap %s %s\n", lc, rc);
    while (fgetc(fi) != '\n');
  }
  fclose(fo);
  fclose(fi);
}

It doesn't work identically to langmap and so it might break other bindings.

查看更多
萌系小妹纸
4楼-- · 2019-07-30 01:15

From your :set langmap I understand that you mapped a to c so, by typing aaa, did you expect to obtain ccc?

From what I understand (:help langmap), your custom substitutions are not available in INSERT mode for actually inserting stuff and I don't see a mention of the SELECT mode you are in when overwriting SnipMate's placeholders.

If I do this

:set langmap+=ac,bs

and I type aaa in SELECT mode, I obtain caa.

That's because langmap applies to the first a (:help Select-mode) and, therefore inserts c. But, after this first character I am in INSERT mode for all subsequent characters. Since langmap doesn't apply in INSERT mode, aa is inserted as is.

What is not clear to me is why you obtain baa instead of caa. Your langmap seems to be pretty clear about your intention: you want a to insert c and b to insert s. Typing a shouldn't insert b.

I smell a risk of mistyping in your .vimrc. Try this: reset your set langmap and start adding your mappings one by one.

May I ask you what is the purpose of such a massive remapping?

查看更多
登录 后发表回答