Merge pull request #734 from lifecrisis/issue733

BUGFIX: Make the NERDTree aware of the 'shellslash' setting.
This commit is contained in:
Jason Franklin 2017-08-19 09:48:27 -04:00 committed by GitHub
commit 5782b228e4
3 changed files with 204 additions and 162 deletions

View File

@ -1,13 +1,20 @@
"we need to use this number many times for sorting... so we calculate it only " ============================================================================
"once here " CLASS: Path
let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') "
" The Path class provides an abstracted representation of a file system
" pathname. Various operations on pathnames are provided and a number of
" representations of a given path name can be accessed here.
" ============================================================================
" This constant is used throughout this script for sorting purposes.
let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
lockvar s:NERDTreeSortStarIndex
"CLASS: Path
"============================================================
let s:Path = {} let s:Path = {}
let g:NERDTreePath = s:Path let g:NERDTreePath = s:Path
"FUNCTION: Path.AbsolutePathFor(str) {{{1 " FUNCTION: Path.AbsolutePathFor(str) {{{1
function! s:Path.AbsolutePathFor(str) function! s:Path.AbsolutePathFor(str)
let prependCWD = 0 let prependCWD = 0
if nerdtree#runningWindows() if nerdtree#runningWindows()
@ -24,7 +31,7 @@ function! s:Path.AbsolutePathFor(str)
return toReturn return toReturn
endfunction endfunction
"FUNCTION: Path.bookmarkNames() {{{1 " FUNCTION: Path.bookmarkNames() {{{1
function! s:Path.bookmarkNames() function! s:Path.bookmarkNames()
if !exists("self._bookmarkNames") if !exists("self._bookmarkNames")
call self.cacheDisplayString() call self.cacheDisplayString()
@ -32,7 +39,7 @@ function! s:Path.bookmarkNames()
return self._bookmarkNames return self._bookmarkNames
endfunction endfunction
"FUNCTION: Path.cacheDisplayString() {{{1 " FUNCTION: Path.cacheDisplayString() {{{1
function! s:Path.cacheDisplayString() abort function! s:Path.cacheDisplayString() abort
let self.cachedDisplayString = self.getLastPathComponent(1) let self.cachedDisplayString = self.getLastPathComponent(1)
@ -59,7 +66,7 @@ function! s:Path.cacheDisplayString() abort
endif endif
endfunction endfunction
"FUNCTION: Path.changeToDir() {{{1 " FUNCTION: Path.changeToDir() {{{1
function! s:Path.changeToDir() function! s:Path.changeToDir()
let dir = self.str({'format': 'Cd'}) let dir = self.str({'format': 'Cd'})
if self.isDirectory ==# 0 if self.isDirectory ==# 0
@ -74,16 +81,16 @@ function! s:Path.changeToDir()
endtry endtry
endfunction endfunction
"FUNCTION: Path.compareTo() {{{1 " FUNCTION: Path.compareTo() {{{1
" "
"Compares this Path to the given path and returns 0 if they are equal, -1 if " Compares this Path to the given path and returns 0 if they are equal, -1 if
"this Path is "less than" the given path, or 1 if it is "greater". " this Path is "less than" the given path, or 1 if it is "greater".
" "
"Args: " Args:
"path: the path object to compare this to " path: the path object to compare this to
" "
"Return: " Return:
"1, -1 or 0 " 1, -1 or 0
function! s:Path.compareTo(path) function! s:Path.compareTo(path)
let thisPath = self.getLastPathComponent(1) let thisPath = self.getLastPathComponent(1)
let thatPath = a:path.getLastPathComponent(1) let thatPath = a:path.getLastPathComponent(1)
@ -118,16 +125,16 @@ function! s:Path.compareTo(path)
endif endif
endfunction endfunction
"FUNCTION: Path.Create(fullpath) {{{1 " FUNCTION: Path.Create(fullpath) {{{1
" "
"Factory method. " Factory method.
" "
"Creates a path object with the given path. The path is also created on the " Creates a path object with the given path. The path is also created on the
"filesystem. If the path already exists, a NERDTree.Path.Exists exception is " filesystem. If the path already exists, a NERDTree.Path.Exists exception is
"thrown. If any other errors occur, a NERDTree.Path exception is thrown. " thrown. If any other errors occur, a NERDTree.Path exception is thrown.
" "
"Args: " Args:
"fullpath: the full filesystem path to the file/dir to create " fullpath: the full filesystem path to the file/dir to create
function! s:Path.Create(fullpath) function! s:Path.Create(fullpath)
"bail if the a:fullpath already exists "bail if the a:fullpath already exists
if isdirectory(a:fullpath) || filereadable(a:fullpath) if isdirectory(a:fullpath) || filereadable(a:fullpath)
@ -155,12 +162,12 @@ function! s:Path.Create(fullpath)
return s:Path.New(a:fullpath) return s:Path.New(a:fullpath)
endfunction endfunction
"FUNCTION: Path.copy(dest) {{{1 " FUNCTION: Path.copy(dest) {{{1
" "
"Copies the file/dir represented by this Path to the given location " Copies the file/dir represented by this Path to the given location
" "
"Args: " Args:
"dest: the location to copy this dir/file to " dest: the location to copy this dir/file to
function! s:Path.copy(dest) function! s:Path.copy(dest)
if !s:Path.CopyingSupported() if !s:Path.CopyingSupported()
throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS" throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS"
@ -181,20 +188,20 @@ function! s:Path.copy(dest)
endif endif
endfunction endfunction
"FUNCTION: Path.CopyingSupported() {{{1 " FUNCTION: Path.CopyingSupported() {{{1
" "
"returns 1 if copying is supported for this OS " returns 1 if copying is supported for this OS
function! s:Path.CopyingSupported() function! s:Path.CopyingSupported()
return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd')) return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd'))
endfunction endfunction
"FUNCTION: Path.copyingWillOverwrite(dest) {{{1 " FUNCTION: Path.copyingWillOverwrite(dest) {{{1
" "
"returns 1 if copy this path to the given location will cause files to " returns 1 if copy this path to the given location will cause files to
"overwritten " overwritten
" "
"Args: " Args:
"dest: the location this path will be copied to " dest: the location this path will be copied to
function! s:Path.copyingWillOverwrite(dest) function! s:Path.copyingWillOverwrite(dest)
if filereadable(a:dest) if filereadable(a:dest)
return 1 return 1
@ -208,13 +215,13 @@ function! s:Path.copyingWillOverwrite(dest)
endif endif
endfunction endfunction
"FUNCTION: Path.createParentDirectories(path) {{{1 " FUNCTION: Path.createParentDirectories(path) {{{1
" "
"create parent directories for this path if needed " create parent directories for this path if needed
"without throwing any errors if those directories already exist " without throwing any errors if those directories already exist
" "
"Args: " Args:
"path: full path of the node whose parent directories may need to be created " path: full path of the node whose parent directories may need to be created
function! s:Path.createParentDirectories(path) function! s:Path.createParentDirectories(path)
let dir_path = fnamemodify(a:path, ':h') let dir_path = fnamemodify(a:path, ':h')
if !isdirectory(dir_path) if !isdirectory(dir_path)
@ -222,11 +229,11 @@ function! s:Path.createParentDirectories(path)
endif endif
endfunction endfunction
"FUNCTION: Path.delete() {{{1 " FUNCTION: Path.delete() {{{1
" "
"Deletes the file or directory represented by this path. " Deletes the file or directory represented by this path.
" "
"Throws NERDTree.Path.Deletion exceptions " Throws NERDTree.Path.Deletion exceptions
function! s:Path.delete() function! s:Path.delete()
if self.isDirectory if self.isDirectory
@ -250,10 +257,10 @@ function! s:Path.delete()
endfor endfor
endfunction endfunction
"FUNCTION: Path.displayString() {{{1 " FUNCTION: Path.displayString() {{{1
" "
"Returns a string that specifies how the path should be represented as a " Returns a string that specifies how the path should be represented as a
"string " string
function! s:Path.displayString() function! s:Path.displayString()
if self.cachedDisplayString ==# "" if self.cachedDisplayString ==# ""
call self.cacheDisplayString() call self.cacheDisplayString()
@ -262,14 +269,14 @@ function! s:Path.displayString()
return self.cachedDisplayString return self.cachedDisplayString
endfunction endfunction
"FUNCTION: Path.edit() {{{1 " FUNCTION: Path.edit() {{{1
function! s:Path.edit() function! s:Path.edit()
exec "edit " . self.str({'format': 'Edit'}) exec "edit " . self.str({'format': 'Edit'})
endfunction endfunction
"FUNCTION: Path.extractDriveLetter(fullpath) {{{1 " FUNCTION: Path.extractDriveLetter(fullpath) {{{1
" "
"If running windows, cache the drive letter for this path " If running windows, cache the drive letter for this path
function! s:Path.extractDriveLetter(fullpath) function! s:Path.extractDriveLetter(fullpath)
if nerdtree#runningWindows() if nerdtree#runningWindows()
if a:fullpath =~ '^\(\\\\\|\/\/\)' if a:fullpath =~ '^\(\\\\\|\/\/\)'
@ -285,14 +292,14 @@ function! s:Path.extractDriveLetter(fullpath)
endfunction endfunction
"FUNCTION: Path.exists() {{{1 " FUNCTION: Path.exists() {{{1
"return 1 if this path points to a location that is readable or is a directory " return 1 if this path points to a location that is readable or is a directory
function! s:Path.exists() function! s:Path.exists()
let p = self.str() let p = self.str()
return filereadable(p) || isdirectory(p) return filereadable(p) || isdirectory(p)
endfunction endfunction
"FUNCTION: Path._escChars() {{{1 " FUNCTION: Path._escChars() {{{1
function! s:Path._escChars() function! s:Path._escChars()
if nerdtree#runningWindows() if nerdtree#runningWindows()
return " `\|\"#%&,?()\*^<>$" return " `\|\"#%&,?()\*^<>$"
@ -301,12 +308,12 @@ function! s:Path._escChars()
return " \\`\|\"#%&,?()\*^<>[]$" return " \\`\|\"#%&,?()\*^<>[]$"
endfunction endfunction
"FUNCTION: Path.getDir() {{{1 " FUNCTION: Path.getDir() {{{1
" "
"Returns this path if it is a directory, else this paths parent. " Returns this path if it is a directory, else this paths parent.
" "
"Return: " Return:
"a Path object " a Path object
function! s:Path.getDir() function! s:Path.getDir()
if self.isDirectory if self.isDirectory
return self return self
@ -315,12 +322,12 @@ function! s:Path.getDir()
endif endif
endfunction endfunction
"FUNCTION: Path.getParent() {{{1 " FUNCTION: Path.getParent() {{{1
" "
"Returns a new path object for this paths parent " Returns a new path object for this paths parent
" "
"Return: " Return:
"a new Path object " a new Path object
function! s:Path.getParent() function! s:Path.getParent()
if nerdtree#runningWindows() if nerdtree#runningWindows()
let path = self.drive . '\' . join(self.pathSegments[0:-2], '\') let path = self.drive . '\' . join(self.pathSegments[0:-2], '\')
@ -331,13 +338,13 @@ function! s:Path.getParent()
return s:Path.New(path) return s:Path.New(path)
endfunction endfunction
"FUNCTION: Path.getLastPathComponent(dirSlash) {{{1 " FUNCTION: Path.getLastPathComponent(dirSlash) {{{1
" "
"Gets the last part of this path. " Gets the last part of this path.
" "
"Args: " Args:
"dirSlash: if 1 then a trailing slash will be added to the returned value for " dirSlash: if 1 then a trailing slash will be added to the returned value for
"directory nodes. " directory nodes.
function! s:Path.getLastPathComponent(dirSlash) function! s:Path.getLastPathComponent(dirSlash)
if empty(self.pathSegments) if empty(self.pathSegments)
return '' return ''
@ -349,8 +356,8 @@ function! s:Path.getLastPathComponent(dirSlash)
return toReturn return toReturn
endfunction endfunction
"FUNCTION: Path.getSortOrderIndex() {{{1 " FUNCTION: Path.getSortOrderIndex() {{{1
"returns the index of the pattern in g:NERDTreeSortOrder that this path matches " returns the index of the pattern in g:NERDTreeSortOrder that this path matches
function! s:Path.getSortOrderIndex() function! s:Path.getSortOrderIndex()
let i = 0 let i = 0
while i < len(g:NERDTreeSortOrder) while i < len(g:NERDTreeSortOrder)
@ -362,8 +369,8 @@ function! s:Path.getSortOrderIndex()
return s:NERDTreeSortStarIndex return s:NERDTreeSortStarIndex
endfunction endfunction
"FUNCTION: Path._splitChunks(path) {{{1 " FUNCTION: Path._splitChunks(path) {{{1
"returns a list of path chunks " returns a list of path chunks
function! s:Path._splitChunks(path) function! s:Path._splitChunks(path)
let chunks = split(a:path, '\(\D\+\|\d\+\)\zs') let chunks = split(a:path, '\(\D\+\|\d\+\)\zs')
let i = 0 let i = 0
@ -377,8 +384,8 @@ function! s:Path._splitChunks(path)
return chunks return chunks
endfunction endfunction
"FUNCTION: Path.getSortKey() {{{1 " FUNCTION: Path.getSortKey() {{{1
"returns a key used in compare function for sorting " returns a key used in compare function for sorting
function! s:Path.getSortKey() function! s:Path.getSortKey()
if !exists("self._sortKey") if !exists("self._sortKey")
let path = self.getLastPathComponent(1) let path = self.getLastPathComponent(1)
@ -399,14 +406,14 @@ function! s:Path.getSortKey()
endfunction endfunction
"FUNCTION: Path.isUnixHiddenFile() {{{1 " FUNCTION: Path.isUnixHiddenFile() {{{1
"check for unix hidden files " check for unix hidden files
function! s:Path.isUnixHiddenFile() function! s:Path.isUnixHiddenFile()
return self.getLastPathComponent(0) =~# '^\.' return self.getLastPathComponent(0) =~# '^\.'
endfunction endfunction
"FUNCTION: Path.isUnixHiddenPath() {{{1 " FUNCTION: Path.isUnixHiddenPath() {{{1
"check for unix path with hidden components " check for unix path with hidden components
function! s:Path.isUnixHiddenPath() function! s:Path.isUnixHiddenPath()
if self.getLastPathComponent(0) =~# '^\.' if self.getLastPathComponent(0) =~# '^\.'
return 1 return 1
@ -420,8 +427,8 @@ function! s:Path.isUnixHiddenPath()
endif endif
endfunction endfunction
"FUNCTION: Path.ignore(nerdtree) {{{1 " FUNCTION: Path.ignore(nerdtree) {{{1
"returns true if this path should be ignored " returns true if this path should be ignored
function! s:Path.ignore(nerdtree) function! s:Path.ignore(nerdtree)
"filter out the user specified paths to ignore "filter out the user specified paths to ignore
if a:nerdtree.ui.isIgnoreFilterEnabled() if a:nerdtree.ui.isIgnoreFilterEnabled()
@ -450,8 +457,8 @@ function! s:Path.ignore(nerdtree)
return 0 return 0
endfunction endfunction
"FUNCTION: Path._ignorePatternMatches(pattern) {{{1 " FUNCTION: Path._ignorePatternMatches(pattern) {{{1
"returns true if this path matches the given ignore pattern " returns true if this path matches the given ignore pattern
function! s:Path._ignorePatternMatches(pattern) function! s:Path._ignorePatternMatches(pattern)
let pat = a:pattern let pat = a:pattern
if strpart(pat,len(pat)-7) == '[[dir]]' if strpart(pat,len(pat)-7) == '[[dir]]'
@ -469,10 +476,10 @@ function! s:Path._ignorePatternMatches(pattern)
return self.getLastPathComponent(0) =~# pat return self.getLastPathComponent(0) =~# pat
endfunction endfunction
"FUNCTION: Path.isAncestor(path) {{{1 " FUNCTION: Path.isAncestor(path) {{{1
"return 1 if this path is somewhere above the given path in the filesystem. " return 1 if this path is somewhere above the given path in the filesystem.
" "
"a:path should be a dir " a:path should be a dir
function! s:Path.isAncestor(path) function! s:Path.isAncestor(path)
if !self.isDirectory if !self.isDirectory
return 0 return 0
@ -483,8 +490,8 @@ function! s:Path.isAncestor(path)
return stridx(that, this) == 0 return stridx(that, this) == 0
endfunction endfunction
"FUNCTION: Path.isUnder(path) {{{1 " FUNCTION: Path.isUnder(path) {{{1
"return 1 if this path is somewhere under the given path in the filesystem. " return 1 if this path is somewhere under the given path in the filesystem.
function! s:Path.isUnder(path) function! s:Path.isUnder(path)
if a:path.isDirectory == 0 if a:path.isDirectory == 0
return 0 return 0
@ -495,7 +502,7 @@ function! s:Path.isUnder(path)
return stridx(this, that . s:Path.Slash()) == 0 return stridx(this, that . s:Path.Slash()) == 0
endfunction endfunction
"FUNCTION: Path.JoinPathStrings(...) {{{1 " FUNCTION: Path.JoinPathStrings(...) {{{1
function! s:Path.JoinPathStrings(...) function! s:Path.JoinPathStrings(...)
let components = [] let components = []
for i in a:000 for i in a:000
@ -504,19 +511,19 @@ function! s:Path.JoinPathStrings(...)
return '/' . join(components, '/') return '/' . join(components, '/')
endfunction endfunction
"FUNCTION: Path.equals() {{{1 " FUNCTION: Path.equals() {{{1
" "
"Determines whether 2 path objects are "equal". " Determines whether 2 path objects are "equal".
"They are equal if the paths they represent are the same " They are equal if the paths they represent are the same
" "
"Args: " Args:
"path: the other path obj to compare this with " path: the other path obj to compare this with
function! s:Path.equals(path) function! s:Path.equals(path)
return self.str() ==# a:path.str() return self.str() ==# a:path.str()
endfunction endfunction
"FUNCTION: Path.New() {{{1 " FUNCTION: Path.New() {{{1
"The Constructor for the Path object " The Constructor for the Path object
function! s:Path.New(path) function! s:Path.New(path)
let newPath = copy(self) let newPath = copy(self)
@ -528,26 +535,37 @@ function! s:Path.New(path)
return newPath return newPath
endfunction endfunction
"FUNCTION: Path.Slash() {{{1 " FUNCTION: Path.Slash() {{{1
"return the slash to use for the current OS " Return the path separator used by the underlying file system. Special
" consideration is taken for the use of the 'shellslash' option on Windows
" systems.
function! s:Path.Slash() function! s:Path.Slash()
return nerdtree#runningWindows() ? '\' : '/'
if nerdtree#runningWindows()
if exists('+shellslash') && &shellslash
return '/'
endif
return '\'
endif
return '/'
endfunction endfunction
"FUNCTION: Path.Resolve() {{{1 " FUNCTION: Path.Resolve() {{{1
"Invoke the vim resolve() function and return the result " Invoke the vim resolve() function and return the result
"This is necessary because in some versions of vim resolve() removes trailing " This is necessary because in some versions of vim resolve() removes trailing
"slashes while in other versions it doesn't. This always removes the trailing " slashes while in other versions it doesn't. This always removes the trailing
"slash " slash
function! s:Path.Resolve(path) function! s:Path.Resolve(path)
let tmp = resolve(a:path) let tmp = resolve(a:path)
return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp
endfunction endfunction
"FUNCTION: Path.readInfoFromDisk(fullpath) {{{1 " FUNCTION: Path.readInfoFromDisk(fullpath) {{{1
" "
" "
"Throws NERDTree.Path.InvalidArguments exception. " Throws NERDTree.Path.InvalidArguments exception.
function! s:Path.readInfoFromDisk(fullpath) function! s:Path.readInfoFromDisk(fullpath)
call self.extractDriveLetter(a:fullpath) call self.extractDriveLetter(a:fullpath)
@ -598,22 +616,22 @@ function! s:Path.readInfoFromDisk(fullpath)
endif endif
endfunction endfunction
"FUNCTION: Path.refresh(nerdtree) {{{1 " FUNCTION: Path.refresh(nerdtree) {{{1
function! s:Path.refresh(nerdtree) function! s:Path.refresh(nerdtree)
call self.readInfoFromDisk(self.str()) call self.readInfoFromDisk(self.str())
call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {}) call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {})
call self.cacheDisplayString() call self.cacheDisplayString()
endfunction endfunction
"FUNCTION: Path.refreshFlags(nerdtree) {{{1 " FUNCTION: Path.refreshFlags(nerdtree) {{{1
function! s:Path.refreshFlags(nerdtree) function! s:Path.refreshFlags(nerdtree)
call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {}) call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {})
call self.cacheDisplayString() call self.cacheDisplayString()
endfunction endfunction
"FUNCTION: Path.rename() {{{1 " FUNCTION: Path.rename() {{{1
" "
"Renames this node on the filesystem " Renames this node on the filesystem
function! s:Path.rename(newPath) function! s:Path.rename(newPath)
if a:newPath ==# '' if a:newPath ==# ''
throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath
@ -632,28 +650,28 @@ function! s:Path.rename(newPath)
call g:NERDTreeBookmark.Write() call g:NERDTreeBookmark.Write()
endfunction endfunction
"FUNCTION: Path.str() {{{1 " FUNCTION: Path.str() {{{1
" Return a string representation of this Path object.
" "
"Returns a string representation of this Path " Args:
" This function takes a single dictionary (optional) with keys and values that
" specify how the returned pathname should be formatted.
" "
"Takes an optional dictionary param to specify how the output should be " The dictionary may have the following keys:
"formatted.
"
"The dict may have the following keys:
" 'format' " 'format'
" 'escape' " 'escape'
" 'truncateTo' " 'truncateTo'
" "
"The 'format' key may have a value of: " The 'format' key may have a value of:
" 'Cd' - a string to be used with the :cd command " 'Cd' - a string to be used with ":cd" and similar commands
" 'Edit' - a string to be used with :e :sp :new :tabedit etc " 'Edit' - a string to be used with ":edit" and similar commands
" 'UI' - a string used in the NERD tree UI " 'UI' - a string to be displayed in the NERDTree user interface
" "
"The 'escape' key, if specified will cause the output to be escaped with " The 'escape' key, if specified, will cause the output to be escaped with
"shellescape() " Vim's internal "shellescape()" function.
" "
"The 'truncateTo' key causes the resulting string to be truncated to the value " The 'truncateTo' key shortens the length of the path to that given by the
"'truncateTo' maps to. A '<' char will be prepended. " value associated with 'truncateTo'. A '<' is prepended.
function! s:Path.str(...) function! s:Path.str(...)
let options = a:0 ? a:1 : {} let options = a:0 ? a:1 : {}
let toReturn = "" let toReturn = ""
@ -688,7 +706,7 @@ function! s:Path.str(...)
return toReturn return toReturn
endfunction endfunction
"FUNCTION: Path._strForUI() {{{1 " FUNCTION: Path._strForUI() {{{1
function! s:Path._strForUI() function! s:Path._strForUI()
let toReturn = '/' . join(self.pathSegments, '/') let toReturn = '/' . join(self.pathSegments, '/')
if self.isDirectory && toReturn != '/' if self.isDirectory && toReturn != '/'
@ -697,37 +715,37 @@ function! s:Path._strForUI()
return toReturn return toReturn
endfunction endfunction
"FUNCTION: Path._strForCd() {{{1 " FUNCTION: Path._strForCd() {{{1
" " Return a string representation of this Path that is suitable for use as an
" returns a string that can be used with :cd " argument to Vim's internal ":cd" command.
function! s:Path._strForCd() function! s:Path._strForCd()
return escape(self.str(), self._escChars()) return fnameescape(self.str())
endfunction endfunction
"FUNCTION: Path._strForEdit() {{{1 " FUNCTION: Path._strForEdit() {{{1
" " Return a string representation of this Path that is suitable for use as an
"Return: the string for this path that is suitable to be used with the :edit " argument to Vim's internal ":edit" command.
"command
function! s:Path._strForEdit() function! s:Path._strForEdit()
let p = escape(self.str(), self._escChars())
"make it relative " Make the path relative to the current working directory, if possible.
let p = fnamemodify(p, ':.') let l:result = fnamemodify(self.str(), ':.')
"handle the edge case where the file begins with a + (vim interprets " On Windows, the drive letter may be removed by "fnamemodify()". Add it
"the +foo in `:e +foo` as an option to :edit) " back, if necessary.
if p[0] == "+" if nerdtree#runningWindows() && l:result[0] == s:Path.Slash()
let p = '\' . p let l:result = self.drive . l:result
endif endif
if p ==# '' let l:result = fnameescape(l:result)
let p = '.'
if empty(l:result)
let l:result = '.'
endif endif
return p return l:result
endfunction endfunction
"FUNCTION: Path._strForGlob() {{{1 " FUNCTION: Path._strForGlob() {{{1
function! s:Path._strForGlob() function! s:Path._strForGlob()
let lead = s:Path.Slash() let lead = s:Path.Slash()
@ -744,24 +762,22 @@ function! s:Path._strForGlob()
return toReturn return toReturn
endfunction endfunction
"FUNCTION: Path._str() {{{1 " FUNCTION: Path._str() {{{1
" " Return the absolute pathname associated with this Path object. The pathname
"Gets the string path for this path object that is appropriate for the OS. " returned is appropriate for the underlying file system.
"EG, in windows c:\foo\bar
" in *nix /foo/bar
function! s:Path._str() function! s:Path._str()
let lead = s:Path.Slash() let l:separator = s:Path.Slash()
let l:leader = l:separator
"if we are running windows then slap a drive letter on the front
if nerdtree#runningWindows() if nerdtree#runningWindows()
let lead = self.drive . '\' let l:leader = self.drive . l:separator
endif endif
return lead . join(self.pathSegments, s:Path.Slash()) return l:leader . join(self.pathSegments, l:separator)
endfunction endfunction
"FUNCTION: Path.strTrunk() {{{1 " FUNCTION: Path.strTrunk() {{{1
"Gets the path without the last segment on the end. " Gets the path without the last segment on the end.
function! s:Path.strTrunk() function! s:Path.strTrunk()
return self.drive . '/' . join(self.pathSegments[0:-2], '/') return self.drive . '/' . join(self.pathSegments[0:-2], '/')
endfunction endfunction
@ -782,13 +798,13 @@ function! s:Path.tabnr()
return 0 return 0
endfunction endfunction
"FUNCTION: Path.WinToUnixPath(pathstr){{{1 " FUNCTION: Path.WinToUnixPath(pathstr){{{1
"Takes in a windows path and returns the unix equiv " Takes in a windows path and returns the unix equiv
" "
"A class level method " A class level method
" "
"Args: " Args:
"pathstr: the windows path to convert " pathstr: the windows path to convert
function! s:Path.WinToUnixPath(pathstr) function! s:Path.WinToUnixPath(pathstr)
if !nerdtree#runningWindows() if !nerdtree#runningWindows()
return a:pathstr return a:pathstr

View File

@ -243,7 +243,7 @@ function! s:TreeDirNode._glob(pattern, all)
let l:pathSpec = fnamemodify(self.path.str({'format': 'Glob'}), ':.') let l:pathSpec = fnamemodify(self.path.str({'format': 'Glob'}), ':.')
" On Windows, the drive letter may be removed by "fnamemodify()". " On Windows, the drive letter may be removed by "fnamemodify()".
if nerdtree#runningWindows() && l:pathSpec[0] == '\' if nerdtree#runningWindows() && l:pathSpec[0] == g:NERDTreePath.Slash()
let l:pathSpec = self.path.drive . l:pathSpec let l:pathSpec = self.path.drive . l:pathSpec
endif endif
endif endif

View File

@ -212,14 +212,40 @@ endfunction
" FUNCTION: NERDTreeListNodeWin32() {{{1 " FUNCTION: NERDTreeListNodeWin32() {{{1
function! NERDTreeListNodeWin32() function! NERDTreeListNodeWin32()
let treenode = g:NERDTreeFileNode.GetSelected() let l:node = g:NERDTreeFileNode.GetSelected()
if treenode != {}
let metadata = split(system('DIR /Q ' . shellescape(treenode.path.str()) . ' | FINDSTR "^[012][0-9]/[0-3][0-9]/[12][0-9][0-9][0-9]"'), '\n') if !empty(l:node)
call nerdtree#echo(metadata[0])
else let l:save_shell = &shell
call nerdtree#echo("No information avaialable") set shell&
if exists('+shellslash')
let l:save_shellslash = &shellslash
set noshellslash
endif
let l:command = 'DIR /Q '
\ . shellescape(l:node.path.str())
\ . ' | FINDSTR "^[012][0-9]/[0-3][0-9]/[12][0-9][0-9][0-9]"'
let l:metadata = split(system(l:command), "\n")
if v:shell_error == 0
call nerdtree#echo(l:metadata[0])
else
call nerdtree#echoError('shell command failed')
endif
let &shell = l:save_shell
if exists('l:save_shellslash')
let &shellslash = l:save_shellslash
endif
return
endif endif
call nerdtree#echo('node not recognized')
endfunction endfunction
" FUNCTION: NERDTreeCopyNode() {{{1 " FUNCTION: NERDTreeCopyNode() {{{1