vim 中使用 `/` 搜索时, 可以在每个 buffer 执行不同的搜索且不互相影响吗?

vim版本: 7.4 huge version.

使用中会有 多个 buffer, 一个tab 内会有多个 split window, 会有多个 tab.

可以在一个vim进程中多个buffer间分别进行搜索且不会互相影响吗?

阅读 4k
2 个回答

Vim 的 tab 只是显示的容器
真正存在的只有 buffer

@依云 给你提了利用BufEnter/BufLeave 事件的建议
那我帮你补完代码

augroup SearchKeyword
    autocmd!
    autocmd BufEnter * let @/ = exists('b:keyword') ? b:keyword : ''
    autocmd BufLeave * let b:keyword = @/
augroup END

  • nohlsearchautocmd 中无效, 已删除

你可以自己写插件的。
在 BufLeave 事件记录 @/ 到局部于缓冲区的变量(b:),在 BufEnter 时做相反的操作。
by @依云


多年后的今天我还是没有学会 vimscript,但是在 neovim 的帮助下,我终于可以用 lua 来实现这个功能了。由于与之前其他人的思路不一样,补充以下

local api = vim.api

local search_in_win = (function()
  local ns = api.nvim_create_namespace("search-in-win")
  local last
  return function(win_id, pattern)
    assert(win_id ~= nil and pattern ~= nil)

    if last ~= nil then
      vim.fn.matchdelete(ns, win_id)
      local same_search = pattern == last
      last = nil
      if same_search then return end
    end

    local matches = vim.fn.matchadd("Search", pattern, nil, ns, { window = win_id })
    last = pattern
    vim.notify(string.format("matched %d result", matches))
  end
end)()

do
  -- similar to `nmap *`
  local win_id = api.nvim_get_current_win()
  local keyword = vim.fn.expand("<cword>")
  if keyword ~= "" then search_in_win(win_id, keyword) end
end

(由于是从我的配置中摘抄出来的,以上代码仅作参考,实际使用会很多限制;这里几乎都是用的 vim builtin function,用 nvim lua api 也能实现相似功能,不过稍显麻烦,所以这里以前者实现)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进