Merged ryans fixes for UltiSnipsEdit command without any change
This commit is contained in:
commit
c65e73269c
@ -121,17 +121,24 @@ To Update an installation, simply pull the latest revision: >
|
||||
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
|
||||
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
|
||||
|
||||
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*
|
||||
------------
|
||||
@ -237,9 +244,11 @@ See |UltiSnips-snippet-search-path| for an explanation of where directories
|
||||
with snippet definitions are expected.
|
||||
|
||||
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
|
||||
c.snippets
|
||||
my_c.snippets
|
||||
perl.snippets
|
||||
These files contain the snippet definitions for the various file types. A
|
||||
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.
|
||||
|
||||
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
|
||||
specified.
|
||||
|
||||
|
@ -68,13 +68,12 @@ command! -nargs=0 UltiSnipsReset :py UltiSnips_Manager.reset()
|
||||
function! UltiSnipsEdit(...)
|
||||
if a:0 == 1 && a:1 != ''
|
||||
let type = a:1
|
||||
elseif &filetype != ''
|
||||
let type = split(&filetype, '\.')[0]
|
||||
else
|
||||
let type = 'all'
|
||||
python vim.command("let type = '%s'" % UltiSnips_Manager.filetype)
|
||||
endif
|
||||
|
||||
if exists('g:UltiSnipsSnippetsDir')
|
||||
python vim.command("let file = '%s'" % UltiSnips_Manager.file_to_edit(vim.eval("type")))
|
||||
|
||||
let mode = 'e'
|
||||
if exists('g:UltiSnipsEditSplit')
|
||||
if g:UltiSnipsEditSplit == 'vertical'
|
||||
@ -83,18 +82,7 @@ function! UltiSnipsEdit(...)
|
||||
let mode = 'sp'
|
||||
endif
|
||||
endif
|
||||
exe ':'.mode.' '.g:UltiSnipsSnippetsDir.'/'.type.'.snippets'
|
||||
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
|
||||
exe ':'.mode.' '.file
|
||||
endfunction
|
||||
|
||||
" edit snippets, default of current file type or the specified type
|
||||
@ -211,3 +199,4 @@ call UltiSnips_MapKeys()
|
||||
let did_UltiSnips_vim=1
|
||||
|
||||
" }}}
|
||||
" vim: ts=8 sts=4 sw=4
|
||||
|
@ -870,9 +870,10 @@ class SnippetManager(object):
|
||||
feedkeys(feedkey, mode)
|
||||
|
||||
def _ensure_snippets_loaded(self):
|
||||
filetypes = vim.eval("&filetype").split(".") + [ "all" ]
|
||||
for ft in filetypes[::-1]:
|
||||
if len(ft) and ft not in self._snippets:
|
||||
filetypes = self._filetypes()
|
||||
|
||||
for ft in filetypes:
|
||||
if ft not in self._snippets:
|
||||
self._load_snippets_for(ft)
|
||||
|
||||
return filetypes
|
||||
@ -898,7 +899,7 @@ class SnippetManager(object):
|
||||
filetypes = self._ensure_snippets_loaded()
|
||||
|
||||
found_snippets = []
|
||||
for ft in filetypes[::-1]:
|
||||
for ft in filetypes:
|
||||
found_snippets += self._find_snippets(ft, before, possible)
|
||||
|
||||
# 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):
|
||||
_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
|
||||
def _load_snippets_for(self, ft):
|
||||
self._snippets[ft] = _SnippetDictionary()
|
||||
|
||||
snippet_dirs = vim.eval("g:UltiSnipsSnippetDirectories")
|
||||
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):
|
||||
for fn in self.base_snippet_files_for(ft):
|
||||
self._parse_snippets(ft, fn)
|
||||
|
||||
# Now load for the parents
|
||||
|
Loading…
Reference in New Issue
Block a user