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*
|
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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user