From 4fb468f42498193db64e398e9bb240af76060c54 Mon Sep 17 00:00:00 2001 From: enthudave Date: Wed, 16 May 2018 23:04:48 +0200 Subject: [PATCH 01/18] implement tabbed ranger --- plugin/ranger.vim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index d254f8d..9e7e5c6 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -50,7 +50,7 @@ if has('nvim') let rangerCallback = { 'name': 'ranger', 'edit_cmd': a:edit_cmd } function! rangerCallback.on_exit(job_id, code, event) if a:code == 0 - silent! Bclose! + silent! bdelete! endif try if filereadable(s:choice_file_path) @@ -61,11 +61,13 @@ if has('nvim') endif endtry endfunction - enew + tabnew if isdirectory(currentPath) call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' "' . currentPath . '"', rangerCallback) + silent! execute 'file RANGER' else call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' --selectfile="' . currentPath . '"', rangerCallback) + silent! execute 'file RANGER' endif startinsert endfunction From 7976401cc9a2debced47444eac8aedae620c7df2 Mon Sep 17 00:00:00 2001 From: enthudave Date: Wed, 16 May 2018 23:08:54 +0200 Subject: [PATCH 02/18] add comment --- plugin/ranger.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 9e7e5c6..9b86152 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -64,6 +64,7 @@ if has('nvim') tabnew if isdirectory(currentPath) call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' "' . currentPath . '"', rangerCallback) + " change buffer name for a nicer statusline and tabline silent! execute 'file RANGER' else call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' --selectfile="' . currentPath . '"', rangerCallback) From 8dacf95f6b4713491ec2531e9e5f9aaa903e2d8e Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 18 May 2018 14:24:37 +0200 Subject: [PATCH 03/18] remove lines setting filename --- plugin/ranger.vim | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 9b86152..24b485e 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -65,10 +65,8 @@ if has('nvim') if isdirectory(currentPath) call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' "' . currentPath . '"', rangerCallback) " change buffer name for a nicer statusline and tabline - silent! execute 'file RANGER' else call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' --selectfile="' . currentPath . '"', rangerCallback) - silent! execute 'file RANGER' endif startinsert endfunction From ac603b7473c96dbf194a5ac33b0f9c9d8fb07ab3 Mon Sep 17 00:00:00 2001 From: enthudave Date: Thu, 31 May 2018 23:55:09 +0200 Subject: [PATCH 04/18] fix styleissues --- plugin/ranger.vim | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 24b485e..adbf4cd 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -23,14 +23,16 @@ " ================ Ranger ======================= +scriptencoding utf-8 + if exists('g:ranger_choice_file') if empty(glob(g:ranger_choice_file)) let s:choice_file_path = g:ranger_choice_file else - echom "Message from *Ranger.vim* :" + echom 'Message from *Ranger.vim* :' echom "You've set the g:ranger_choice_file variable." - echom "Please use the path for a file that does not already exist." - echom "Using /tmp/chosenfile for now..." + echom 'Please use the path for a file that does not already exist.' + echom 'Using /tmp/chosenfile for now...' endif endif From 91bdf17061a7ea55bf6d116e4acbcf461017ca15 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 00:00:54 +0200 Subject: [PATCH 05/18] use tempname() as suggested --- plugin/ranger.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index adbf4cd..3f2ab0c 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -43,7 +43,7 @@ else endif if !exists('s:choice_file_path') - let s:choice_file_path = '/tmp/chosenfile' + let s:choice_file_path = tempname() endif if has('nvim') From 01f8c80d72e67c08e502e225d7a1d9cf24f795a9 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 03:12:06 +0200 Subject: [PATCH 06/18] removes Bclose, add tab feature --- plugin/ranger.vim | 52 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 3f2ab0c..352bb53 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -46,27 +46,58 @@ if !exists('s:choice_file_path') let s:choice_file_path = tempname() endif +" Run Ranger in a new tab, only if set by user +let g:tabbed_ranger = get(g:, 'tabbed_ranger', 0) + if has('nvim') function! OpenRangerIn(path, edit_cmd) let currentPath = expand(a:path) - let rangerCallback = { 'name': 'ranger', 'edit_cmd': a:edit_cmd } + let previous_buffer = expand('%') + let rangerCallback = { + \'name': 'ranger', + \'edit_cmd': a:edit_cmd, + \'previous_alternate': expand('#'), + \'previous_buffer': previous_buffer + \} function! rangerCallback.on_exit(job_id, code, event) - if a:code == 0 - silent! bdelete! - endif try + " If ranger opened in a tab we can safely close the window + " We'll delete the buffer when the function ends + if exists('b:used_a_tab') | close! | endif + " remember the ranger buffer so we can delete it after it has left + " the window, this avoids 'bdelete' closing the window + let ranger_buf = expand('%') if filereadable(s:choice_file_path) - for f in readfile(s:choice_file_path) + let files = readfile(s:choice_file_path) + " We'll open a file (or more), '% (before ranger)' should become '#', + " we'll open the last file after visiting '% (before ranger)', + " unless opening files in a new tab + for f in files[0:-2] exec self.edit_cmd . f endfor + if self.edit_cmd ==# 'edit ' + execute 'buffer ' . self.previous_buffer + endif + execute self.edit_cmd . files[-1] + "clean up call delete(s:choice_file_path) + else + " Not opening any files, '% (before ranger)' & '# (before ranger)' should remain the same + execute 'buffer ' . self.previous_alternate + execute 'buffer ' . self.previous_buffer endif + execute 'bdelete! ' . bufnr(ranger_buf) endtry endfunction - tabnew + " if the user likes it, open a tab for ranger unless they 'edit' a directory + " for example when opening vim with directory arg (netrw replace) + " also only uses the tab feature when at least two buffers exist + if g:tabbed_ranger && !isdirectory(previous_buffer) && !len(tabpagebuflist()) < 2 | tabnew | else | enew | endif + " remove any previous directory buffer for fear of ending up in recursive + " automatic ranger opening nightmare + if isdirectory(previous_buffer) | execute 'bdelete! ' . bufnr(previous_buffer) | endif if isdirectory(currentPath) call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' "' . currentPath . '"', rangerCallback) - " change buffer name for a nicer statusline and tabline else call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' --selectfile="' . currentPath . '"', rangerCallback) endif @@ -119,12 +150,9 @@ endfunction " Open Ranger in the directory passed by argument function! OpenRangerOnVimLoadDir(argv_path) let path = expand(a:argv_path) - " Delete empty buffer created by vim - Bclose! - - " Open Ranger - call OpenRangerIn(path, 'edit') + " after opening file so we can use 'bdelete' + call OpenRangerIn(path, 'edit ') endfunction " To open ranger when vim load a directory From 2ddcb17fafecea4c27f15bcc3cbebbf79f704590 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 21:22:08 +0200 Subject: [PATCH 07/18] finish bclose removal and tab feature --- plugin/ranger.vim | 78 ++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 352bb53..423560e 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -52,54 +52,76 @@ let g:tabbed_ranger = get(g:, 'tabbed_ranger', 0) if has('nvim') function! OpenRangerIn(path, edit_cmd) let currentPath = expand(a:path) - let previous_buffer = expand('%') let rangerCallback = { \'name': 'ranger', \'edit_cmd': a:edit_cmd, - \'previous_alternate': expand('#'), - \'previous_buffer': previous_buffer + \'previous_alternate': bufnr('#'), + \'previous_buffer': bufnr('%') \} function! rangerCallback.on_exit(job_id, code, event) + let ranger_buf = bufnr('%') + let from_dir_buffer = isdirectory(fnamemodify(bufname(self.previous_buffer), ':p')) + " If ranger opened in a tab we can safely close the window + " We'll delete the buffer when the function ends + if exists('w:used_a_tab') | close! | endif try - " If ranger opened in a tab we can safely close the window - " We'll delete the buffer when the function ends - if exists('b:used_a_tab') | close! | endif - " remember the ranger buffer so we can delete it after it has left - " the window, this avoids 'bdelete' closing the window - let ranger_buf = expand('%') if filereadable(s:choice_file_path) let files = readfile(s:choice_file_path) " We'll open a file (or more), '% (before ranger)' should become '#', " we'll open the last file after visiting '% (before ranger)', " unless opening files in a new tab - for f in files[0:-2] - exec self.edit_cmd . f - endfor - if self.edit_cmd ==# 'edit ' + if len(files) > 1 + " open all but files but the last, so we can set alternate before + " opening the last + for f in files[0:-2] + exec self.edit_cmd . f + endfor + endif + if self.previous_alternate > 0 + execute 'buffer ' . self.previous_alternate + endif + + if !from_dir_buffer execute 'buffer ' . self.previous_buffer + execute self.edit_cmd . files[-1] + else + " previous_buffer was a directory: don't make it the alternate + " but use previous_alternate ????????????????????????????????? + execute self.edit_cmd . files[-1] + execute 'bdelete! ' . self.previous_buffer endif - execute self.edit_cmd . files[-1] - "clean up call delete(s:choice_file_path) else " Not opening any files, '% (before ranger)' & '# (before ranger)' should remain the same - execute 'buffer ' . self.previous_alternate - execute 'buffer ' . self.previous_buffer + " the old alternate may not exist e.g. only one buffer exists + if self.previous_alternate > 0 + execute 'buffer ' . self.previous_alternate + endif + " visit the previous buffer if it's not a directory or it's the only buffer + if !from_dir_buffer || bufnr('$') == 1 + execute 'buffer ' . self.previous_buffer + else + " previous_buffer was a directory and should not be the only buffer + execute 'bdelete! ' . self.previous_buffer + endif endif - execute 'bdelete! ' . bufnr(ranger_buf) endtry + execute 'bdelete! ' . ranger_buf endfunction - " if the user likes it, open a tab for ranger unless they 'edit' a directory - " for example when opening vim with directory arg (netrw replace) - " also only uses the tab feature when at least two buffers exist - if g:tabbed_ranger && !isdirectory(previous_buffer) && !len(tabpagebuflist()) < 2 | tabnew | else | enew | endif - " remove any previous directory buffer for fear of ending up in recursive - " automatic ranger opening nightmare - if isdirectory(previous_buffer) | execute 'bdelete! ' . bufnr(previous_buffer) | endif + " if the user likes it, open a tab, only when not 'editing' a buffer + if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) + tabnew + let w:used_a_tab = 1 + else + enew + endif if isdirectory(currentPath) call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' "' . currentPath . '"', rangerCallback) + " should disable 'OpenRangerOnVimLoadDir()' kicking in for this buffer + let b:ranger_buf = 1 else call termopen(s:ranger_command . ' --choosefiles=' . s:choice_file_path . ' --selectfile="' . currentPath . '"', rangerCallback) + let b:ranger_buf = 1 endif startinsert endfunction @@ -150,8 +172,8 @@ endfunction " Open Ranger in the directory passed by argument function! OpenRangerOnVimLoadDir(argv_path) let path = expand(a:argv_path) - " Delete empty buffer created by vim - " after opening file so we can use 'bdelete' + " Delete empty buffer created by vim after opening file, + " in the callback, so we can use 'bdelete' call OpenRangerIn(path, 'edit ') endfunction @@ -159,7 +181,7 @@ endfunction if exists('g:ranger_replace_netrw') && g:ranger_replace_netrw augroup ReplaceNetrwByRangerVim autocmd VimEnter * silent! autocmd! FileExplorer - autocmd BufEnter * if isdirectory(expand("%")) | call OpenRangerOnVimLoadDir("%") | endif + autocmd BufEnter * if !exists('b:ranger_buf') && isdirectory(expand("%")) | call OpenRangerOnVimLoadDir("%") | endif augroup END endif From 5ac9d42e5b22644d00c4c0189afccbe6273cad9d Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 21:24:13 +0200 Subject: [PATCH 08/18] correct a comment --- plugin/ranger.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 423560e..d14e619 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -71,7 +71,7 @@ if has('nvim') " we'll open the last file after visiting '% (before ranger)', " unless opening files in a new tab if len(files) > 1 - " open all but files but the last, so we can set alternate before + " open all files but the last, so we can set alternate before " opening the last for f in files[0:-2] exec self.edit_cmd . f From fb17018be39515c5b1704580dfb6e28b20fe85eb Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 21:26:19 +0200 Subject: [PATCH 09/18] correct a comment --- plugin/ranger.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index d14e619..98b374f 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -108,7 +108,7 @@ if has('nvim') endtry execute 'bdelete! ' . ranger_buf endfunction - " if the user likes it, open a tab, only when not 'editing' a buffer + " if the user likes it, open a tab, only when not 'editing' a directory if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) tabnew let w:used_a_tab = 1 From b6a8f526e4ae72543afdc7d0aa48bc34db7a77d8 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 1 Jun 2018 23:41:02 +0200 Subject: [PATCH 10/18] remove unnecessary condition --- plugin/ranger.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 98b374f..572f73f 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -97,11 +97,11 @@ if has('nvim') if self.previous_alternate > 0 execute 'buffer ' . self.previous_alternate endif - " visit the previous buffer if it's not a directory or it's the only buffer - if !from_dir_buffer || bufnr('$') == 1 + " visit the previous buffer if it's not a directory + if !from_dir_buffer execute 'buffer ' . self.previous_buffer else - " previous_buffer was a directory and should not be the only buffer + " previous_buffer was a directory execute 'bdelete! ' . self.previous_buffer endif endif From 122bfc2e37c7f358896db750ee608d8c7f44b1e1 Mon Sep 17 00:00:00 2001 From: enthudave Date: Sun, 3 Jun 2018 00:10:33 +0200 Subject: [PATCH 11/18] further improvements --- plugin/ranger.vim | 60 +++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 38 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 572f73f..71c8769 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -67,46 +67,30 @@ if has('nvim') try if filereadable(s:choice_file_path) let files = readfile(s:choice_file_path) - " We'll open a file (or more), '% (before ranger)' should become '#', - " we'll open the last file after visiting '% (before ranger)', - " unless opening files in a new tab - if len(files) > 1 - " open all files but the last, so we can set alternate before - " opening the last - for f in files[0:-2] - exec self.edit_cmd . f - endfor - endif - if self.previous_alternate > 0 - execute 'buffer ' . self.previous_alternate - endif - - if !from_dir_buffer - execute 'buffer ' . self.previous_buffer - execute self.edit_cmd . files[-1] - else - " previous_buffer was a directory: don't make it the alternate - " but use previous_alternate ????????????????????????????????? - execute self.edit_cmd . files[-1] - execute 'bdelete! ' . self.previous_buffer - endif - call delete(s:choice_file_path) - else - " Not opening any files, '% (before ranger)' & '# (before ranger)' should remain the same - " the old alternate may not exist e.g. only one buffer exists - if self.previous_alternate > 0 - execute 'buffer ' . self.previous_alternate - endif - " visit the previous buffer if it's not a directory - if !from_dir_buffer - execute 'buffer ' . self.previous_buffer - else - " previous_buffer was a directory - execute 'bdelete! ' . self.previous_buffer - endif endif endtry - execute 'bdelete! ' . ranger_buf + + if !from_dir_buffer + if !len(files) || self.edit_cmd ==# 'tabedit ' && !exists('w:used_a_tab') + exec 'buffer ' . self.previous_buffer + if self.previous_alternate > 0 | let @# = self.previous_alternate | endif + else + " We'll open a file (or more), '% (before ranger)' should become '#', + let @#= self.previous_buffer + endif + else + " previous_buffer was a directory + if self.previous_alternate > 0 | let @# = self.previous_alternate | endif + exec 'bdelete! ' . self.previous_buffer + endif + + if len(files) + for f in files + exec self.edit_cmd . f + endfor + call delete(s:choice_file_path) + endif + exec 'bdelete! ' . ranger_buf endfunction " if the user likes it, open a tab, only when not 'editing' a directory if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) From ccd2301c4167ce388fee939d71b81cee8efb2ef8 Mon Sep 17 00:00:00 2001 From: enthudave Date: Sun, 3 Jun 2018 15:09:15 +0200 Subject: [PATCH 12/18] alternate fixes --- plugin/ranger.vim | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 71c8769..e79ab2a 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -59,6 +59,8 @@ if has('nvim') \'previous_buffer': bufnr('%') \} function! rangerCallback.on_exit(job_id, code, event) + echomsg 'alt before: ' . bufname(self.previous_alternate) + echomsg 'current before: ' . bufname(self.previous_buffer) let ranger_buf = bufnr('%') let from_dir_buffer = isdirectory(fnamemodify(bufname(self.previous_buffer), ':p')) " If ranger opened in a tab we can safely close the window @@ -67,30 +69,44 @@ if has('nvim') try if filereadable(s:choice_file_path) let files = readfile(s:choice_file_path) + else + let files = [] endif endtry + if !len(files) || self.edit_cmd ==# 'tabedit ' && !exists('w:used_a_tab') + let fallback = 1 + endif + if !from_dir_buffer - if !len(files) || self.edit_cmd ==# 'tabedit ' && !exists('w:used_a_tab') + if exists('l:fallback') exec 'buffer ' . self.previous_buffer - if self.previous_alternate > 0 | let @# = self.previous_alternate | endif - else - " We'll open a file (or more), '% (before ranger)' should become '#', - let @#= self.previous_buffer endif else " previous_buffer was a directory - if self.previous_alternate > 0 | let @# = self.previous_alternate | endif exec 'bdelete! ' . self.previous_buffer endif + if self.edit_cmd ==# 'tabedit ' | let current_window = win_getid() | endif + if len(files) for f in files exec self.edit_cmd . f endfor call delete(s:choice_file_path) endif + if self.edit_cmd ==# 'tabedit ' | let tab_window = win_getid() | endif + exec 'bdelete! ' . ranger_buf + + if self.edit_cmd ==# 'tabedit ' | call win_gotoid(current_window) | endif + + if !from_dir_buffer | let @# = self.previous_buffer | endif + if from_dir_buffer | let @# = w:alternate_buffer | endif + if exists('l:fallback') | let @# = self.previous_alternate | endif + + echomsg 'alt: ' . @# + if self.edit_cmd ==# 'tabedit ' | call win_gotoid(tab_window) | endif endfunction " if the user likes it, open a tab, only when not 'editing' a directory if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) @@ -158,6 +174,7 @@ function! OpenRangerOnVimLoadDir(argv_path) let path = expand(a:argv_path) " Delete empty buffer created by vim after opening file, " in the callback, so we can use 'bdelete' + let w:alternate_buffer = @# call OpenRangerIn(path, 'edit ') endfunction From b49a3c16942bdd19b60987a205b160ca9d5a1ace Mon Sep 17 00:00:00 2001 From: enthudave Date: Sun, 3 Jun 2018 18:16:43 +0200 Subject: [PATCH 13/18] improve alternate --- plugin/ranger.vim | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index e79ab2a..ae1f6ee 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -43,7 +43,7 @@ else endif if !exists('s:choice_file_path') - let s:choice_file_path = tempname() + let s:choice_file_path = '/tmp/chosenfile' endif " Run Ranger in a new tab, only if set by user @@ -101,9 +101,9 @@ if has('nvim') if self.edit_cmd ==# 'tabedit ' | call win_gotoid(current_window) | endif - if !from_dir_buffer | let @# = self.previous_buffer | endif - if from_dir_buffer | let @# = w:alternate_buffer | endif - if exists('l:fallback') | let @# = self.previous_alternate | endif + if !from_dir_buffer | let @# = self.previous_buffer > 0 ? self.previous_buffer : @# | echomsg '!from_dir_buffer' | endif + if from_dir_buffer | let @# = w:alternate_buffer | echomsg 'from_dir_buffer' | endif + if exists('l:fallback') | let @# = self.previous_alternate | echomsg 'fallback'| endif echomsg 'alt: ' . @# if self.edit_cmd ==# 'tabedit ' | call win_gotoid(tab_window) | endif From 4d2a84c33736e9e71fd2a35ccb509673c49e71d0 Mon Sep 17 00:00:00 2001 From: enthudave Date: Sun, 3 Jun 2018 21:04:56 +0200 Subject: [PATCH 14/18] further stabilizations --- plugin/ranger.vim | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index ae1f6ee..1a1692b 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -80,10 +80,12 @@ if has('nvim') if !from_dir_buffer if exists('l:fallback') + echomsg 'visit buffer: ' . bufname(self.previous_buffer) exec 'buffer ' . self.previous_buffer endif else " previous_buffer was a directory + echomsg 'delete buffer: ' . bufname(self.previous_buffer) exec 'bdelete! ' . self.previous_buffer endif @@ -95,17 +97,26 @@ if has('nvim') endfor call delete(s:choice_file_path) endif - if self.edit_cmd ==# 'tabedit ' | let tab_window = win_getid() | endif + echomsg 'ranger_buf: ' . ranger_buf exec 'bdelete! ' . ranger_buf - if self.edit_cmd ==# 'tabedit ' | call win_gotoid(current_window) | endif - - if !from_dir_buffer | let @# = self.previous_buffer > 0 ? self.previous_buffer : @# | echomsg '!from_dir_buffer' | endif - if from_dir_buffer | let @# = w:alternate_buffer | echomsg 'from_dir_buffer' | endif - if exists('l:fallback') | let @# = self.previous_alternate | echomsg 'fallback'| endif + if self.edit_cmd ==# 'tabedit ' + let tab_window = win_getid() + call win_gotoid(current_window) + echomsg 'from tabedit' + let @# = self.previous_alternate + elseif !from_dir_buffer && self.previous_buffer !=# ranger_buf + echomsg '!from_dir_buffer' + let @# = self.previous_buffer + elseif from_dir_buffer + echomsg 'from_dir_buffer' + echomsg 'nr ' . bufnr(w:alternate_buffer) + if len(w:alternate_buffer) | let @# = w:alternate_buffer | endif + endif echomsg 'alt: ' . @# + if !len(@#) | let @# = @% | echomsg 'set alt to current' | endif if self.edit_cmd ==# 'tabedit ' | call win_gotoid(tab_window) | endif endfunction " if the user likes it, open a tab, only when not 'editing' a directory From 8d9ba51cd5ecb30c9c767cb0ba53038dd71bdd65 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 8 Jun 2018 20:39:05 +0200 Subject: [PATCH 15/18] further improvement --- plugin/ranger.vim | 109 +++++++++++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 34 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 1a1692b..78fdb3d 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -49,6 +49,15 @@ endif " Run Ranger in a new tab, only if set by user let g:tabbed_ranger = get(g:, 'tabbed_ranger', 0) +let g:debug_ranger = get(g:, 'debug_ranger', 0) +function! s:debugmessage(mes) + if g:debug_ranger + redraw | echohl Keyword | echomsg a:mes | echohl None + else + return + endif +endfunction + if has('nvim') function! OpenRangerIn(path, edit_cmd) let currentPath = expand(a:path) @@ -59,65 +68,96 @@ if has('nvim') \'previous_buffer': bufnr('%') \} function! rangerCallback.on_exit(job_id, code, event) - echomsg 'alt before: ' . bufname(self.previous_alternate) - echomsg 'current before: ' . bufname(self.previous_buffer) + call debugmessage('alt before: ' . bufname(self.previous_alternate)) + call debugmessage('current before: ' . bufname(self.previous_buffer)) let ranger_buf = bufnr('%') - let from_dir_buffer = isdirectory(fnamemodify(bufname(self.previous_buffer), ':p')) + if ranger_buf == self.previous_buffer + let self.previous_buffer = -1 + let ranger_ate_buffer = 1 + call debugmessage('ranger ate buffer') + endif + let from_dir_buffer = exists('w:alternate_buffer') " If ranger opened in a tab we can safely close the window " We'll delete the buffer when the function ends if exists('w:used_a_tab') | close! | endif try if filereadable(s:choice_file_path) let files = readfile(s:choice_file_path) - else - let files = [] endif endtry - if !len(files) || self.edit_cmd ==# 'tabedit ' && !exists('w:used_a_tab') - let fallback = 1 + if !exists('l:files') || self.edit_cmd ==# 'tabedit ' && !exists('w:used_a_tab') + let should_visit_previous = 1 endif - if !from_dir_buffer - if exists('l:fallback') - echomsg 'visit buffer: ' . bufname(self.previous_buffer) + if exists('l:should_visit_previous') && !exists('l:ranger_ate_buffer') + if from_dir_buffer + call debugmessage('visit buffer: ' . bufname(self.previous_alternate)) + exec 'buffer ' . self.previous_alternate + else + call debugmessage('visit buffer: ' . bufname(self.previous_buffer)) exec 'buffer ' . self.previous_buffer endif - else - " previous_buffer was a directory - echomsg 'delete buffer: ' . bufname(self.previous_buffer) - exec 'bdelete! ' . self.previous_buffer endif - if self.edit_cmd ==# 'tabedit ' | let current_window = win_getid() | endif + if from_dir_buffer + call debugmessage('delete buffer: ' . bufname(self.previous_buffer)) + exec 'bdelete! ' . self.previous_buffer + endif - if len(files) + if self.edit_cmd ==# 'edit ' && exists('l:files') for f in files exec self.edit_cmd . f endfor - call delete(s:choice_file_path) endif - echomsg 'ranger_buf: ' . ranger_buf + call debugmessage('ranger_buf: ' . ranger_buf) + let ranger_buf_name = bufname(ranger_buf) exec 'bdelete! ' . ranger_buf - if self.edit_cmd ==# 'tabedit ' - let tab_window = win_getid() - call win_gotoid(current_window) - echomsg 'from tabedit' - let @# = self.previous_alternate - elseif !from_dir_buffer && self.previous_buffer !=# ranger_buf - echomsg '!from_dir_buffer' - let @# = self.previous_buffer - elseif from_dir_buffer - echomsg 'from_dir_buffer' - echomsg 'nr ' . bufnr(w:alternate_buffer) - if len(w:alternate_buffer) | let @# = w:alternate_buffer | endif + if !exists('w:used_a_tab') + + if self.edit_cmd ==# 'tabedit ' + let @# = self.previous_alternate + call debugmessage('alt: tabedit') + + elseif from_dir_buffer + let @# = w:alternate_buffer + unlet w:alternate_buffer + call debugmessage('alt: from_dir_buffer') + + elseif !exists('l:files') + if exists('l:ranger_ate_buffer') + let @# = ranger_buf + 1 + call debugmessage('alt: ranger_buf + 1') + else + let @# = self.previous_alternate + call debugmessage('alt: no files') + endif + + elseif exists('l:files') + if exists('l:ranger_ate_buffer') + let @# = @% + call debugmessage('alt: current') + else + let @# = self.previous_buffer + call debugmessage('alt: files') + endif + + else + call debugmessage("don't know what to do") + endif + endif + + call debugmessage('set alt from logic: ' . @#) + + if self.edit_cmd ==# 'tabedit ' && exists('l:files') + for f in files + exec self.edit_cmd . f + endfor endif - echomsg 'alt: ' . @# - if !len(@#) | let @# = @% | echomsg 'set alt to current' | endif - if self.edit_cmd ==# 'tabedit ' | call win_gotoid(tab_window) | endif + call delete(s:choice_file_path) endfunction " if the user likes it, open a tab, only when not 'editing' a directory if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) @@ -185,7 +225,8 @@ function! OpenRangerOnVimLoadDir(argv_path) let path = expand(a:argv_path) " Delete empty buffer created by vim after opening file, " in the callback, so we can use 'bdelete' - let w:alternate_buffer = @# + " Set alternate to the directory buffer + let w:alternate_buffer = bufnr('%') call OpenRangerIn(path, 'edit ') endfunction From 5b7f7fa559a3763da8e3097f3bd3f61e37ed5d1b Mon Sep 17 00:00:00 2001 From: enthudave Date: Thu, 14 Jun 2018 19:44:02 +0200 Subject: [PATCH 16/18] skip the directory buffer for alternate --- plugin/ranger.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 78fdb3d..41bb468 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -226,7 +226,7 @@ function! OpenRangerOnVimLoadDir(argv_path) " Delete empty buffer created by vim after opening file, " in the callback, so we can use 'bdelete' " Set alternate to the directory buffer - let w:alternate_buffer = bufnr('%') + let w:alternate_buffer = bufnr('#') call OpenRangerIn(path, 'edit ') endfunction From 48368681172aa7e6a2852f00fe5d27a89e62411b Mon Sep 17 00:00:00 2001 From: enthudave Date: Thu, 14 Jun 2018 20:18:13 +0200 Subject: [PATCH 17/18] remove debugmessages --- plugin/ranger.vim | 55 ++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/plugin/ranger.vim b/plugin/ranger.vim index 41bb468..e4e1893 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -49,15 +49,6 @@ endif " Run Ranger in a new tab, only if set by user let g:tabbed_ranger = get(g:, 'tabbed_ranger', 0) -let g:debug_ranger = get(g:, 'debug_ranger', 0) -function! s:debugmessage(mes) - if g:debug_ranger - redraw | echohl Keyword | echomsg a:mes | echohl None - else - return - endif -endfunction - if has('nvim') function! OpenRangerIn(path, edit_cmd) let currentPath = expand(a:path) @@ -68,13 +59,12 @@ if has('nvim') \'previous_buffer': bufnr('%') \} function! rangerCallback.on_exit(job_id, code, event) - call debugmessage('alt before: ' . bufname(self.previous_alternate)) - call debugmessage('current before: ' . bufname(self.previous_buffer)) let ranger_buf = bufnr('%') if ranger_buf == self.previous_buffer + " this line kept for now to get an error if the logic fails to avoid + " using the ranger buffer for the alternate file or tries to visit it. let self.previous_buffer = -1 let ranger_ate_buffer = 1 - call debugmessage('ranger ate buffer') endif let from_dir_buffer = exists('w:alternate_buffer') " If ranger opened in a tab we can safely close the window @@ -83,6 +73,7 @@ if has('nvim') try if filereadable(s:choice_file_path) let files = readfile(s:choice_file_path) + call delete(s:choice_file_path) endif endtry @@ -92,16 +83,13 @@ if has('nvim') if exists('l:should_visit_previous') && !exists('l:ranger_ate_buffer') if from_dir_buffer - call debugmessage('visit buffer: ' . bufname(self.previous_alternate)) exec 'buffer ' . self.previous_alternate else - call debugmessage('visit buffer: ' . bufname(self.previous_buffer)) exec 'buffer ' . self.previous_buffer endif endif if from_dir_buffer - call debugmessage('delete buffer: ' . bufname(self.previous_buffer)) exec 'bdelete! ' . self.previous_buffer endif @@ -111,55 +99,57 @@ if has('nvim') endfor endif - call debugmessage('ranger_buf: ' . ranger_buf) - let ranger_buf_name = bufname(ranger_buf) + " deleting ranger buffer now, if the alternate file logic tries to use + " it we will get an error, so we learn were improvements are needed exec 'bdelete! ' . ranger_buf if !exists('w:used_a_tab') - if self.edit_cmd ==# 'tabedit ' let @# = self.previous_alternate - call debugmessage('alt: tabedit') elseif from_dir_buffer let @# = w:alternate_buffer unlet w:alternate_buffer - call debugmessage('alt: from_dir_buffer') elseif !exists('l:files') if exists('l:ranger_ate_buffer') + " this is a weird one, the result of using ranger when vim's buffer + " list is 'empty', vim always has at least the [No Name] buffer, + " when the user subsequently opens an actual buffer this old + " [No Name] buffer gets 'eaten'. If ranger replaces that + " buffer and the user does not choose a file, vim will end up in a + " state where once again there is only the [No Name] buffer, + " except it will have a 'bufnr' 1 higher than the one before + " using ranger did. let @# = ranger_buf + 1 - call debugmessage('alt: ranger_buf + 1') else let @# = self.previous_alternate - call debugmessage('alt: no files') endif elseif exists('l:files') if exists('l:ranger_ate_buffer') + " A last resort, we can't set a sensible alternate, to not get an + " error, we use the buffer we end up in as with 'the weird one' let @# = @% - call debugmessage('alt: current') else let @# = self.previous_buffer - call debugmessage('alt: files') endif - - else - call debugmessage("don't know what to do") endif endif - call debugmessage('set alt from logic: ' . @#) - + " when opening files in a new tab, we do this only now, after setting + " the alternate file to avoid jumping windows for setting that alternate + " in the previous window. Perhaps there is a way to open the files + " earlier and while being in the new tab set the alternate for that old + " window but I haven't yet found a way to do that. if self.edit_cmd ==# 'tabedit ' && exists('l:files') for f in files exec self.edit_cmd . f endfor endif - - call delete(s:choice_file_path) endfunction " if the user likes it, open a tab, only when not 'editing' a directory + " (netrw replacement) if g:tabbed_ranger && !isdirectory(fnamemodify(bufname('%'), ':p')) tabnew let w:used_a_tab = 1 @@ -223,9 +213,6 @@ endfunction " Open Ranger in the directory passed by argument function! OpenRangerOnVimLoadDir(argv_path) let path = expand(a:argv_path) - " Delete empty buffer created by vim after opening file, - " in the callback, so we can use 'bdelete' - " Set alternate to the directory buffer let w:alternate_buffer = bufnr('#') call OpenRangerIn(path, 'edit ') endfunction From cb87378418b718ea1414de288e4379ea6d163f69 Mon Sep 17 00:00:00 2001 From: enthudave Date: Fri, 15 Jun 2018 12:43:31 +0200 Subject: [PATCH 18/18] visit correct buffer after dir edit --- plugin/.ranger.vim.un~ | Bin 0 -> 1084 bytes plugin/ranger.vim | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 plugin/.ranger.vim.un~ diff --git a/plugin/.ranger.vim.un~ b/plugin/.ranger.vim.un~ new file mode 100644 index 0000000000000000000000000000000000000000..b73c0fba32dc70de5ef565a5fa33901cebd2b586 GIT binary patch literal 1084 zcmWH`%$*;a=aT=FfoZu!I)A!}|AU3Q{n)AvQ?I2PrhHCgs^5~TEfD3~eE%f_1H*G5 zHd26t)QZ$(1@)xTw6xSB1$6~Ih2qqlG`)hN)UwR{(&G5UoRZX{yu^}Jpsp|=mIh)* zAZ7w$5CG9I%n+?St&jyI%g7La0VE3qFohsCND5{M!+#(Ei-2TC0S!U`7#)$|=wM*@ zDgiV<6o|ut7?c7)Q9(v3Fl_`!EJ!yp07Wt=V%0!`qY(=V1zG}N#1=sF8Pz>% literal 0 HcmV?d00001 diff --git a/plugin/ranger.vim b/plugin/ranger.vim index e4e1893..4f9f576 100644 --- a/plugin/ranger.vim +++ b/plugin/ranger.vim @@ -83,7 +83,7 @@ if has('nvim') if exists('l:should_visit_previous') && !exists('l:ranger_ate_buffer') if from_dir_buffer - exec 'buffer ' . self.previous_alternate + exec 'buffer ' . w:alternate_buffer else exec 'buffer ' . self.previous_buffer endif