forked from aniani/vim
updated for version 7.0187
This commit is contained in:
@@ -1,10 +1,20 @@
|
||||
"pycomplete.vim - Omni Completion for python
|
||||
" Maintainer: Aaron Griffin
|
||||
" Version: 0.2
|
||||
" Last Updated: 5 January 2006
|
||||
" Version: 0.3
|
||||
" Last Updated: 23 January 2006
|
||||
"
|
||||
" v0.3 Changes:
|
||||
" added top level def parsing
|
||||
" for safety, call returns are not evaluated
|
||||
" handful of parsing changes
|
||||
" trailing ( and . characters
|
||||
" argument completion on open parens
|
||||
" stop parsing at current line - ++performance, local var resolution
|
||||
"
|
||||
" TODO
|
||||
" * local variables *inside* class members
|
||||
" RExec subclass
|
||||
" Code cleanup + make class
|
||||
" use internal dict, not globals()
|
||||
|
||||
if !has('python')
|
||||
echo "Error: Required vim compiled with +python"
|
||||
@@ -20,10 +30,10 @@ function! pycomplete#Complete(findstart, base)
|
||||
let idx -= 1
|
||||
let c = line[idx-1]
|
||||
if c =~ '\w'
|
||||
continue
|
||||
elseif ! c =~ '\.'
|
||||
continue
|
||||
elseif ! c =~ '\.'
|
||||
idx = -1
|
||||
break
|
||||
break
|
||||
else
|
||||
break
|
||||
endif
|
||||
@@ -39,79 +49,222 @@ endfunction
|
||||
|
||||
function! s:DefPython()
|
||||
python << PYTHONEOF
|
||||
import vim
|
||||
import sys
|
||||
import vim, sys, types
|
||||
import __builtin__
|
||||
import tokenize, keyword, cStringIO
|
||||
|
||||
LOCALDEFS = \
|
||||
['LOCALDEFS', 'clean_up','eval_source_code', \
|
||||
'get_completions', '__builtin__', '__builtins__', \
|
||||
'dbg', '__name__', 'vim', 'sys']
|
||||
#comment/uncomment one line at a time to enable/disable debugging
|
||||
def dbg(msg):
|
||||
pass
|
||||
# print(msg)
|
||||
'dbg', '__name__', 'vim', 'sys', 'parse_to_end', \
|
||||
'parse_statement', 'tokenize', 'keyword', 'cStringIO', \
|
||||
'debug_level', 'safe_eval', '_ctor', 'get_arguments', \
|
||||
'strip_calls', 'types', 'parse_block']
|
||||
|
||||
#it seems that by this point, vim has already stripped the base
|
||||
# matched in the findstart=1 section, so we will create the
|
||||
# statement from scratch
|
||||
def get_completions(base):
|
||||
stmt = vim.eval('expand("<cWORD>")')+base
|
||||
dbg("parsed statement => %s" % stmt)
|
||||
eval_source_code()
|
||||
def dbg(level,msg):
|
||||
debug_level = 1
|
||||
try:
|
||||
dbg("eval: %s" % stmt)
|
||||
if len(stmt.split('.')) == 1:
|
||||
all = globals().keys() + dir(__builtin__)
|
||||
match = stmt
|
||||
else:
|
||||
rindex= stmt.rfind('.')
|
||||
all = dir(eval(stmt[:rindex]))
|
||||
match = stmt[rindex+1:]
|
||||
debug_level = vim.eval("g:pycomplete_debug_level")
|
||||
except:
|
||||
pass
|
||||
if level <= debug_level: print(msg)
|
||||
|
||||
def strip_calls(stmt):
|
||||
parsed=''
|
||||
level = 0
|
||||
for c in stmt:
|
||||
if c in ['[','(']:
|
||||
level += 1
|
||||
elif c in [')',']']:
|
||||
level -= 1
|
||||
elif level == 0:
|
||||
parsed += c
|
||||
##dbg(10,"stripped: %s" % parsed)
|
||||
return parsed
|
||||
|
||||
def get_completions(base):
|
||||
stmt = vim.eval('expand("<cWORD>")')
|
||||
#dbg(1,"statement: %s - %s" % (stmt, base))
|
||||
stmt = stmt+base
|
||||
eval_source_code()
|
||||
|
||||
try:
|
||||
ridx = stmt.rfind('.')
|
||||
if stmt[-1] == '(':
|
||||
match = ""
|
||||
stmt = strip_calls(stmt[:len(stmt)-1])
|
||||
all = get_arguments(eval(stmt))
|
||||
elif ridx == -1:
|
||||
match = stmt
|
||||
all = globals() + __builtin__.__dict__
|
||||
else:
|
||||
match = stmt[ridx+1:]
|
||||
stmt = strip_calls(stmt[:ridx])
|
||||
all = eval(stmt).__dict__
|
||||
|
||||
#dbg(15,"completions for: %s, match=%s" % (stmt,match))
|
||||
completions = []
|
||||
dbg("match == %s" % match)
|
||||
for m in all:
|
||||
#TODO: remove private (_foo) functions?
|
||||
if m.find('__') != 0 and \
|
||||
m.find(match) == 0 and \
|
||||
m not in LOCALDEFS:
|
||||
dbg("matched... %s, %s" % (m, m.find(match)))
|
||||
completions.append(m)
|
||||
dbg("all completions: %s" % completions)
|
||||
if type(all) == types.DictType:
|
||||
for m in all:
|
||||
if m.find('_') != 0 and m.find(match) == 0 and \
|
||||
m not in LOCALDEFS:
|
||||
#dbg(25,"matched... %s, %s" % (m, m.find(match)))
|
||||
typestr = str(all[m])
|
||||
if "function" in typestr: m += '('
|
||||
elif "method" in typestr: m += '('
|
||||
elif "module" in typestr: m += '.'
|
||||
elif "class" in typestr: m += '('
|
||||
completions.append(m)
|
||||
completions.sort()
|
||||
else:
|
||||
completions.append(all)
|
||||
#dbg(10,"all completions: %s" % completions)
|
||||
vim.command("let g:pycomplete_completions = %s" % completions)
|
||||
except:
|
||||
dbg("exception: %s" % sys.exc_info()[1])
|
||||
vim.command("let g:pycomplete_completions = []")
|
||||
#dbg(1,"exception: %s" % sys.exc_info()[1])
|
||||
clean_up()
|
||||
|
||||
#yes, this is a quasi-functional python lexer
|
||||
def get_arguments(func_obj):
|
||||
def _ctor(obj):
|
||||
try:
|
||||
return class_ob.__init__.im_func
|
||||
except AttributeError:
|
||||
for base in class_ob.__bases__:
|
||||
rc = _find_constructor(base)
|
||||
if rc is not None: return rc
|
||||
return None
|
||||
|
||||
arg_offset = 1
|
||||
if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)
|
||||
elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func
|
||||
else: arg_offset = 0
|
||||
|
||||
#dbg(20,"%s, offset=%s" % (str(func_obj), arg_offset))
|
||||
|
||||
arg_text = ''
|
||||
if type(func_obj) in [types.FunctionType, types.LambdaType]:
|
||||
try:
|
||||
cd = func_obj.func_code
|
||||
real_args = cd.co_varnames[arg_offset:cd.co_argcount]
|
||||
defaults = func_obj.func_defaults or []
|
||||
defaults = list(map(lambda name: "=%s" % name, defaults))
|
||||
defaults = [""] * (len(real_args)-len(defaults)) + defaults
|
||||
items = map(lambda a,d: a+d, real_args, defaults)
|
||||
if func_obj.func_code.co_flags & 0x4:
|
||||
items.append("...")
|
||||
if func_obj.func_code.co_flags & 0x8:
|
||||
items.append("***")
|
||||
arg_text = ", ".join(items) + ')'
|
||||
|
||||
except:
|
||||
#dbg(1,"exception: %s" % sys.exc_info()[1])
|
||||
pass
|
||||
if len(arg_text) == 0:
|
||||
# The doc string sometimes contains the function signature
|
||||
# this works for alot of C modules that are part of the
|
||||
# standard library
|
||||
doc = getattr(func_obj, '__doc__', '')
|
||||
if doc:
|
||||
doc = doc.lstrip()
|
||||
pos = doc.find('\n')
|
||||
if pos > 0:
|
||||
sigline = doc[:pos]
|
||||
lidx = sigline.find('(')
|
||||
ridx = sigline.find(')')
|
||||
retidx = sigline.find('->')
|
||||
ret = sigline[retidx+2:].strip()
|
||||
if lidx > 0 and ridx > 0:
|
||||
arg_text = sigline[lidx+1:ridx] + ')'
|
||||
if len(ret) > 0: arg_text += ' #returns %s' % ret
|
||||
#dbg(15,"argument completion: %s" % arg_text)
|
||||
return arg_text
|
||||
|
||||
def parse_to_end(gen):
|
||||
stmt=''
|
||||
level = 0
|
||||
for type, str, begin, end, line in gen:
|
||||
if line == vim.eval('getline(\'.\')'): break
|
||||
elif str == '\\': continue
|
||||
elif str == ';':
|
||||
break
|
||||
elif type == tokenize.NEWLINE and level == 0:
|
||||
break
|
||||
elif str in ['[','(']:
|
||||
level += 1
|
||||
elif str in [')',']']:
|
||||
level -= 1
|
||||
elif level == 0:
|
||||
stmt += str
|
||||
#dbg(10,"current statement: %s" % stmt)
|
||||
return stmt
|
||||
|
||||
def parse_block(gen):
|
||||
lines = []
|
||||
level = 0
|
||||
for type, str, begin, end, line in gen:
|
||||
if line.replace('\n','') == vim.eval('getline(\'.\')'): break
|
||||
elif type == tokenize.INDENT:
|
||||
level += 1
|
||||
elif type == tokenize.DEDENT:
|
||||
level -= 1
|
||||
if level == 0: break;
|
||||
else:
|
||||
stmt = parse_statement(gen,str)
|
||||
if len(stmt) > 0: lines.append(stmt)
|
||||
return lines
|
||||
|
||||
def parse_statement(gen,curstr=''):
|
||||
var = curstr
|
||||
type, str, begin, end, line = gen.next()
|
||||
if str == '=':
|
||||
type, str, begin, end, line = gen.next()
|
||||
if type == tokenize.NEWLINE:
|
||||
return ''
|
||||
elif type == tokenize.STRING or str == 'str':
|
||||
return '%s = str' % var
|
||||
elif str == '[' or str == 'list':
|
||||
return '%s= list' % var
|
||||
elif str == '{' or str == 'dict':
|
||||
return '%s = dict' % var
|
||||
elif type == tokenize.NUMBER:
|
||||
return '%s = 0' % var
|
||||
elif str == 'Set':
|
||||
return '%s = Set' % var
|
||||
elif str == 'open' or str == 'file':
|
||||
return '%s = file' % var
|
||||
else:
|
||||
inst = str + parse_to_end(gen)
|
||||
if len(inst) > 0:
|
||||
#dbg(5,"found [%s = %s]" % (var, inst))
|
||||
return '%s = %s' % (var, inst)
|
||||
return ''
|
||||
|
||||
def eval_source_code():
|
||||
import tokenize
|
||||
import keyword
|
||||
import StringIO
|
||||
s = StringIO.StringIO('\n'.join(vim.current.buffer[:]) + '\n')
|
||||
LINE=vim.eval('getline(\'.\')')
|
||||
s = cStringIO.StringIO('\n'.join(vim.current.buffer[:]) + '\n')
|
||||
g = tokenize.generate_tokens(s.readline)
|
||||
|
||||
stmts = []
|
||||
lineNo = 0
|
||||
try:
|
||||
for type, str, begin, end, line in g:
|
||||
if begin[0] == lineNo:
|
||||
continue
|
||||
if line.replace('\n','') == vim.eval('getline(\'.\')'): break
|
||||
elif begin[0] == lineNo: continue
|
||||
#junk
|
||||
elif type == tokenize.INDENT or \
|
||||
type == tokenize.DEDENT or \
|
||||
type == tokenize.ERRORTOKEN or \
|
||||
type == tokenize.ENDMARKER or \
|
||||
type == tokenize.NEWLINE:
|
||||
type == tokenize.NEWLINE or \
|
||||
type == tokenize.COMMENT:
|
||||
continue
|
||||
#import statement
|
||||
elif str == 'import':
|
||||
for type, str, begin, end, line in g:
|
||||
if str == ';' or type == tokenize.NEWLINE: break
|
||||
dbg("found [import %s]" % str)
|
||||
stmts.append("import %s" % str)
|
||||
import_stmt=parse_to_end(g)
|
||||
if len(import_stmt) > 0:
|
||||
#dbg(5,"found [import %s]" % import_stmt)
|
||||
stmts.append("import %s" % import_stmt)
|
||||
#import from statement
|
||||
elif str == 'from':
|
||||
type, str, begin, end, line = g.next()
|
||||
@@ -119,87 +272,68 @@ def eval_source_code():
|
||||
|
||||
type, str, begin, end, line = g.next()
|
||||
if str != "import": break
|
||||
mem = ''
|
||||
from_stmt=parse_to_end(g)
|
||||
if len(from_stmt) > 0:
|
||||
#dbg(5,"found [from %s import %s]" % (mod, from_stmt))
|
||||
stmts.append("from %s import %s" % (mod, from_stmt))
|
||||
#def statement
|
||||
elif str == 'def':
|
||||
funcstr = ''
|
||||
for type, str, begin, end, line in g:
|
||||
if str == ';' or type == tokenize.NEWLINE: break
|
||||
mem += (str + ',')
|
||||
if len(mem) > 0:
|
||||
dbg("found [from %s import %s]" % (mod, mem[:-1]))
|
||||
stmts.append("from %s import %s" % (mod, mem[:-1]))
|
||||
if line.replace('\n','') == vim.eval('getline(\'.\')'): break
|
||||
elif str == ':':
|
||||
stmts += parse_block(g)
|
||||
break
|
||||
funcstr += str
|
||||
if len(funcstr) > 0:
|
||||
#dbg(5,"found [def %s]" % funcstr)
|
||||
stmts.append("def %s:\n pass" % funcstr)
|
||||
#class declaration
|
||||
elif str == 'class':
|
||||
type, str, begin, end, line = g.next()
|
||||
classname = str
|
||||
dbg("found [class %s]" % classname)
|
||||
#dbg(5,"found [class %s]" % classname)
|
||||
|
||||
level = 0
|
||||
members = []
|
||||
#we don't care about the meat of the members,
|
||||
# only the signatures, so we'll replace the bodies
|
||||
# with 'pass' for evaluation
|
||||
for type, str, begin, end, line in g:
|
||||
if type == tokenize.INDENT:
|
||||
if line.replace('\n','') == vim.eval('getline(\'.\')'): break
|
||||
elif type == tokenize.INDENT:
|
||||
level += 1
|
||||
elif type == tokenize.DEDENT:
|
||||
level -= 1
|
||||
if level == 0: break;
|
||||
elif str == 'def':
|
||||
#TODO: if name begins with '_', keep private
|
||||
memberstr = ''
|
||||
for type, str, begin, end, line in g:
|
||||
if str == ':': break
|
||||
if line.replace('\n','') == vim.eval('getline(\'.\')'): break
|
||||
elif str == ':':
|
||||
stmts += parse_block(g)
|
||||
break
|
||||
memberstr += str
|
||||
dbg(" member [%s]" % memberstr)
|
||||
#dbg(5," member [%s]" % memberstr)
|
||||
members.append(memberstr)
|
||||
#TODO parse self.blah = something lines
|
||||
#elif str == "self" && next && str == "." ...blah...
|
||||
classstr = 'class %s:' % classname
|
||||
for m in members:
|
||||
classstr += ("\n def %s:\n pass" % m)
|
||||
stmts.append("%s\n" % classstr)
|
||||
elif keyword.iskeyword(str) or str in globals():
|
||||
dbg("keyword = %s" % str)
|
||||
#dbg(5,"keyword = %s" % str)
|
||||
lineNo = begin[0]
|
||||
else:
|
||||
if line.find("=") == -1: continue
|
||||
var = str
|
||||
type, str, begin, end, line = g.next()
|
||||
dbg('next = %s' % str)
|
||||
if str != '=': continue
|
||||
|
||||
type, str, begin, end, line = g.next()
|
||||
if type == tokenize.NEWLINE:
|
||||
continue
|
||||
elif type == tokenize.STRING or str == 'str':
|
||||
stmts.append('%s = str' % var)
|
||||
elif str == '[' or str == 'list':
|
||||
stmts.append('%s= list' % var)
|
||||
elif str == '{' or str == 'dict':
|
||||
stmts.append('%s = dict' % var)
|
||||
elif type == tokenize.NUMBER:
|
||||
continue
|
||||
elif str == 'Set':
|
||||
stmts.append('%s = Set' % var)
|
||||
elif str == 'open' or str == 'file':
|
||||
stmts.append('%s = file' % var)
|
||||
else:
|
||||
inst = str
|
||||
for type, str, begin, end, line in g:
|
||||
if type == tokenize.NEWLINE:
|
||||
break
|
||||
inst += str
|
||||
if len(inst) > 0:
|
||||
dbg("found [%s = %s]" % (var, inst))
|
||||
stmts.append('%s = %s' % (var, inst))
|
||||
lineNo = begin[0]
|
||||
assign = parse_statement(g,str)
|
||||
if len(assign) > 0: stmts.append(assign)
|
||||
|
||||
for s in stmts:
|
||||
try:
|
||||
dbg("evaluating: %s\n" % s)
|
||||
#dbg(15,"evaluating: %s\n" % s)
|
||||
exec(s) in globals()
|
||||
except:
|
||||
#dbg(1,"exception: %s" % sys.exc_info()[1])
|
||||
pass
|
||||
except:
|
||||
dbg("exception: %s" % sys.exc_info()[1])
|
||||
#dbg(1,"exception: %s" % sys.exc_info()[1])
|
||||
pass
|
||||
|
||||
def clean_up():
|
||||
for o in globals().keys():
|
||||
@@ -212,5 +346,6 @@ sys.path.extend(['.','..'])
|
||||
PYTHONEOF
|
||||
endfunction
|
||||
|
||||
let g:pycomplete_debug_level = 0
|
||||
call s:DefPython()
|
||||
" vim: set et ts=4:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
" Vim completion script
|
||||
" Language: XHTML 1.0 Strict
|
||||
" Language: XML
|
||||
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||
" Last Change: 2005 Nov 22
|
||||
" Last Change: 2006 Jan 24
|
||||
|
||||
" This function will create Dictionary with users namespace strings and values
|
||||
" canonical (system) names of data files. Names should be lowercase,
|
||||
@@ -54,6 +54,7 @@ endfunction
|
||||
function! xmlcomplete#CompleteTags(findstart, base)
|
||||
if a:findstart
|
||||
" locate the start of the word
|
||||
let curline = line('.')
|
||||
let line = getline('.')
|
||||
let start = col('.') - 1
|
||||
let compl_begin = col('.') - 2
|
||||
@@ -69,11 +70,32 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
||||
endif
|
||||
|
||||
let b:compl_context = getline('.')[0:(compl_begin)]
|
||||
let b:compl_context = matchstr(b:compl_context, '.*<\zs.*')
|
||||
if b:compl_context !~ '<[^>]*$'
|
||||
" Look like we may have broken tag. Check previous lines. Up to
|
||||
" 10?
|
||||
let i = 1
|
||||
while 1
|
||||
let context_line = getline(curline-i)
|
||||
if context_line =~ '<[^>]*$'
|
||||
" Yep, this is this line
|
||||
let context_lines = getline(curline-i, curline)
|
||||
let b:compl_context = join(context_lines, ' ')
|
||||
break
|
||||
elseif context_line =~ '>[^<]*$'
|
||||
" Normal tag line, no need for completion at all
|
||||
let b:compl_context = ''
|
||||
break
|
||||
endif
|
||||
let i += 1
|
||||
endwhile
|
||||
" Make sure we don't have counter
|
||||
unlet! i
|
||||
endif
|
||||
let b:compl_context = matchstr(b:compl_context, '.*\zs<.*')
|
||||
|
||||
" Make sure we will have only current namespace
|
||||
unlet! b:xml_namespace
|
||||
let b:xml_namespace = matchstr(b:compl_context, '^\k*\ze:')
|
||||
let b:xml_namespace = matchstr(b:compl_context, '^<\zs\k*\ze:')
|
||||
if b:xml_namespace == ''
|
||||
let b:xml_namespace = 'DEFAULT'
|
||||
endif
|
||||
@@ -89,7 +111,10 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
||||
let res = []
|
||||
let res2 = []
|
||||
" a:base is very short - we need context
|
||||
let context = b:compl_context
|
||||
if len(b:compl_context) == 0 && !exists("b:entitiescompl")
|
||||
return []
|
||||
endif
|
||||
let context = matchstr(b:compl_context, '^<\zs.*')
|
||||
unlet! b:compl_context
|
||||
|
||||
" Make entities completion
|
||||
@@ -111,13 +136,24 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
||||
let values = intent + values
|
||||
endif
|
||||
|
||||
for m in values
|
||||
if m =~ '^'.a:base
|
||||
call add(res, m.';')
|
||||
endif
|
||||
endfor
|
||||
if len(a:base) == 1
|
||||
for m in values
|
||||
if m =~ '^'.a:base
|
||||
call add(res, m.';')
|
||||
endif
|
||||
endfor
|
||||
return res
|
||||
else
|
||||
for m in values
|
||||
if m =~? '^'.a:base
|
||||
call add(res, m.';')
|
||||
elseif m =~? a:base
|
||||
call add(res2, m.';')
|
||||
endif
|
||||
endfor
|
||||
|
||||
return res
|
||||
return res + res2
|
||||
endif
|
||||
|
||||
endif
|
||||
if context =~ '>'
|
||||
@@ -265,6 +301,9 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
||||
" Deal with tag completion.
|
||||
let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
|
||||
let opentag = substitute(opentag, '^\k*:', '', '')
|
||||
if opentag == ''
|
||||
return []
|
||||
endif
|
||||
|
||||
let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
|
||||
let context = substitute(context, '^\k*:', '', '')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*eval.txt* For Vim version 7.0aa. Last change: 2006 Jan 20
|
||||
*eval.txt* For Vim version 7.0aa. Last change: 2006 Jan 24
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -3260,7 +3260,7 @@ map({expr}, {string}) *map()*
|
||||
maparg({name}[, {mode}]) *maparg()*
|
||||
Return the rhs of mapping {name} in mode {mode}. When there
|
||||
is no mapping for {name}, an empty String is returned.
|
||||
These characters can be used for {mode}:
|
||||
{mode} can be one of these strings:
|
||||
"n" Normal
|
||||
"v" Visual
|
||||
"o" Operator-pending
|
||||
@@ -3268,7 +3268,7 @@ maparg({name}[, {mode}]) *maparg()*
|
||||
"c" Cmd-line
|
||||
"l" langmap |language-mapping|
|
||||
"" Normal, Visual and Operator-pending
|
||||
When {mode} is omitted, the modes from "" are used.
|
||||
When {mode} is omitted, the modes for "" are used.
|
||||
The {name} can have special key names, like in the ":map"
|
||||
command. The returned String has special characters
|
||||
translated like in the output of the ":map" command listing.
|
||||
|
||||
@@ -42,6 +42,13 @@ easy way to do this is with the |:make| command (see below). The
|
||||
'errorformat' option should be set to match the error messages from your
|
||||
compiler (see |errorformat| below).
|
||||
|
||||
*location-list* *E776*
|
||||
A location list is a window-local quickfix list. Each window can have a
|
||||
separate location list. A location list can be associated with only one
|
||||
window. When a window with a location list is split, the new window gets a
|
||||
copy of the location list. When there are no references to a location list,
|
||||
the location list is destroyed.
|
||||
|
||||
The following quickfix commands can be used:
|
||||
|
||||
*:cc*
|
||||
@@ -56,18 +63,32 @@ The following quickfix commands can be used:
|
||||
The 'switchbuf' settings are respected when jumping
|
||||
to a buffer.
|
||||
|
||||
*:ll*
|
||||
:ll[!] [nr] Same as ":cc", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cn* *:cnext* *E553*
|
||||
:[count]cn[ext][!] Display the [count] next error in the list that
|
||||
includes a file name. If there are no file names at
|
||||
all, go to the [count] next error. See |:cc| for
|
||||
[!] and 'switchbuf'.
|
||||
|
||||
*:ln* *:lnext*
|
||||
:[count]ln[ext][!] Same as ":cnext", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
:[count]cN[ext][!] *:cp* *:cprevious* *:cN* *:cNext*
|
||||
:[count]cp[revious][!] Display the [count] previous error in the list that
|
||||
includes a file name. If there are no file names at
|
||||
all, go to the [count] previous error. See |:cc| for
|
||||
[!] and 'switchbuf'.
|
||||
|
||||
*:lp* *:lprevious* *:lN* *:lNext*
|
||||
:[count]lN[ext][!]
|
||||
:[count]lp[revious][!] Same as ":cNext" and ":cprevious", except the location
|
||||
list for the current window is used instead of the
|
||||
quickfix list.
|
||||
|
||||
*:cnf* *:cnfile*
|
||||
:[count]cnf[ile][!] Display the first error in the [count] next file in
|
||||
the list that includes a file name. If there are no
|
||||
@@ -75,6 +96,10 @@ The following quickfix commands can be used:
|
||||
the [count] next error. See |:cc| for [!] and
|
||||
'switchbuf'.
|
||||
|
||||
*:lnf* *:lnfile*
|
||||
:[count]lnf[ile][!] Same as ":cnfile", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
:[count]cNf[ile][!] *:cpf* *:cpfile* *:cNf* *:cNfile*
|
||||
:[count]cpf[ile][!] Display the last error in the [count] previous file in
|
||||
the list that includes a file name. If there are no
|
||||
@@ -82,17 +107,34 @@ The following quickfix commands can be used:
|
||||
the [count] previous error. See |:cc| for [!] and
|
||||
'switchbuf'.
|
||||
|
||||
*:lpf* *:lpfile* *:lNf* *:lNfile*
|
||||
:[count]lNf[ile][!]
|
||||
:[count]lpf[ile][!] Same as ":cNfile" and ":cpfile", except the location
|
||||
list for the current window is used instead of the
|
||||
quickfix list.
|
||||
|
||||
*:crewind* *:cr*
|
||||
:cr[ewind][!] [nr] Display error [nr]. If [nr] is omitted, the FIRST
|
||||
error is displayed. See |:cc|.
|
||||
|
||||
*:lrewind* *:lr*
|
||||
:lr[ewind][!] [nr] Same as ":crewind", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cfirst* *:cfir*
|
||||
:cfir[st][!] [nr] Same as ":crewind".
|
||||
|
||||
*:lfirst* *:lfir*
|
||||
:lfir[st][!] [nr] Same as ":lrewind".
|
||||
|
||||
*:clast* *:cla*
|
||||
:cla[st][!] [nr] Display error [nr]. If [nr] is omitted, the LAST
|
||||
error is displayed. See |:cc|.
|
||||
|
||||
*:llast* *:lla*
|
||||
:lla[st][!] [nr] Same as ":clast", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cq* *:cquit*
|
||||
:cq[uit] Quit Vim with an error code, so that the compiler
|
||||
will not compile the same file again.
|
||||
@@ -105,16 +147,31 @@ The following quickfix commands can be used:
|
||||
name of the errorfile, the 'errorfile' option will
|
||||
be set to [errorfile]. See |:cc| for [!].
|
||||
|
||||
*:lf* *:lfile*
|
||||
:lf[ile][!] [errorfile] Same as ":cfile", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
You can not use the -q command-line option to set
|
||||
the location list.
|
||||
|
||||
*:cg* *:cgetfile*
|
||||
:cg[etfile][!] [errorfile]
|
||||
Read the error file. Just like ":cfile" but don't
|
||||
jump to the first error.
|
||||
|
||||
*:lg* *:lgetfile*
|
||||
:lg[etfile][!] [errorfile]
|
||||
Same as ":cgetfile", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:caddf* *:caddfile*
|
||||
:caddf[ile] [errorfile] Read the error file and add the errors from the
|
||||
errorfile to the current quickfix list. If a quickfix
|
||||
list is not present, then a new list is created.
|
||||
|
||||
*:laddf* *:laddfile*
|
||||
:laddf[ile] [errorfile] Same as ":caddfile", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cb* *:cbuffer* *E681*
|
||||
:cb[uffer] [bufnr] Read the error list from the current buffer.
|
||||
When [bufnr] is given it must be the number of a
|
||||
@@ -123,6 +180,10 @@ The following quickfix commands can be used:
|
||||
A range can be specified for the lines to be used.
|
||||
Otherwise all lines in the buffer are used.
|
||||
|
||||
*:lb* *:lbuffer*
|
||||
:lb[uffer] [bufnr] Same as ":cbuffer", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cex* *:cexpr* *E777*
|
||||
:cex[pr][!] {expr} Create a quickfix list using the result of {expr} and
|
||||
jump to the first error. If {expr} is a String, then
|
||||
@@ -137,6 +198,10 @@ The following quickfix commands can be used:
|
||||
:cexpr system('grep -n xyz *')
|
||||
:cexpr getline(1, '$')
|
||||
<
|
||||
*:lex* *:lexpr*
|
||||
:lex[pr][!] {expr} Same as ":cexpr", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cad* *:caddexpr*
|
||||
:cad[dexpr][!] {expr} Evaluate {expr} and add the resulting lines to the
|
||||
current quickfix list. If a quickfix list is not
|
||||
@@ -146,6 +211,10 @@ The following quickfix commands can be used:
|
||||
Example: >
|
||||
:g/mypattern/caddexpr expand("%") . ":" . line(".") . ":" . getline(".")
|
||||
<
|
||||
*:lad* *:laddexpr*
|
||||
:lad[dexpr][!] {expr} Same as ":caddexpr", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
*:cl* *:clist*
|
||||
:cl[ist] [from] [, [to]]
|
||||
List all errors that are valid |quickfix-valid|.
|
||||
@@ -158,6 +227,15 @@ The following quickfix commands can be used:
|
||||
:cl[ist]! [from] [, [to]]
|
||||
List all errors.
|
||||
|
||||
*:lli* *:llist*
|
||||
:lli[st] [from] [, [to]]
|
||||
Same as ":clist", except the location list for the
|
||||
current window is used instead of the quickfix list.
|
||||
|
||||
:lli[st]! [from] [, [to]]
|
||||
List all the entries in the location list for the
|
||||
current window.
|
||||
|
||||
If you insert or delete lines, mostly the correct error location is still
|
||||
found because hidden marks are used. Sometimes, when the mark has been
|
||||
deleted for some reason, the message "line changed" is shown to warn you that
|
||||
@@ -182,14 +260,28 @@ on) is executed. See |QuickFixCmdPre| and |QuickFixCmdPost| for details.
|
||||
the current window. It is not possible to open a
|
||||
second quickfix window.
|
||||
|
||||
*:lope* *:lopen*
|
||||
:lope[n] [height] Open a window to show the location list for the
|
||||
current window. Works only when the location list for
|
||||
the current window is present. You can have more than
|
||||
one location window opened at a time. Otherewise,
|
||||
same as ":copen".
|
||||
|
||||
*:ccl* *:cclose*
|
||||
:ccl[ose] Close the quickfix window.
|
||||
|
||||
*:lcl* *:lclose*
|
||||
:lcl[ose] Close the window showing the location list for the
|
||||
current window.
|
||||
|
||||
*:cw* *:cwindow*
|
||||
:cw[indow] [height] Open the quickfix window when there are recognized
|
||||
errors. If the window is already open and there are
|
||||
no recognized errors, close the window.
|
||||
|
||||
*:lw* *:lwindow*
|
||||
:lw[indow] [height] Same as ":cwindow", except use the window showing the
|
||||
location list for the current window.
|
||||
|
||||
Normally the quickfix window is at the bottom of the screen. If there are
|
||||
vertical splits, it's at the bottom of the rightmost column of windows. To
|
||||
@@ -228,6 +320,19 @@ errors. 'modifiable' is off to avoid making changes. If you delete or insert
|
||||
lines anyway, the relation between the text and the error number is messed up.
|
||||
If you really want to do this, you could write the contents of the quickfix
|
||||
window to a file and use ":cfile" to have it parsed and used as the new error
|
||||
list.
|
||||
|
||||
*location-list-window*
|
||||
The location list window displays the entries in a location list. When
|
||||
opening a location list window, it is created just below the current window
|
||||
and displays the location list for the current window. The location list
|
||||
window is similar to the quickfix window, except that you can have more than
|
||||
one location list window opened at a time.
|
||||
|
||||
When an entry is selected from the location list window, the file is opened in
|
||||
the window with the corresponding location list. If the window is not found,
|
||||
but the file is opened in another window, then cursor is moved to that window.
|
||||
Otherwise a new window is opened. The new window gets a copy of the location
|
||||
list.
|
||||
|
||||
=============================================================================
|
||||
@@ -243,11 +348,19 @@ lists. They set one of the existing error lists as the current one.
|
||||
this [count] times. When already at the oldest error
|
||||
list, an error message is given.
|
||||
|
||||
*:lolder* *:lol*
|
||||
:lol[der] [count] Same as ":colder", except use the location list for
|
||||
the current window instead of the quickfix list.
|
||||
|
||||
*:cnewer* *:cnew* *E381*
|
||||
:cnew[er] [count] Go to newer error list. When [count] is given, do
|
||||
this [count] times. When already at the newest error
|
||||
list, an error message is given.
|
||||
|
||||
*:lnewer* *:lnew*
|
||||
:lnew[er] [count] Same as ":cnewer", except use the location list for
|
||||
the current window instead of the quickfix list.
|
||||
|
||||
When adding a new error list, it becomes the current list.
|
||||
|
||||
When ":colder" has been used and ":make" or ":grep" is used to add a new error
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*spell.txt* For Vim version 7.0aa. Last change: 2006 Jan 23
|
||||
*spell.txt* For Vim version 7.0aa. Last change: 2006 Jan 25
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -1316,13 +1316,17 @@ efficient if the first letter is ASCII or at least one without accents.
|
||||
.SUG FILE *spell-NOSUGFILE*
|
||||
|
||||
When soundfolding is specified in the affix file then ":mkspell" will normally
|
||||
p ~ ~roduce a .sug file next to the .spl file. This used to find suggestions by
|
||||
their sound-a-like form quickly. At the cost of a lot of memory.
|
||||
produce a .sug file next to the .spl file. This file is used to find
|
||||
suggestions by their sound-a-like form quickly. At the cost of a lot of
|
||||
memory (the amount depends on the number of words, |:mkspell| will display an
|
||||
estimate when it's done).
|
||||
|
||||
To avoid producing a .sug file use this item in the affix file:
|
||||
|
||||
NOSUGFILE ~
|
||||
|
||||
Users can simply omit the .sug file if they don't want to use it.
|
||||
|
||||
|
||||
SOUND-A-LIKE *spell-SAL*
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*todo.txt* For Vim version 7.0aa. Last change: 2006 Jan 23
|
||||
*todo.txt* For Vim version 7.0aa. Last change: 2006 Jan 25
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -30,10 +30,7 @@ be worked on, but only if you sponsor Vim development. See |sponsor|.
|
||||
*known-bugs*
|
||||
-------------------- Known bugs and current work -----------------------
|
||||
|
||||
When ":silent" is used mode message is (should) not be displayed. Thus don't
|
||||
set clear_cmdline to clear it. Use separate flag to remember whether mode is
|
||||
currently displayed (and needs to be cleared).
|
||||
|
||||
Include location list commands, patch from Yegappan Lakshmanan.
|
||||
|
||||
ccomplete:
|
||||
- When an option is set: In completion mode and the user types (identifier)
|
||||
@@ -62,7 +59,8 @@ ccomplete:
|
||||
|
||||
spelling:
|
||||
- Use runtime/cleanadd script to cleanup .add files. When to invoke it?
|
||||
After deleting a word and some timestamp difference perhaps?
|
||||
After deleting a word with "zw" and some timestamp difference perhaps?
|
||||
Store it as spell/cleanadd.vim.
|
||||
- suggestion for "KG" to "kg" when it's keepcase.
|
||||
- Autocommand event for when a spell file is missing. Allows making a plugin
|
||||
that fetches the file over internet. Pattern == language.
|
||||
@@ -400,25 +398,9 @@ Also place vimtutor.bat in %windir%?
|
||||
|
||||
Add gui_mch_browsedir() for Motif, Mac OS/X.
|
||||
|
||||
Add extra list of file locations. A bit like the quickfix list, but there is
|
||||
one per window. Can be used with:
|
||||
Implement:
|
||||
:ltag list of matching tags, like :tselect
|
||||
Patch from Yegappan Lakshmanan, Jan 13.
|
||||
Commands to use the location list:
|
||||
:lnext next location
|
||||
:lprevious :lNext previous location
|
||||
:lnfile location in next file
|
||||
:lNfile :lpfile location in previous file
|
||||
:lrewind :lfirst first location
|
||||
:llast last location
|
||||
:ll [N] go to location N (current one if N omitted)
|
||||
:lwindow open window with locations (separate from quickfix window)
|
||||
:lopen open window with locations
|
||||
:lclose close window with locations
|
||||
:llist list locations
|
||||
:lfile read locations from file using 'errorformat'
|
||||
:lgetfile idem, don't jump to first one
|
||||
:lbuffer idem, from current buffer.
|
||||
|
||||
HTML indenting can be slow, find out why. Any way to do some kind of
|
||||
profiling for Vim script? At least add a function to get the current time in
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*version7.txt* For Vim version 7.0aa. Last change: 2006 Jan 22
|
||||
*version7.txt* For Vim version 7.0aa. Last change: 2006 Jan 25
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -1608,4 +1608,8 @@ value didn't fill the whole screen. (SungHyun Nam)
|
||||
Win32 installer: The generated _vimrc contained an absolute path to diff.exe.
|
||||
After upgrading it becomes invalid. Now use $VIMRUNTIME instead.
|
||||
|
||||
The command line was cleared to often when 'showmode' was set and ":silent
|
||||
normal vy" was used. Don't clear the command line unless the mode was
|
||||
actually displayed. Added the "mode_displayed" variable.
|
||||
|
||||
vim:tw=78:ts=8:ft=help:norl:
|
||||
|
||||
@@ -1699,10 +1699,10 @@ types.vim: $(TAGS_SRC) $(TAGS_INCL)
|
||||
#
|
||||
test check:
|
||||
$(MAKE) -f Makefile $(VIMTARGET)
|
||||
cd testdir; $(MAKE) -f Makefile $(GUI_TESTTARGET) VIMPROG=../$(VIMTARGET) $(GUI_TESTARG)
|
||||
@if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \
|
||||
-@if test -n "$(MAKEMO)" -a -f $(PODIR)/Makefile; then \
|
||||
cd $(PODIR); $(MAKE) -f Makefile check VIM=../$(VIMTARGET); \
|
||||
fi
|
||||
cd testdir; $(MAKE) -f Makefile $(GUI_TESTTARGET) VIMPROG=../$(VIMTARGET) $(GUI_TESTARG)
|
||||
|
||||
testclean:
|
||||
cd testdir; $(MAKE) -f Makefile clean
|
||||
|
||||
31
src/edit.c
31
src/edit.c
@@ -89,7 +89,7 @@ static compl_T *compl_shown_match = NULL;
|
||||
|
||||
/* When the first completion is done "compl_started" is set. When it's
|
||||
* FALSE the word to be completed must be located. */
|
||||
static int compl_started = FALSE;
|
||||
static int compl_started = FALSE;
|
||||
|
||||
static int compl_matches = 0;
|
||||
static char_u *compl_pattern = NULL;
|
||||
@@ -123,6 +123,7 @@ static void ins_compl_delete __ARGS((void));
|
||||
static void ins_compl_insert __ARGS((void));
|
||||
static int ins_compl_next __ARGS((int allow_get_expansion, int count));
|
||||
static int ins_compl_key2dir __ARGS((int c));
|
||||
static int ins_compl_pum_key __ARGS((int c));
|
||||
static int ins_compl_key2count __ARGS((int c));
|
||||
static int ins_complete __ARGS((int c));
|
||||
static int quote_meta __ARGS((char_u *dest, char_u *str, int len));
|
||||
@@ -495,7 +496,7 @@ edit(cmdchar, startln, count)
|
||||
* actually changing anything. It's put after the mode, if any.
|
||||
*/
|
||||
i = 0;
|
||||
if (p_smd)
|
||||
if (p_smd && msg_silent == 0)
|
||||
i = showmode();
|
||||
|
||||
if (!p_im && did_restart_edit == 0)
|
||||
@@ -1116,7 +1117,10 @@ doESCkey:
|
||||
* cursor. */
|
||||
if (bt_quickfix(curbuf) && c == CAR)
|
||||
{
|
||||
do_cmdline_cmd((char_u *)".cc");
|
||||
if (curwin->w_llist_ref == NULL) /* quickfix window */
|
||||
do_cmdline_cmd((char_u *)".cc");
|
||||
else /* location list window */
|
||||
do_cmdline_cmd((char_u *)".ll");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
@@ -1846,8 +1850,7 @@ vim_is_ctrl_x_key(c)
|
||||
return TRUE;
|
||||
|
||||
/* Accept <PageUp> and <PageDown> if the popup menu is visible. */
|
||||
if (pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
|
||||
|| c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN))
|
||||
if (ins_compl_pum_key(c))
|
||||
return TRUE;
|
||||
|
||||
switch (ctrl_x_mode)
|
||||
@@ -2648,7 +2651,8 @@ ins_compl_prep(c)
|
||||
* 'Pattern not found') until another key is hit, then go back to
|
||||
* showing what mode we are in. */
|
||||
showmode();
|
||||
if ((ctrl_x_mode == 0 && c != Ctrl_N && c != Ctrl_P && c != Ctrl_R)
|
||||
if ((ctrl_x_mode == 0 && c != Ctrl_N && c != Ctrl_P && c != Ctrl_R
|
||||
&& !ins_compl_pum_key(c))
|
||||
|| ctrl_x_mode == CTRL_X_FINISHED)
|
||||
{
|
||||
/* Get here when we have finished typing a sequence of ^N and
|
||||
@@ -3451,6 +3455,18 @@ ins_compl_key2dir(c)
|
||||
return FORWARD;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return TRUE for keys that are used for completion only when the popup menu
|
||||
* is visible.
|
||||
*/
|
||||
static int
|
||||
ins_compl_pum_key(c)
|
||||
int c;
|
||||
{
|
||||
return pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
|
||||
|| c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decide the number of completions to move forward.
|
||||
* Returns 1 for most keys, height of the popup menu for page-up/down keys.
|
||||
@@ -3461,8 +3477,7 @@ ins_compl_key2count(c)
|
||||
{
|
||||
int h;
|
||||
|
||||
if (pum_visible() && (c == K_PAGEUP || c == K_KPAGEUP || c == K_S_UP
|
||||
|| c == K_PAGEDOWN || c == K_KPAGEDOWN || c == K_S_DOWN))
|
||||
if (ins_compl_pum_key(c))
|
||||
{
|
||||
h = pum_get_height();
|
||||
if (h > 3)
|
||||
|
||||
@@ -473,26 +473,58 @@ EX(CMD_keepalt, "keepalt", ex_wrongmodifier,
|
||||
NEEDARG|EXTRA|NOTRLCOM),
|
||||
EX(CMD_list, "list", ex_print,
|
||||
RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN),
|
||||
EX(CMD_lNext, "lNext", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lNfile, "lNfile", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_last, "last", ex_last,
|
||||
EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR),
|
||||
EX(CMD_language, "language", ex_language,
|
||||
EXTRA|TRLBAR|CMDWIN),
|
||||
EX(CMD_laddexpr, "laddexpr", ex_cexpr,
|
||||
NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG),
|
||||
EX(CMD_laddfile, "laddfile", ex_cfile,
|
||||
TRLBAR|FILE1),
|
||||
EX(CMD_lbuffer, "lbuffer", ex_cbuffer,
|
||||
RANGE|NOTADR|WORD1|TRLBAR),
|
||||
EX(CMD_lcd, "lcd", ex_cd,
|
||||
BANG|FILE1|TRLBAR|CMDWIN),
|
||||
EX(CMD_lchdir, "lchdir", ex_cd,
|
||||
BANG|FILE1|TRLBAR|CMDWIN),
|
||||
EX(CMD_lclose, "lclose", ex_cclose,
|
||||
RANGE|NOTADR|COUNT|TRLBAR),
|
||||
EX(CMD_left, "left", ex_align,
|
||||
TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
|
||||
EX(CMD_leftabove, "leftabove", ex_wrongmodifier,
|
||||
NEEDARG|EXTRA|NOTRLCOM),
|
||||
EX(CMD_let, "let", ex_let,
|
||||
EXTRA|NOTRLCOM|SBOXOK|CMDWIN),
|
||||
EX(CMD_lexpr, "lexpr", ex_cexpr,
|
||||
NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG),
|
||||
EX(CMD_lfile, "lfile", ex_cfile,
|
||||
TRLBAR|FILE1|BANG),
|
||||
EX(CMD_lfirst, "lfirst", ex_cc,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lgetfile, "lgetfile", ex_cfile,
|
||||
TRLBAR|FILE1|BANG),
|
||||
EX(CMD_ll, "ll", ex_cc,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_llast, "llast", ex_cc,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_llist, "llist", qf_list,
|
||||
BANG|EXTRA|TRLBAR|CMDWIN),
|
||||
EX(CMD_lmap, "lmap", ex_map,
|
||||
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
|
||||
EX(CMD_lmapclear, "lmapclear", ex_mapclear,
|
||||
EXTRA|TRLBAR|CMDWIN),
|
||||
EX(CMD_lnoremap, "lnoremap", ex_map,
|
||||
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
|
||||
EX(CMD_lnext, "lnext", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lnewer, "lnewer", qf_age,
|
||||
RANGE|NOTADR|COUNT|TRLBAR),
|
||||
EX(CMD_lnfile, "lnfile", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_loadview, "loadview", ex_loadview,
|
||||
FILE1|TRLBAR),
|
||||
EX(CMD_loadkeymap, "loadkeymap", ex_loadkeymap,
|
||||
@@ -501,8 +533,20 @@ EX(CMD_lockmarks, "lockmarks", ex_wrongmodifier,
|
||||
NEEDARG|EXTRA|NOTRLCOM),
|
||||
EX(CMD_lockvar, "lockvar", ex_lockvar,
|
||||
BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN),
|
||||
EX(CMD_lolder, "lolder", qf_age,
|
||||
RANGE|NOTADR|COUNT|TRLBAR),
|
||||
EX(CMD_lopen, "lopen", ex_copen,
|
||||
RANGE|NOTADR|COUNT|TRLBAR),
|
||||
EX(CMD_lprevious, "lprevious", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lpfile, "lpfile", ex_cnext,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lrewind, "lrewind", ex_cc,
|
||||
RANGE|NOTADR|COUNT|TRLBAR|BANG),
|
||||
EX(CMD_lunmap, "lunmap", ex_unmap,
|
||||
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
|
||||
EX(CMD_lwindow, "lwindow", ex_cwindow,
|
||||
RANGE|NOTADR|COUNT|TRLBAR),
|
||||
EX(CMD_ls, "ls", buflist_list,
|
||||
BANG|TRLBAR|CMDWIN),
|
||||
EX(CMD_move, "move", ex_copymove,
|
||||
|
||||
@@ -83,6 +83,7 @@ EXTERN int cmdline_row;
|
||||
|
||||
EXTERN int redraw_cmdline INIT(= FALSE); /* cmdline must be redrawn */
|
||||
EXTERN int clear_cmdline INIT(= FALSE); /* cmdline must be cleared */
|
||||
EXTERN int mode_displayed INIT(= FALSE); /* mode is being displayed */
|
||||
#if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
|
||||
EXTERN int cmdline_star INIT(= FALSE); /* cmdline is crypted */
|
||||
#endif
|
||||
@@ -1366,6 +1367,7 @@ EXTERN char_u e_prev_dir[] INIT(= N_("E459: Cannot go back to previous directory
|
||||
|
||||
#ifdef FEAT_QUICKFIX
|
||||
EXTERN char_u e_quickfix[] INIT(= N_("E42: No Errors"));
|
||||
EXTERN char_u e_loclist[] INIT(= N_("E776: No location list"));
|
||||
#endif
|
||||
EXTERN char_u e_re_damg[] INIT(= N_("E43: Damaged match string"));
|
||||
EXTERN char_u e_re_corr[] INIT(= N_("E44: Corrupted regexp program"));
|
||||
|
||||
@@ -1104,7 +1104,7 @@ cs_find_common(opt, pat, forceit, verbose)
|
||||
cs_file_results(f, nummatches);
|
||||
fclose(f);
|
||||
/* '-' starts a new error list */
|
||||
if (qf_init(tmp, (char_u *)"%f%*\\t%l%*\\t%m", *qfpos == '-') > 0)
|
||||
if (qf_init(NULL, tmp, (char_u *)"%f%*\\t%l%*\\t%m", *qfpos == '-') > 0)
|
||||
{
|
||||
# ifdef FEAT_WINDOWS
|
||||
if (postponed_split != 0)
|
||||
@@ -1117,7 +1117,7 @@ cs_find_common(opt, pat, forceit, verbose)
|
||||
postponed_split = 0;
|
||||
}
|
||||
# endif
|
||||
qf_jump(0, 0, forceit);
|
||||
qf_jump(NULL, 0, 0, forceit);
|
||||
}
|
||||
mch_remove(tmp);
|
||||
vim_free(tmp);
|
||||
|
||||
@@ -636,7 +636,7 @@ main
|
||||
if (params.use_ef != NULL)
|
||||
set_string_option_direct((char_u *)"ef", -1,
|
||||
params.use_ef, OPT_FREE);
|
||||
if (qf_init(p_ef, p_efm, TRUE) < 0)
|
||||
if (qf_init(NULL, p_ef, p_efm, TRUE) < 0)
|
||||
{
|
||||
out_char('\n');
|
||||
mch_exit(3);
|
||||
@@ -785,7 +785,7 @@ main
|
||||
*/
|
||||
if (params.edit_type == EDIT_QF)
|
||||
{
|
||||
qf_jump(0, 0, FALSE);
|
||||
qf_jump(NULL, 0, 0, FALSE);
|
||||
TIME_MSG("jump to first error");
|
||||
}
|
||||
#endif
|
||||
@@ -2442,7 +2442,7 @@ exe_commands(parmp)
|
||||
#ifdef FEAT_QUICKFIX
|
||||
/* When started with "-q errorfile" jump to first error again. */
|
||||
if (parmp->edit_type == EDIT_QF)
|
||||
qf_jump(0, 0, FALSE);
|
||||
qf_jump(NULL, 0, 0, FALSE);
|
||||
#endif
|
||||
TIME_MSG("executing command arguments");
|
||||
}
|
||||
|
||||
@@ -952,6 +952,7 @@ free_all_mem()
|
||||
{
|
||||
buf_T *buf, *nextbuf;
|
||||
static int entered = FALSE;
|
||||
win_T *win;
|
||||
|
||||
/* When we cause a crash here it is caught and Vim tries to exit cleanly.
|
||||
* Don't try freeing everything again. */
|
||||
@@ -1027,7 +1028,10 @@ free_all_mem()
|
||||
init_history();
|
||||
|
||||
#ifdef FEAT_QUICKFIX
|
||||
qf_free_all();
|
||||
qf_free_all(NULL);
|
||||
/* Free all location lists */
|
||||
FOR_ALL_WINDOWS(win)
|
||||
qf_free_all(win);
|
||||
#endif
|
||||
|
||||
/* Close all script inputs. */
|
||||
|
||||
@@ -6743,7 +6743,7 @@ set_bool_option(opt_idx, varp, value, opt_flags)
|
||||
{
|
||||
need_start_insertmode = FALSE;
|
||||
stop_insert_mode = TRUE;
|
||||
if (p_smd && msg_silent == 0 && restart_edit != 0)
|
||||
if (restart_edit != 0 && mode_displayed)
|
||||
clear_cmdline = TRUE; /* remove "(insert)" */
|
||||
restart_edit = 0;
|
||||
}
|
||||
|
||||
@@ -4852,7 +4852,7 @@ mch_expandpath(gap, path, flags)
|
||||
# define SEEK_END 2
|
||||
#endif
|
||||
|
||||
#define SHELL_SPECIAL (char_u *)"\t \"&';<>\\|"
|
||||
#define SHELL_SPECIAL (char_u *)"\t \"&';<>()\\|"
|
||||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
@@ -5128,7 +5128,12 @@ mch_expand_wildcards(num_pat, pat, num_file, file, flags)
|
||||
}
|
||||
else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL)
|
||||
{
|
||||
/* Remove a backslash, take char literally. */
|
||||
/* Remove a backslash, take char literally. But keep
|
||||
* backslash before special character and inside
|
||||
* backticks. */
|
||||
if (intick
|
||||
|| vim_strchr(SHELL_SPECIAL, pat[i][j + 1]) != NULL)
|
||||
*p++ = '\\';
|
||||
*p++ = pat[i][++j];
|
||||
}
|
||||
else if (!intick && vim_strchr(SHELL_SPECIAL,
|
||||
@@ -5140,12 +5145,8 @@ mch_expand_wildcards(num_pat, pat, num_file, file, flags)
|
||||
*p++ = pat[i][j];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* For a backslash also copy the next character, don't
|
||||
* want to put quotes around it. */
|
||||
if ((*p++ = pat[i][j]) == '\\' && pat[i][j + 1] != NUL)
|
||||
*p++ = pat[i][++j];
|
||||
}
|
||||
/* Simply copy the character. */
|
||||
*p++ = pat[i][++j];
|
||||
}
|
||||
*p = NUL;
|
||||
#endif
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/* quickfix.c */
|
||||
int qf_init __ARGS((char_u *efile, char_u *errorformat, int newlist));
|
||||
void qf_free_all __ARGS((void));
|
||||
void qf_jump __ARGS((int dir, int errornr, int forceit));
|
||||
int qf_init __ARGS((win_T *wp, char_u *efile, char_u *errorformat, int newlist));
|
||||
void qf_free_all __ARGS((win_T *wp));
|
||||
void qf_jump __ARGS((win_T *wp, int dir, int errornr, int forceit));
|
||||
void qf_list __ARGS((exarg_T *eap));
|
||||
void qf_age __ARGS((exarg_T *eap));
|
||||
void qf_mark_adjust __ARGS((linenr_T line1, linenr_T line2, long amount, long amount_after));
|
||||
void qf_mark_adjust __ARGS((win_T *wp, linenr_T line1, linenr_T line2, long amount, long amount_after));
|
||||
void ex_cwindow __ARGS((exarg_T *eap));
|
||||
void ex_cclose __ARGS((exarg_T *eap));
|
||||
void ex_copen __ARGS((exarg_T *eap));
|
||||
linenr_T qf_current_entry __ARGS((void));
|
||||
linenr_T qf_current_entry __ARGS((win_T *wp));
|
||||
int bt_quickfix __ARGS((buf_T *buf));
|
||||
int bt_nofile __ARGS((buf_T *buf));
|
||||
int bt_dontwrite __ARGS((buf_T *buf));
|
||||
@@ -26,4 +26,5 @@ int set_errorlist __ARGS((list_T *list, int action));
|
||||
void ex_cbuffer __ARGS((exarg_T *eap));
|
||||
void ex_cexpr __ARGS((exarg_T *eap));
|
||||
void ex_helpgrep __ARGS((exarg_T *eap));
|
||||
void copy_loclist __ARGS((win_T *from, win_T *to));
|
||||
/* vim: set ft=c : */
|
||||
|
||||
867
src/quickfix.c
867
src/quickfix.c
File diff suppressed because it is too large
Load Diff
@@ -2806,7 +2806,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
|
||||
# endif
|
||||
# if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)
|
||||
/* Highlight the current line in the quickfix window. */
|
||||
if (bt_quickfix(wp->w_buffer) && qf_current_entry() == lnum)
|
||||
if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum)
|
||||
line_attr = hl_attr(HLF_L);
|
||||
# endif
|
||||
if (line_attr != 0)
|
||||
@@ -6651,6 +6651,8 @@ screen_fill(start_row, end_row, start_col, end_col, c1, c2, attr)
|
||||
redraw_cmdline = TRUE;
|
||||
if (c1 == ' ' && c2 == ' ')
|
||||
clear_cmdline = FALSE; /* command line has been cleared */
|
||||
if (start_col == 0)
|
||||
mode_displayed = FALSE; /* mode cleared or overwritten */
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7027,6 +7029,7 @@ screenclear2()
|
||||
{
|
||||
out_str(T_CL); /* clear the display */
|
||||
clear_cmdline = FALSE;
|
||||
mode_displayed = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -8326,6 +8329,7 @@ showmode()
|
||||
#endif
|
||||
MSG_PUTS_ATTR(" --", attr);
|
||||
}
|
||||
|
||||
need_clear = TRUE;
|
||||
}
|
||||
if (Recording
|
||||
@@ -8337,6 +8341,8 @@ showmode()
|
||||
MSG_PUTS_ATTR(_("recording"), attr);
|
||||
need_clear = TRUE;
|
||||
}
|
||||
|
||||
mode_displayed = TRUE;
|
||||
if (need_clear || clear_cmdline)
|
||||
msg_clr_eos();
|
||||
msg_didout = FALSE; /* overwrite this message */
|
||||
@@ -8383,6 +8389,7 @@ msg_pos_mode()
|
||||
/*
|
||||
* Delete mode message. Used when ESC is typed which is expected to end
|
||||
* Insert mode (but Insert mode didn't end yet!).
|
||||
* Caller should check "mode_displayed".
|
||||
*/
|
||||
void
|
||||
unshowmode(force)
|
||||
|
||||
@@ -1085,6 +1085,9 @@ struct dictvar_S
|
||||
# define B_SPELL(buf) (0)
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_QUICKFIX
|
||||
typedef struct qf_info_S qf_info_T;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* buffer: structure that holds information about one file
|
||||
@@ -1835,6 +1838,15 @@ struct window
|
||||
int w_nrwidth_width; /* nr of chars to print line count. */
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_QUICKFIX
|
||||
qf_info_T *w_llist; /* Location list for this window */
|
||||
/*
|
||||
* Location list reference used in the location list window.
|
||||
* In a non-location list window, w_llist_ref is NULL.
|
||||
*/
|
||||
qf_info_T *w_llist_ref;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef FEAT_MZSCHEME
|
||||
void *w_mzscheme_ref; /* The MzScheme value for this window */
|
||||
|
||||
@@ -36,5 +36,5 @@
|
||||
#define VIM_VERSION_NODOT "vim70aa"
|
||||
#define VIM_VERSION_SHORT "7.0aa"
|
||||
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
|
||||
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Jan 23)"
|
||||
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Jan 23, compiled "
|
||||
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Jan 25)"
|
||||
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Jan 25, compiled "
|
||||
|
||||
Reference in New Issue
Block a user