我知道这不是vim的工作原理,但是有没有插件可以做到这一点?我找不到它。
在编辑css和其他情况下也非常有用。
给出:
▐margin: 10px
当我按
CTRL-A
时,我想查看:▐margin: 20px
实际情况:
#1 楼
这似乎工作得很好,并且在a 9(95变为105)上使用
<C-a>
或在0(105变为95)上使用<C-x>
时确实做得很理智: br /> 首先,我们搜索任何数字,
search()
的优点是不重置@/
。a <Esc>h
-进入插入模式,在数字后添加空格,然后移到左侧,使光标位于数字的顶部。我们现在可以使用
<C-a>
或<C-x>
。我们使用
lxh
删除添加的空格。我已将其映射到
g<C-a>
和g<C-x>
,因此您仍然可以调用原始版本。版本略有不同,它将仅在当前行上搜索数字(但会悬空)如果当前行上没有数字,请输入空格):
nnoremap g<C-a> :call search('\d', 'c')<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c')<CR>a <Esc>h<C-x>lxh
这是另一个版本,它使用与以前相同的概念,但是还添加了
数字前的空格。这将使
g<C-a>
忽略该数字之前的任何munis符号(默认情况下,<C-a>
上的-42
会将其“递增”到-41
。它也接受计数,以便
5g<C-a>
将递增5的数字:nnoremap g<C-a> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-x>lxh
#2 楼
基本增量这是执行操作的简单宏:
:nnoremap <leader>a m`lv$xh<c-a>p``
:nnoremap <leader>x m`lv$xh<c-x>p``
在正常模式下,您
m`
标记您的位置l
向右移动一个字符v$x
剪切到行尾h
移回原始位置<c-a>
增量(或递减)p
粘贴您的切割``
移回您的标记/>
跳到下一个数字
如果要跳到下一个数字(如果在数字上则保持在当前位置),则需要一个用于检查当前光标字符的函数可能跳转到下一个数字。
function! NextNum()
let ch = getline(".")[col(".")-1]
if ch !~ "[0-9]"
execute "normal! /[0-9]\<cr>"
endif
endfunction
nnoremap <leader>a :call NextNum()<cr>m`lv$xh<c-a>p``
nnoremap <leader>x :call NextNum()<cr>m`lv$xh<c-x>p``
NextNum
获取光标下方的字符,检查其是否为数字,如果没有,则搜索下一个数字。之后,其余部分相同。如果您希望映射不同,则只需将nnoremap <leader>a
更改为所需的值即可,例如nnoremap <c-a>
。忽略负数和大于9的数字
如果要仅循环显示数字并且不让它们充当已签名的符号
,则以下功能将在0和9处递增和递减并翻转。
function! NextNum()
let ch = getline(".")[col(".")-1]
if ch !~ "[0-9]"
execute "normal! /[0-9]\<cr>"
endif
endfunction
function! IncDec(val, dec)
if a:dec
if a:val == 0
return 9
else
return a:val - 1
endif
else
if a:val == 9
return 0
else
return a:val + 1
endif
endif
endfunction
function! DoMath(dec)
call NextNum()
normal! x
let @" = IncDec(@", a:dec)
normal! P
endfunction
nnoremap <leader>a :call DoMath(0)<cr>
nnoremap <leader>x :call DoMath(1)<cr>
并输入8
您将得到<leader>a
。再次执行将导致9
。如果在0
上按<leader>x
,则会得到0
。负数也一样。这些功能剪切单个字符,递增,递减或翻转,然后粘贴到位。评论
此处不存在某些问题,但我会牢记该想法,也许可以改进它。如果有的话,它应该跳到当前行的第一位并对其进行操作。优选地,也可映射到
– firedev
2015年4月14日在3:54
更新版本。现在跳到下一个数字,或者如果您当前在一个数字上,则可以递增该数字。
–jecxjo
15年4月14日在11:56
是!太神奇了,谢谢!我不明白为什么问题被否决了,但是从第一天开始,这让我很烦,而且显然很多人将
– firedev
2015年4月15日下午4:39
我看到它被否决了,因为问题是针对非常具体的问题,并且原始问题在此过程中发生了变化……需要跳到第一个数字。除此之外,我实际上经常使用
–jecxjo
2015年4月15日在5:13
可能,但是会有更多的功能。当前实现利用
–jecxjo
2015年4月17日下午13:31
#3 楼
这是我使用替代表达式编写的版本:map <c-a> :s/\d/\=submatch(0) < 9 ? submatch(0) + 1 : submatch(0)/<CR>
map <c-x> :s/\d/\=submatch(0) > 0 ? submatch(0) - 1 : submatch(0)/<CR>
每个人都只寻找行中的第一个数字字符,如果在范围内,则加减一个分别为[0-8]或[1-9]。它具有三个问题:
主要是文本操作,并且仅查看第一个字符,因此它不知道数字是否为负数。这是可以解决的,但是我喜欢当前的行为。
它会阻塞搜索寄存器
"/
,如果启用了hlsearch,则使用此功能时,当前缓冲区中的所有数字都将突出显示。您可以将:noh<CR>
附加到上述每个map
命令中,以停止突出显示,但是我不知道如何很好地阻止寄存器被破坏。在光标之后。如果是我,我会将上面的内容映射到
<leader>a
和<leader>x
,而不是CTRL-A/X
。这样,您就可以同时使用两种行为。默认情况下,<leader>
是反斜杠键(\
)。评论
它忽略负数的事实很好,事实上默认行为对我来说很奇怪。我认为:noh看起来也更好。但是真正的问题是它不能使用光标位置作为基准,因此只能增加行中的第一位数字。
– firedev
15年4月14日在8:38
它停止在数字9处,超过10则增加11,而不是10 ...我认为这是无意的(即错误)?此外,您始终希望使用非递归映射(noremap),而从不映射。请参阅此页面以获取更详细的说明。
–马丁·图尔诺伊(Martin Tournoij)
2015年5月4日,0:01
评论
您还可以执行10