nvim-telescope / telescope-file-browser.nvim

File Browser extension for telescope.nvim
MIT License
1.6k stars 89 forks source link

The date of file preview is displayed incorrectly in Windows #392

Closed IC0hO closed 1 month ago

IC0hO commented 1 month ago

Description

image Dates are displayed starting with 5

Neovim version

NVIM v0.10.0
Build type: Release
LuaJIT 2.1.1713484068

Operating system and version

Windows 11 22631.3593

Steps to reproduce

  1. Open Neovim in the $HOME directory.
  2. Open the file manager using the :Telescope file_browser command Close the file browser.
  3. When displaying any file information, the date is wrong.

Expected behavior

No response

Actual behavior

image

Minimal config

local root = vim.fn.fnamemodify("./.repro", ":p")

-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "cache" }) do
  vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    lazypath,
  })
end
vim.opt.runtimepath:prepend(lazypath)

-- install plugins
local plugins = {
  {
    "nvim-telescope/telescope-file-browser.nvim",
    dependencies = {
      "nvim-telescope/telescope.nvim",
      "nvim-lua/plenary.nvim",
    },
    config = function()
      require("telescope").setup({})
      require("telescope").load_extension("file_browser")
    end,
  },
}

require("lazy").setup(plugins, {
  root = root .. "/plugins",
})
jamestrew commented 1 month ago

I believe this is caused by system locale rather than it being Windows related. It's trying to render the abbreviated month name using the system locale but your terminal or font or something isn't handling the encoding well.

I'm not too confident this is something I can fix on our end.

IC0hO commented 1 month ago

The display_stat option cannot hide the preview window on the right? If the display is abnormal, it is better to give the user the option to close it.

IC0hO commented 1 month ago

I checked out some information: The behavior of the os.date function is actually determined by the underlying C language's strftime function. The behavior of the strftime function is influenced by the system's locale settings. In certain system locale configurations, the %b format specifier might return month abbreviations in languages other than English, which could potentially cause encoding issues.

The solution I can think of is to treat the date and rows uniformly. I simply modified the code from lines 27 to 38 of fs_stat.lua:

local DATE_HL = "TelescopePreviewDate"
local month_names = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }

M.date = {
  width = 13,
  right_justify = true,
  display = function(entry)
    local mtime = entry.stat.mtime.sec
    local date_table = os.date("*t", mtime)
    local month_abbreviation = month_names[date_table.month]
    local formatted_date = string.format("%s %02d %04d %02d:%02d", month_abbreviation, date_table.day, date_table.year, date_table.hour, date_table.min)
    return { formatted_date, DATE_HL }
  end,
}

Hope this provides some ideas.

jamestrew commented 1 month ago

That is an option but I'm not sure about forcing English month names on everyone. And the idea of the display_stat is to mirror ls -la so I'd prefer to not change the format to something more universal either.

If the display is abnormal, it is better to give the user the option to close it.

You can disable the previewer entirely using the previewer = false option to the file_browser config or just :Telescope file_browser previewer=false.

You can also use preview = { ls_short = true } option to make the previewer not show stats.

I hope that's a good enough compromise.

IC0hO commented 1 month ago

Thank you for your reply. I set it to preview = { ls_short = true } and it looks pretty good now.

jamestrew commented 1 month ago

No worries!