Обновление строки «Последнее изменение» при каждом сохранении файла
Мне нравится уровень автоматизации, которого позволяет достичь vim/neovim, просто для примера, у меня есть следующая функция в моем ~/.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
Функция запускается в файле автокоманд:
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
Большим преимуществом использования функции substitute()
вместе с setline()
является то, что ваш changelist и ваш jumplist не будут изменены.
Советы по сохранению временных меток ваших файлов
При копировании файлов в Linux используйте опцию -p
, «preserve», чтобы сохранить временную метку.
У меня есть куча файлов в моей личной вики, где я хотел исправить строку «Last Change:», около 600 файлов. Я использовал этот скрипт для исправления проблемы:
(
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
)
В основном:
1 — Храним метку времени в переменной
2 — Используйте date -r
, чтобы получить строку для использования в sed
3 — Используйте sed для изменения строки «Last Change:».
4 — Восстановите временную метку, используя переменную из шага 1.