有没有办法增加/减少光标后/下的第一个数字,而不是整数。

我知道这不是vim的工作原理,但是有没有插件可以做到这一点?我找不到它。

在编辑css和其他情况下也非常有用。

给出:

▐margin: 10px


当我按CTRL-A时,我想查看:

▐margin: 20px


实际情况:

评论

您还可以执行10 来添加10或r2以将2替换为1。

#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

我看到它被否决了,因为问题是针对非常具体的问题,并且原始问题在此过程中发生了变化……需要跳到第一个数字。除此之外,我实际上经常使用。每当我更新版本或增加范围变量时,我只需[N] 而不是删除和替换。

–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