在使用langmap时,在片段字段中输入文本时使用了错误的字符

时间:2011-12-11 14:04:18

标签: vim snipmate

我在vimrc中使用langmap选项使用自定义键盘映射。

我正在尝试使用snipmate,但我遇到了麻烦。当我输入一个单词并点击标签时,它允许我编辑参数。问题是第一个字符是重新映射的字符,而我希望它是实际的密钥。

例如,我会输入:

for

并点击标签展开代码段:

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

i突出显示,这意味着我可以编辑它。我输入“aaa”:

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

即使我输入baa,它也会出现aaa。这是因为我重新映射了ab

我该如何解决这个问题?


这是我的键盘映射:

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\\;

对其他人来说没有多大意义,我还没有最终确定我希望它的样子。

3 个答案:

答案 0 :(得分:2)

:set langmap我知道您已将a映射到c,因此,通过输入aaa,您是否希望获得ccc

根据我的理解(:help langmap),您的自定义替换在 INSERT 模式下不可用于实际插入内容,我没有看到提及 SELECT < / em>模式,当你覆盖SnipMate的占位符时。

如果我这样做

:set langmap+=ac,bs

我在 SELECT 模式下输入aaa,我获得了caa

这是因为langmap适用于第一个a:help Select-mode),因此会插入c。但是,在第一个字符之后,我处于 INSERT 模式中,用于所有后续字符。由于langmap不适用于 INSERT 模式,因此aa按原样插入。

我不清楚为什么您获得baa而不是caa。您的langmap似乎非常清楚您的意图:您希望a插入cb来插入s。键入a不应插入b

我闻到你.vimrc中有误输的风险。试试这个:重置set langmap并开始逐个添加映射。

我可以问你这种大规模重新映射的目的是什么?

答案 1 :(得分:0)

C程序,它输出与langmap相似的行为,但不是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);
}

它与langmap的工作方式不同,因此可能会破坏其他绑定。

答案 2 :(得分:0)

这已在vim 7.4.1150中修复。看到 https://github.com/vim/vim/issues/572 详情。