Функция Neovim «Последнее изменение»


Обновление строки «Последнее изменение» при каждом сохранении файла

Мне нравится уровень автоматизации, которого позволяет достичь 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.

Оцените статью
devanswers.ru
Добавить комментарий