Vimで強調表示された取り消し


12

spacemacsのデフォルト設定のように、Vimで強調表示された取り消しをしようとしています。すぐに元に戻す操作が必要な場合は、瞬時に変更されるため、何が変わったのかわからないことがあります。だから私はプレスが元に戻すときにこのような何かをしようとしています:

強調表示された元に戻す

誰でもVimでこれを行う方法を知っていますか?

(すでにGundoプラグインを持っています。デフォルトの取り消しをよりスムーズにしたいだけです)

編集undotreeプラグインの仕事は(ないGundoが変更をハイライト表示されません)だけを使用UndotreeToggleコマンドを、ファイル上のすべての将来の変更が強調表示されます。


良いアイデア。を使用してハイライトを作成できますmatchadd()が、ファイルのどの部分が変更されたかを調べるのが少し難しくなります。
-joeytwiddle

おそらく、元に戻す前に一時的なバッファ/ファイルに保存し、元に戻す後に2番目のバッファ/ファイルに保存し、前のものをクリーニング(または色を変更)した後に新しい差分を強調表示します。大きなファイルの場合は遅くなる可能性があります。
ヴァンレーザー

UndoTreeは変更された行を実際に強調表示しますが、リアルタイムでは強調表示しません。GNU diffを使用していると思います。単語の粒度を取得することは追加の手順になります(たとえば、単語の区切りで行を分割する、diff、行を再結合する)。
joeytwiddle

これらのプラグインは近づいていますが、それでも行ベースです。smeargleは最後の保存以降に変更された行を強調表示できます。changesPluginは、左側の余白に変更された行(削除を含む)をマークします。
joeytwiddle

1
@ joeytwiddle、changesPluginは最後の変更領域を強調表示することもできます
クリスチャンブラバンド

回答:


6

新しいソリューション

:changesコマンドを使用して、最後の変更を表示できます。そのため、最新の行の変更を正規表現でmatchadd()修正し、@ joeytwiddleの提案に従って行を適用できます。

コードは次のとおりです。

function! DiffWithPrevious()
  call clearmatches()
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=green guibg=green
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction

  • この関数は古いハイライトを削除せずに新しいハイライトを追加するだけなので、最初に古いハイライトを削除する必要があります。このclearmatches機能を使用すると、新しいものを追加する前に一致を削除できます。慎重に、すべての一致を削除します。さらに細かくしたい場合は、一致を保存して手動で削除できます。

例えば

function! DiffWithPrevious()
  call matchdelete(m)
  ... 
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
  • いくつかのテストの後、1行の変更でのみ機能することがわかりました。

参考資料:


古いソリューション

主にDiffカレントバッファーと元のファイルに触発された、考えられる解決策を次に示します

function! DiffWithPrevious()
  undo
  write
  redo
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction

このアイデアは、ファイルをシステム上のファイルと比較することです。したがって、最後の変更を取り消し、書き込み、ラスの変更をやり直し、差分を実行します。

私は、これが時々の時間差分視覚化の仕事をするべきだと思います。


DiffWithPrevious()のメッセージ「バッファ」をクリアする方法はありますか?関数が最後の変更だけを強調表示したいのですが、ハイライトは時間の経過とともに蓄積され、message = 0またはmessage = ""のようなことを試みていますが、成功していません。
tjbrn

もちろん、答えを更新します。
nobe4


2

私と同じことを試みている人にとって、それは答えのおかげで私が到達した最も近いものです。

function! DiffWithPrevious()
  call clearmatches()
  undo
  redir => message
  silent changes
  redir END
  let line = matchstr(message, '\v\n\s{4}1[^0-9]*\zs\d+\ze')
  highlight TemporalDiff ctermbg=black guibg=black
  let m = matchadd('TemporalDiff', '\%'.line.'l')
  redraw
  let gchar = getchar()
  highlight TemporalDiff ctermbg=none guibg=none
  let m = matchadd('TemporalDiff', '\%'.line.'l')
endfunction
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.