barbar.nvim icon indicating copy to clipboard operation
barbar.nvim copied to clipboard

Buffer jump from inside offset tab will cause tab to move unintentionally

Open Kaesenudeln opened this issue 3 years ago • 11 comments

Description

Buffer jump inside offset tab will cause tab to move.

To Reproduce I enabled tab offset with the setting

vim.api.nvim_create_autocmd('BufWinEnter', {
  pattern = '*',
  callback = function()
    if vim.bo.filetype == 'NvimTree' then
      require'bufferline.state'.set_offset(31, 'FileTree')
    end
  end
})

vim.api.nvim_create_autocmd('BufWinLeave', {
  pattern = '*',
  callback = function()
    if vim.fn.expand('<afile>'):match('NvimTree') then
      require'bufferline.state'.set_offset(0)
    end
  end
})

If I

  1. Open multiple tabs with nvim -p a.md b.md c.md d.md
  2. Use c-n to open my file explorer with an offset tab.
  3. Move the cursor to the file explorer.
  4. Use the command BufferGoto 3
  5. I can see that c.md has been moved to the last.

Informations Neovim version: 0.7.2

Kaesenudeln avatar Aug 08 '22 17:08 Kaesenudeln

Can you post a screencast? I wasn't able to reproduce

Iron-E avatar Aug 10 '22 19:08 Iron-E

https://user-images.githubusercontent.com/68341899/184172452-4244c0b5-42fb-4d18-b76a-3bbed8654f9d.mp4

Please check the video attached.

Kaesenudeln avatar Aug 11 '22 15:08 Kaesenudeln

Can you share your nvim-tree config as well?

Iron-E avatar Aug 11 '22 17:08 Iron-E

-- Unless you are still migrating, remove the deprecated commands from v2.x
vim.cmd([[ let g:neo_tree_remove_legacy_commands = 1 ]])
-- If you want icons for diagnostic errors, you'll need to define them somewhere:
vim.fn.sign_define("DiagnosticSignError",
  {text = " ", texthl = "DiagnosticSignError"})
vim.fn.sign_define("DiagnosticSignWarn",
  {text = " ", texthl = "DiagnosticSignWarn"})
vim.fn.sign_define("DiagnosticSignInfo",
  {text = " ", texthl = "DiagnosticSignInfo"})
vim.fn.sign_define("DiagnosticSignHint",
  {text = "", texthl = "DiagnosticSignHint"})
-- NOTE: this is changed from v1.x, which used the old style of highlight groups
-- in the form "LspDiagnosticsSignWarning"

require("neo-tree").setup({
  close_if_last_window = true, -- Close Neo-tree if it is the last window left in the tab
  popup_border_style = "rounded",
  enable_git_status = true,
  enable_diagnostics = true,
  sort_case_insensitive = false, -- used when sorting files and directories in the tree
  sort_function = nil , -- use a custom function for sorting files and directories in the tree 
  -- sort_function = function (a,b)
  --       if a.type == b.type then
  --           return a.path > b.path
  --       else
  --           return a.type > b.type
  --       end
  --   end , -- this sorts files and directories descendantly
  default_component_configs = {
    container = {
      enable_character_fade = true
    },
    indent = {
      indent_size = 2,
      padding = 1, -- extra padding on left hand side
      -- indent guides
      with_markers = true,
      indent_marker = "│",
      last_indent_marker = "└",
      highlight = "NeoTreeIndentMarker",
      -- expander config, needed for nesting files
      with_expanders = nil, -- if nil and file nesting is enabled, will enable expanders
      expander_collapsed = "",
      expander_expanded = "",
      expander_highlight = "NeoTreeExpander",
    },
    icon = {
      folder_closed = "",
      folder_open = "",
      folder_empty = "ﰊ",
      -- The next two settings are only a fallback, if you use nvim-web-devicons and configure default icons there
      -- then these will never be used.
      default = "*",
      highlight = "NeoTreeFileIcon"
    },
    modified = {
      symbol = "[+]",
      highlight = "NeoTreeModified",
    },
    name = {
      trailing_slash = false,
      use_git_status_colors = true,
      highlight = "NeoTreeFileName",
    },
    git_status = {
      symbols = {
        -- Change type
        added     = "", -- or "✚", but this is redundant info if you use git_status_colors on the name
        modified  = "", -- or "", but this is redundant info if you use git_status_colors on the name
        deleted   = "✖",-- this can only be used in the git_status source
        renamed   = "",-- this can only be used in the git_status source
        -- Status type
        untracked = "",
        ignored   = "",
        unstaged  = "",
        staged    = "",
        conflict  = "",
      }
    },
  },
  window = {
    position = "left",
    width = 35,
    mapping_options = {
      noremap = true,
      nowait = true,
    },
    mappings = {
      -- ["<space>"] = { 
      ["o"] = { 
          "toggle_node", 
          nowait = false, -- disable `nowait` if you have existing combos starting with this char that you want to use 
      },
      ["<2-LeftMouse>"] = "open",
      ["<cr>"] = "open",
      ["S"] = "open_split",
      ["s"] = "open_vsplit",
      -- ["S"] = "split_with_window_picker",
      -- ["s"] = "vsplit_with_window_picker",
      ["t"] = "open_tabnew",
      ["w"] = "open_with_window_picker",
      ["C"] = "close_node",
      ["z"] = "close_all_nodes",
      ["Z"] = "expand_all_nodes",
      ["a"] = { 
        "add",
        -- some commands may take optional config options, see `:h neo-tree-mappings` for details
        config = {
          show_path = "none" -- "none", "relative", "absolute"
        }
      },
      ["A"] = "add_directory", -- also accepts the optional config.show_path option like "add".
      ["d"] = "delete",
      ["r"] = "rename",
      ["y"] = "copy_to_clipboard",
      ["x"] = "cut_to_clipboard",
      ["p"] = "paste_from_clipboard",
      ["c"] = "copy", -- takes text input for destination, also accepts the optional config.show_path option like "add":
      -- ["c"] = {
      --  "copy",
      --  config = {
      --    show_path = "none" -- "none", "relative", "absolute"
      --  }
      --}
      ["m"] = "move", -- takes text input for destination, also accepts the optional config.show_path option like "add".
      ["q"] = "close_window",
      ["R"] = "refresh",
      ["?"] = "show_help",
      ["<"] = "prev_source",
      [">"] = "next_source",
    }
  },
  nesting_rules = {},
  filesystem = {
    filtered_items = {
      visible = false, -- when true, they will just be displayed differently than normal items
      hide_dotfiles = true,
      hide_gitignored = true,
      hide_hidden = true, -- only works on Windows for hidden files/directories
      hide_by_name = {
        --"node_modules"
      },
      hide_by_pattern = { -- uses glob style patterns
        --"*.meta"
      },
      never_show = { -- remains hidden even if visible is toggled to true
        --".DS_Store",
        --"thumbs.db"
      },
    },
    follow_current_file = false, -- This will find and focus the file in the active buffer every
                                 -- time the current file is changed while the tree is open.
    group_empty_dirs = false, -- when true, empty folders will be grouped together
    hijack_netrw_behavior = "open_default", -- netrw disabled, opening a directory opens neo-tree
                                            -- in whatever position is specified in window.position
                          -- "open_current",  -- netrw disabled, opening a directory opens within the
                                            -- window like netrw would, regardless of window.position
                          -- "disabled",    -- netrw left alone, neo-tree does not handle opening dirs
    use_libuv_file_watcher = false, -- This will use the OS level file watchers to detect changes
                                    -- instead of relying on nvim autocmd events.
    window = {
      mappings = {
        ["<bs>"] = "navigate_up",
        ["."] = "set_root",
        ["H"] = "toggle_hidden",
        ["/"] = "fuzzy_finder",
        ["D"] = "fuzzy_finder_directory",
        ["f"] = "filter_on_submit",
        ["<c-x>"] = "clear_filter",
        ["[g"] = "prev_git_modified",
        ["]g"] = "next_git_modified",
      }
    }
  },
  buffers = {
    follow_current_file = true, -- This will find and focus the file in the active buffer every
                                 -- time the current file is changed while the tree is open.
    group_empty_dirs = true, -- when true, empty folders will be grouped together
    show_unloaded = true,
    window = {
      mappings = {
        ["bd"] = "buffer_delete",
        ["<bs>"] = "navigate_up",
        ["."] = "set_root",
      }
    },
  },
  git_status = {
    window = {
      position = "float",
      mappings = {
        ["A"]  = "git_add_all",
        ["gu"] = "git_unstage_file",
        ["ga"] = "git_add_file",
        ["gr"] = "git_revert_file",
        ["gc"] = "git_commit",
        ["gp"] = "git_push",
        ["gg"] = "git_commit_and_push",
      }
    }
  }
})

I am using neo-tree . I haven't checked whether the problem is neo-tree specific. For the sake of readability, I didn't delete the comments in my config.

Kaesenudeln avatar Aug 11 '22 17:08 Kaesenudeln

I just tested neo-tree. It seems that there is some strange behavior with that plugin specifically— it seems to be deleting buffers. Removing these lines specifically seems to make this plugin work as expected.

Iron-E avatar Aug 16 '22 22:08 Iron-E

I tried deleting those lines but it didn't work. Did I miss any steps?

Kaesenudeln avatar Aug 17 '22 14:08 Kaesenudeln

I think I linked the wrong place, sorry. I have set up a fork which works for me

Iron-E avatar Aug 22 '22 20:08 Iron-E

I think I linked the wrong place, sorry. I have set up a fork which works for me

I'm sorry I didn't get the solution here. Could you please specify the code that I should try?

Kaesenudeln avatar Sep 07 '22 08:09 Kaesenudeln

You should source the fork in your config and try to reproduce this issue.

Iron-E avatar Sep 07 '22 15:09 Iron-E

I think I linked the wrong place, sorry. I have set up a fork which works for me

Sorry, I still didn't get what is "the fork in my config" :(
Are you implying the fork you set up? Could you please paste the link to it?

Kaesenudeln avatar Sep 07 '22 17:09 Kaesenudeln

Are you implying the fork you set up?

Yes. It is here

Iron-E avatar Sep 07 '22 18:09 Iron-E

Are you implying the fork you set up?

Yes. It is here

I sourced the fork you created and everything indeed works fine. But the original release still has the same problem. I am using the exact same config for both versions but the result is different.

Kaesenudeln avatar Sep 19 '22 16:09 Kaesenudeln

That makes sense. I created my fork just to confirm that the problem wasn't in the barbar.nvim code, but a precise line of code in neo-tree. To get this fixed, you or I will have to report this incompatibility to them and so they can fix it on their end.

Would you like me to do that, or do you want to report it to them?

Iron-E avatar Sep 22 '22 01:09 Iron-E

That makes sense. I created my fork just to confirm that the problem wasn't in the barbar.nvim code, but a precise line of code in neo-tree. To get this fixed, you or I will have to report this incompatibility to them and so they can fix it on their end.

Would you like me to do that, or do you want to report it to them?

Could you please do that? Though I started to use your fork some days ago, I don't know the lines that made the difference between your fork and the original one. Your work would be much appreciated, thanks.

Kaesenudeln avatar Sep 29 '22 14:09 Kaesenudeln

  • Open multiple tabs with nvim -p a.md b.md c.md d.md
  • Use c-n to open my file explorer with an offset tab.
  • Move the cursor to the file explorer.
  • Use the command BufferGoto 3
  • I can see that c.md has been moved to the last.

If you just remove the "Move the cursor to the file explorer." step, then everything would work fine. There is really no reason to move the cursor to the tree if the intention is to open a file using another plugin. You obviously don't want to open that file within the tree's window, right?

If moving the focus to the tree window is not intentional but just a situation that happens from time to time, BarBar can fix the problem by first issuing a wincmd p in the GoToBuffer code. It can check for that situation by checking the filetype of the current buffer and comparing it to a list of known filetypes, like neo-tree and NvimTree.

cseickel avatar Oct 03 '22 11:10 cseickel