3

空の文字列を持たないすべてのレジスタをリストに入れる必要があります。

まず第一に、それらはすでにどこかのリストに存在しますか?

第二に、そうでない場合、手動ですべてを調べて空かどうかを確認するよりも、簡単にリストに入れる方法はありますか?

定義済みレジスタのリストを作成し、そのリストに対して getreg() を使用することもできますが、リストが既に存在することを望んでいたので、作成する必要はありませんでした。

4

2 に答える 2

2

これが私が思いついたものです:

" 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

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
于 2012-06-18T00:30:31.847 に答える
1

そのようなリストはありません。少なくともvimscriptではアクセスできません。:silent regによってキャプチャされた(silent表示された出力はありませんが、キャプチャ可能です)の出力を解析できますが:redir、このコマンドはあまり好きではありません(「ネストされたリダイレクトがない」ため、ターゲット変数がその場所に作成されるため)最初のredirが発生する場所では、2番目のredirが発生する場所にデータが入力され、そこで名前で参照されるため、任意の変数にデータを追加したり、E121: Undefined variable)のようなエラーをスローしたりできます。私はそのような予測不可能なコマンドが好きではありません。

于 2012-06-17T21:15:44.130 に答える