2012-07-03 88 views
6

我经常在CSS文件或其他需要编号的文件上工作。我希望有一个键能够引用整数,就像w引用一个词,或(引用一个句子。例如,在一个css文件中,我可以导航到一个高度声明的开始,并且可以更改它的值,而不必重新输入“px”作为结束符,如果使用w,会发生什么情况。有没有办法在vim中获取整数对象运动?

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

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

如果我可以做简单的算术,可以获得更多的积分。我希望能够发出一个简短的命令,它是“添加内部,整数,5”的简短命令,并且当前行上的下一个整数为5时,那么当我开始时。

编辑:

一些真正伟大的建议大家,有些是一定要提高自己的工作有很大的想法。谢谢!哈塞克的回答可能最有可能在我的工作流程中结束,但其他人似乎没有(完全)回答我的初始问题:一个对整数有效的动议。 romainl跟踪的提案似乎有这个目标,但我不能得到它可靠地工作

对于我(和其他人也许)我会澄清我的需要如下:

作用多大的方式w行为单词的一个关键,但在整数,这样我可以简单地把它添加到我的心理vim词汇并无缝地使用它。这包括以下情况。 (我将使用d作为我的例子键):

  1. 普通模式d:跳转到下一个整数
  2. 普通模式cd:更改光标所在的整结束(注意:cw是一个特殊的应该换成下一个字cw实际上就像ce一样)。我期望这个特殊情况也可以用整数实现
  3. 可视模式id:选择[count]整数。
  4. 可视模式ad:选择[计数]整数。包括领先或尾随空白。

我是否缺少w对于新动作可能会有的任何行为?在正常模式和视觉模式下是否还有一把钥匙?

+3

'^ A'递增整数,'^ Z'递减整数。 'f0'将跳转到当前行的下一个'0'。 – sarnold

+4

您错误地键入了“^ X”而不是“^ Z”。 – Benoit

回答

4

参见this proposal选择。看上去不错。

编辑

事实上,一个是相当不错的。这使我认为我做/<number><Esc>的习惯效率不高,因此我添加了这些映射(并略微修改了上面的一致性映射)到我的~/.vimrc。让我们来看看他们,从长远来看是有用的:

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

乍一看,èciè132<Esc>似乎是在按键方面比/2<Esc>{count}s132<Esc>略好,但基本上更好,如果它可以让我跳过。检查我想更改的值的第一位数字和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>当新值与当前值非常不同时,我觉得懒得计算三角洲。 /2<CR>2s67<Esc>将允许我将23px更改为67px/2<CR>R67<Esc>是另一种方式,但只有当新值与当前值的长度相同时才有效。如果你在同一行,请使用f<number>

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

+0

很不错'/ {count} s '诀窍:) – Hassek

+0

感谢您追踪这个建议。这看起来非常像我最初寻找的东西。首先,要获得可复制格式的实际代码,我必须使用此URL:http://sprunge.us/QTPL 其次,我无法使其可靠地工作。出于某种原因,它似乎只能在其他时间(或那里)工作。可能与'N'的本地函数有关? –

+0

@JordanEldredge,请参阅我的编辑。它似乎为我工作,但它远非一个完整的解决方案。 – romainl

8

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

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

,它会向右转到线下一个号码并执行命令

+1

可惜我只有一个投票给予。这很酷。谢谢! – sarnold

+0

那么,这回答奖金问题,并可能会完成工作。这解决了我最常见的情况:“我需要将这个盒子多于5个像素”。如果可能的话,我仍然很想知道如何改变(覆盖)一个整数。如果这样的功能不存在(或者很快出现在这里),你有我的答案。谢谢! –

+1

告诉你真相我还没有找到任何方式来改变这种整数,让我们给一些时间来看看是否有人可以将这些信息附加到 – Hassek

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目视从第一到第二标记
+0

该死的读取真的好像我在键盘上滚动我的头像 – epsilonhalbe

+0

谁知道?也许人们可以用这种方式提出一个有用的正则表达式。有人有尖尖的尖头。 – romainl

+0

我很自豪我的头在键盘上滚动了它的第一个正则表达式 - 我会庆祝的,也许它会得到一个新的发型,因此它可以在所有字母上滚动。 – epsilonhalbe

相关问题