Currently I am using a git hook to update file headings:
https://dev.to/voyeg3r/update-your-files-header-using-git-hooks-460c
Update the line "Last Change" each time your file is saved
I love the level of automation that vim/neovim allows us to achieve, just for give you an example, I have the following function in my ~/.config/nvim/lua/core/utils.lua
-- ~/.config/nvim/lua/core/utils.lua
local M = {}
M.changeheader = function()
-- We only can run this function if the file is modifiable
local bufnr = vim.api.nvim_get_current_buf()
if not vim.api.nvim_buf_get_option(bufnr, "modifiable") then
require("notify")("Current file not modifiable!")
return
end
-- if not vim.api.nvim_buf_get_option(bufnr, "modified") then
-- require("notify")("Current file has not changed!")
-- return
-- end
if vim.fn.line("$") >= 7 then
os.setlocale("en_US.UTF-8") -- show Sun instead of dom (portuguese)
local time = os.date("%a, %d %b %Y %H:%M:%S")
local l = 1
while l <= 7 do
vim.fn.setline(l, vim.fn.substitute(vim.fn.getline(l), 'last change: \\zs.*', time , 'gc'))
l = l + 1
end
if vim.fn.search('\\vlast (change|update):?', 'wncp') > 0 then
require("notify")("Changed file header!")
end
end
end
return M
The function is triggered in the autocommands file:
local augroups = {}
augroups.misc = {
change_header = {
event = "BufWritePre",
pattern = "*",
callback = function()
require('core.utils').changeheader()
end,
},
}
for group, commands in pairs(augroups) do
local augroup = vim.api.nvim_create_augroup("AU_"..group, {clear = true})
for _, opts in pairs(commands) do
local event = opts.event
opts.event = nil
opts.group = augroup
vim.api.nvim_create_autocmd(event, opts)
end
end
The great advantage of using the function substitute()
along with setline()
is that your changelist and your jumplist will not be changed.
Tips about keeping your files timestamp
When copying files on Linux use the option -p
, "preserve" to keep the timestamp.
I have a bunch of files in my personal wiki where I wanted to fix the "Last Change:" line, about 600 files. I used this script to fix the issue:
(
cd ~/.dotfiles/wiki || exit
for file in *.md; do
echo "Modificando o arquivo $file .."
t=$(stat -c "%y" "$file") # original timestamp
new_date=$(date -r "$file" +'%a, %d %b %Y - %H:%M:%S')
sed -i "1,7s/\(Last Change: \).*/\1 $new_date/g" "$file"
# sed -i '1,7{/^[Cc]reated:/d}' "$file" # in this case delete lines with pattern
touch -d "$t" "$file"
done
)
Basically:
1 - Store the timestamp in a variable
2 - Use date -r
to get a string to use in sed
3 - Use sed to change the line "Last Change:"
4 - Restore the timestamp using the variable from the step 1
Top comments (1)
I have just added a test, just in case the file does not have "Last Change/Update" on it the message does not appear.