如何在vim中映射具有两种不同行为的相同密钥?

时间:2016-02-15 20:14:07

标签: vim vi keymapping

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

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

2 个答案:

答案 0 :(得分:1)

UserControl1

请注意,这将删除您线路上的最后一个字符,无论它是什么。如果你希望它只删除最后一个字符(如果是分号),你可以这样做:

nnoremap ; A;<esc>
nnoremap ;; $x

这是有效的,因为如果nnoremap ;; $hf;x 命令(查找)失败,重映射将停止运行,例如如果该行末尾没有分号。

修改

f

似乎做你想做的事。它当然不是很整洁,但它确实有效。

答案 1 :(得分:1)

这样做,尽管它有点疯狂......

nnoremap ; :if(getline('.')[col('$')-2]==';')\|exe "norm $x"\|else\|exe "norm A;"\|endif<cr><cr>

它获取当前行的最后一个字符(字符串索引从0开始,col('$')返回刚刚超过行尾的从1开始的列,这就是为什么有&#39; sa { {1}}在那里),将其与分号进行比较,并从行中删除或追加最后一个字符。

我不知道为什么最后需要两个-2<CR>exe因为norm将所有内容捕获到行尾,因此条形码不会分隔&#34;行&#34;否则。

编辑以更改要求:: - )

如果你想确保在一行的末尾出现一个且只有一个分号,并且还处理尾随空格(包括分号之间的空格),那么实际上比切换最后一个分号要容易得多。 #39; t需要保留尾随空格。这也将确保一个分号在它之前没有任何空格,如果你真的想在分号之前留下空格去掉第一个\s*

nnoremap ; :s/\v\s*(;\s*)*$/;/<cr>

如果您仍想切换但需要处理尾随空格,那么我们需要弄清楚您打算对这些尾随空格做什么。我的偏好只是删除它们,这样你就可以继续处理生活中更简单的事情......如果你愿意,可以将它连接到一个键,我实际上是在autocmd处理BufWritePre时这样做。

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