Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 使用langmap时,在代码段字段中输入文本使用了错误字符_Vim_Snipmate - Fatal编程技术网

Vim 使用langmap时,在代码段字段中输入文本使用了错误字符

Vim 使用langmap时,在代码段字段中输入文本使用了错误字符,vim,snipmate,Vim,Snipmate,我正在使用vimrc中的langmap选项使用自定义键映射 我试图使用snipmate,但我遇到了麻烦。当我键入一个单词并点击tab时,它允许我编辑参数。问题是第一个字符是重新映射的字符,而我希望它是实际的键 例如,我将键入以下内容: for 然后单击tab展开代码段: for (i = 0; i < COUNT; ++i) 即使我输入了aaa,它还是显示为baa。这是因为我重新映射了a和b 我怎样才能解决这个问题 这是我的密钥映射: set langmap=nj,N},ek,E{,

我正在使用vimrc中的
langmap
选项使用自定义键映射

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

例如,我将键入以下内容:

for
然后单击tab展开代码段:

for (i = 0; i < COUNT; ++i)
即使我输入了
aaa
,它还是显示为
baa
。这是因为我重新映射了
a
b

我怎样才能解决这个问题


这是我的密钥映射:

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

它对其他人来说没有多大意义,我还没有最终确定我想要它的外观。

从您的
:set langmap
我知道您将
a
映射到
c
,那么,通过键入
aaa
,您是否希望获得
ccc

据我所知(
:help langmap
),您的自定义替换在插入模式下无法用于实际插入内容,并且我看不到在覆盖SnipMate的占位符时您所处的选择模式

如果我这样做

:set langmap+=ac,bs
我在选择模式下键入
aaa
,我获得
caa

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

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

我感觉到您的
.vimrc
中存在输入错误的风险。尝试以下操作:重置
设置langmap
,然后开始逐个添加映射


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

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);
}
/*输入:
lhs rhs可选描述符
lhs rhs。。。
*/
#包括
#包括
int main(){
FILE*fi=fopen(“in.txt”、“r”);
文件*fo=fopen(“out.txt”,“w”);
char-lc[8],rc[8];
而(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的工作方式不同,因此可能会破坏其他绑定。

这已在vim 7.4.1150中修复。看见
详细信息。

您期望得到什么?aaa?bbb?为什么要重新映射a和b?请提供您的自定义密钥映射,以便我们知道您重新映射了什么a和b。您可以粘贴您的精确映射吗?
baa
更多用于说明目的。你是对的,它实际上是
caa
。我使用的是自定义映射,因为我使用的是不同的键盘布局。我试着在vimrc中使用
snoremap
,它确实可以工作,尽管对每个键都这样做很麻烦。你使用什么键盘布局?Colemak。langmap与普通vim布局完全不同。我想我会写一个程序来重新映射,而不是手工。我看过,但我不是一个超级粉丝。它使用wasd风格的动作和其他愚蠢的动作。谢谢你让我知道
/* 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);
}