如何在vim中映射具有两种不同行为的同一个键?

如何在vim中映射具有两种不同行为的同一个键?,vim,vi,keymapping,Vim,Vi,Keymapping,好的,这是我的问题,我想找到一种方法,根据点击数映射具有两种不同行为的键。 作为一个例子,让我们假设我想添加一个在行尾如果我点击它两次,它将被删除 注意:分号只是一个示例,其主要思想是如何切换键 nnoremap ; A;<esc> nnoremap ;; $x 这是因为如果f命令(find)失败,例如,如果行末尾没有分号,则重新映射将停止运行 编辑: nnoremap ; A;<esc>hh2f;xx nnoremap;A.hh2f;xx 似乎做你想做的事。它当

好的,这是我的问题,我想找到一种方法,根据点击数映射具有两种不同行为的键。 作为一个例子,让我们假设我想添加一个
在行尾如果我点击它两次,它将被删除

注意:分号只是一个示例,其主要思想是如何切换键

nnoremap ; A;<esc>
nnoremap ;; $x
这是因为如果
f
命令(find)失败,例如,如果行末尾没有分号,则重新映射将停止运行

编辑

nnoremap ; A;<esc>hh2f;xx 
nnoremap;A.hh2f;xx
似乎做你想做的事。它当然不是很整洁,但很管用

这是因为如果
f
命令(find)失败,例如,如果行末尾没有分号,则重新映射将停止运行

编辑

nnoremap ; A;<esc>hh2f;xx 
nnoremap;A.hh2f;xx

似乎做你想做的事。它当然不是很整洁,但很管用。

这就行了,尽管有点疯狂

nnoremap ; :if(getline('.')[col('$')-2]==';')\|exe "norm $x"\|else\|exe "norm A;"\|endif<cr><cr>
nnoremap;:if(getline('..')[col('$)-2]=';')\\\\124; exe“norm$x”\\124; else\\124; exe“norm A;”\\124; endif
它获取当前行的最后一个字符(字符串索引是基于0的,
col(“$”)
返回刚过行尾的基于1的列,因此其中有一个
-2
),将其与分号进行比较,并从行中删除或追加最后一个字符

我不知道为什么最后需要两个
s。
exe
s是因为
norm
将所有内容都捕获到行的末尾,因此条不会分开“行”

编辑更改需求::-)

如果要确保在一行的末尾显示一个且只有一个分号,并且还要处理尾随空格(包括分号之间的空格),如果不需要保留尾随空格,则实际上要比切换最后一个分号容易得多。如果您确实想在分号之前留下空格,请删除第一个
\s*
,这也将确保分号前面没有空格

nnoremap;:s/\v\s*(;\s*)*$//

如果您仍然希望切换,但需要处理尾随空格,那么我们需要弄清楚您打算如何处理这些尾随空格。我的偏好是删除它们,这样你就可以继续生活中更简单的事情。。。如果需要,将其连接到一个键,我实际上是在
autocmd
中处理BufWritePre时执行此操作的


:%s/\s\*$//e

这就行了,尽管有点疯狂

nnoremap ; :if(getline('.')[col('$')-2]==';')\|exe "norm $x"\|else\|exe "norm A;"\|endif<cr><cr>
nnoremap;:if(getline('..')[col('$)-2]=';')\\\\124; exe“norm$x”\\124; else\\124; exe“norm A;”\\124; endif
它获取当前行的最后一个字符(字符串索引是基于0的,
col(“$”)
返回刚过行尾的基于1的列,因此其中有一个
-2
),将其与分号进行比较,并从行中删除或追加最后一个字符

我不知道为什么最后需要两个
s。
exe
s是因为
norm
将所有内容都捕获到行的末尾,因此条不会分开“行”

编辑更改需求::-)

如果要确保在一行的末尾显示一个且只有一个分号,并且还要处理尾随空格(包括分号之间的空格),如果不需要保留尾随空格,则实际上要比切换最后一个分号容易得多。如果您确实想在分号之前留下空格,请删除第一个
\s*
,这也将确保分号前面没有空格

nnoremap;:s/\v\s*(;\s*)*$//

如果您仍然希望切换,但需要处理尾随空格,那么我们需要弄清楚您打算如何处理这些尾随空格。我的偏好是删除它们,这样你就可以继续生活中更简单的事情。。。如果需要,将其连接到一个键,我实际上是在
autocmd
中处理BufWritePre时执行此操作的



:%s/\s\*$//e

这需要一个超时,所以我需要点击;;一秒钟之内。也许我不太清楚在映射过程中如何进行检查。哦,如果分号在那里,它会删除它,如果它不在那里,它会添加它?那么切换呢?@Meninx查看我的编辑。足够近,但它不适用于空行。这需要一个超时,所以我需要点击;;一秒钟之内。也许我不太清楚在映射过程中如何进行检查。哦,如果分号在那里,它会删除它,如果它不在那里,它会添加它?那么切换呢?@Meninx请看我的编辑。足够近,但它对空行不起作用。它似乎有点复杂,特别是在我目前的vim级别下,但它起作用了。谢谢稍微短一点:
nnoremap;getline(行('.')=~';$'?'$x':“A;\”
。注意:这会产生更改未命名寄存器的副作用。这两种方法都可能会修改未命名寄存器。可以(并且应该)通过添加
介于
$
x
之间。结尾的尾随空格仍然存在问题,但我有了主意。实际上,我通过创建一个函数来解决这个问题,找到了我想要的,我试着返回到您的解决方案,以查看并获得另一个想法!这似乎有点复杂,特别是我目前在vim的水平,但它的工作。谢谢稍微短一点:
nnoremap;getline(行('.')=~';$'?'$x':“A;\”
。注意:这会产生更改未命名寄存器的副作用。这两种方法都可能会修改未命名寄存器。这可以(也应该)通过在
$
x
之间添加
来解决。结尾的尾随空格仍然存在问题,但我想到了。实际上,我通过创建一个函数来