如何制作Vim';s全局命令:g/基于每次事件的工作

如何制作Vim';s全局命令:g/基于每次事件的工作,vim,Vim,通常,Vim的全局命令:g//基于每行工作。有没有可能让它在每次事件的基础上工作,因为一行中可能有多个事件。这不是一个直接的答案,但您可以使用类似于:rubydo的东西,它将在每行代码中运行一些ruby scriptlet。结合ruby中的gsub,您应该能够在每次匹配时做任何事情。当然,您需要使用ruby代码来完成这项工作,而ruby代码可能无法让您轻松地访问您可能需要的所有内容(例如,注册附加会很烦人) :[range]rubyd[o]{cmd}为 [range],其中$\被设置为中每行的文

通常,Vim的全局命令:g//基于每行工作。有没有可能让它在每次事件的基础上工作,因为一行中可能有多个事件。

这不是一个直接的答案,但您可以使用类似于:rubydo的东西,它将在每行代码中运行一些ruby scriptlet。结合ruby中的gsub,您应该能够在每次匹配时做任何事情。当然,您需要使用ruby代码来完成这项工作,而ruby代码可能无法让您轻松地访问您可能需要的所有内容(例如,注册附加会很烦人)

:[range]rubyd[o]{cmd}为
[range],其中$\被设置为中每行的文本
转弯,没有尾随。设置$将更改
文本,但请注意,无法添加或
使用此命令删除行。
[range]的默认值是整个文件:“1,$”。
您可以尝试:

command! -bang -nargs=1 -range OGlobal 
    \ <line1>,<line2>call s:Global("<bang>", <f-args>)

function! s:Global(bang, param) range
  let inverse = a:bang == '!'

  " obtain the separator character
  let sep = a:param[0]
  " obtain all fields in the initial command
  let fields = split(a:param, sep)

  " todo: handle inverse
  let l = a:firstline
  while 1
    let l = search(fields[0], 'W')
    if l == -1 || l > a:lastline 
      break 
    endif
    exe fields[1]
  endwhile
endfunction
命令-bang-nargs=1-范围OGlobal
\,调用s:Global(“,)
功能!s:全局(爆炸,参数)范围
让倒数=a:bang=='!'
“获取分隔符字符
设sep=a:param[0]
“获取初始命令中的所有字段
let fields=split(a:param,sep)
“todo:句柄反转”
设l=a:第一行
而1
设l=搜索(字段[0],“W”)
如果l==-1 | | l>a:lastline
打破
恩迪夫
exe字段[1]
循环结束
端功能

您可以将其用作
:global
,但命令名不同(且bang选项尚未实现)

回答这个问题需要有关vim脚本的知识。好吧,SU不是关于编程的——而答案需要编程技能…@Don:即使这不需要编写解决方案的脚本(因为功能不是内置的),这仍然是正确的地方。每次发生这种情况时,您需要做什么操作?如果您不受线路限制,为什么需要一个在线工作的操作员?
command! -bang -nargs=1 -range OGlobal 
    \ <line1>,<line2>call s:Global("<bang>", <f-args>)

function! s:Global(bang, param) range
  let inverse = a:bang == '!'

  " obtain the separator character
  let sep = a:param[0]
  " obtain all fields in the initial command
  let fields = split(a:param, sep)

  " todo: handle inverse
  let l = a:firstline
  while 1
    let l = search(fields[0], 'W')
    if l == -1 || l > a:lastline 
      break 
    endif
    exe fields[1]
  endwhile
endfunction