Sfoglia il codice sorgente

Version 3.4 (April 14, 2012)

Yegappan Lakshmanan 12 anni fa
parent
commit
4250f7108f
1 ha cambiato i file con 109 aggiunte e 52 eliminazioni
  1. 109 52
      plugin/mru.vim

+ 109 - 52
plugin/mru.vim

@@ -1,8 +1,8 @@
 " File: mru.vim
 " Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
-" Version: 3.3
-" Last Modified: December 18, 2009
-" Copyright: Copyright (C) 2003-2009 Yegappan Lakshmanan
+" Version: 3.4
+" Last Modified: April 13, 2012
+" Copyright: Copyright (C) 2003-2012 Yegappan Lakshmanan
 "            Permission is hereby granted to use and distribute this code,
 "            with or without modifications, provided that this copyright
 "            notice is copied with it. Like anything else that's free,
@@ -97,7 +97,7 @@
 "
 " To display only files matching a pattern from the MRU list in the MRU
 " window, you can specify a pattern to the ":MRU" command. For example, to
-" display only file names containing "vim" in them, you can use the following
+" display only file names matching "vim" in them, you can use the following
 " command ":MRU vim".  When you specify a partial file name and only one
 " matching filename is found, then the ":MRU" command will edit that file.
 "
@@ -280,6 +280,22 @@ if !exists('MRU_Max_Submenu_Entries')
     let MRU_Max_Submenu_Entries = 10
 endif
 
+" When only a single matching filename is found in the MRU list, the following
+" option controls whether the file name is displayed in the MRU window or the
+" file is directly opened. When this variable is set to 0 and a single
+" matching file name is found, then the file is directly opened.
+if !exists('MRU_Window_Open_Always')
+    let MRU_Window_Open_Always = 0
+endif
+
+" When opening a file from the MRU list, the file is opened in the current
+" tab. If the selected file has to be opened in a tab always, then set the
+" following variable to 1. If the file is already opened in a tab, then the
+" cursor will be moved to that tab.
+if !exists('MRU_Open_File_Use_Tabs')
+    let MRU_Open_File_Use_Tabs = 0
+endif
+
 " Control to temporarily lock the MRU list. Used to prevent files from
 " getting added to the MRU list when the ':vimgrep' command is executed.
 let s:mru_list_locked = 0
@@ -409,7 +425,7 @@ endfunction
 " MRU_Edit_File                         {{{1
 " Edit the specified file
 "   filename - Name of the file to edit
-"   sanitized - Specifies whether the filename is already escape for special
+"   sanitized - Specifies whether the filename is already escaped for special
 "   characters or not.
 function! s:MRU_Edit_File(filename, sanitized)
     if !a:sanitized
@@ -417,6 +433,15 @@ function! s:MRU_Edit_File(filename, sanitized)
     else
 	let esc_fname = a:filename
     endif
+
+    " If the user wants to always open the file in a tab, then open the file
+    " in a tab. If it is already opened in a tab, then the cursor will be
+    " moved to that tab.
+    if g:MRU_Open_File_Use_Tabs
+	call s:MRU_Open_File_In_Tab(a:filename, esc_fname)
+	return
+    endif
+
     " If the file is already open in one of the windows, jump to it
     let winnum = bufwinnr('^' . a:filename . '$')
     if winnum != -1
@@ -434,6 +459,42 @@ function! s:MRU_Edit_File(filename, sanitized)
     endif
 endfunction
 
+" MRU_Open_File_In_Tab
+" Open a file in a tab. If the file is already opened in a tab, jump to the
+" tab. Otherwise, create a new tab and open the file.
+"   fname     : Name of the file to open
+"   esc_fname : File name with special characters escaped
+function! s:MRU_Open_File_In_Tab(fname, esc_fname)
+    " If the selected file is already open in the current tab or in
+    " another tab, jump to it. Otherwise open it in a new tab
+    if bufwinnr('^' . a:fname . '$') == -1
+	let tabnum = -1
+	let i = 1
+	let bnum = bufnr('^' . a:fname . '$')
+	while i <= tabpagenr('$')
+	    if index(tabpagebuflist(i), bnum) != -1
+		let tabnum = i
+		break
+	    endif
+	    let i += 1
+	endwhile
+
+	if tabnum != -1
+	    " Goto the tab containing the file
+	    exe 'tabnext ' . i
+	else
+	    " Open a new tab as the last tab page
+	    exe '999tabnew ' . a:esc_fname
+	endif
+    endif
+
+    " Jump to the window containing the file
+    let winnum = bufwinnr('^' . a:fname . '$')
+    if winnum != winnr()
+	exe winnum . 'wincmd w'
+    endif
+endfunction
+
 " MRU_Window_Edit_File                  {{{1
 "   fname     : Name of the file to edit. May specify single or multiple
 "               files.
@@ -447,44 +508,25 @@ endfunction
 "               useopen - If the file is already present in a window, then
 "                         jump to that window.  Otherwise, open the file in
 "                         the previous window.
-"               newwin  - Open the file in a new window.
+"               newwin_horiz - Open the file in a new horizontal window.
+"               newwin_vert - Open the file in a new vertical window.
 "               newtab  - Open the file in a new tab. If the file is already
 "                         opened in a tab, then jump to that tab.
 function! s:MRU_Window_Edit_File(fname, multi, edit_type, open_type)
     let esc_fname = s:MRU_escape_filename(a:fname)
 
-    if a:open_type == 'newwin'
-        " Edit the file in a new window
-        exe 'leftabove new ' . esc_fname
-    elseif a:open_type == 'newtab'
-        " If the selected file is already open in the current tab or in
-        " another tab, jump to it. Otherwise open it in a new tab
-        if bufwinnr('^' . a:fname . '$') == -1
-            let tabnum = -1
-            let i = 1
-            let bnum = bufnr('^' . a:fname . '$')
-            while i <= tabpagenr('$')
-                if index(tabpagebuflist(i), bnum) != -1
-                    let tabnum = i
-                    break
-                endif
-                let i += 1
-            endwhile
-
-            if tabnum != -1
-                " Goto the tab containing the file
-                exe 'tabnext ' . i
-            else
-                " Open a new tab as the last tab page
-                exe '999tabnew ' . esc_fname
-            endif
-        endif
-
-        " Jump to the window containing the file
-        let winnum = bufwinnr('^' . a:fname . '$')
-        if winnum != winnr()
-            exe winnum . 'wincmd w'
-        endif
+    if a:open_type == 'newwin_horiz'
+        " Edit the file in a new horizontally split window above the previous
+        " window
+        wincmd p
+        exe 'belowright new ' . esc_fname
+    elseif a:open_type == 'newwin_vert'
+        " Edit the file in a new vertically split window above the previous
+        " window
+        wincmd p
+        exe 'belowright vnew ' . esc_fname
+    elseif a:open_type == 'newtab' || g:MRU_Open_File_Use_Tabs
+	call s:MRU_Open_File_In_Tab(a:fname, esc_fname)
     else
         " If the selected file is already open in one of the windows,
         " jump to it
@@ -551,10 +593,11 @@ endfunction
 "
 "   'opt' has two values separated by comma. The first value specifies how to
 "   edit the file  and can be either 'edit' or 'view'. The second value
-"   specifies where to open the file. It can be 'useopen' to open file in the
-"   previous window. It can be 'newwin' to open the file in a new window. It
-"   can be 'newtab' to open the file in a new tab.
-"
+"   specifies where to open the file. It can take one of the following values:
+"     'useopen' to open file in the previous window
+"     'newwin_horiz' to open the file in a new horizontal split window
+"     'newwin_vert' to open the file in a new vertical split window.
+"     'newtab' to open the file in a new tab.
 " If multiple file names are selected using visual mode, then open multiple
 " files (either in split windows or tabs)
 function! s:MRU_Select_File_Cmd(opt) range
@@ -575,7 +618,10 @@ function! s:MRU_Select_File_Cmd(opt) range
             continue
         endif
 
-        call s:MRU_Window_Edit_File(f, multi, edit_type, open_type)
+        " The text in the MRU window contains the filename in parenthesis
+        let file = matchstr(f, '(\zs.*\ze)')
+
+        call s:MRU_Window_Edit_File(file, multi, edit_type, open_type)
 
         if a:firstline != a:lastline
             " Opening multiple files
@@ -680,9 +726,13 @@ function! s:MRU_Open_Window(...)
     vnoremap <buffer> <silent> <CR>
                 \ :call <SID>MRU_Select_File_Cmd('edit,useopen')<CR>
     nnoremap <buffer> <silent> o
-                \ :call <SID>MRU_Select_File_Cmd('edit,newwin')<CR>
+                \ :call <SID>MRU_Select_File_Cmd('edit,newwin_horiz')<CR>
     vnoremap <buffer> <silent> o
-                \ :call <SID>MRU_Select_File_Cmd('edit,newwin')<CR>
+                \ :call <SID>MRU_Select_File_Cmd('edit,newwin_horiz')<CR>
+    nnoremap <buffer> <silent> O
+                \ :call <SID>MRU_Select_File_Cmd('edit,newwin_vert')<CR>
+    vnoremap <buffer> <silent> O
+                \ :call <SID>MRU_Select_File_Cmd('edit,newwin_vert')<CR>
     nnoremap <buffer> <silent> t
                 \ :call <SID>MRU_Select_File_Cmd('edit,newtab')<CR>
     vnoremap <buffer> <silent> t
@@ -700,7 +750,7 @@ function! s:MRU_Open_Window(...)
     " Display the MRU list
     if a:0 == 0
         " No search pattern specified. Display the complete list
-        silent! 0put =s:MRU_files
+        let m = copy(s:MRU_files)
     else
         " Display only the entries matching the specified pattern
 	" First try using it as a literal pattern
@@ -709,9 +759,16 @@ function! s:MRU_Open_Window(...)
 	    " No match. Try using it as a regular expression
 	    let m = filter(copy(s:MRU_files), 'v:val =~# a:1')
 	endif
-        silent! 0put =m
     endif
 
+    " Get the tail part of the file name (without the directory) and display
+    " it along with the full path
+    let  output = map(m, 'fnamemodify(v:val, ":t") . " (" . v:val . ")"')
+    silent! 0put =output
+
+    " Delete the empty line at the end of the buffer
+    $delete
+
     " Move the cursor to the beginning of the file
     normal! gg
 
@@ -751,17 +808,17 @@ function! s:MRU_Cmd(pat)
 
     " First use the specified string as a literal string and search for
     " filenames containing the string. If only one filename is found,
-    " then edit it.
+    " then edit it (unless the user wants to open the MRU window always)
     let m = filter(copy(s:MRU_files), 'stridx(v:val, a:pat) != -1')
     if len(m) > 0
-	if len(m) == 1
+	if len(m) == 1 && !g:MRU_Window_Open_Always
 	    call s:MRU_Edit_File(m[0], 0)
 	    return
 	endif
 
 	" More than one file matches. Try find an accurate match
 	let new_m = filter(m, 'v:val ==# a:pat')
-	if len(new_m) == 1
+	if len(new_m) == 1 && !g:MRU_Window_Open_Always
 	    call s:MRU_Edit_File(new_m[0], 0)
 	    return
 	endif
@@ -786,11 +843,11 @@ function! s:MRU_Cmd(pat)
 
         " No filenames matching the specified pattern are found
         call s:MRU_Warn_Msg("MRU file list doesn't contain " .
-                    \ "files containing " . a:pat)
+                    \ "files matching " . a:pat)
         return
     endif
 
-    if len(m) == 1
+    if len(m) == 1 && !g:MRU_Window_Open_Always
         call s:MRU_Edit_File(m[0], 0)
         return
     endif