Vimに「小さな削除」をレジスタ「1」に保存させることもできますか?


14

YankRingプラグインを最近セットアップから削除しましたが、これはマクロにいくつかの問題を引き起こしていたためですが、主に、代わりにVimのレジスターを使用するように訓練する方が良いと判断したためです。さらに削除が行われるにつれて、などに"1移動し"2"3非常に便利です。

ただし、削除/変更によって1行未満のテキストが"-削除されると、代わりに小さな削除レジスタに保存されます(特定の移動コマンドにはいくつかの例外があります)。後続の小さな削除が行われると、そのテキストの一部は失われます。

Vimですべての削除をレジスタに保存することは可能"1ですか?

nnoremap d "1d ほとんど動作しますが、レジスタ"1 との 両方にテキストが表示されます"2

小さな削除レジスタの機能が影響を受けるかどうかは気にしません。名前付きレジスタに小さな削除を保存するように振る舞いを変更することを提案することは、間違いなく有用な答えではありません-それは私が現在していることです。

回答:


10

あなたはとき、これは古いのVim 7.3のバージョンでの作業に使用し:set clipboard=unnamedます(このRedditの議論をバグの結果として、私はここで報告しました

このスレッドには、'regone'オプションを導入するAryeh Leib Taurogによるパッチが含まれています。これにより、(非常に長い)todoリストに追加されましたが、すぐには組み込まれそうにありません。そのため、現在のところ、古いVimにダウングレードするか、そのパッチを使用して自分でVimをビルドする(そしてvim_devメーリングリストで採用をプッシュする)オプションしかありません。


1
面白い!(特にしきい値についてのあなたの考え。)情報をありがとう。暫定的にこれを行うために、誰かがクレイジーなVimScriptを思い付くように促すために、当分の間、賛成票/承認を控えるつもりです。
リッチ

5

dモーションを使用したコマンドとビジュアルモードで機能する概念実証ソリューションがあります。それは完全に堅牢なソリューションではありませんはまだありません(例えば、d[count]d仕事をしない、とどちらもありません[count]D)、それは非常に、ほぼすべての私の実際の使用例をカバーしています。

以下の顧客オペレーター機能を設定することにより機能します。

  1. レジスタ1〜8の内容を辞書に保存します。
  2. レジスタ1への削除を実行します
  3. レジスター2〜9を、以前に保存したレジスター1〜8の内容に設定します。

:help map-operator演算子関数の動作方法の説明を参照してください。

function! ShiftingDeleteOperator(type)
  let reg_dict = {}
  for k in range(1, 8)
    execute printf("let reg_dict[%d]=getreg('%d', 1)", k, k)
  endfor

  if a:type ==# 'v'
    execute 'normal! `<v`>d'
  elseif a:type ==# 'V'
    execute 'normal! `<V`>d'
  elseif a:type ==# "\<C-V>"
    execute "normal! `<\<C-V>`>d"
  elseif a:type ==# 'char'
    execute 'normal! `[v`]d'
  elseif a:type ==# 'line'
    execute "normal! '[V']d"
  else
    return
  endif

  let deleted = getreg('"', 1)
  call setreg(1, deleted)

  for [k, v] in items(reg_dict)
    execute printf("call setreg(%d, v)", k + 1)
  endfor
endfunction

" Call the function for d{motion} via operatorfunc
nnoremap <silent> d :set operatorfunc=ShiftingDeleteOperator<CR>g@
" Call the function when d or x are hit in visual mode
vnoremap d :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
vnoremap x :<C-U>call ShiftingDeleteOperator(visualmode())<CR>
" Use the d{motion} as defined above to add limited support for `D` command
nmap D d$
" Use the standard dd command
nnoremap dd dd 

古い回答についてコメントして申し訳ありません。私は、このソリューションを採用yしてcますがためにc、私のnvimはアクションの後、挿入モードに入りません...現在私が持っているにexecute lしてstartinsertいる適切な修正(のようではないc$間違った位置にカーソルを置きます)。何か案は?
サニーしゃれ

2

neovimエディターにプルリクエストをチェックアウトします。

[RFC]小規模な削除に番号付きレジスタを使用するオプションを追加#8169

smalldelオプションを追加しようとしました。このオプションを使用すると、削除された文字の最小数を設定して、番号付きレジスター「1 ..」9にプッシュできます

このPRがマージされた後の次のneovimリリース(これが発生した場合)には、このオプションが含まれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.