citadel

My dotfiles, scripts and nix configs
git clone git://jb55.com/citadel
Log | Files | Refs | README | LICENSE

fs_menu.vim (7022B)


      1 " ============================================================================
      2 " File:        fs_menu.vim
      3 " Description: plugin for the NERD Tree that provides a file system menu
      4 " Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
      5 " Last Change: 17 July, 2009
      6 " License:     This program is free software. It comes without any warranty,
      7 "              to the extent permitted by applicable law. You can redistribute
      8 "              it and/or modify it under the terms of the Do What The Fuck You
      9 "              Want To Public License, Version 2, as published by Sam Hocevar.
     10 "              See http://sam.zoy.org/wtfpl/COPYING for more details.
     11 "
     12 " ============================================================================
     13 if exists("g:loaded_nerdtree_fs_menu")
     14     finish
     15 endif
     16 let g:loaded_nerdtree_fs_menu = 1
     17 
     18 call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'})
     19 call NERDTreeAddMenuItem({'text': '(m)ove the curent node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
     20 call NERDTreeAddMenuItem({'text': '(d)elete the curent node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
     21 if g:NERDTreePath.CopyingSupported()
     22     call NERDTreeAddMenuItem({'text': '(c)copy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
     23 endif
     24 
     25 "FUNCTION: s:echo(msg){{{1
     26 function! s:echo(msg)
     27     redraw
     28     echomsg "NERDTree: " . a:msg
     29 endfunction
     30 
     31 "FUNCTION: s:echoWarning(msg){{{1
     32 function! s:echoWarning(msg)
     33     echohl warningmsg
     34     call s:echo(a:msg)
     35     echohl normal
     36 endfunction
     37 
     38 "FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1
     39 "prints out the given msg and, if the user responds by pushing 'y' then the
     40 "buffer with the given bufnum is deleted
     41 "
     42 "Args:
     43 "bufnum: the buffer that may be deleted
     44 "msg: a message that will be echoed to the user asking them if they wish to
     45 "     del the buffer
     46 function! s:promptToDelBuffer(bufnum, msg)
     47     echo a:msg
     48     if nr2char(getchar()) ==# 'y'
     49         exec "silent bdelete! " . a:bufnum
     50     endif
     51 endfunction
     52 
     53 "FUNCTION: NERDTreeAddNode(){{{1
     54 function! NERDTreeAddNode()
     55     let curDirNode = g:NERDTreeDirNode.GetSelected()
     56 
     57     let newNodeName = input("Add a childnode\n".
     58                           \ "==========================================================\n".
     59                           \ "Enter the dir/file name to be created. Dirs end with a '/'\n" .
     60                           \ "", curDirNode.path.str({'format': 'Glob'}) . g:NERDTreePath.Slash())
     61 
     62     if newNodeName ==# ''
     63         call s:echo("Node Creation Aborted.")
     64         return
     65     endif
     66 
     67     try
     68         let newPath = g:NERDTreePath.Create(newNodeName)
     69         let parentNode = b:NERDTreeRoot.findNode(newPath.getParent())
     70 
     71         let newTreeNode = g:NERDTreeFileNode.New(newPath)
     72         if parentNode.isOpen || !empty(parentNode.children)
     73             call parentNode.addChild(newTreeNode, 1)
     74             call NERDTreeRender()
     75             call newTreeNode.putCursorHere(1, 0)
     76         endif
     77     catch /^NERDTree/
     78         call s:echoWarning("Node Not Created.")
     79     endtry
     80 endfunction
     81 
     82 "FUNCTION: NERDTreeMoveNode(){{{1
     83 function! NERDTreeMoveNode()
     84     let curNode = g:NERDTreeFileNode.GetSelected()
     85     let newNodePath = input("Rename the current node\n" .
     86                           \ "==========================================================\n" .
     87                           \ "Enter the new path for the node:                          \n" .
     88                           \ "", curNode.path.str())
     89 
     90     if newNodePath ==# ''
     91         call s:echo("Node Renaming Aborted.")
     92         return
     93     endif
     94 
     95     try
     96         let bufnum = bufnr(curNode.path.str())
     97 
     98         call curNode.rename(newNodePath)
     99         call NERDTreeRender()
    100 
    101         "if the node is open in a buffer, ask the user if they want to
    102         "close that buffer
    103         if bufnum != -1
    104             let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
    105             call s:promptToDelBuffer(bufnum, prompt)
    106         endif
    107 
    108         call curNode.putCursorHere(1, 0)
    109 
    110         redraw
    111     catch /^NERDTree/
    112         call s:echoWarning("Node Not Renamed.")
    113     endtry
    114 endfunction
    115 
    116 " FUNCTION: NERDTreeDeleteNode() {{{1
    117 function! NERDTreeDeleteNode()
    118     let currentNode = g:NERDTreeFileNode.GetSelected()
    119     let confirmed = 0
    120 
    121     if currentNode.path.isDirectory
    122         let choice =input("Delete the current node\n" .
    123                          \ "==========================================================\n" .
    124                          \ "STOP! To delete this entire directory, type 'yes'\n" .
    125                          \ "" . currentNode.path.str() . ": ")
    126         let confirmed = choice ==# 'yes'
    127     else
    128         echo "Delete the current node\n" .
    129            \ "==========================================================\n".
    130            \ "Are you sure you wish to delete the node:\n" .
    131            \ "" . currentNode.path.str() . " (yN):"
    132         let choice = nr2char(getchar())
    133         let confirmed = choice ==# 'y'
    134     endif
    135 
    136 
    137     if confirmed
    138         try
    139             call currentNode.delete()
    140             call NERDTreeRender()
    141 
    142             "if the node is open in a buffer, ask the user if they want to
    143             "close that buffer
    144             let bufnum = bufnr(currentNode.path.str())
    145             if buflisted(bufnum)
    146                 let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
    147                 call s:promptToDelBuffer(bufnum, prompt)
    148             endif
    149 
    150             redraw
    151         catch /^NERDTree/
    152             call s:echoWarning("Could not remove node")
    153         endtry
    154     else
    155         call s:echo("delete aborted")
    156     endif
    157 
    158 endfunction
    159 
    160 " FUNCTION: NERDTreeCopyNode() {{{1
    161 function! NERDTreeCopyNode()
    162     let currentNode = g:NERDTreeFileNode.GetSelected()
    163     let newNodePath = input("Copy the current node\n" .
    164                           \ "==========================================================\n" .
    165                           \ "Enter the new path to copy the node to:                   \n" .
    166                           \ "", currentNode.path.str())
    167 
    168     if newNodePath != ""
    169         "strip trailing slash
    170         let newNodePath = substitute(newNodePath, '\/$', '', '')
    171 
    172         let confirmed = 1
    173         if currentNode.path.copyingWillOverwrite(newNodePath)
    174             call s:echo("Warning: copying may overwrite files! Continue? (yN)")
    175             let choice = nr2char(getchar())
    176             let confirmed = choice ==# 'y'
    177         endif
    178 
    179         if confirmed
    180             try
    181                 let newNode = currentNode.copy(newNodePath)
    182                 call NERDTreeRender()
    183                 call newNode.putCursorHere(0, 0)
    184             catch /^NERDTree/
    185                 call s:echoWarning("Could not copy node")
    186             endtry
    187         endif
    188     else
    189         call s:echo("Copy aborted.")
    190     endif
    191     redraw
    192 endfunction
    193 
    194 " vim: set sw=4 sts=4 et fdm=marker: