0

ユース ケースは、世界中のすべての (vim) 開発者 (IMHO) によって共有されています。ソース ファイルの書き込み操作ごとにタグタイムスタンプを更新したいと考えています。Barry Arthur の助けを借りた私の試みは次のとおりです。

書き込みごとに更新する文字列の例

# 2013-01-09 01:04:31.0 +0100 / Me <me@domain.tld>

vimrc コード

" if not maped, :x don't call UpdateTimestamp()
map :x :wq
function! UpdateTimestamp()
  let old_pos = getpos('.')
  let old_search = histget("search", -1)
  g/^\(#\|\/\/\)\s\+\d\{4\}-\d\{2\}-\d\{2\}\s\+\d\{2\}:\d\{2\}:\d\{2\}\.\d\+\s\++\d\{4\}\s\+\/\s\+Me <me@domain.tld>.*/s/.*/\="# " . strftime('%F %H:%M:%S.0 %z') . " \/ Me <me@domain.tld>"/
  exe "normal /".old_search
  call setpos('.', old_pos)
endfunction

au BufWrite * call UpdateTimestamp()

解決しない問題

  • タグの更新時に元に戻す履歴を変更しないでください (可能な場合)
  • 書き込み時の画面変更の位置
  • パターンが見つからない場合、画面に不要なエラーが表示される

質問

簡単: これらの問題を解決するには?

4

2 に答える 2

2
  • RE: タグの更新時に履歴を変更するべきではありません 履歴を
    元に戻すという意味ですか? それは Vim の設計に反します。すべての変更を表す必要があります。あなたができる最善のことは ですが:undojoin、これは混乱を招くと思います。

  • RE: 書き込み時の画面変更の位置 の代わりに/
    を使用する必要があります。winsaveview()winrestview()setpos()

  • RE: パターンが見つからない場合、画面に望ましくないエラーが表示されますの最後にフラグを
    渡し、 の前に追加します。/e:substitute:silent!:global

PS: vim.org には、あなたが望むことを行うプラグインがあると思います。それらのいくつかを試しましたか?

于 2013-01-09T00:46:24.387 に答える
1

位置を保存/復元する必要はまったくありません。どちらも使用setpos()winrestview()ず、カーソルを移動することもできません。検索を保存/復元するためのトリックも必要ありません: の代わりに関数を使用してsearch()ください::gsetline()s/.*/\=

function! UpdateTimestamp()
  " Removed “.*” from the end of the pattern because it is pointless
  " Also made it use very-magic mode because otherwise it looks bad (too many escapes)
  " Also replaced \d\{2\} with \d\d because \d\d takes less characters
  let lnr=search('\v^(\#|\/\/)\s+\d{4}\-\d\d\-\d\d\s+\d\d\:\d\d\:\d\d\.\d+\s+\+\d{4}\s+\/\s+\VMe <me@domain.tld>', 'wn')
  if lnr
    " Matchstr gets comment leader. Above regex intended to work with # or // comments, but \=expression supported only the former, this got fixed
    call setline(lnr, matchstr(getline(lnr), '^\S\+')." " . strftime('%F %H:%M:%S.0 %z') . " / Me <me@domain.tld>")
  endif
endfunction

. 注: あなたと私のソリューションにはまだ 1 つの違いがあります。ここでは、タイムスタンプが 1 つだけ更新されます。この問題は修正できます。

于 2013-01-09T16:22:25.177 に答える