好的,这是我的问题我想找到一种方法,如何根据点击次数映射一个具有两种不同行为的键。
举一个例子,假设我想在按键;
时在行尾添加;
,如果我点击两次,它将被删除
注意:分号只是一个例子,主要思想是如何切换键
答案 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