如何遍历vimscript中的寄存器?

如何遍历vimscript中的寄存器?,vim,Vim,我需要将所有没有空字符串的寄存器放入一个列表中 首先,它们是否已经存在于某个列表中 第二,如果没有,有没有更简单的方法将它们放入列表,而不是手动检查它们是否为空 也许我可以创建一个已定义寄存器的列表,并在该列表上使用getreg(),但我想我希望该列表已经存在,所以我不必创建它。没有这样的列表,至少vimscript无法访问。您可以解析由:redir捕获的:silent reg(带有silent:无可见输出,但仍可捕获)的输出,但我不太喜欢此命令(因为“无嵌套重定向”而且,虽然目标变量将在第一次

我需要将所有没有空字符串的寄存器放入一个列表中

首先,它们是否已经存在于某个列表中

第二,如果没有,有没有更简单的方法将它们放入列表,而不是手动检查它们是否为空


也许我可以创建一个已定义寄存器的列表,并在该列表上使用getreg(),但我想我希望该列表已经存在,所以我不必创建它。

没有这样的列表,至少vimscript无法访问。您可以解析由
:redir
捕获的
:silent reg
(带有
silent
:无可见输出,但仍可捕获)的输出,但我不太喜欢此命令(因为“无嵌套重定向”而且,虽然目标变量将在第一次重读发生的地方创建,但它在第二次重读发生的地方填充,并在那里按名称引用,这使得可以向任何变量追加数据或抛出错误,如
E121:Undefined variable
)。我就是不喜欢这种不可预知的命令。

我想到了以下几点:

" Description:
"   Get a list of all the non-empty register indexes
" Example Usage:
"   :call GetNonEmptyRegsIndex( 'print' )    """ To print the registers
"   for n in GetNonEmptyRegsIndex() | echo nr2char(n)." = ".getreg(nr2char(n)) | endfor
" Resources:
"   http://www.ibm.com/developerworks/linux/library/l-vim-script-3/index.html
"   irs channel #vim <jamessan>
function! GetNonEmptyRegsIndex( ... )
  " Create the list of register 'indexes' where the the elements are in char2nr form
  let regnum =  range(char2nr('a'), char2nr('z'))
  let regnum += range(char2nr('0'), char2nr('9'))
  let regstr =  ['"','-','*','%','/','.','#',':']
  let regnum += map(regstr, 'char2nr(v:val)')

  " Remove the registers that are empty
  "let regnum = filter( regnum, 'getreg(nr2char(v:val)) != ""' )
  let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^$"' )

  " Remove the registers that are just spaces
  let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^\s\+$"' )

  " Remove the registers that have no alpha-num
  "let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^\W\+$"' )
  return regnum
endfunction
“说明:
“获取所有非空寄存器索引的列表
“示例用法:
“:调用GetNoneEmptyRegsIndex('print')”,以打印寄存器
“对于getNoneEmptyRegsIndex()中的n,回显nr2char(n)。”=“.getreg(nr2char(n))|结束
“资源:
"   http://www.ibm.com/developerworks/linux/library/l-vim-script-3/index.html
“irs频道#vim
函数!GetNoneEmptyRegsIndex(…)
“创建寄存器‘索引’列表,其中元素为char2nr形式
设regnum=range(char2nr('a'),char2nr('z'))
设regnum+=range(char2nr('0'),char2nr('9'))
让regstr=['“'”、'-'、'*'、'%'、'/'、'.'、'#'、':']
让regnum+=map(regstr'char2nr(v:val)'
“删除空的寄存器
“让regnum=filter(regnum,'getreg(nr2char(v:val))!=”“”
让regnum=filter(regnum,'getreg(nr2char(v:val))!~“^$”)
“删除仅为空格的寄存器
让regnum=filter(regnum,'getreg(nr2char(v:val))!~“^\s\+$”)
“删除没有alpha num的寄存器
“让regnum=filter(regnum,'getreg(nr2char(v:val))!~”^\W\+$”)
返回regnum
端功能
必须从string转换为num,然后再转换回来,这使得代码有点难看,但它可以工作

这是自动完成注册信息的完整工作解决方案。我以后可能会对它进行更多的调整,但它提供了我想要的基本功能

inoremap <F5> <C-R>=AutoCompleteRegs()<CR>

function! AutoCompleteRegs()
  call complete( col('.'), GetNonEmptyRegs() )
  return ''
endfunction

" Description:
"   Get a list of all the non-empty registers.
function! GetNonEmptyRegs()
  " Create the list of register 'indexes' where the the elements are in char2nr form
  let regIndexNum = GetNonEmptyRegsIndex()

  " Convert the list of indexes to values
  let regs = map(regIndexNum, 'getreg(nr2char(v:val))')
  "let regs = map(regs, 'substitute(v:val,  "^(.*)", "\\U\\1", "g")')
  "let regs = map(regs, "echo substitute(v:val,  '^(.*)', '\U\1', 'g')")
  return regs
endfunction

" Description:
"   Get a list of all the non-empty register indexes
" Example Usage:
"   :call GetNonEmptyRegsIndex( 'print' )    """ To print the registers
"   for n in GetNonEmptyRegsIndex() | echo nr2char(n)." = ".getreg(nr2char(n)) | endfor
" Resources:
"   http://www.ibm.com/developerworks/linux/library/l-vim-script-3/index.html
"   irs channel #vim <jamessan>
function! GetNonEmptyRegsIndex( ... )
  " Create the list of register 'indexes' where the the elements are in char2nr form
  let regnum =  range(char2nr('a'), char2nr('z'))
  let regnum += range(char2nr('0'), char2nr('9'))
  let regstr =  ['"','-','*','%','/','.','#',':']
  let regnum += map(regstr, 'char2nr(v:val)')

  " Remove the registers that are empty
  "let regnum = filter( regnum, 'getreg(nr2char(v:val)) != ""' )
  let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^$"' )

  " Remove the registers that are just spaces
  let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^\s\+$"' )

  " Remove the registers that have no alpha-num
  "let regnum = filter( regnum, 'getreg(nr2char(v:val)) !~ "^\W\+$"' )
  return regnum
endfunction
inoremap=autocompleteegs()
功能!自动完成()
调用complete(col('.'),GetNonEmptyRegs())
返回“”
端功能
“说明:
“获取所有非空寄存器的列表。
功能!GetNonEmptyRegs()
“创建寄存器‘索引’列表,其中元素为char2nr形式
让regIndexNum=GetNonEmptyRegsIndex()
“将索引列表转换为值
设regs=map(regIndexNum,'getreg(nr2char(v:val))'))
“让regs=map(regs,'替换(v:val,“^(.*”,“\\U\\1”,“g”)”)
“let regs=map(regs,“echo替换(v:val,,^(.*),,\U\1,,'g')”)
返回注册表
端功能
“说明:
“获取所有非空寄存器索引的列表
“示例用法:
“:调用GetNoneEmptyRegsIndex('print')”,以打印寄存器
“对于getNoneEmptyRegsIndex()中的n,回显nr2char(n)。”=“.getreg(nr2char(n))|结束
“资源:
"   http://www.ibm.com/developerworks/linux/library/l-vim-script-3/index.html
“irs频道#vim
函数!GetNoneEmptyRegsIndex(…)
“创建寄存器‘索引’列表,其中元素为char2nr形式
设regnum=range(char2nr('a'),char2nr('z'))
设regnum+=range(char2nr('0'),char2nr('9'))
让regstr=['“'”、'-'、'*'、'%'、'/'、'.'、'#'、':']
让regnum+=map(regstr'char2nr(v:val)'
“删除空的寄存器
“让regnum=filter(regnum,'getreg(nr2char(v:val))!=”“”
让regnum=filter(regnum,'getreg(nr2char(v:val))!~“^$”)
“删除仅为空格的寄存器
让regnum=filter(regnum,'getreg(nr2char(v:val))!~“^\s\+$”)
“删除没有alpha num的寄存器
“让regnum=filter(regnum,'getreg(nr2char(v:val))!~”^\W\+$”)
返回regnum
端功能

您想实现什么目标?也许还有另一种方法…我想让寄存器更容易使用,这样我就可以开始更多地使用它们了。我想能够自动完成注册。我知道我想做什么,我只是没有看到一个简单的方法来轻松获取所有寄存器。好吧,好吧(据我所知),没有这样的直接解决方案(除了下面提到的那些)。然而,出于“正常”的拉/粘贴目的,有一些插件,如yankring等,它们有一个“yankring窗口”,显示寄存器的内容。有点难以解释,所以你最好自己去看看。对于autocomplete,我不太明白,所以如果你能多说一句关于你想做什么的话。。。也许有人已经做过类似的事情了。现在是凌晨4点,在我的世界里-请原谅那些不连贯的英语:/ldigas:我都明白了。我提供了下面的解决方案来说明我正在尝试做什么。我在让substitute()函数执行我想要的操作时遇到了一点麻烦,但这只是额外的积分。谢谢