Giter Site home page Giter Site logo

coc-explorer's Introduction

coc-explorer

Explorer extension for coc.nvim

Note: This project is still under development and may be broken.

Build Status

Screenshot

image

Requirements

>= vim 8.1.1418 or >= neovim 0.3.1

Usage

  1. Install by coc.nvim command:
    :CocInstall coc-explorer
    
  2. Configuration custom vim mapping
    :nmap <space>e <Cmd>CocCommand explorer<CR>
    
  3. Open explorer
    <space>e
    
  4. Press ? to show mappings help

More at Quickstart

Feature

  • Buffer source
    • Highlight visible buffers in real time
  • File tree source
    • Basic actions
      • Open file in select / vsplit / tab explorer.openAction.strategy options:
        • select: Open action use selection UI
        • vsplit: Open action use vsplit
        • split: Open action use split
        • tab: Open action use tab
        • previousBuffer: Open action use last used buffer
        • previousWindow: Open action use last used window
        • sourceWindow: Open action use the window where explorer opened
      • Selection
      • Cut / Copy / Paste
      • Delete action use trash by default
      • Other actions, press ? in explorer to check out the all actions
    • Git status
    • Automatically reveal the current file
    • Icons, use nerdfont
    • Search files by Coc-list
    • Preview file attributes by floating window
    • LSP
      • diagnostic
      • file rename (won't support, use watchman)
    • Exrename, like defx
    • Archive file (use lsar / unar)
    • SSH
  • Bookmark source (DEPRECATED) (require coc-bookmark)
  • Git source
    • Git actions
  • Show help

Command

:CocCommand explorer [options] [root-uri]

User events

  • CocExplorerOpenPre: triggered before open explorer
  • CocExplorerOpenPost: triggered after open explorer
  • CocExplorerQuitPre: triggered before quit explorer
  • CocExplorerQuitPost: triggered after quit explorer

Example

:CocCommand explorer
    \ --toggle
    \ --sources=buffer+,file+
    \ /root/path

Reveal to current buffer for closest coc-explorer

nmap <Leader>er <Cmd>call CocAction('runCommand', 'explorer.doAction', 'closest', ['reveal:0'], [['relative', 0, 'file']])<CR>

Presets

let g:coc_explorer_global_presets = {
\   '.vim': {
\     'root-uri': '~/.vim',
\   },
\   'cocConfig': {
\      'root-uri': '~/.config/coc',
\   },
\   'tab': {
\     'position': 'tab',
\     'quit-on-open': v:true,
\   },
\   'tab:$': {
\     'position': 'tab:$',
\     'quit-on-open': v:true,
\   },
\   'floating': {
\     'position': 'floating',
\     'open-action-strategy': 'sourceWindow',
\   },
\   'floatingTop': {
\     'position': 'floating',
\     'floating-position': 'center-top',
\     'open-action-strategy': 'sourceWindow',
\   },
\   'floatingLeftside': {
\     'position': 'floating',
\     'floating-position': 'left-center',
\     'floating-width': 50,
\     'open-action-strategy': 'sourceWindow',
\   },
\   'floatingRightside': {
\     'position': 'floating',
\     'floating-position': 'right-center',
\     'floating-width': 50,
\     'open-action-strategy': 'sourceWindow',
\   },
\   'simplify': {
\     'file-child-template': '[selection | clip | 1] [indent][icon | 1] [filename omitCenter 1]'
\   },
\   'buffer': {
\     'sources': [{'name': 'buffer', 'expand': v:true}]
\   },
\ }

" Use preset argument to open it
nmap <space>ed <Cmd>CocCommand explorer --preset .vim<CR>
nmap <space>ef <Cmd>CocCommand explorer --preset floating<CR>
nmap <space>ec <Cmd>CocCommand explorer --preset cocConfig<CR>
nmap <space>eb <Cmd>CocCommand explorer --preset buffer<CR>

" List all presets
nmap <space>el <Cmd>CocList explPresets<CR>

Options

[root-uri]

Explorer root, default is use root-strategies

--root-strategies <root-strategies>

Strategies for root uri, types list of (keep | workspace | cwd | sourceBuffer | reveal | custom:name)

  • keep: never change the root path
  • workspace: workspace.root
  • cwd: getcwd()
  • sourceBuffer: directory of buffer
  • reveal: directory of reveal path

default is: workspace,cwd,sourceBuffer,reveal or "explorer.root.strategies" of coc-settings

Custom root patterns settings

{
  "explorer.root.customRules": {
    "vcs": {
      "patterns": [".git", ".hg", ".projections.json"]
    },
    "vcs-r": {
      "patterns": [".git", ".hg", ".projections.json"],
      "bottomUp": true
    }
  }
}

Using custom root patterns

{
  "explorer.root.strategies": ["workspace", "custom:vcs", "custom:vcs-r"]
}

or :CocCommand explorer --root-strategies workspace,custom:vcs,custom:vcs-r

--preset <name>

Open explorer use presets

--toggle | --no-toggle

Close the explorer if it exists, default: --toggle

--focus | --no-focus

Focus to explorer when opened, default: --focus

--open-action-strategy <strategy>

Strategy for open action, types: select | vsplit | split | tab | previousBuffer | previousWindow | sourceWindow, default: select

--quit-on-open | --no-quit-on-open

quit explorer when open action, default: --no-quit-on-open

--sources <sources>

Explorer sources, example: buffer+,file+, default: buffer-,file+

              expand
      collapsed โ”‚
          โ†“     โ†“
    buffer-,file+
    โ””โ”€โ”€โ”ฌโ”€โ”˜  โ””โ”€โ”ฌโ”˜
buffer source โ”‚
          file source

--position <position>

Explorer position, supported position: left, right, tab, tab:0, tab:$, floating, default: left

--width <number>

Width of Explorer window for open in left or right side, default: 40

--content-width <number>

Content width, default: 0

--content-width-type <type>

Type of content width, types: win-width, vim-width, , default: vim-width

--floating-position <position>

Explorer position for floating window, positions:

  • left-center
  • center
  • right-center
  • center-top
  • <number for left>,<number for top>

default: center

--floating-width <number>

Width of Explorer window when position is floating, use negative value or zero to as width - value, default: 0

--floating-height <number>

Height of Explorer window when position is floating, use negative value or zero to as height - value, default: 0

--floating-content-width <number>

Width of content when position is floating, use negative value or zero to as width - value, default: 0

--buffer-root-template <template>

Template for root node of buffer source

Columns:

  • icon
  • hidden
  • title

default: [icon] [title] [hidden & 1]

--buffer-child-template <template>

Template for child node of buffer source

Columns:

  • selection
  • name
  • bufname
  • modified
  • bufnr
  • readonly
  • fullpath

default: [selection | 1] [bufnr] [name][modified][readonly] [fullpath]

--buffer-child-labeling-template <template>

Labeling template for child node of buffer source, use for preview when previewAction is labeling

Columns: same with --buffer-child-template

default: [name][bufname][fullpath][modified][readonly]

--file-root-template <template>

Template for root node of file source

Columns:

  • icon
  • hidden
  • title
  • root
  • fullpath

default: [icon] [title] [hidden & 1][root] [fullpath]

--file-root-labeling-template <template>

Labeling template for root node of file source, use for preview when previewAction is labeling

Columns: same with --file-root-template

default: [fullpath]

--file-child-template <template>

Template for child node file source

Columns:

  • git
  • selection
  • icon
  • filename
  • linkIcon
  • link
  • fullpath
  • indent
  • clip
  • size
  • readonly
  • modified
  • timeModified
  • timeCreated
  • timeAccessed
  • diagnosticError
  • diagnosticWarning

default: [git | 2] [selection | clip | 1] [indent][icon | 1] [diagnosticError & 1][filename omitCenter 1][modified][readonly] [linkIcon & 1][link growRight 1 omitCenter 5][size]

--file-child-labeling-template <template>

Labeling template for child node of file source, use for preview when previewAction is labeling

Columns: same with --file-child-template

default: [fullpath][link][diagnosticWarning][diagnosticError][size][timeAccessed][timeModified][timeCreated][readonly][modified]

--bookmark-root-template <template>

Template for root node of bookmark source

Columns:

  • icon
  • hidden
  • title

default: [icon] [title] [hidden & 1]

--bookmark-child-template <template>

Template for child node of bookmark source

Columns:

  • selection
  • position
  • filename
  • fullpath
  • line
  • annotation

default: [selection | 1] [filename] [position]

--bookmark-child-labeling-template <template>

Labeling template for child node of bookmark source, use for preview when previewAction is labeling

Columns: same with --bookmark-child-template

default: [filename][fullpath][position][line][annotation]

--reveal <filepath>

Explorer will expand to this filepath, default: current buffer

--reveal-when-open | --no-reveal-when-open

Explorer will automatically reveal to the current buffer when open explorer, default: "explorer.file.reveal.whenOpen"

Template grammar

Example:

[git | 2] [selection | clip | 1] [diagnosticError & 1][filename growRight 1 omitCenter 5]
  • [git]
    • Display git.
  • [git | 2]
    • If git is not empty, display git, otherwise display 2 spaces.
  • [selection | clip | 1]
    • Checking selection and clip in turn, if one is not empty, display it, otherwise display 1 spaces.
  • [diagnosticError & 1]
    • If diagnosticError is empty, display nothing. otherwise display diagnosticError and 1 space.
  • [filename growRight 1 omitCenter 5]
    • Flexible to display filename, grow right column volume is 1, omit center volume is 5

Grammar:

                      block
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
[selection | clip | 1] [filename growRight 1 omitCenter 5]
                      โ†‘
                 plain string

            column
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚                     โ”‚   volume of modifier
     โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
 โ”Œโ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”   โ”Œโ”€โ”ดโ”   โ†“   โ”Œโ”€โ”€โ”ดโ”€โ”€โ”€โ”           โ†“            โ†“
[selection | clip | 1] [filename growRight 1 omitCenter 5]
           โ†‘      โ†‘              โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜
           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           modifier

Custom mappings example

You can use ? to view all actions of current source

// coc-settings.json
{
  "explorer.keyMappings.global": {
    "i": false, // cancel default mapkey
    "<c-o>": "noop",

    "*": "toggleSelection",
    "<tab>": "actionMenu",

    "gk": ["wait", "expandablePrev"],
    "gj": ["wait", "expandableNext"],
    "h": ["wait", "collapse"],
    "l": ["wait", "expandable?", "expand", "open"],
    "J": ["wait", "toggleSelection", "normal:j"],
    "K": ["wait", "toggleSelection", "normal:k"],
    "gl": ["wait", "expand:recursive"],
    "gh": ["wait", "collapse:recursive"],
    "<2-LeftMouse>": [
      "expandable?",
      ["expanded?", "collapse", "expand"],
      "open"
    ],
    "o": ["wait", "expanded?", "collapse", "expand"],
    "<cr>": ["wait", "expandable?", "cd", "open"],
    "e": "open",
    "s": "open:split",
    "E": "open:vsplit",
    "t": "open:tab",
    "<bs>": ["wait", "gotoParent"],
    "gs": ["wait", "reveal:select"],
    "il": "preview:labeling",
    "ic": "preview:content",
    "Il": "previewOnHover:toggle:labeling",
    "Ic": "previewOnHover:toggle:content",
    "II": "previewOnHover:disable",

    "yp": "copyFilepath",
    "yn": "copyFilename",
    "yy": "copyFile",
    "dd": "cutFile",
    "p": "pasteFile",
    "df": "delete",
    "dF": "deleteForever",

    "a": "addFile",
    "A": "addDirectory",
    "r": "rename",

    "zh": "toggleHidden",
    "g<dot>": "toggleHidden",
    "R": "refresh",

    "?": "help",
    "q": "quit",
    "<esc>": "esc",
    "X": "systemExecute",
    "gd": "listDrive",

    "f": "search",
    "F": "searchRecursive",

    "gf": "gotoSource:file",
    "gb": "gotoSource:buffer",

    "[[": ["wait", "sourcePrev"],
    "]]": ["wait", "sourceNext"],

    "[i": ["wait", "indentPrev"],
    "]i": ["wait", "indentNext"],

    "[m": ["wait", "markPrev:modified"],
    "]m": ["wait", "markNext:modified"],

    "[d": ["wait", "markPrev:diagnosticError:diagnosticWarning"],
    "]d": ["wait", "markNext:diagnosticError:diagnosticWarning"],
    "[D": ["wait", "markPrev:diagnosticError"],
    "]D": ["wait", "markNext:diagnosticError"],

    "[c": ["wait", "markPrev:git"],
    "]c": ["wait", "markNext:git"],
    "<<": "gitStage",
    ">>": "gitUnstage"
  }
}

WIKI

FAQ

Example by Vim API and event hooks

function! s:explorer_cur_dir()
  let node_info = CocAction('runCommand', 'explorer.getNodeInfo', 0)
  return fnamemodify(node_info['fullpath'], ':h')
endfunction

function! s:exec_cur_dir(cmd)
  let dir = s:explorer_cur_dir()
  execute 'cd ' . dir
  execute a:cmd
endfunction

function! s:init_explorer()
  set winblend=10

  " Integration with other plugins

  " CocList
  nmap <buffer> <Leader>fg <Cmd>call <SID>exec_cur_dir('CocList -I grep')<CR>
  nmap <buffer> <Leader>fG <Cmd>call <SID>exec_cur_dir('CocList -I grep -regex')<CR>
  nmap <buffer> <C-p> <Cmd>call <SID>exec_cur_dir('CocList files')<CR>

  " vim-floaterm
  nmap <buffer> <Leader>ft <Cmd>call <SID>exec_cur_dir('FloatermNew --wintype=floating')<CR>
endfunction

function! s:enter_explorer()
  if &filetype == 'coc-explorer'
    " statusline
    setl statusline=coc-explorer
  endif
endfunction

augroup CocExplorerCustom
  autocmd!
  autocmd BufEnter * call <SID>enter_explorer()
  autocmd FileType coc-explorer call <SID>init_explorer()
augroup END

more API: https://github.com/weirongxu/coc-explorer/wiki/Vim-API

Settings

Commands

explorer: Open explorer.

Configuration

Definitions

Position: Position. Type:
'left' | 'right' | 'tab' | 'floating'
MappingActionExp: MappingActionExp. Type:
MappingAction | MappingActionExp[]
MappingAction: MappingAction. Type:
string | {
    name?: string;
    args?: string[];
    [k: string]: unknown;
}
PreviewActionStrategy: PreviewActionStrategy. Type:
'labeling' | 'content'
RootStrategy: RootStrategy. Type:
'keep' | 'workspace' | 'cwd' | 'sourceBuffer' | 'reveal'
Properties
explorer.presets: Explorer presets. Type:
{
    [k: string]: {
        'root-uri'?: string;
        /**
         * Close the explorer if it exists
         */
        toggle?: boolean;
        /**
         * Focus to explorer when opened
         */
        focus?: boolean;
        /**
         * Strategy for open action
         */
        'open-action-strategy'?: 'select' | 'split' | 'split.plain' | 'split.intelligent' | 'vsplit' | 'vsplit.plain' | 'vsplit.intelligent' | 'tab' | 'previousBuffer' | 'previousWindow' | 'sourceWindow';
        /**
         * quit explorer when open action
         */
        'quit-on-open'?: boolean;
        reveal?: string;
        /**
         * Explorer sources
         */
        sources?: {
            /**
             * Explorer source name
             */
            name: 'bookmark' | 'buffer' | 'file';
            /**
             * Whether to expand it by default
             */
            expand: boolean;
            [k: string]: unknown;
        }[];
        /**
         * Explorer position
         */
        position?: Position | [
            Position
        ] | [
            Position,
            string
        ];
        /**
         * Width of explorer window for open in left or right side
         */
        width?: number;
        /**
         * Content width, use negative value or zero to as `width - value`
         */
        'content-width'?: number;
        /**
         * Type of content width
         */
        'content-width-type'?: 'win-width' | 'vim-width';
        /**
         * Position of Explorer for floating window
         */
        'floating-position'?: ('left-center' | 'right-center' | 'center' | 'center-top') | [
            number,
            number
        ];
        /**
         * Width of explorer window when position is floating, use negative value or zero to as `width - value`
         */
        'floating-width'?: number;
        /**
         * Height of explorer window when position is floating, use negative value or zero to as `height - value`
         */
        'floating-height'?: number;
        /**
         * Width of content when position is floating, use negative value or zero to as `width - value`
         */
        'floating-content-width'?: number;
        /**
         * Template for root node of buffer source
         */
        'buffer-root-template'?: string;
        /**
         * Template for child node of buffer source
         */
        'buffer-child-template'?: string;
        /**
         * Labeling template for child node of buffer source, use for preview when previewAction is labeling
         */
        'buffer-child-labeling-template'?: string;
        /**
         * Template for root node of file source
         */
        'file-root-template'?: string;
        /**
         * Labeling template for root node of file source, use for preview when previewAction is labeling
         */
        'file-root-labeling-template'?: string;
        /**
         * Template for child node file source
         */
        'file-child-template'?: string;
        /**
         * Labeling template for child node of file source, use for preview when previewAction is labeling
         */
        'file-child-labeling-template'?: string;
        [k: string]: unknown;
    };
}
Default:
null
explorer.mouseMode: Mouse mode. Type:
'none' | 'singleclick' | 'doubleclick'
Default:
"doubleclick"
explorer.keyMappingMode: Keymapping mode. Type:
'none' | 'default'
Default:
"default"
explorer.keyMappings.global: Custom global key mappings. Type:
{
    [k: string]: MappingActionExp | false;
}
Default:
{}
explorer.keyMappings.vmap: Custom vmap key mappings. Type:
{
    [k: string]: MappingActionExp | false;
}
Default:
{}
explorer.keyMappings.sources: Custom key mappings in source. Type:
{
    [k: string]: {
        [k: string]: MappingActionExp | false;
    };
}
Default:
{}
explorer.toggle: Close the explorer if it exists. Type:
boolean
Default:
true
explorer.focus: Focus to explorer when opened. Type:
boolean
Default:
true
explorer.position: Explorer position. Type:
Position | [
    Position
] | [
    Position,
    string
]
Default:
"left"
explorer.width: Width of explorer window for open in left or right side. Type:
number
Default:
40
explorer.contentWidth: Content width, use negative value or zero to as `width - value`. Type:
number
Default:
0
explorer.contentWidthType: Type of content width. Type:
'win-width' | 'vim-width'
Default:
"vim-width"
explorer.floating.position: Position of Explorer for floating window. Type:
('left-center' | 'right-center' | 'center' | 'center-top') | [
    number,
    number
]
Default:
"center"
explorer.floating.width: Width of explorer window when position is floating, use negative value or zero to as `width - value`. Type:
number
Default:
-10
explorer.floating.height: Height of explorer window when position is floating, use negative value or zero to as `height - value`. Type:
number
Default:
-10
explorer.floating.contentWidth: Width of content when position is floating, use negative value or zero to as `width - value`. Type:
number
Default:
0
explorer.floating.border.enable: . Type:
boolean
Default:
true
explorer.floating.border.chars: Border chars for floating window, their order is top/right/bottom/left/topleft/topright/botright/botleft. Type:
string[]
Default:
[
  "โ”€",
  "โ”‚",
  "โ”€",
  "โ”‚",
  "โ”Œ",
  "โ”",
  "โ”˜",
  "โ””"
]
explorer.floating.border.title: . Type:
string
Default:
"coc-explorer"
explorer.floating.hideOnCocList: Hide floating window, when opening CocList. Type:
boolean
Default:
true
explorer.autoExpandMaxDepth: Automatically expand maximum depth of one time. Type:
number
Default:
20
explorer.autoExpandOptions: Automatically expand options. Type:
('recursive' | 'compact' | 'uncompact' | 'recursiveSingle')[]
Default:
[
  "compact",
  "uncompact"
]
explorer.autoCollapseOptions: Automatically collapse options. Type:
'recursive'[]
Default:
[
  "recursive"
]
explorer.quitOnOpen: quit explorer when open action. Type:
boolean
Default:
false
explorer.previewAction.onHover: Open preview when hovering over on node. Type:
false | PreviewActionStrategy | [
    PreviewActionStrategy,
    number
]
Default:
false
explorer.previewAction.content.maxHeight: Preview content maximum height. Type:
number
Default:
30
explorer.openAction.strategy: Strategy for open action. Type:
'select' | 'split' | 'split.plain' | 'split.intelligent' | 'vsplit' | 'vsplit.plain' | 'vsplit.intelligent' | 'tab' | 'previousBuffer' | 'previousWindow' | 'sourceWindow'
Default:
"select"
explorer.openAction.select.filter: Filter windows for select strategy. Type:
BufferFilter & {
    /**
     * Filter windows for select strategy in source
     */
    sources?: {
        [k: string]: BufferFilter;
    };
    [k: string]: unknown;
}
Default:
{
  "buftypes": [
    "terminal"
  ],
  "filetypes": [
    "vista",
    "vista_kind",
    "qf",
    "tagbar",
    "coctree"
  ],
  "floatingWindows": true,
  "sources": {
    "buffer": {
      "buftypes": []
    }
  }
}
explorer.openAction.for.directory: The action when you open a directory of file source. Type:
MappingAction | MappingActionExp[]
Default:
"cd"
explorer.openAction.relativePath: Use relative path when open a file with openAction. Type:
boolean
Default:
false
explorer.expandStores: The expand stores of sources. Type:
boolean | {
    includes: string[];
} | {
    excludes: string[];
}
Default:
true
explorer.sources: Explorer sources. Type:
{
    /**
     * Explorer source name
     */
    name: 'bookmark' | 'buffer' | 'file';
    /**
     * Whether to expand it by default
     */
    expand: boolean;
    [k: string]: unknown;
}[]
Default:
[
  {
    "name": "bookmark",
    "expand": false
  },
  {
    "name": "buffer",
    "expand": false
  },
  {
    "name": "file",
    "expand": true
  }
]
explorer.root.strategies: Strategies for root uri. Type:
(RootStrategy | string)[]
Default:
[
  "workspace",
  "cwd",
  "sourceBuffer",
  "reveal"
]
explorer.root.customRules: Patterns for root uri. Type:
{
    [k: string]: {
        patterns: string[];
        /**
         * Search outward from the current buffer, default is false
         */
        bottomUp?: boolean;
        [k: string]: unknown;
    };
}
Default:
null
explorer.enableFloatinput: Enable integrated with coc-floatinput. Type:
boolean
Default:
true
explorer.icon.enableNerdfont: Enable nerdfont. Type:
boolean
Default:
false
explorer.icon.source: The source or file type icon and color. Type:
'builtin' | 'vim-devicons' | 'nvim-web-devicons' | 'nerdfont.vim'
Default:
"builtin"
explorer.icon.customIcons: Custom icons and color highlights. Type:
{
    /**
     * Icons for extension groups
     */
    icons?: {
        /**
         * Icon for an extension group
         */
        [k: string]: {
            /**
             * Group icon
             */
            code: string;
            /**
             * Group icon color
             */
            color: string;
            [k: string]: unknown;
        };
    };
    /**
     * File extension to icon group
     */
    extensions?: {
        [k: string]: unknown;
    };
    /**
     * Filename to icon group
     */
    filenames?: {
        [k: string]: unknown;
    };
    /**
     * Filename to icon group
     */
    dirnames?: {
        [k: string]: unknown;
    };
    /**
     * Pattern to icon group
     */
    patternMatches?: {
        [k: string]: unknown;
    };
    /**
     * Pattern to icon group
     */
    dirPatternMatches?: {
        [k: string]: unknown;
    };
    [k: string]: unknown;
}
Default:
{
  "icons": {},
  "extensions": {},
  "filenames": {},
  "dirnames": {},
  "patternMatches": {},
  "dirPatternMatches": {}
}
explorer.icon.expanded: Icon for expanded node. Type:
string
Default:
"-"
explorer.icon.collapsed: Icon for collapsed node. Type:
string
Default:
"+"
explorer.icon.selected: Selection selected chars for File source. Type:
string
Default:
"โœ“"
explorer.icon.hidden: Icon for hidden status. Type:
string
Default:
"โ€ฅ"
explorer.icon.link: Icon for soft link. Type:
string
Default:
"โ†’"
explorer.icon.readonly: Icon for readonly. Type:
string
Default:
"RO"
explorer.bookmark.root.template: Template for root node of bookmark source. Type:
string
Default:
"[icon] [title] [hidden & 1]"
explorer.bookmark.child.template: Template for child node of bookmark source. Type:
string
Default:
"[selection | 1] [filename] [position] - [annotation]"
explorer.bookmark.child.labelingTemplate: Labeling template for child node of bookmark source, use for preview when previewAction is labeling. Type:
string
Default:
"[filename][fullpath][position][line][annotation]"
explorer.buffer.showHiddenBuffers: Default show hidden buffers. Type:
boolean
Default:
false
explorer.buffer.tabOnly: Default only show buffers in current tab. Type:
boolean
Default:
false
explorer.buffer.root.template: Template for root node of buffer source. Type:
string
Default:
"[icon] [title] [hidden & 1]"
explorer.buffer.child.template: Template for child node of buffer source. Type:
string
Default:
"[git | 2] [selection | 1] [bufnr] [name][modified][readonly] [fullpath]"
explorer.buffer.child.labelingTemplate: Labeling template for child node of buffer source, use for preview when previewAction is labeling. Type:
string
Default:
"[name][bufname][fullpath][modified][readonly][diagnosticError][diagnosticWarning][git]"
explorer.datetime.format: Explorer datetime format, check out https://date-fns.org/v2.9.0/docs/format. Type:
string
Default:
"yy/MM/dd HH:mm:ss"
explorer.file.reveal.whenOpen: Explorer will automatically reveal to the current buffer when open explorer. Type:
boolean
Default:
true
explorer.file.reveal.auto: Explorer will automatically reveal to the current buffer when enter a buffer. Type:
boolean
Default:
false
explorer.file.reveal.filter: Exlorer will not automatically reveal to these buffers. Type:
{
    /**
     * Filter buffer by RegExp
     */
    patterns?: string[];
    /**
     * Filter buffer by literal string
     */
    literals?: string[];
    [k: string]: unknown;
}
Default:
{}
explorer.file.hiddenRules: Custom hidden rules for file. Type:
{
    extensions?: string[];
    filenames?: string[];
    /**
     * Pattern to icon group
     */
    patternMatches?: unknown[];
    [k: string]: unknown;
}
Default:
{
  "extensions": [
    "o",
    "a",
    "obj",
    "pyc"
  ],
  "filenames": [],
  "patternMatches": [
    "^\\."
  ]
}
explorer.file.showHiddenFiles: Default show hidden files. Type:
boolean
Default:
false
explorer.file.root.template: Template for root node of file source. Type:
string
Default:
"[icon] [title] [git & 1][hidden & 1][root] [fullpath]"
explorer.file.root.labelingTemplate: Labeling template for root node of file source, use for preview when previewAction is labeling. Type:
string
Default:
"[fullpath][git]"
explorer.file.child.template: Template for child node file source. Type:
string
Default:
"[git | 2] [selection | clip | 1] [indent][icon | 1] [diagnosticError & 1][filename omitCenter 1][modified][readonly] [linkIcon & 1][link growRight 1 omitCenter 5][size]"
explorer.file.child.labelingTemplate: Labeling template for child node of file source, use for preview when previewAction is labeling. Type:
string
Default:
"[fullpath][link][diagnosticError][diagnosticWarning][git][size][timeAccessed][timeModified][timeCreated][readonly][modified]"
explorer.file.column.link.copy: Whether the file has been copied. Type:
string
Default:
null
explorer.file.column.clip.copy: Whether the file has been copied. Type:
string
Default:
null
explorer.file.column.clip.cut: Whether the file has been cut. Type:
string
Default:
null
explorer.file.column.indent.chars: Indent chars for file source. Type:
string
Default:
"  "
explorer.file.column.indent.indentLine: Whether to display the alignment line. Type:
boolean
Default:
null
explorer.file.cdCommand: Change directory when performing the cd action. Type:
false | 'cd' | 'tcd'
Default:
false
explorer.filename.colored.enable: Enable colored filenames based on status. Type:
boolean | {
    diagnosticError?: boolean;
    diagnosticWarning?: boolean;
    git?: boolean;
    [k: string]: unknown;
}
Default:
true
explorer.file.git.showUntrackedFiles: Show untracked file in git. Type:
boolean | 'system'
Default:
null
explorer.trash.command: Trash command template, arguments(%s source filepath, %l source filepath list), example: 'trash-put %l', 'mv --backup=t %l ~/.trash/'. Type:
('nodejs:module' | 'trash-put %s') | string
Default:
"nodejs:module"
explorer.diagnostic.displayMax: Maximum count of diagnostic column. Type:
number
Default:
99
explorer.diagnostic.enableSubscriptNumber: Subscript number for diagnostic count. Type:
boolean
Default:
false
explorer.git.enable: Enable git. Type:
boolean
Default:
true
explorer.git.command: Git command. Type:
string
Default:
"git"
explorer.git.icon.rootStatus.stashed: Icon for a stash exists for the local repository. Type:
string
Default:
"$"
explorer.git.icon.rootStatus.ahead: Icon for current branch ahead of upstream. Type:
string
Default:
"โ‡ก"
explorer.git.icon.rootStatus.behind: Icon for current branch behind upstream. Type:
string
Default:
"โ‡ฃ"
explorer.git.icon.rootStatus.conflicted: Icon for current branch has merge conflicts. Type:
string
Default:
"="
explorer.git.icon.rootStatus.untracked: Icon for there are untracked files in the working directory. Type:
string
Default:
"?"
explorer.git.icon.rootStatus.modified: Icon for there are file modifications in the working directory. Type:
string
Default:
"~"
explorer.git.icon.rootStatus.added: Icon for a new file has been added to the staging area. Type:
string
Default:
"+"
explorer.git.icon.rootStatus.renamed: Icon for a renamed file has been added to the staging area. Type:
string
Default:
"โ†’"
explorer.git.icon.rootStatus.deleted: Icon for a file's deletion has been added to the staging area. Type:
string
Default:
"โœ—"
explorer.git.icon.status.mixed: Icon for git mixed status. Type:
string
Default:
"*"
explorer.git.icon.status.unmodified: Icon for git unmodified status. Type:
string
Default:
" "
explorer.git.icon.status.modified: Icon for git modified status. Type:
string
Default:
"M"
explorer.git.icon.status.added: Icon for git added status. Type:
string
Default:
"A"
explorer.git.icon.status.deleted: Icon for git removed status. Type:
string
Default:
"D"
explorer.git.icon.status.renamed: Icon for git renamed status. Type:
string
Default:
"R"
explorer.git.icon.status.copied: Icon for git copied status. Type:
string
Default:
"C"
explorer.git.icon.status.unmerged: Icon for git unmerged status. Type:
string
Default:
"U"
explorer.git.icon.status.untracked: Icon for git untracked status. Type:
string
Default:
"?"
explorer.git.icon.status.ignored: Icon for git ignored status. Type:
string
Default:
"!"
explorer.git.showIgnored: Show ignored files in git. Type:
boolean
Default:
true
explorer.debug: Enable debug. Type:
boolean
Default:
false

Inspired by

coc-explorer's People

Contributors

alps2006 avatar alwc avatar asheq avatar chau-bao-long avatar danilamihailov avatar dependabot-preview[bot] avatar dependabot[bot] avatar goldfishpi avatar gopherj avatar hdspray avatar ic-768 avatar jacobmischka avatar kassio avatar lapingenieur avatar monlih avatar robin239 avatar straydragon avatar tcx4c70 avatar unrealapex avatar voldikss avatar weirongxu avatar wsdjeg avatar ytian81 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

coc-explorer's Issues

'Rename' action throws an error when the target file already exists

Hi @weirongxu

Description

Suppose there are two files a.txt and b.txt in one directory and I want to rename a.txt to b.txt. After executing rename action the extension throws an error

[coc.nvim] Error: Target file or directory /home/voldikss/dotfiles/README.md already exists

Expected

  • If the target file already exist
    • If the target file is the source file itself(e.g. rename a.txt to a.txt), do nothing
    • Otherwise show a prompt with an option such as override? and ...

Development documentation

Hi, this plugin is interesting to me and I want to work on it.
Is there any documentation I can use for local development?

coc-explorer leaves a explorer buffer when 'quitOnOpen' is set

  • coc-settings.json:
{
  "explorer.sources": [
    {
      "name": "buffer",
      "expand": false
    },
    {
      "name": "file",
      "expand": true
    }
  ],
  "explorer.quitOnOpen": true, /////////////
  "explorer.keyMappings": {
    "<space>": "toggleSelection"
  },
  "explorer.icon.enableNerdfont": false
}
  • mini.vim: same as coc-explorer/mini_vimrc/mini.vim

Steps to reproduce

  • ge to open explorer
  • open a file
  • :q<CR>. And then nvim will show an error message "No write since last change for buffer [coc-explorer]..." and redirect me to a buffer which contains the following stuff.
<113|+|113> <112|[BUFFER]|112>
<104|-|104> <102|[FILE]:|102> <103|coc-explorer|103> <105|/home/voldikss/code/coc-explorer|105>
   <9|+|9> <9|autoload/|9><10|                               |10> <95|    4.1 kB|95> <97|19/11/01 16:58:16|97> 
   <9|+|9> <9|lib/|9><10|                                    |10> <95|    4.1 kB|95> <97|19/11/01 17:07:37|97> 
 <7|M|7> <9|+|9> <9|mini_vimrc/|9><10|                             |10> <95|    4.1 kB|95> <97|19/11/01 23:21:47|97> 
   <9|+|9> <9|node_modules/|9><10|                           |10> <95|   20.5 kB|95> <97|19/11/01 17:07:37|97> 
   <9|+|9> <9|scripts/|9><10|                                |10> <95|    4.1 kB|95> <97|19/11/01 16:58:16|97> 
   <9|+|9> <9|src/|9><10|                                    |10> <95|    4.1 kB|95> <97|19/11/01 16:58:16|97> 
     jest.config.js<10|                          |10> <95|      70 B|95> <97|19/11/01 16:58:16|97> 
     LICENSE<10|                                 |10> <95|   1.07 kB|95> <97|19/11/01 16:58:16|97> 
     memos.json<10|                              |10> <95|       2 B|95> <97|19/11/01 23:17:23|97> 
     package.json<10|                            |10> <95|     11 kB|95> <97|19/11/01 16:58:16|97> 
     readme.md<10|                               |10> <95|   8.33 kB|95> <97|19/11/01 16:58:16|97> 
     tsconfig.json<10|                           |10> <95|     307 B|95> <97|19/11/01 16:58:16|97> 
     tsconfig.prod.json<10|                      |10> <95|      78 B|95> <97|19/11/01 16:58:16|97> 
     tslint.json<10|                             |10> <95|     344 B|95> <97|19/11/01 16:58:16|97> 
     webpack.config.js<10|                       |10> <95|     733 B|95> <97|19/11/01 16:58:16|97> 
     yarn.lock<10|                               |10> <95|    233 kB|95> <97|19/11/01 16:58:16|97> 

[Feature Request]: Toggles to show only buffers for this tab or not

When I was thinking about the difference between tab and buffer, I saw this question on stackoverflow: Why do Vim experts prefer buffers over tabs?

Someone said

"Vim experts" don't prefer buffers over tabs: they use buffers as the file proxies they are and tab pages as the workspaces they are

I love this idea. Because of this, I really need a feature that manages buffers of different tabs separately. So far, I only found that bufexplorer can do this.

I really appreciate this extension, could you add a feature like this?

[Feature]: Display node attribute by floating preview

New format for command and coc-settings.json

--file-columns=git:selection:clip:diagnosticError:indent:icon:filename;fullpath;size;modified;readonly
{
  "columns": [
	"git",
    "selection",
    "clip",
    "diagnosticError",
    "indent",
    "icon",
	"filename",
    ["fullpath"],
    ["size"],
    ["modified"],
    ["readonly"],
  ]
}

Match the colorscheme

What do you think that coc-explorer match the current colorscheme like defx nerdtree?
image

[question] open with current buffer path as root

I'm trying to open the explorer with the current buffer as root path.

I first tried the NerdTree wat with no luck on %:

nnoremap ,, :CocCommand explorer --toggle --sources=buffer+,file+ --file-columns=git,selection,clip,indent,filename %<CR>

Now trying this, also with no luck:

function! ExploreCurrentBufferHead()
  return ':CocCommand explorer --sources=buffer+,file+ --file-columns=git,selection,clip,indent,filename ' . expand('%:h')
endfunction

nnoremap <expr> ,, ExploreCurrentBufferHead() <CR>

Could you help me please?

[Feature Request] Separate file and folder actions for <cr>

In at least some other tree plugins (ones that have apparently formed a strong muscle memory for me ๐Ÿ˜„), hitting cr on a file opens it, and hitting cr on a folder will expand or collapse it. It would be nice if coc-explorer had an option to enable that behavior; maybe separate file and folder actions for cr, or an option to change what "open" does by default with folders.

[Feature]: Unified asynchronous event to avoid over-render

if (!workspace.env.isVim) {
events.on(
['BufCreate', 'BufHidden', 'BufUnload', 'BufWritePost', 'InsertLeave'],
debounce(500, async () => {
await this.reload(null);
}),
);
} else if (workspace.env.isVim) {
onBufEnter(500, async (bufnr) => {
if (bufnr === this.explorer.bufnr) {
await this.reload(null, { render: false });
}
});
}

if (!workspace.env.isVim) {
if (autoReveal) {
onBufEnter(200, async (bufnr) => {
if (bufnr !== this.explorer.bufnr) {
const bufinfo = await nvim.call('getbufinfo', [bufnr]);
if (bufinfo[0] && bufinfo[0].name) {
const item = await this.revealItemByPath(bufinfo[0].name as string);
if (item !== null) {
await execNotifyBlock(async () => {
await this.render({ storeCursor: false, notify: true });
await this.gotoItem(item, { notify: true });
nvim.command('redraw', true);
});
}
}
}
});
}
events.on(
'BufWritePost',
debounce(1000, async (bufnr) => {
const bufinfo = await nvim.call('getbufinfo', [bufnr]);
if (bufinfo[0] && bufinfo[0].name) {
await gitManager.reload(pathLib.dirname(bufinfo[0].name as string), this.showHiddenFiles);
await this.render();
}
}),
);
events.on(
['InsertLeave', 'TextChanged'],
debounce(1000, async () => {
let needRender = false;
if (fileColumnManager.columns.includes('diagnosticError')) {
if (diagnosticManager.errorReload()) {
needRender = true;
}
}
if (fileColumnManager.columns.includes('diagnosticWarning')) {
if (diagnosticManager.warningReload()) {
needRender = true;
}
}
if (needRender) {
await this.render();
}
}),
);
} else {
onBufEnter(200, async (bufnr) => {
if (bufnr === this.explorer.bufnr) {
await this.reload(null);
}
});
}
}, 30);

[Feature Request] Remove padding after filename column

There is a large amount of white space added after the filename. I'm assuming it's there for a reason but it would be great to be able to turn it off so that columns can be added after the filename. I had a look but couldn't figure out where it is coming from.

This is an example what I'd like to have:

Imgur

I have a very hacky fix here if more clarification is needed:

Error installing on Ubuntu 19.10

Firstly this is such an amazing plugin ๐Ÿš€ thanks for building it ๐Ÿ‘

I've tried it on a macbook and it installs and works fine without any issues, but I tried installing it on a laptop using ubuntu 19.10 and I'm getting errors trying to install it.

## versions

vim version: NVIM v0.5.0-dev
node version: v12.13.0
coc.nvim version: 0.0.74
term: tmux-256color
platform: linux
[coc.nvim] Installed extension: coc-explorer
[coc.nvim] Error on load extension coc-explorer from /home/username/.config/coc/extensions/node_modules/coc-explorer/lib/index.js: Error: Cannot find module 'trash'
Require stack:
- /home/username/.config/coc/extensions/node_modules/coc-explorer/lib/index.js
- /home/username/.config/coc/extensions/node_modules/coc-explorer/lib/index.js

I went into the coc-explorer directory to try and see what happens if I add the trash module manually and I get

Insufficient number of arguments or no entry found.
Alternatively, run 'webpack(-cli) --help' for usage info.

Hash: 9cd1ba0f17437bf8135b
Version: webpack 4.41.2
Time: 24ms
Built at: 11/02/2019 10:52:26

ERROR in Entry module not found: Error: Can't resolve './src' in '/home/username/.config/coc/extensions/node_modules/coc-explorer'

Not sure if this is the real underlying error or just a different thing. I've tried debugging this myself but I'm not very familiar with how coc extensions work, I'd appreciate any help

keyMappings and the control key

When mapping a key using keyMappings, is it possible to use the Control key?

Example coc-settings.json:

{
...
"explorer.keyMappings": {
  "<ctrl v>": "toggleSelection"
  },
...
}

Thanks!

Focus

Is there any way to focus the explorer window if it's already open ?
Thanks

Random characters in explorer

I have my dotfiles directory and when I open the explorer I see the following

image

I ran :CocCommand workspace.showOutput and nothing shows up when I open the explorer. So not sure why its doing it.

Using `l` or `enter` key on file opens select window UI

Hello! Thank you for such an awesome plugin! โค๏ธ

When using l or Enter key on directory everything works fine, folder opens as intented.
But when I try to open a file with l or Enter it shows the select window UI. Here's the screenshot:

How can I figure out what breaks the default l and Enter in coc-explorer buffer? Thanks!

Alignment issue with git icons

Hi,

I have a weird alignment issue when files have a git status different than "nothing":

image

This is the same with or without nerdfonts enabled.

My config:

  "explorer.quitOnOpen": true,
  "explorer.file.autoReveal": true,
  "explorer.icon.enableNerdfont": true,
  "explorer.file.column.indent.topLevel": false,

I tried to set the unmodified icon to a single space to force alignment but it didn't change anything.

Latest neovim on ubuntu 19.10 and kitty

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.