如何防止vim替代移动光标

y1aodyip  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(155)

我工作的公司对源文件使用特殊的头文件,其中包含最后修改的日期。
我编写了一个Vim脚本,它在每次缓冲区写入时自动更新此日期。
我正在使用搜索/替换功能来完成这个任务。
现在的问题是,替换操作确实会将光标移到文件的开头,这非常烦人,因为在每次写入缓冲区时,用户都必须手动跳回到上一个编辑位置。
有没有人知道一种方法可以防止vim在更新日期时跳转,或者至少让它跳回到以前的位置?

yfwxisqw

yfwxisqw1#

您可以使用<C-O>或变更标记````,以互动方式移回原始位置,如vim replace all without cursor moving所示。
在Vimscript中,特别是在每次缓冲区写入时运行此脚本时,我将 Package 代码:

let l:save_view = winsaveview()
    %substitute///
call winrestview(l:save_view)

以前的移动命令可能仍然会影响 * 窗口视图 *(即视口中显示的确切行和列),而此解决方案会将所有内容恢复为原来的样子。

额外奖励

另外,请注意,在:substitute中使用的{pattern}会添加到搜索历史记录中。

call histdel('search', -1)

(The当您在:function中使用此功能时,搜索模式本身不会受到影响。)
或者使用Vim8:

keeppatterns %substitute///

相关插件

我已经在我的AutoAdapt plugin中实现了类似的功能,你也会看到所有这些技巧。

vs3odd8k

vs3odd8k2#

我认为使用函数substitute()可以保存你的changelist和jumplist.在neovim中我使用了一个函数来改变文件修改的日期,方法是:

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|modified): \\zs.*', time , 'gc'))
        l = l + 1
    end

        require("notify")("Changed file header!")
    end
end

相关问题