有没有办法在vim中获得整数对象运动?

时间:2012-07-03 22:26:47

标签: vim

我经常处理CSS文件或其他需要繁琐数字的文件。我希望能够拥有一个引用整数的键,就像w引用一个单词,或(引用一个单词一样。例如,在css文件中,我可以导航到高度声明的开头,并更改它的值,而不必在结尾处重新输入“px”,如果我使用w会发生这种情况。

有没有这样的东西,但我在文档中遗漏了它,或者有没有办法将这个功能添加到我的.vimrc中?

如果有一种方法可以像ci"一样使用它,我可以在行的开头使用“更改内部”命令跳转到AND并更改下一个整数。

如果我可以做简单的算术,可以获得更多奖励积分。我希望能够发出一个简短的命令,这个命令是“Add too,internal,integer,5”的缩写,并且当前行的下一个整数比我开始时的五个更大。

修改:

一些非常好的建议每个人,一些伟大的想法肯定会改善我的工作。谢谢! Hassek的回答可能最有可能在我的工作流程中结束,但其他人似乎都没有(完全)回答我的初始问题:一个对整数有效的动作。 romainl追踪的提案似乎有目标,但我无法让它可靠地工作

对于我自己(或其他人),我将在下面澄清我的要求:

一个在w对单词起作用的键,但对整数起作用的键,这样我就可以简单地将它添加到我的mental vim词汇表中并无缝地使用它。这包括以下方案。 (我将使用d作为我的示例键):

  1. 普通模式d:跳转到下一个整数
  2. 普通模式cd:更改为光标下整数的结尾(请注意cw是一个特殊情况,应该更改为NEXT字。cw实际上就像{ {1}}。)我希望这个特殊情况也可以用整数来实现
  3. 可视模式ce:选择[count]整数。
  4. 可视模式id:选择[count]整数。包含前导或尾随空格。
  5. 我是否遗漏了ad对新动议可能出现的任何行为?在普通模式和视觉模式中是否都有可用的键?

3 个答案:

答案 0 :(得分:8)

您可以使用以下命令添加或减去整数:

<num>Ctrl-a (to add)
<num>Ctrl-x (to substract)

然后它会直接进入下一个数字并执行命令

答案 1 :(得分:4)

this proposal。它看起来不错。

修改

确实这个很不错。这让我觉得我做/<number><Esc>的习惯不是很有效,所以我已经添加了这些映射(并略微修改了上面的映射以保持一致性)到我的~/.vimrc。让我们看看它们从长远来看是否有用:

nnoremap è  /\v\d+<CR>
nnoremap é  ?\v\d+<CR>

乍一看,èciè132<Esc>在按键方面似乎略微优于/2<Esc>{count}s132<Esc>,但如果它允许我跳过a,则会更好。检查我想要改变的值的第一个数字和b。计算要替换的字符。

时间会证明。

重新修改

以下是函数及其映射:

onoremap N  :<c-u>call <SID>NumberTextObject(0)<cr>
xnoremap N  :<c-u>call <SID>NumberTextObject(0)<cr>
onoremap aN :<c-u>call <SID>NumberTextObject(1)<cr>
xnoremap aN :<c-u>call <SID>NumberTextObject(1)<cr>
onoremap iN :<c-u>call <SID>NumberTextObject(1)<cr>
xnoremap iN :<c-u>call <SID>NumberTextObject(1)<cr>

function! s:NumberTextObject(whole)
    normal! v

    while getline('.')[col('.')] =~# '\v[0-9]'
        normal! l
    endwhile

    if a:whole
        normal! o

        while col('.') > 1 && getline('.')[col('.') - 2] =~# '\v[0-9]'
            normal! h
        endwhile
    endif
endfunction

有了这个,我可以:

  • vcdy从游标到结尾<command>N的部分数字。与<command>e<command>w类似。

    Here are some random numbers: 24 7635 1000018
                                            ^--->
    

    如果光标不在数字上并且不会向后移动,则它不起作用。

  • vcdy <command>iN的整数。

    Here are some random numbers: 24 7635 1000018
                                          <-^--->
    

    同样,如果光标不在数字上,它就不起作用。

整个事情可以改进,当然,但这是一个开始!

EndEdit中

我也使用CSS工作了很多。

我使用两种策略来改变数值:

  • {count}<C-a>{count}<C-x>,就像在Hassek的回答中一样,当我知道我想要增加/减少数量时。假设我想将20px转换为25px,一个简单的5<C-a>就可以完成这项工作,而无需将光标移动到数字上。这非常酷

  • /<number><CR>{count}s<new number>当新值与当前值非常不同时,我觉得懒得计算delta。 /2<CR>2s67<Esc>允许我将23px更改为67px/2<CR>R67<Esc>是另一种方式,但只有新值与当前值的长度相同才有效。如果您在同一条线上,请使用f<number>

请注意,您可以使用<C-r>=137-42<CR>插入表达式的结果,我也经常使用它。

答案 2 :(得分:3)

我在internetz here的深处找到了一些东西并像这样修改了它

nnoremap ,n /\v\d+/b<cr>mah/\v\d+/e<cr>mb`av`b
vnoremap ,n <esc>/\v\d+/b<cr>mah/\v\d+/e<cr>mb`av`b
  • \v\d+搜索一组数字
  • /b + mah转到其b eginning,设置标记并返回一个字符,以便我们再次
  • \v\d+搜索同一组数字
  • /e + mb结束并设置另一个标记,最后
  • `av`b从第一个标记到第二个标记视觉选择