146 lines
5.8 KiB
VimL
146 lines
5.8 KiB
VimL
|
" ============================================================================
|
||
|
" python_pydiction.vim - Module and Keyword completion for Python
|
||
|
" ============================================================================
|
||
|
"
|
||
|
" Author: Ryan Kulla (rkulla AT gmail DOT com)
|
||
|
" Version: 1.2, for Vim 7
|
||
|
" URL: http://www.vim.org/scripts/script.php?script_id=850
|
||
|
" Last Modified: July 22th, 2009
|
||
|
" Installation: On Linux, put this file in ~/.vim/after/ftplugin/
|
||
|
" On Windows, put this file in C:\vim\vimfiles\ftplugin\
|
||
|
" (assuming you installed vim in C:\vim\).
|
||
|
" You may install the other files anywhere.
|
||
|
" In .vimrc, add the following:
|
||
|
" filetype plugin on
|
||
|
" let g:pydiction_location = 'path/to/complete-dict'
|
||
|
" Optionally, you set the completion menu height like:
|
||
|
" let g:pydiction_menu_height = 20
|
||
|
" The default menu height is 15
|
||
|
" To do case-sensitive searches, set noignorecase (:set noic).
|
||
|
" Usage: Type part of a Python keyword, module name, attribute or method,
|
||
|
" then hit the TAB key and it will auto-complete (as long as it
|
||
|
" exists in the complete-dict file.
|
||
|
" You can also use Shift-Tab to Tab backwards.
|
||
|
" License: BSD
|
||
|
" Copyright: Copyright (c) 2003-2009 Ryan Kulla
|
||
|
" All rights reserved.
|
||
|
"
|
||
|
" Redistribution and use in source and binary forms, with or without
|
||
|
" modification, are permitted provided that the following conditions
|
||
|
" are met:
|
||
|
" 1. Redistributions of source code must retain the above copyright
|
||
|
" notice, this list of conditions and the following disclaimer.
|
||
|
" 2. Redistributions in binary form must reproduce the above
|
||
|
" copyright notice, this list of conditions and the following
|
||
|
" disclaimer in the documentation and/or other materials provided
|
||
|
" with the distribution.
|
||
|
" 3. The name of the author may not be used to endorse or promote
|
||
|
" products derived from this software without specific prior
|
||
|
" written permission.
|
||
|
"
|
||
|
" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||
|
" OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
|
" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||
|
" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
|
" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||
|
" GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
|
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
|
" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
"
|
||
|
"
|
||
|
|
||
|
if v:version < 700
|
||
|
echoerr "Pydiction requires vim version 7 or greater."
|
||
|
finish
|
||
|
endif
|
||
|
|
||
|
|
||
|
" Make the Tab key do python code completion:
|
||
|
inoremap <silent> <buffer> <Tab>
|
||
|
\<C-R>=<SID>SetVals()<CR>
|
||
|
\<C-R>=<SID>TabComplete('down')<CR>
|
||
|
\<C-R>=<SID>RestoreVals()<CR>
|
||
|
|
||
|
" Make Shift+Tab do python code completion in the reverse direction:
|
||
|
inoremap <silent> <buffer> <S-Tab>
|
||
|
\<C-R>=<SID>SetVals()<CR>
|
||
|
\<C-R>=<SID>TabComplete('up')<CR>
|
||
|
\<C-R>=<SID>RestoreVals()<CR>
|
||
|
|
||
|
|
||
|
if !exists("*s:TabComplete")
|
||
|
function! s:TabComplete(direction)
|
||
|
" Check if the char before the char under the cursor is an
|
||
|
" underscore, letter, number, dot or opening parentheses.
|
||
|
" If it is, and if the popup menu is not visible, use
|
||
|
" I_CTRL-X_CTRL-K ('dictionary' only completion)--otherwise,
|
||
|
" use I_CTRL-N to scroll downward through the popup menu or
|
||
|
" use I_CTRL-P to scroll upward through the popup menu,
|
||
|
" depending on the value of a:direction.
|
||
|
" If the char is some other character, insert a normal Tab:
|
||
|
if searchpos('[_a-zA-Z0-9.(]\%#', 'nb') != [0, 0]
|
||
|
if !pumvisible()
|
||
|
return "\<C-X>\<C-K>"
|
||
|
else
|
||
|
if a:direction == 'down'
|
||
|
return "\<C-N>"
|
||
|
else
|
||
|
return "\<C-P>"
|
||
|
endif
|
||
|
endif
|
||
|
else
|
||
|
return "\<Tab>"
|
||
|
endif
|
||
|
endfunction
|
||
|
endif
|
||
|
|
||
|
|
||
|
if !exists("*s:SetVals")
|
||
|
function! s:SetVals()
|
||
|
" Save and change any config values we need.
|
||
|
|
||
|
" Temporarily change isk to treat periods and opening
|
||
|
" parenthesis as part of a keyword -- so we can complete
|
||
|
" python modules and functions:
|
||
|
let s:pydiction_save_isk = &iskeyword
|
||
|
setlocal iskeyword +=.,(
|
||
|
|
||
|
" Save any current dictionaries the user has set:
|
||
|
let s:pydiction_save_dictions = &dictionary
|
||
|
" Temporarily use only pydiction's dictionary:
|
||
|
let &dictionary = g:pydiction_location
|
||
|
|
||
|
" Save the ins-completion options the user has set:
|
||
|
let s:pydiction_save_cot = &completeopt
|
||
|
" Have the completion menu show up for one or more matches:
|
||
|
let &completeopt = "menu,menuone"
|
||
|
|
||
|
" Set the popup menu height:
|
||
|
let s:pydiction_save_pumheight = &pumheight
|
||
|
if !exists('g:pydiction_menu_height')
|
||
|
let g:pydiction_menu_height = 15
|
||
|
endif
|
||
|
let &pumheight = g:pydiction_menu_height
|
||
|
|
||
|
return ''
|
||
|
endfunction
|
||
|
endif
|
||
|
|
||
|
|
||
|
if !exists("*s:RestoreVals")
|
||
|
function! s:RestoreVals()
|
||
|
" Restore the user's initial values.
|
||
|
|
||
|
let &dictionary = s:pydiction_save_dictions
|
||
|
let &completeopt = s:pydiction_save_cot
|
||
|
let &pumheight = s:pydiction_save_pumheight
|
||
|
let &iskeyword = s:pydiction_save_isk
|
||
|
|
||
|
return ''
|
||
|
endfunction
|
||
|
endif
|
||
|
|