mirror of
https://github.com/preservim/nerdtree.git
synced 2025-11-08 11:23:48 -05:00
Added Case Sensitive Move Operation via newly introduced flag NERDTreeCaseSensitiveFS (#1375)
* Added NERDTreeCaseInsensitiveFS option. * check against g:NERDTreeCaseInsensitiveFS with path.equals method * Fixed issues in comments and added nerdtree#runningMac * Using nerdtree#runningMac instead of manual checks for mac * Better implementation * Updated documentation * Added notice about the flag * Updated the documentation * Added support for g:NERDTreeCaseSensitiveFS = 3 * Better comments * Exported caseSensitiveFS check as a function
This commit is contained in:
@@ -23,7 +23,7 @@ call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callbac
|
||||
call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
|
||||
call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
|
||||
|
||||
if has('gui_mac') || has('gui_macvim') || has('mac')
|
||||
if nerdtree#runningMac()
|
||||
call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'})
|
||||
call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'})
|
||||
call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'})
|
||||
@@ -149,21 +149,41 @@ function! s:renameBuffer(bufNum, newNodeName, isDirectory)
|
||||
let quotedFileName = fnameescape(a:newNodeName)
|
||||
let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'})
|
||||
endif
|
||||
" 1. ensure that a new buffer is loaded
|
||||
call nerdtree#exec('badd ' . quotedFileName, 0)
|
||||
" 2. ensure that all windows which display the just deleted filename
|
||||
" display a buffer for a new filename.
|
||||
let s:originalTabNumber = tabpagenr()
|
||||
let s:originalWindowNumber = winnr()
|
||||
call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 0)
|
||||
call nerdtree#exec('tabnext ' . s:originalTabNumber, 1)
|
||||
call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1)
|
||||
" 3. We don't need a previous buffer anymore
|
||||
let l:tempBufferName = 'NERDTreeRenameTempBuffer'
|
||||
|
||||
" 1. swap deleted file buffer with a temporary one
|
||||
" this step is needed to compensate for case insensitive filesystems
|
||||
|
||||
" 1.1. create an intermediate(temporary) buffer
|
||||
call nerdtree#exec('badd ' . l:tempBufferName, 0)
|
||||
let l:tempBufNum = bufnr(l:tempBufferName)
|
||||
" 1.2. ensure that all windows which display the just deleted filename
|
||||
" display the new temp buffer.
|
||||
call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . l:tempBufferName . "' | endif", 0)
|
||||
" 1.3. We don't need the deleted file buffer anymore
|
||||
try
|
||||
call nerdtree#exec('confirm bwipeout ' . a:bufNum, 0)
|
||||
catch
|
||||
" This happens when answering Cancel if confirmation is needed. Do nothing.
|
||||
endtry
|
||||
|
||||
" 2. swap temporary buffer with the new filename buffer
|
||||
" 2.1. create the actual new file buffer
|
||||
call nerdtree#exec('badd ' . quotedFileName, 0)
|
||||
|
||||
" 2.2. ensure that all windows which display the temporary buffer
|
||||
" display a buffer for the new filename.
|
||||
call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . l:tempBufNum . " | exec ':e! " . editStr . "' | endif", 0)
|
||||
call nerdtree#exec('tabnext ' . s:originalTabNumber, 1)
|
||||
call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1)
|
||||
" 2.3. We don't need the temporary buffer anymore
|
||||
try
|
||||
call nerdtree#exec('confirm bwipeout ' . l:tempBufNum, 0)
|
||||
catch
|
||||
" This happens when answering Cancel if confirmation is needed. Do nothing.
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
"FUNCTION: NERDTreeAddNode(){{{1
|
||||
@@ -206,7 +226,24 @@ function! NERDTreeMoveNode()
|
||||
let prompt = s:inputPrompt('move')
|
||||
let newNodePath = input(prompt, curNode.path.str(), 'file')
|
||||
while filereadable(newNodePath)
|
||||
call nerdtree#echoWarning('This destination already exists. Try again.')
|
||||
" allow renames with different casing when g:NERDTreeCaseSensitiveFS
|
||||
" is set to either 0 or 3 and the 2 paths are equal
|
||||
if (g:NERDTreeCaseSensitiveFS == 0 || g:NERDTreeCaseSensitiveFS == 3) &&
|
||||
\nerdtree#pathEquals(curNode.path.str(), newNodePath)
|
||||
break
|
||||
endif
|
||||
|
||||
call nerdtree#echoWarning('This destination already exists, Try again.')
|
||||
|
||||
" inform the user about the flag if we think it is a false positive
|
||||
" when g:NERDTreeCaseSensitiveFS is set to 2
|
||||
if g:NERDTreeCaseSensitiveFS == 2 &&
|
||||
\!nerdtree#osDefaultCaseSensitiveFS() &&
|
||||
\nerdtree#pathEquals(curNode.path.str(), newNodePath)
|
||||
echon "\n(If it is a false positive please consider assigning NERDTreeCaseSensitiveFS's value)"
|
||||
endif
|
||||
|
||||
" prompt the user again
|
||||
let newNodePath = substitute(input(prompt, curNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g')
|
||||
endwhile
|
||||
|
||||
|
||||
Reference in New Issue
Block a user