如何在VIM中递增 %z 十六进制数?

4

有没有一种方法可以在VIM中增加%z十六进制数呢?通常,我可以通过按下ctrl + a来增加普通数字。但不幸的是,我正在使用一个老式系统,该系统使用%z而不是0x来表示十六进制数。我已经尝试过了。

Set nf=hex

但这仅适用于 0x 十六进制数。有人遇到过这种情况吗?我在谷歌上没有找到太多相关信息。

2
%z 格式是从哪里来的?看起来 vim 只支持 0x 作为十六进制数的前缀,因此你最好将所有的 %z 全局替换为 0x,然后执行宏或其他操作来增加数值,最后再恢复前缀。 - robbyphillips
2个回答

1
我不知道这个前缀%z是什么意思,但我写了一个快速而简单的函数来增加像%z0f这样的数字;这是你想要的吗?然后你应该能够添加一个映射到它上面(但不能用它本身,因为它在函数中使用!),例如::map <C-p> :call MyIncrement()<CR> 当然,你应该根据自己的需要进行定制;第17行重置光标位置以在增加后保持正确的位置;你可以用l:b(或甚至l:a)替换l:c并选择你最喜欢的选项。
function! MyIncrement()
  let l:l = line(".")
  let l:c = col(".")
  let l:a = 0
  let l:b = 0

  let l:s = search('%z[0-9a-f]\+', 'bcW',l:l)
  if l:s == l:l
    let l:a = col(".")
    let l:s = search('%z[0-9a-f]\+', 'ecW',l:l)
    let l:b = col(".")
    if ((l:a<=l:c)&&(l:c<=l:b))
      call cursor(l:l, l:a+2)
      silent exe "normal i 0x\e\<C-a>"
      call cursor(l:l, l:a+2)
      silent exe "normal 3x"
      call cursor(l:l, l:c)
    endif
  endif
endfunction

1
使用 @oobivat 的评论:
:map \a Fza0x<ESC><C-a>Fzlxx

现在,\a -- (请选择更好的键)将会:

  • 在左侧找到z (Fz)
  • 添加0x (a0x<ESC>)
  • 增加十六进制数(<C-a>)
  • 删除0x (Fzlxx)

然而,这个解决方案只在您实际上处于正确的位置时才有效;一旦您在使用它时将字符“z”放在同一行上,很容易出现错误的行为。从这个角度来看,另一个解决方案更加健壮,因为它实际上检查当前位置是否符合所需格式。 - Thomas Baruchel
@Baruchel,我还没有考虑过那个问题!你可能是对的(如果它以可靠的方式工作,那只是纯属运气)。你能指出任何它产生错误行为的情况吗? - JJoao
1
将以下与编程有关的内容从英语翻译成汉语。仅返回翻译文本:将代码行“# 将寄存器x初始化为%z1b”键入,就好像它是您代码中的一种注释; 将光标置于在实际使用中很可能发生的%上并尝试进行映射! - Thomas Baruchel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接