Merged ryans fixes for UltiSnipsEdit command without any change

This commit is contained in:
Holger Rapp 2011-04-28 08:00:56 +02:00
commit c65e73269c
3 changed files with 192 additions and 102 deletions

View File

@ -121,17 +121,24 @@ To Update an installation, simply pull the latest revision: >
3.1 Commands *UltiSnips-commands* 3.1 Commands *UltiSnips-commands*
------------ ------------
UltiSnips defines two Commands, the first one is UltiSnipsReset, which will *:UltiSnipsReset*
UltiSnips defines two commands, the first one is UltiSnipsReset, which will
reload the snippets definitions and is useful while you are tweaking a reload the snippets definitions and is useful while you are tweaking a
snippet. snippet.
UltiSnipsEdit is the second one. It opens your private snippet definition file
for the current filetype. You can easily open them manually of course, this is
just a shortcut. There is also a variable called: >
*:UltiSnipsEdit*
The second command is UltiSnipsEdit. It opens or creates your private snippet
definition file for the current filetype. You can easily open them manually of
course, this is just a shortcut. There is also a variable called: >
g:UltiSnipsEditSplit g:UltiSnipsEditSplit
which can be set to "normal" (default), "horizontal" or "vertical" that which can be set to "normal" (default), "horizontal" or "vertical" that
defines if a new window should be opened for the edit. defines if a new window should be opened for the edit. There is also a
variable called: >
g:UltiSnipsSnippetsDir
that, when set to a directory like "~/.vim/mydir/UltiSnips", becomes the base
directory for the snippet file to open. For example, if it is set to
"~/.vim/mydir/UltiSnips" and the current 'filetype' is "cpp", then
:UltiSnipsEdit will open "~/.vim/mydir/UltiSnips/cpp.snippets".
3.2 Triggers *UltiSnips-triggers* 3.2 Triggers *UltiSnips-triggers*
------------ ------------
@ -237,9 +244,11 @@ See |UltiSnips-snippet-search-path| for an explanation of where directories
with snippet definitions are expected. with snippet definitions are expected.
While iterating over the snippet definition directories found, files are While iterating over the snippet definition directories found, files are
looked for called ft.snippets, for example: > looked for called ft.snippets or *_ft.snippets where "ft" is the current
'filetype', and the "*" matches anything, for example: >
ruby.snippets ruby.snippets
c.snippets c.snippets
my_c.snippets
perl.snippets perl.snippets
These files contain the snippet definitions for the various file types. A These files contain the snippet definitions for the various file types. A
special file is > special file is >
@ -248,7 +257,7 @@ which contains snippets that are always expanded, no matter what file type is
defined. For example, I keep mail signatures and date insertion snippets here. defined. For example, I keep mail signatures and date insertion snippets here.
The dotted file type syntax of vim is supported. For example, for my cpp or The dotted file type syntax of vim is supported. For example, for my cpp or
CUDA files, i keep the file type set to ":set ft=cpp.c" or ":set CUDA files, I keep the file type set to ":set ft=cpp.c" or ":set
ft=cuda.cpp.c". This activates all snippets for each file type in the order ft=cuda.cpp.c". This activates all snippets for each file type in the order
specified. specified.

View File

@ -68,13 +68,12 @@ command! -nargs=0 UltiSnipsReset :py UltiSnips_Manager.reset()
function! UltiSnipsEdit(...) function! UltiSnipsEdit(...)
if a:0 == 1 && a:1 != '' if a:0 == 1 && a:1 != ''
let type = a:1 let type = a:1
elseif &filetype != ''
let type = split(&filetype, '\.')[0]
else else
let type = 'all' python vim.command("let type = '%s'" % UltiSnips_Manager.filetype)
endif endif
if exists('g:UltiSnipsSnippetsDir') python vim.command("let file = '%s'" % UltiSnips_Manager.file_to_edit(vim.eval("type")))
let mode = 'e' let mode = 'e'
if exists('g:UltiSnipsEditSplit') if exists('g:UltiSnipsEditSplit')
if g:UltiSnipsEditSplit == 'vertical' if g:UltiSnipsEditSplit == 'vertical'
@ -83,18 +82,7 @@ function! UltiSnipsEdit(...)
let mode = 'sp' let mode = 'sp'
endif endif
endif endif
exe ':'.mode.' '.g:UltiSnipsSnippetsDir.'/'.type.'.snippets' exe ':'.mode.' '.file
else
for dir in g:UltiSnipsSnippetDirectories
for p in reverse(split(&runtimepath, ','))
if isdirectory(p.'/'.dir)
let g:UltiSnipsSnippetsDir = p.'/'.dir
call UltiSnipsEdit(type)
break
endif
endfor
endfor
endif
endfunction endfunction
" edit snippets, default of current file type or the specified type " edit snippets, default of current file type or the specified type
@ -211,3 +199,4 @@ call UltiSnips_MapKeys()
let did_UltiSnips_vim=1 let did_UltiSnips_vim=1
" }}} " }}}
" vim: ts=8 sts=4 sw=4

View File

@ -870,9 +870,10 @@ class SnippetManager(object):
feedkeys(feedkey, mode) feedkeys(feedkey, mode)
def _ensure_snippets_loaded(self): def _ensure_snippets_loaded(self):
filetypes = vim.eval("&filetype").split(".") + [ "all" ] filetypes = self._filetypes()
for ft in filetypes[::-1]:
if len(ft) and ft not in self._snippets: for ft in filetypes:
if ft not in self._snippets:
self._load_snippets_for(ft) self._load_snippets_for(ft)
return filetypes return filetypes
@ -898,7 +899,7 @@ class SnippetManager(object):
filetypes = self._ensure_snippets_loaded() filetypes = self._ensure_snippets_loaded()
found_snippets = [] found_snippets = []
for ft in filetypes[::-1]: for ft in filetypes:
found_snippets += self._find_snippets(ft, before, possible) found_snippets += self._find_snippets(ft, before, possible)
# Search if any of the snippets overwrites the previous # Search if any of the snippets overwrites the previous
@ -1066,16 +1067,107 @@ class SnippetManager(object):
def _parse_snippets(self, ft, fn, file_data=None): def _parse_snippets(self, ft, fn, file_data=None):
_SnippetsFileParser(ft, fn, self, file_data).parse() _SnippetsFileParser(ft, fn, self, file_data).parse()
def base_snippet_files_for(self, ft, default=True):
""" Returns a list of snippet files matching the given filetype (ft).
If default is set to false, it doesn't include shipped files.
Searches through each path in 'runtimepath' in reverse order,
in each of these, it searches each directory name listed in
'g:UltiSnipsSnippetDirectories' in order, then looks for files in these
directories called 'ft.snippets' or '*_ft.snippets' replacing ft with
the filetype.
"""
snippet_dirs = vim.eval("g:UltiSnipsSnippetDirectories")
base_snippets = os.path.realpath(os.path.join(__file__, "../../../UltiSnips"))
ret = []
for rtp in vim.eval("&runtimepath").split(',')[::-1]:
for snippet_dir in snippet_dirs:
pth = os.path.realpath(os.path.join(rtp, snippet_dir))
patterns = ["%s.snippets", "*_%s.snippets"]
if not default and pth == base_snippets:
patterns.remove("%s.snippets")
for pattern in patterns:
for fn in glob.glob(os.path.join(pth, pattern % ft)):
if fn not in ret:
ret.append(fn)
return ret
def _filetypes(self, dotft=None):
if dotft is None:
dotft = vim.eval("&filetype")
fts = dotft.split(".") + [ "all" ]
return [ft for ft in fts[::-1] if ft]
def filetype(self):
""" Property for the current (undotted) filetype. """
return self._filetypes()[-1]
filetype = property(filetype)
def file_to_edit(self, ft=None):
""" Gets a file to edit based on the given filetype.
If no filetype is given, uses the current filetype from vim.
Checks 'g:UltiSnipsSnippetsDir' and uses it if it exists
If a non-shipped file already exists, it uses it.
Otherwise uses a file in ~/.vim/ or ~/vimfiles
"""
if not ft:
ft = self.filetype
edit = None
existing = self.base_snippet_files_for(ft, False)
filename = ft + ".snippets"
if vim.eval("exists('g:UltiSnipsSnippetsDir')") == 1:
snipdir = vim.eval("g:UltiSnipsSnippetsDir")
edit = os.path.join(snipdir, filename)
elif existing:
edit = existing[-1] # last sourced/highest priority
else:
home = vim.eval("$HOME")
rtp = vim.eval("&rtp").split(",")
snippet_dirs = ["UltiSnips"] + vim.eval("g:UltiSnipsSnippetDirectories")
us = snippet_dirs[-1]
path = os.path.join(home, ".vim", us)
for dirname in [".vim", "vimfiles"]:
pth = os.path.join(home, dirname)
if pth in rtp:
path = os.path.join(pth, us)
if not os.path.isdir(path):
os.mkdir(path)
edit = os.path.join(path, filename)
return edit
def base_snippet_files(self, dotft=None):
""" Returns a list of all snippet files for the given filetype.
If no filetype is given, uses furrent filetype.
If the filetype is dotted (e.g. 'cuda.cpp.c') then it is split and
each filetype is checked.
"""
ret = []
filetypes = self._filetypes(dotft)
for ft in filetypes:
ret += self.base_snippet_files_for(ft)
return ret
# Loading # Loading
def _load_snippets_for(self, ft): def _load_snippets_for(self, ft):
self._snippets[ft] = _SnippetDictionary() self._snippets[ft] = _SnippetDictionary()
snippet_dirs = vim.eval("g:UltiSnipsSnippetDirectories") for fn in self.base_snippet_files_for(ft):
for p in vim.eval("&runtimepath").split(',')[::-1]:
for snippet_dir in snippet_dirs:
pattern = os.path.join(p, snippet_dir, "*%s.snippets" % ft)
for fn in glob.glob(pattern):
self._parse_snippets(ft, fn) self._parse_snippets(ft, fn)
# Now load for the parents # Now load for the parents