6

我经常处理 CSS 文件或其他需要旋转数字的文件。我希望能够拥有一个以w引用单词或(引用句子的方式引用整数的键。例如,在一个 css 文件中,我可以导航到一个高度声明的开头,并更改它的值,而不必在结尾处重新键入“px”,如果我使用w.

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

如果有一种方法可以使用它,例如ci"我可以在行首的位置并使用“更改内部”命令跳转到并更改下一个整数,则可以加分。

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

编辑:

每个人都有一些非常棒的建议,一些很棒的想法肯定会改善我的工作。谢谢!Hassek 的回答可能最有可能出现在我的工作流程中,但其他人似乎都没有(完全)回答我最初的问题:适用于整数的运动。romainl 追踪的提案似乎有这个目标,但我无法让它可靠地工作

对于我自己(也许还有其他人),我将在下面阐明我的需求:

一个键在很大程度上w作用于单词,但作用于整数,这样我就可以简单地将它添加到我的精神 vim 词汇表中并无缝使用它。这包括以下场景。(我将d用作我的示例键):

  1. 普通模式d:跳转到下一个整数
  2. 普通模式cd:更改到光标下整数的末尾(注意这cw是一个特殊情况,应该更改为 NEXT 单词。cw实际上就像ce。)我希望这种特殊情况也可以用整数来实现
  3. 可视模式id:选择 [count] 个整数。
  4. 可视模式ad:选择 [count] 个整数。包括前导或尾随空格。

我是否错过w了新动议可能预期的任何行为?在普通模式和视觉模式下是否都有可用的键?

4

3 回答 3

8

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

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

它将直接进入下一个数字并执行命令

于 2012-07-03T22:37:04.117 回答
4

请参阅此建议。这看起来不错的样子。

编辑

确实,那一款相当不错。这让我觉得我这样做的习惯/<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>eor <command>w

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

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

  • vcdy一个整数<command>iN

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

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

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

结束编辑

我也经常使用 CSS。

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

  • {count}<C-a>并且{count}<C-x>,就像在哈塞克的回答中一样,当我知道我想增加/减少多少数字时。假设我想20px变成25px,一个简单5<C-a>的技巧就不需要我将光标移动到数字上。这非常酷

  • /<number><CR>{count}s<new number>当新值与当前值有很大差异并且我懒得计算增量时。/2<CR>2s67<Esc>会让我23px变成67px. /2<CR>R67<Esc>是另一种方式,但只有新值与当前值的长度相同时才好。f<number>如果您在同一行,请使用。

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

于 2012-07-04T06:31:55.380 回答
3

我在internetz的深处发现了一些东西像这样修改它

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起点,设置一个标记并返回一个字符,这样我们就可以再次
  • \v\d+搜索同一组数字
  • /e+mb走到尽头并设置另一个标记,最后
  • `av`b从第一个到第二个标记视觉选择
于 2012-07-04T00:50:40.347 回答