mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
updated for version 7.0051
This commit is contained in:
parent
6bdcfc08cb
commit
df177f679e
@ -1,4 +1,4 @@
|
|||||||
*cmdline.txt* For Vim version 7.0aa. Last change: 2005 Jan 13
|
*cmdline.txt* For Vim version 7.0aa. Last change: 2005 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -17,8 +17,9 @@ Basic command line editing is explained in chapter 20 of the user manual
|
|||||||
2. Command-line completion |cmdline-completion|
|
2. Command-line completion |cmdline-completion|
|
||||||
3. Ex command-lines |cmdline-lines|
|
3. Ex command-lines |cmdline-lines|
|
||||||
4. Ex command-line ranges |cmdline-ranges|
|
4. Ex command-line ranges |cmdline-ranges|
|
||||||
5. Ex special characters |cmdline-special|
|
5. Ex command-line flags |ex-flags|
|
||||||
6. Command-line window |cmdline-window|
|
6. Ex special characters |cmdline-special|
|
||||||
|
7. Command-line window |cmdline-window|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
1. Command-line editing *cmdline-editing*
|
1. Command-line editing *cmdline-editing*
|
||||||
@ -668,7 +669,20 @@ Visual Mode and Range *v_:*
|
|||||||
lines.
|
lines.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
5. Ex special characters *cmdline-special*
|
5. Ex command-line flags *ex-flags*
|
||||||
|
|
||||||
|
These flags are supported by a selection of Ex commands. They print the line
|
||||||
|
that the cursor ends up after executing the command:
|
||||||
|
|
||||||
|
l output like for |:list|
|
||||||
|
# add line number
|
||||||
|
p output like for |:print|
|
||||||
|
|
||||||
|
The flags can be combined, thus "l#" uses both a line number and |:list| style
|
||||||
|
output.
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
6. Ex special characters *cmdline-special*
|
||||||
|
|
||||||
In Ex commands, at places where a file name can be used, the following
|
In Ex commands, at places where a file name can be used, the following
|
||||||
characters have a special meaning. These can also be used in the expression
|
characters have a special meaning. These can also be used in the expression
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*editing.txt* For Vim version 7.0aa. Last change: 2005 Feb 07
|
*editing.txt* For Vim version 7.0aa. Last change: 2005 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -1143,13 +1143,16 @@ You may use the |:cd| and |:lcd| commands to change to another directory, so
|
|||||||
you will not have to type that directory name in front of the file names. It
|
you will not have to type that directory name in front of the file names. It
|
||||||
also makes a difference for executing external commands, e.g. ":!ls".
|
also makes a difference for executing external commands, e.g. ":!ls".
|
||||||
|
|
||||||
|
Changing directory fails when the current buffer is modified, the '.' flag is
|
||||||
|
present in 'cpoptions' and "!" is not used in the command.
|
||||||
|
|
||||||
*:cd* *E472*
|
*:cd* *E472*
|
||||||
:cd On non-Unix systems: Print the current directory
|
:cd[!] On non-Unix systems: Print the current directory
|
||||||
name. On Unix systems: Change the current directory
|
name. On Unix systems: Change the current directory
|
||||||
to the home directory. Use |:pwd| to print the
|
to the home directory. Use |:pwd| to print the
|
||||||
current directory on all systems.
|
current directory on all systems.
|
||||||
|
|
||||||
:cd {path} Change the current directory to {path}.
|
:cd[!] {path} Change the current directory to {path}.
|
||||||
If {path} is relative, it is searched for in the
|
If {path} is relative, it is searched for in the
|
||||||
directories listed in |'cdpath'|.
|
directories listed in |'cdpath'|.
|
||||||
Does not change the meaning of an already opened file,
|
Does not change the meaning of an already opened file,
|
||||||
@ -1160,19 +1163,19 @@ also makes a difference for executing external commands, e.g. ":!ls".
|
|||||||
:cd %:h
|
:cd %:h
|
||||||
<
|
<
|
||||||
*:cd-* *E186*
|
*:cd-* *E186*
|
||||||
:cd - Change to the previous current directory (before the
|
:cd[!] - Change to the previous current directory (before the
|
||||||
previous ":cd {path}" command). {not in Vi}
|
previous ":cd {path}" command). {not in Vi}
|
||||||
|
|
||||||
*:chd* *:chdir*
|
*:chd* *:chdir*
|
||||||
:chd[ir] [path] Same as |:cd|.
|
:chd[ir][!] [path] Same as |:cd|.
|
||||||
|
|
||||||
*:lc* *:lcd*
|
*:lc* *:lcd*
|
||||||
:lc[d] {path} Like |:cd|, but only set the current directory for the
|
:lc[d][!] {path} Like |:cd|, but only set the current directory for the
|
||||||
current window. The current directory for other
|
current window. The current directory for other
|
||||||
windows is not changed. {not in Vi}
|
windows is not changed. {not in Vi}
|
||||||
|
|
||||||
*:lch* *:lchdir*
|
*:lch* *:lchdir*
|
||||||
:lch[dir] Same as |:lcd|. {not in Vi}
|
:lch[dir][!] Same as |:lcd|. {not in Vi}
|
||||||
|
|
||||||
*:pw* *:pwd* *E187*
|
*:pw* *:pwd* *E187*
|
||||||
:pw[d] Print the current directory name. {Vi: no pwd}
|
:pw[d] Print the current directory name. {Vi: no pwd}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*gui_w32.txt* For Vim version 7.0aa. Last change: 2005 Jan 07
|
*gui_w32.txt* For Vim version 7.0aa. Last change: 2005 Feb 14
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -235,7 +235,7 @@ cancel an operation. Use CTRL-Break for that.
|
|||||||
|
|
||||||
CTRL-Z is used for undo. This means you can't suspend Vim.
|
CTRL-Z is used for undo. This means you can't suspend Vim.
|
||||||
|
|
||||||
*CTRL-V-alternative*
|
*CTRL-V-alternative* *CTRL-Q*
|
||||||
Since CTRL-V is used to paste, you can't use it to start a blockwise Visual
|
Since CTRL-V is used to paste, you can't use it to start a blockwise Visual
|
||||||
selection. You can use CTRL-Q instead. You can also use CTRL-Q in Insert
|
selection. You can use CTRL-Q instead. You can also use CTRL-Q in Insert
|
||||||
mode and Command-line mode to get the old meaning of CTRL-V. But CTRL-Q
|
mode and Command-line mode to get the old meaning of CTRL-V. But CTRL-Q
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*insert.txt* For Vim version 7.0aa. Last change: 2005 Feb 08
|
*insert.txt* For Vim version 7.0aa. Last change: 2005 Feb 21
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -970,18 +970,29 @@ too long when appending characters a line break is automatically inserted.
|
|||||||
9. Ex insert commands *inserting-ex*
|
9. Ex insert commands *inserting-ex*
|
||||||
|
|
||||||
*:a* *:append*
|
*:a* *:append*
|
||||||
:{range}a[ppend] Insert several lines of text below the specified
|
:{range}a[ppend][!] Insert several lines of text below the specified
|
||||||
line. If the {range} is missing, the text will be
|
line. If the {range} is missing, the text will be
|
||||||
inserted after the current line.
|
inserted after the current line.
|
||||||
|
Adding [!] toggles 'autoindent' for the time this
|
||||||
|
command is executed.
|
||||||
|
|
||||||
*:i* *:in* *:insert*
|
*:i* *:in* *:insert*
|
||||||
:{range}i[nsert] Insert several lines of text above the specified
|
:{range}i[nsert][!] Insert several lines of text above the specified
|
||||||
line. If the {range} is missing, the text will be
|
line. If the {range} is missing, the text will be
|
||||||
inserted before the current line.
|
inserted before the current line.
|
||||||
|
Adding [!] toggles 'autoindent' for the time this
|
||||||
|
command is executed.
|
||||||
|
|
||||||
These two commands will keep on asking for lines, until you type a line
|
These two commands will keep on asking for lines, until you type a line
|
||||||
containing only a ".". Watch out for lines starting with a backslash, see
|
containing only a ".". Watch out for lines starting with a backslash, see
|
||||||
|line-continuation|.
|
|line-continuation|.
|
||||||
|
When these commands are used with |:global| or |:vglobal| then the lines are
|
||||||
|
obtained from the text following the command. Separate lines with a NL
|
||||||
|
escaped with a backslash: >
|
||||||
|
:global/abc/insert\
|
||||||
|
one line\
|
||||||
|
another line
|
||||||
|
The final "." is not needed then.
|
||||||
NOTE: ":append" and ":insert" don't work properly in between ":if" and
|
NOTE: ":append" and ":insert" don't work properly in between ":if" and
|
||||||
":endif", ":for" and ":endfor", ":while" and ":endwhile".
|
":endif", ":for" and ":endfor", ":while" and ":endwhile".
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*mbyte.txt* For Vim version 7.0aa. Last change: 2004 Dec 19
|
*mbyte.txt* For Vim version 7.0aa. Last change: 2005 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar et al.
|
VIM REFERENCE MANUAL by Bram Moolenaar et al.
|
||||||
@ -1319,7 +1319,7 @@ a zero if necessary.
|
|||||||
COMMAND ARGUMENTS *utf-8-char-arg*
|
COMMAND ARGUMENTS *utf-8-char-arg*
|
||||||
|
|
||||||
Commands like |f|, |F|, |t| and |r| take an argument of one character. For
|
Commands like |f|, |F|, |t| and |r| take an argument of one character. For
|
||||||
UTF-8 this argument may include one or two composing characters. These needs
|
UTF-8 this argument may include one or two composing characters. These need
|
||||||
to be produced together with the base character, Vim doesn't wait for the next
|
to be produced together with the base character, Vim doesn't wait for the next
|
||||||
character to be typed to find out if it is a composing character or not.
|
character to be typed to find out if it is a composing character or not.
|
||||||
Using 'keymap' or |:lmap| is a nice way to type these characters.
|
Using 'keymap' or |:lmap| is a nice way to type these characters.
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
*message.txt* For Vim version 7.0aa. Last change: 2005 Jan 08
|
*message.txt* For Vim version 7.0aa. Last change: 2005 Feb 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@ -364,7 +364,8 @@ cannot be written. You need to give the buffer a file name: >
|
|||||||
|
|
||||||
When using the '~' character in a pattern, it is replaced with the previously
|
When using the '~' character in a pattern, it is replaced with the previously
|
||||||
used pattern in a ":substitute" command. This fails when no such command has
|
used pattern in a ":substitute" command. This fails when no such command has
|
||||||
been used yet. See |/~|.
|
been used yet. See |/~|. This also happens when using ":s/pat/%/", where the
|
||||||
|
"%" stands for the previous substitute string.
|
||||||
|
|
||||||
*E35* >
|
*E35* >
|
||||||
No previous regular expression
|
No previous regular expression
|
||||||
|
@ -1,35 +1,198 @@
|
|||||||
" Vim filetype plugin file
|
" SQL filetype plugin file
|
||||||
" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase)
|
" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase)
|
||||||
" Version: 0.02
|
" Version: 0.08
|
||||||
" Maintainer: David Fishburn <fishburn@ianywhere.com>
|
" Maintainer: David Fishburn <fishburn at ianywhere dot com>
|
||||||
" Last Change: Tue May 27 2003 09:33:31
|
" Last Change: Mon Feb 21 2005 7:27:36 AM
|
||||||
|
" Download: http://vim.sourceforge.net/script.php?script_id=454
|
||||||
|
|
||||||
" This file should only contain values that are common to all SQL languages
|
" This file should only contain values that are common to all SQL languages
|
||||||
" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
|
" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
|
||||||
" If additional features are required create:
|
" If additional features are required create:
|
||||||
" vimfiles/after/ftplugin/sql.vim
|
" vimfiles/after/ftplugin/sql.vim (Windows)
|
||||||
" to override and add any of your own settings
|
" .vim/after/ftplugin/sql.vim (Unix)
|
||||||
|
" to override and add any of your own settings.
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo=
|
||||||
|
|
||||||
" Don't load another plugin for this buffer
|
" Don't load another plugin for this buffer
|
||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Some standard expressions for use with the matchit strings
|
||||||
|
let s:notend = '\%(\<end\s\+\)\@<!'
|
||||||
|
let s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
|
||||||
|
let s:or_replace = '\%(or\s\+replace\s\+\)\?'
|
||||||
|
|
||||||
" Define patterns for the matchit macro
|
" Define patterns for the matchit macro
|
||||||
if !exists("b:match_words")
|
if !exists("b:match_words")
|
||||||
" SQL is generally case insensitive
|
" SQL is generally case insensitive
|
||||||
let b:match_ignorecase = 1
|
let b:match_ignorecase = 1
|
||||||
|
|
||||||
|
" Handle the following:
|
||||||
|
" if
|
||||||
|
" elseif | elsif
|
||||||
|
" else [if]
|
||||||
|
" end if
|
||||||
|
"
|
||||||
|
" [while condition] loop
|
||||||
|
" leave
|
||||||
|
" break
|
||||||
|
" continue
|
||||||
|
" exit
|
||||||
|
" end loop
|
||||||
|
"
|
||||||
|
" for
|
||||||
|
" leave
|
||||||
|
" break
|
||||||
|
" continue
|
||||||
|
" exit
|
||||||
|
" end loop
|
||||||
|
"
|
||||||
|
" do
|
||||||
|
" statements
|
||||||
|
" doend
|
||||||
|
"
|
||||||
|
" case
|
||||||
|
" when
|
||||||
|
" when
|
||||||
|
" default
|
||||||
|
" end case
|
||||||
|
"
|
||||||
|
" merge
|
||||||
|
" when not matched
|
||||||
|
" when matched
|
||||||
|
"
|
||||||
|
" EXCEPTION
|
||||||
|
" WHEN column_not_found THEN
|
||||||
|
" WHEN OTHERS THEN
|
||||||
|
"
|
||||||
|
" create[ or replace] procedure|function|event
|
||||||
|
|
||||||
let b:match_words =
|
let b:match_words =
|
||||||
\ '\<begin\>:\<end\>\(;\)\?$,'.
|
\ '\<begin\>:\<end\>\W*$,'.
|
||||||
\ '\<if\>:\<elsif\>:\<elseif\>:\<else\>:'.
|
\
|
||||||
\ '\%(\<end\s\+\)\@<!' . '\<if\>:\<end\s\+if\>,'.
|
\ s:notend . '\<if\>:'.
|
||||||
\ '\<loop\>:\<break\>:\<continue\>:'.
|
\ '\<elsif\>\|\<elseif\>\|\<else\>:'.
|
||||||
\ '\%(\<end\s\+\)\@<!' . '\<loop\>:\<end\s\+loop\>,'.
|
\ '\<end\s\+if\>,'.
|
||||||
\ '\<for\>:\<break\>:\<continue\>:'.
|
\
|
||||||
\ '\%(\<end\s\+\)\@<!' . '\<for\>:\<end\s\+for\>,'.
|
\ '\<do\>\|'.
|
||||||
\ '\<case\>:\<when\>:\<default\>:'.
|
\ '\<while\>\|'.
|
||||||
\ '\%(\<end\s\+\)\@<!' . '\<case\>:\<end\s\+case\>'
|
\ '\%(' . s:notend . '\<loop\>\)\|'.
|
||||||
|
\ '\%(' . s:notend . '\<for\>\):'.
|
||||||
|
\ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'.
|
||||||
|
\ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'.
|
||||||
|
\
|
||||||
|
\ '\%('. s:notend . '\<case\>\):'.
|
||||||
|
\ '\%('.s:when_no_matched_or_others.'\):'.
|
||||||
|
\ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
|
||||||
|
\
|
||||||
|
\ '\<merge\>:' .
|
||||||
|
\ '\<when\s\+not\s\+matched\>:' .
|
||||||
|
\ '\<when\s\+matched\>,' .
|
||||||
|
\
|
||||||
|
\ '\%(\<create\s\+' . s:or_replace . '\)\?'.
|
||||||
|
\ '\%(function\|procedure\|event\):'.
|
||||||
|
\ '\<returns\?\>'
|
||||||
|
" \ '\<begin\>\|\<returns\?\>:'.
|
||||||
|
" \ '\<end\>\(;\)\?\s*$'
|
||||||
|
" \ '\<exception\>:'.s:when_no_matched_or_others.
|
||||||
|
" \ ':\<when\s\+others\>,'.
|
||||||
|
"
|
||||||
|
" \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
|
||||||
|
" \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
|
||||||
|
" \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Define how to find the macro definition of a variable using the various
|
||||||
|
" [d, [D, [_CTRL_D and so on features
|
||||||
|
" Match these values ignoring case
|
||||||
|
" ie DECLARE varname INTEGER
|
||||||
|
let &l:define = '\c\(DECLARE\|IN\|OUT\|INOUT\)\s*'
|
||||||
|
|
||||||
|
|
||||||
|
" Mappings to move to the next BEGIN ... END block
|
||||||
|
" \W - no characters or digits
|
||||||
|
nmap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
|
||||||
|
nmap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
|
||||||
|
nmap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
|
||||||
|
nmap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
|
||||||
|
vmap <buffer> <silent> ]] /\c^\s*begin\><CR>
|
||||||
|
vmap <buffer> <silent> [[ ?\c^\s*begin<CR>
|
||||||
|
vmap <buffer> <silent> ][ /\c^\s*end\W*$<CR>
|
||||||
|
vmap <buffer> <silent> [] ?\c^\s*end\W*$<CR>
|
||||||
|
|
||||||
|
|
||||||
|
" Predefined SQL objects what are used by the below mappings using
|
||||||
|
" the ]} style maps.
|
||||||
|
" This global variable allows the users to override it's value
|
||||||
|
" from within their vimrc.
|
||||||
|
if !exists('g:ftplugin_sql_objects')
|
||||||
|
let g:ftplugin_sql_objects = 'function,procedure,event,' .
|
||||||
|
\ '\(existing\\|global\s\+temporary\s\+\)\?table,trigger' .
|
||||||
|
\ ',schema,service,publication,database,datatype,domain' .
|
||||||
|
\ ',index,subscription,synchronization,view,variable'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:ftplugin_sql_objects =
|
||||||
|
\ '\c^\s*' .
|
||||||
|
\ '\(create\s\+\(or\s\+replace\s\+\)\?\)\?' .
|
||||||
|
\ '\<\(' .
|
||||||
|
\ substitute(g:ftplugin_sql_objects, ',', '\\\\|', 'g') .
|
||||||
|
\ '\)\>'
|
||||||
|
|
||||||
|
" Mappings to move to the next CREATE ... block
|
||||||
|
" map <buffer> <silent> ]} :call search(g:ftplugin_sql_objects, 'W' )<CR>
|
||||||
|
" nmap <buffer> <silent> [{ :call search('\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\>', 'bW' )<CR>
|
||||||
|
" exec 'nmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
|
||||||
|
exec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
|
||||||
|
exec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
|
||||||
|
" Could not figure out how to use a :call search() string in visual mode
|
||||||
|
" without it ending visual mode
|
||||||
|
exec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
|
||||||
|
exec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
|
||||||
|
" vmap <buffer> <silent> ]} /\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
|
||||||
|
" vmap <buffer> <silent> [{ ?\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
|
||||||
|
|
||||||
|
" Mappings to move to the next COMMENT
|
||||||
|
"
|
||||||
|
" Had to double the \ for the \| separator since this has a special
|
||||||
|
" meaning on maps
|
||||||
|
let b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
|
||||||
|
" Find the start of the next comment
|
||||||
|
let b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
|
||||||
|
\ '\(\s*'.b:comment_leader.'\)'
|
||||||
|
" Find the end of the previous comment
|
||||||
|
let b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
|
||||||
|
\ '\(^\s*'.b:comment_leader.'\)\@!'
|
||||||
|
" Skip over the comment
|
||||||
|
let b:comment_jump_over = "call search('".
|
||||||
|
\ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
|
||||||
|
\ "', 'W')"
|
||||||
|
let b:comment_skip_back = "call search('".
|
||||||
|
\ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
|
||||||
|
\ "', 'bW')"
|
||||||
|
" Move to the start and end of comments
|
||||||
|
exec 'nnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
|
||||||
|
exec 'nnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
|
||||||
|
exec 'vnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
|
||||||
|
exec 'vnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
|
||||||
|
|
||||||
|
" Comments can be of the form:
|
||||||
|
" /*
|
||||||
|
" *
|
||||||
|
" */
|
||||||
|
" or
|
||||||
|
" //
|
||||||
|
" or
|
||||||
|
" --
|
||||||
|
setlocal comments=s1:/*,mb:*,ex:*/,:--,://
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
|
||||||
|
" vim:sw=4:ff=unix:
|
||||||
|
|
||||||
|
34
runtime/syntax/esmtprc.vim
Normal file
34
runtime/syntax/esmtprc.vim
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
" Vim syntax file
|
||||||
|
" Language: Esmtp setup file (based on esmtp 0.5.0)
|
||||||
|
" Maintainer: Kornel Kielczewski <kornel@gazeta.pl>
|
||||||
|
" Last Change: 16 Feb 2005
|
||||||
|
|
||||||
|
" For version 5.x: Clear all syntax items
|
||||||
|
" For version 6.x: Quit when a syntax file was already loaded
|
||||||
|
if version < 600
|
||||||
|
syntax clear
|
||||||
|
elseif exists("b:current_syntax")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
"All options
|
||||||
|
:syntax keyword esmtprcOptions hostname username password starttls certificate_passphrase preconnect identity mda
|
||||||
|
|
||||||
|
"All keywords
|
||||||
|
:syntax keyword esmtprcIdentifier default enabled disabled required
|
||||||
|
|
||||||
|
"We're trying to be smarer than /."*@.*/ :)
|
||||||
|
:syntax match esmtprcAddress /[a-z0-9_.-]*[a-z0-9]\+@[a-z0-9_.-]*[a-z0-9]\+\.[a-z]\+/
|
||||||
|
:syntax match esmtprcFulladd /[a-z0-9_.-]*[a-z0-9]\+\.[a-z]\+:[0-9]\+/
|
||||||
|
|
||||||
|
"String..
|
||||||
|
:syntax region esmtprcString start=/"/ end=/"/
|
||||||
|
|
||||||
|
|
||||||
|
:highlight link esmtprcOptions Label
|
||||||
|
:highlight link esmtprcString String
|
||||||
|
:highlight link esmtprcAddress Type
|
||||||
|
:highlight link esmtprcIdentifier Identifier
|
||||||
|
:highlight link esmtprcFulladd Include
|
||||||
|
|
||||||
|
let b:current_syntax="esmtprc"
|
@ -2,8 +2,8 @@
|
|||||||
" Language: shell (sh) Korn shell (ksh) bash (sh)
|
" Language: shell (sh) Korn shell (ksh) bash (sh)
|
||||||
" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
|
" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
|
||||||
" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
|
" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
|
||||||
" Last Change: Dec 28, 2004
|
" Last Change: Feb 16, 2005
|
||||||
" Version: 71
|
" Version: 72
|
||||||
" URL: http://www.erols.com/astronaut/vim/index.html#vimlinks_syntax
|
" URL: http://www.erols.com/astronaut/vim/index.html#vimlinks_syntax
|
||||||
"
|
"
|
||||||
" Using the following VIM variables: {{{1
|
" Using the following VIM variables: {{{1
|
||||||
@ -63,24 +63,24 @@ syn case match
|
|||||||
|
|
||||||
" Clusters: contains=@... clusters {{{1
|
" Clusters: contains=@... clusters {{{1
|
||||||
"==================================
|
"==================================
|
||||||
syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseSingleQuote,shCaseDoubleQuote,shSpecial
|
syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shSpecial
|
||||||
syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,bkshFunction,shSpecial
|
syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,bkshFunction,shSpecial
|
||||||
syn cluster shColonList contains=@shCaseList
|
syn cluster shColonList contains=@shCaseList
|
||||||
syn cluster shCommandSubList contains=shArithmetic,shDeref,shDerefSimple,shNumber,shOperator,shPosnParm,shSpecial,shSingleQuote,shDoubleQuote,shStatement,shVariable,shSubSh,shAlias,shTest
|
syn cluster shCommandSubList contains=shArithmetic,shDeref,shDerefSimple,shNumber,shOperator,shPosnParm,shSpecial,shExSingleQuote,shSingleQuote,shDoubleQuote,shStatement,shVariable,shSubSh,shAlias,shTest
|
||||||
syn cluster shDblQuoteList contains=shCommandSub,shDeref,shDerefSimple,shSpecial,shPosnParm
|
syn cluster shDblQuoteList contains=shCommandSub,shDeref,shDerefSimple,shSpecial,shPosnParm
|
||||||
syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError
|
syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError
|
||||||
syn cluster shDerefVarList contains=shDerefOp,shDerefVarArray,shDerefOpError
|
syn cluster shDerefVarList contains=shDerefOp,shDerefVarArray,shDerefOpError
|
||||||
syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shExpr,shSingleQuote,shDoubleQuote,shSpecial
|
syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shExpr,shExSingleQuote,shSingleQuote,shDoubleQuote,shSpecial
|
||||||
syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shSingleQuote,shDoubleQuote,shSpecial,shExpr,shDblBrace,shDeref,shDerefSimple
|
syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shSingleQuote,shDoubleQuote,shSpecial,shExpr,shDblBrace,shDeref,shDerefSimple
|
||||||
syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
|
syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
|
||||||
syn cluster shFunctionList contains=@shCaseList,shOperator
|
syn cluster shFunctionList contains=@shCaseList,shOperator
|
||||||
syn cluster shHereBeginList contains=@shCommandSubList
|
syn cluster shHereBeginList contains=@shCommandSubList
|
||||||
syn cluster shHereList contains=shBeginHere,shHerePayload
|
syn cluster shHereList contains=shBeginHere,shHerePayload
|
||||||
syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
|
syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
|
||||||
syn cluster shIdList contains=shCommandSub,shWrapLineOperator,shIdWhiteSpace,shDeref,shDerefSimple,shSpecial,shRedir,shSingleQuote,shDoubleQuote,shExpr
|
syn cluster shIdList contains=shCommandSub,shWrapLineOperator,shIdWhiteSpace,shDeref,shDerefSimple,shSpecial,shRedir,shExSingleQuote,shSingleQuote,shDoubleQuote,shExpr
|
||||||
syn cluster shLoopList contains=@shCaseList,shTestOpr,shExpr,shDblBrace,shConditional,shCaseEsac,shTest
|
syn cluster shLoopList contains=@shCaseList,shTestOpr,shExpr,shDblBrace,shConditional,shCaseEsac,shTest
|
||||||
syn cluster shSubShList contains=@shCaseList
|
syn cluster shSubShList contains=@shCaseList
|
||||||
syn cluster shTestList contains=shCharClass,shComment,shCommandSub,shDeref,shDerefSimple,shDoubleQuote,shExpr,shExpr,shNumber,shOperator,shSingleQuote,shSpecial,shTestOpr,shTest
|
syn cluster shTestList contains=shCharClass,shComment,shCommandSub,shDeref,shDerefSimple,shDoubleQuote,shExpr,shExpr,shNumber,shOperator,shExSingleQuote,shSingleQuote,shSpecial,shTestOpr,shTest
|
||||||
|
|
||||||
|
|
||||||
" Echo: {{{1
|
" Echo: {{{1
|
||||||
@ -90,7 +90,7 @@ syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup
|
|||||||
syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|()]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList
|
syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|()]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList
|
||||||
|
|
||||||
" This must be after the strings, so that bla \" be correct
|
" This must be after the strings, so that bla \" be correct
|
||||||
syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=shNumber,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shSpecial,shOperator,shDoubleQuote,shCharClass
|
syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shOperator end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=shNumber,shExSingleQuote,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shSpecial,shOperator,shDoubleQuote,shCharClass
|
||||||
|
|
||||||
" Alias: {{{1
|
" Alias: {{{1
|
||||||
" =====
|
" =====
|
||||||
@ -124,7 +124,7 @@ syn match shOption "\s--\S\+"ms=s+1
|
|||||||
syn match shOperator "[!&;|]"
|
syn match shOperator "[!&;|]"
|
||||||
syn match shOperator "\[[[^:]\|\]]"
|
syn match shOperator "\[[[^:]\|\]]"
|
||||||
syn match shOperator "!\==" skipwhite nextgroup=shPattern
|
syn match shOperator "!\==" skipwhite nextgroup=shPattern
|
||||||
syn match shPattern "\<\S\+\())\)\@=" contained contains=shSingleQuote,shDoubleQuote,shDeref
|
syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shDoubleQuote,shDeref
|
||||||
|
|
||||||
" Subshells: {{{1
|
" Subshells: {{{1
|
||||||
" ==========
|
" ==========
|
||||||
@ -163,12 +163,17 @@ endif
|
|||||||
|
|
||||||
" Case: case...esac {{{1
|
" Case: case...esac {{{1
|
||||||
" ====
|
" ====
|
||||||
syn match shCaseBar contained skipwhite "[^|"`'()]\{-}|"hs=e nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseSingleQuote,shCaseDoubleQuote
|
syn match shCaseBar contained skipwhite "[^|"`'()]\{-}|"hs=e nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
|
||||||
syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
|
syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
|
||||||
syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="[^$()]\{-})"ms=s,hs=e end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,,shComment
|
syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="[^$()]\{-})"ms=s,hs=e end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,,shComment
|
||||||
syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
|
syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
|
||||||
syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseSingleQuote,shCaseDoubleQuote
|
syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
|
||||||
syn region shCaseSingleQuote matchgroup=shOperator start=+'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
if exists("b:is_bash")
|
||||||
|
syn region shCaseExSingleQuote matchgroup=shOperator start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
||||||
|
else
|
||||||
|
syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
||||||
|
endif
|
||||||
|
syn region shCaseSingleQuote matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
||||||
syn region shCaseDoubleQuote matchgroup=shOperator start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
syn region shCaseDoubleQuote matchgroup=shOperator start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
|
||||||
syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
|
syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
|
||||||
|
|
||||||
@ -188,7 +193,7 @@ if exists("b:is_kornshell") || exists("b:is_bash")
|
|||||||
syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shCommandSubList
|
syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shCommandSubList
|
||||||
syn match shSkipInitWS contained "^\s\+"
|
syn match shSkipInitWS contained "^\s\+"
|
||||||
else
|
else
|
||||||
syn region shCommandSub matchgroup=Error start="$(" end=")" contains=@shCommandSubList
|
syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if exists("b:is_bash")
|
if exists("b:is_bash")
|
||||||
@ -213,7 +218,16 @@ syn region shColon start="^\s*:" end="$\|" end="#"me=e-1 contains=@shColonList
|
|||||||
" String And Character Constants: {{{1
|
" String And Character Constants: {{{1
|
||||||
"================================
|
"================================
|
||||||
syn match shNumber "-\=\<\d\+\>"
|
syn match shNumber "-\=\<\d\+\>"
|
||||||
syn match shSpecial "\\\d\d\d\|\\[abcfnrtv0]" contained
|
if exists("b:is_bash")
|
||||||
|
syn match shSpecial "\\\o\o\o\|\\x\x\x\|\\c.\|\\[abefnrtv]" contained
|
||||||
|
else
|
||||||
|
syn match shSpecial "\\\d\d\d\|\\[abcfnrtv0]" contained
|
||||||
|
endif
|
||||||
|
if exists("b:is_bash")
|
||||||
|
syn region shExSingleQuote matchgroup=shOperator start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial
|
||||||
|
else
|
||||||
|
syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial
|
||||||
|
endif
|
||||||
syn region shSingleQuote matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial
|
syn region shSingleQuote matchgroup=shOperator start=+'+ end=+'+ contains=shStringSpecial
|
||||||
syn region shDoubleQuote matchgroup=shOperator start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
|
syn region shDoubleQuote matchgroup=shOperator start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
|
||||||
syn match shStringSpecial "[^[:print:]]" contained
|
syn match shStringSpecial "[^[:print:]]" contained
|
||||||
@ -314,7 +328,7 @@ endif
|
|||||||
"=============
|
"=============
|
||||||
syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shSetIdentifier
|
syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shSetIdentifier
|
||||||
syn match shIdWhiteSpace contained "\s"
|
syn match shIdWhiteSpace contained "\s"
|
||||||
syn match shSetIdentifier contained "=" nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shSingleQuote
|
syn match shSetIdentifier contained "=" nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shSingleQuote,shExSingleQuote
|
||||||
if exists("b:is_bash")
|
if exists("b:is_bash")
|
||||||
syn region shSetList matchgroup=shSet start="\<\(declare\|typeset\|local\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shOperator end="[;&]"me=e-1 matchgroup=NONE end="#\|="me=e-1 contains=@shIdList
|
syn region shSetList matchgroup=shSet start="\<\(declare\|typeset\|local\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shOperator end="[;&]"me=e-1 matchgroup=NONE end="#\|="me=e-1 contains=@shIdList
|
||||||
syn region shSetList matchgroup=shSet start="\<set\>[^/]"me=e-1 end="$" end="\\ze[|)]" matchgroup=shOperator end="[;&]"me=e-1 matchgroup=NONE end="[#=]"me=e-1 contains=@shIdList
|
syn region shSetList matchgroup=shSet start="\<set\>[^/]"me=e-1 end="$" end="\\ze[|)]" matchgroup=shOperator end="[;&]"me=e-1 matchgroup=NONE end="[#=]"me=e-1 contains=@shIdList
|
||||||
@ -448,32 +462,30 @@ syn sync match shWhileSync grouphere shRepeat "\<while\>"
|
|||||||
" Default Highlighting: {{{1
|
" Default Highlighting: {{{1
|
||||||
" =====================
|
" =====================
|
||||||
hi def link shArithRegion shShellVariables
|
hi def link shArithRegion shShellVariables
|
||||||
|
hi def link shBeginHere shRedir
|
||||||
hi def link shCaseBar shConditional
|
hi def link shCaseBar shConditional
|
||||||
hi def link shCaseIn shConditional
|
|
||||||
hi def link shCaseCommandSub shCommandSub
|
hi def link shCaseCommandSub shCommandSub
|
||||||
hi def link shCaseDoubleQuote shDoubleQuote
|
hi def link shCaseDoubleQuote shDoubleQuote
|
||||||
|
hi def link shCaseIn shConditional
|
||||||
hi def link shCaseSingleQuote shSingleQuote
|
hi def link shCaseSingleQuote shSingleQuote
|
||||||
hi def link shCaseStart shConditional
|
hi def link shCaseStart shConditional
|
||||||
hi def link shCmdSubRegion shShellVariables
|
hi def link shCmdSubRegion shShellVariables
|
||||||
hi def link shColon shStatement
|
hi def link shColon shStatement
|
||||||
|
|
||||||
hi def link shDeref shShellVariables
|
|
||||||
hi def link shDerefOp shOperator
|
hi def link shDerefOp shOperator
|
||||||
|
|
||||||
hi def link shDerefVar shDeref
|
|
||||||
hi def link shDerefPOL shDerefOp
|
|
||||||
hi def link shDerefPatString shDerefPattern
|
|
||||||
hi def link shDerefPatStringOp shDerefOp
|
hi def link shDerefPatStringOp shDerefOp
|
||||||
|
hi def link shDerefPatString shDerefPattern
|
||||||
|
hi def link shDerefPOL shDerefOp
|
||||||
|
hi def link shDeref shShellVariables
|
||||||
hi def link shDerefSimple shDeref
|
hi def link shDerefSimple shDeref
|
||||||
hi def link shDerefSpecial shDeref
|
hi def link shDerefSpecial shDeref
|
||||||
hi def link shDerefString shDoubleQuote
|
hi def link shDerefString shDoubleQuote
|
||||||
hi def link shHerePayload shHereDoc
|
hi def link shDerefVar shDeref
|
||||||
hi def link shBeginHere shRedir
|
|
||||||
|
|
||||||
hi def link shDoubleQuote shString
|
hi def link shDoubleQuote shString
|
||||||
hi def link shEcho shString
|
hi def link shEcho shString
|
||||||
hi def link shEmbeddedEcho shString
|
hi def link shEmbeddedEcho shString
|
||||||
|
hi def link shExSingleQuote shSingleQuote
|
||||||
hi def link shHereDoc shString
|
hi def link shHereDoc shString
|
||||||
|
hi def link shHerePayload shHereDoc
|
||||||
hi def link shLoop shStatement
|
hi def link shLoop shStatement
|
||||||
hi def link shOption shCommandSub
|
hi def link shOption shCommandSub
|
||||||
hi def link shPattern shString
|
hi def link shPattern shString
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: Vim 7.0 script
|
" Language: Vim 7.0 script
|
||||||
" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
|
" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
|
||||||
" Last Change: February 09, 2005
|
" Last Change: Feb 14, 2005
|
||||||
" Version: 7.0-04
|
" Version: 7.0-05
|
||||||
" Automatically generated keyword lists: {{{1
|
" Automatically generated keyword lists: {{{1
|
||||||
|
|
||||||
" Quit when a syntax file was already loaded {{{2
|
" Quit when a syntax file was already loaded {{{2
|
||||||
@ -16,7 +16,7 @@ syn keyword vimTodo contained COMBAK NOT RELEASED TODO WIP
|
|||||||
syn cluster vimCommentGroup contains=vimTodo
|
syn cluster vimCommentGroup contains=vimTodo
|
||||||
|
|
||||||
" regular vim commands {{{2
|
" regular vim commands {{{2
|
||||||
syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cf[ile] cfir[st] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] DeleteFirst delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] g[lobal] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] I ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] lan[guage] la[st] lc[d] lch[dir] le[ft] lefta[bove] l[ist] lm[ap] lmapc[lear] ln[oremap] lo[adview] loc[kmarks] lockv[ar] ls lu[nmap] mak[e] ma[rk] marks mat[ch] menut[ranslate] mk[exrc] mks[ession] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] Nread nu[mber] nun[map] Nw omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] prompt promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] sandbox sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sn[ext] sN[ext] sni[ff] sno[magic] so[urce] sp[lit] spr[evious] sre[wind] sta[g] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sus[pend] sv[iew] syncbind t ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] the th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] v[global] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] winpos* win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] y[ank]
|
syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cf[ile] cfir[st] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] DeleteFirst delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] g[lobal] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] I ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] lan[guage] la[st] lc[d] lch[dir] le[ft] lefta[bove] l[ist] lm[ap] lmapc[lear] ln[oremap] lo[adview] loc[kmarks] lockv[ar] ls lu[nmap] mak[e] ma[rk] marks mat[ch] menut[ranslate] mk[exrc] mks[ession] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] Nread nu[mber] nun[map] Nw omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] prompt promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] sandbox sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st] sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sn[ext] sN[ext] sni[ff] sno[magic] so[urce] sp[lit] spr[evious] sre[wind] sta[g] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sus[pend] sv[iew] syncbind t ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] the th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] v[global] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] winpos* win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] y[ank]
|
||||||
syn match vimCommand contained "\<z[-+^.=]"
|
syn match vimCommand contained "\<z[-+^.=]"
|
||||||
|
|
||||||
" vimOptions are caught only when contained in a vimSet {{{2
|
" vimOptions are caught only when contained in a vimSet {{{2
|
||||||
@ -389,13 +389,14 @@ syn match vimMtchComment contained '"[^"]\+$'
|
|||||||
|
|
||||||
" Syntax: sync {{{2
|
" Syntax: sync {{{2
|
||||||
" ============
|
" ============
|
||||||
syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncC,vimSyncLines,vimSyncMatch,vimSyncError,vimSyncLinecont,vimSyncRegion
|
syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncC,vimSyncLines,vimSyncMatch,vimSyncError,vimSyncLinebreak,vimSyncLinecont,vimSyncRegion
|
||||||
if !exists("g:vimsyntax_noerror")
|
if !exists("g:vimsyntax_noerror")
|
||||||
syn match vimSyncError contained "\i\+"
|
syn match vimSyncError contained "\i\+"
|
||||||
endif
|
endif
|
||||||
syn keyword vimSyncC contained ccomment clear fromstart
|
syn keyword vimSyncC contained ccomment clear fromstart
|
||||||
syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName
|
syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName
|
||||||
syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynReg
|
syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynReg
|
||||||
|
syn match vimSyncLinebreak contained "\<linebreaks=" skipwhite nextgroup=vimNumber
|
||||||
syn keyword vimSyncLinecont contained linecont skipwhite nextgroup=vimSynRegPat
|
syn keyword vimSyncLinecont contained linecont skipwhite nextgroup=vimSynRegPat
|
||||||
syn match vimSyncLines contained "\(min\|max\)\=lines=" nextgroup=vimNumber
|
syn match vimSyncLines contained "\(min\|max\)\=lines=" nextgroup=vimNumber
|
||||||
syn match vimSyncGroupName contained "\k\+" skipwhite nextgroup=vimSyncKey
|
syn match vimSyncGroupName contained "\k\+" skipwhite nextgroup=vimSyncKey
|
||||||
|
@ -505,6 +505,7 @@ CClink = $(CC)
|
|||||||
# Often used for GCC: mixed optimizing, lot of optimizing, debugging
|
# Often used for GCC: mixed optimizing, lot of optimizing, debugging
|
||||||
#CFLAGS = -g -O2 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
|
#CFLAGS = -g -O2 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
|
||||||
#CFLAGS = -g -O2 -fno-strength-reduce -Wall -Wmissing-prototypes
|
#CFLAGS = -g -O2 -fno-strength-reduce -Wall -Wmissing-prototypes
|
||||||
|
#CFLAGS = -g -Wall -Wmissing-prototypes
|
||||||
#CFLAGS = -O6 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
|
#CFLAGS = -O6 -fno-strength-reduce -Wall -Wshadow -Wmissing-prototypes
|
||||||
#CFLAGS = -g -DDEBUG -Wall -Wshadow -Wmissing-prototypes
|
#CFLAGS = -g -DDEBUG -Wall -Wshadow -Wmissing-prototypes
|
||||||
#CFLAGS = -g -O2 '-DSTARTUPTIME="vimstartup"' -fno-strength-reduce -Wall -Wmissing-prototypes
|
#CFLAGS = -g -O2 '-DSTARTUPTIME="vimstartup"' -fno-strength-reduce -Wall -Wmissing-prototypes
|
||||||
@ -2410,6 +2411,11 @@ $(APPDIR): bundle-dir bundle-executable bundle-info bundle-resource \
|
|||||||
bundle-dir: $(APPDIR)/Contents $(VIMTARGET)
|
bundle-dir: $(APPDIR)/Contents $(VIMTARGET)
|
||||||
-@srcdir=`pwd`; cd $(HELPSOURCE); $(MAKE) VIMEXE=$$srcdir/$(VIMTARGET) vimtags
|
-@srcdir=`pwd`; cd $(HELPSOURCE); $(MAKE) VIMEXE=$$srcdir/$(VIMTARGET) vimtags
|
||||||
cp -R ../runtime $(APPDIR)
|
cp -R ../runtime $(APPDIR)
|
||||||
|
# When using CVS some CVS directories might have been copied.
|
||||||
|
cvs=`find $(APPDIR) \( -name CVS -o -name AAPDIR \) -print`; \
|
||||||
|
if test -n "$$cvs"; then \
|
||||||
|
rm -rf $$cvs; \
|
||||||
|
fi
|
||||||
|
|
||||||
bundle-executable: $(VIMTARGET)
|
bundle-executable: $(VIMTARGET)
|
||||||
cp $(VIMTARGET) $(APPDIR)/Contents/MacOS/$(VIMTARGET)
|
cp $(VIMTARGET) $(APPDIR)/Contents/MacOS/$(VIMTARGET)
|
||||||
|
366
src/ex_docmd.c
366
src/ex_docmd.c
@ -128,6 +128,7 @@ static int getargopt __ARGS((exarg_T *eap));
|
|||||||
|
|
||||||
static int check_more __ARGS((int, int));
|
static int check_more __ARGS((int, int));
|
||||||
static linenr_T get_address __ARGS((char_u **, int skip, int to_other_file));
|
static linenr_T get_address __ARGS((char_u **, int skip, int to_other_file));
|
||||||
|
static void get_flags __ARGS((exarg_T *eap));
|
||||||
#if !defined(FEAT_PERL) || !defined(FEAT_PYTHON) || !defined(FEAT_TCL) \
|
#if !defined(FEAT_PERL) || !defined(FEAT_PYTHON) || !defined(FEAT_TCL) \
|
||||||
|| !defined(FEAT_RUBY) || !defined(FEAT_MZSCHEME)
|
|| !defined(FEAT_RUBY) || !defined(FEAT_MZSCHEME)
|
||||||
static void ex_script_ni __ARGS((exarg_T *eap));
|
static void ex_script_ni __ARGS((exarg_T *eap));
|
||||||
@ -185,6 +186,7 @@ static void ex_recover __ARGS((exarg_T *eap));
|
|||||||
static void ex_mode __ARGS((exarg_T *eap));
|
static void ex_mode __ARGS((exarg_T *eap));
|
||||||
static void ex_wrongmodifier __ARGS((exarg_T *eap));
|
static void ex_wrongmodifier __ARGS((exarg_T *eap));
|
||||||
static void ex_find __ARGS((exarg_T *eap));
|
static void ex_find __ARGS((exarg_T *eap));
|
||||||
|
static void ex_open __ARGS((exarg_T *eap));
|
||||||
static void ex_edit __ARGS((exarg_T *eap));
|
static void ex_edit __ARGS((exarg_T *eap));
|
||||||
#if !defined(FEAT_GUI) && !defined(FEAT_CLIENTSERVER)
|
#if !defined(FEAT_GUI) && !defined(FEAT_CLIENTSERVER)
|
||||||
# define ex_drop ex_ni
|
# define ex_drop ex_ni
|
||||||
@ -271,6 +273,7 @@ static void ex_winpos __ARGS((exarg_T *eap));
|
|||||||
static void ex_operators __ARGS((exarg_T *eap));
|
static void ex_operators __ARGS((exarg_T *eap));
|
||||||
static void ex_put __ARGS((exarg_T *eap));
|
static void ex_put __ARGS((exarg_T *eap));
|
||||||
static void ex_copymove __ARGS((exarg_T *eap));
|
static void ex_copymove __ARGS((exarg_T *eap));
|
||||||
|
static void ex_may_print __ARGS((exarg_T *eap));
|
||||||
static void ex_submagic __ARGS((exarg_T *eap));
|
static void ex_submagic __ARGS((exarg_T *eap));
|
||||||
static void ex_join __ARGS((exarg_T *eap));
|
static void ex_join __ARGS((exarg_T *eap));
|
||||||
static void ex_at __ARGS((exarg_T *eap));
|
static void ex_at __ARGS((exarg_T *eap));
|
||||||
@ -570,19 +573,22 @@ do_exmode(improved)
|
|||||||
int save_msg_scroll;
|
int save_msg_scroll;
|
||||||
int prev_msg_row;
|
int prev_msg_row;
|
||||||
linenr_T prev_line;
|
linenr_T prev_line;
|
||||||
|
int changedtick;
|
||||||
|
|
||||||
|
if (improved)
|
||||||
|
exmode_active = EXMODE_VIM;
|
||||||
|
else
|
||||||
|
exmode_active = EXMODE_NORMAL;
|
||||||
|
State = NORMAL;
|
||||||
|
|
||||||
|
/* When using ":global /pat/ visual" and then "Q" we return to continue
|
||||||
|
* the :global command. */
|
||||||
|
if (global_busy)
|
||||||
|
return;
|
||||||
|
|
||||||
save_msg_scroll = msg_scroll;
|
save_msg_scroll = msg_scroll;
|
||||||
++RedrawingDisabled; /* don't redisplay the window */
|
++RedrawingDisabled; /* don't redisplay the window */
|
||||||
++no_wait_return; /* don't wait for return */
|
++no_wait_return; /* don't wait for return */
|
||||||
if (improved)
|
|
||||||
exmode_active = EXMODE_VIM;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settmode(TMODE_COOK);
|
|
||||||
exmode_active = EXMODE_NORMAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
State = NORMAL;
|
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
/* Ignore scrollbar and mouse events in Ex mode */
|
/* Ignore scrollbar and mouse events in Ex mode */
|
||||||
++hold_gui_events;
|
++hold_gui_events;
|
||||||
@ -606,6 +612,7 @@ do_exmode(improved)
|
|||||||
need_wait_return = FALSE;
|
need_wait_return = FALSE;
|
||||||
ex_pressedreturn = FALSE;
|
ex_pressedreturn = FALSE;
|
||||||
ex_no_reprint = FALSE;
|
ex_no_reprint = FALSE;
|
||||||
|
changedtick = curbuf->b_changedtick;
|
||||||
prev_msg_row = msg_row;
|
prev_msg_row = msg_row;
|
||||||
prev_line = curwin->w_cursor.lnum;
|
prev_line = curwin->w_cursor.lnum;
|
||||||
#ifdef FEAT_SNIFF
|
#ifdef FEAT_SNIFF
|
||||||
@ -620,29 +627,38 @@ do_exmode(improved)
|
|||||||
do_cmdline(NULL, getexmodeline, NULL, DOCMD_NOWAIT);
|
do_cmdline(NULL, getexmodeline, NULL, DOCMD_NOWAIT);
|
||||||
lines_left = Rows - 1;
|
lines_left = Rows - 1;
|
||||||
|
|
||||||
if (prev_line != curwin->w_cursor.lnum && !ex_no_reprint)
|
if ((prev_line != curwin->w_cursor.lnum
|
||||||
|
|| changedtick != curbuf->b_changedtick) && !ex_no_reprint)
|
||||||
{
|
{
|
||||||
if (ex_pressedreturn)
|
if (curbuf->b_ml.ml_flags & ML_EMPTY)
|
||||||
|
EMSG(_(e_emptybuf));
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* go up one line, to overwrite the ":<CR>" line, so the
|
if (ex_pressedreturn)
|
||||||
* output doensn't contain empty lines. */
|
{
|
||||||
msg_row = prev_msg_row;
|
/* go up one line, to overwrite the ":<CR>" line, so the
|
||||||
if (prev_msg_row == Rows - 1)
|
* output doensn't contain empty lines. */
|
||||||
msg_row--;
|
msg_row = prev_msg_row;
|
||||||
|
if (prev_msg_row == Rows - 1)
|
||||||
|
msg_row--;
|
||||||
|
}
|
||||||
|
msg_col = 0;
|
||||||
|
print_line_no_prefix(curwin->w_cursor.lnum, FALSE, FALSE);
|
||||||
|
msg_clr_eos();
|
||||||
}
|
}
|
||||||
msg_col = 0;
|
|
||||||
print_line_no_prefix(curwin->w_cursor.lnum, FALSE);
|
|
||||||
msg_clr_eos();
|
|
||||||
}
|
}
|
||||||
else if (ex_pressedreturn) /* must be at EOF */
|
else if (ex_pressedreturn && !ex_no_reprint) /* must be at EOF */
|
||||||
EMSG(_("E501: At end-of-file"));
|
{
|
||||||
|
if (curbuf->b_ml.ml_flags & ML_EMPTY)
|
||||||
|
EMSG(_(e_emptybuf));
|
||||||
|
else
|
||||||
|
EMSG(_("E501: At end-of-file"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
--hold_gui_events;
|
--hold_gui_events;
|
||||||
#endif
|
#endif
|
||||||
if (!improved)
|
|
||||||
settmode(TMODE_RAW);
|
|
||||||
--RedrawingDisabled;
|
--RedrawingDisabled;
|
||||||
--no_wait_return;
|
--no_wait_return;
|
||||||
update_screen(CLEAR);
|
update_screen(CLEAR);
|
||||||
@ -1663,7 +1679,8 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
/* in ex mode, an empty line works like :+ */
|
/* in ex mode, an empty line works like :+ */
|
||||||
if (*ea.cmd == NUL && exmode_active
|
if (*ea.cmd == NUL && exmode_active
|
||||||
&& (getline_equal(getline, cookie, getexmodeline)
|
&& (getline_equal(getline, cookie, getexmodeline)
|
||||||
|| getline_equal(getline, cookie, getexline)))
|
|| getline_equal(getline, cookie, getexline))
|
||||||
|
&& curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
|
||||||
{
|
{
|
||||||
ea.cmd = (char_u *)"+";
|
ea.cmd = (char_u *)"+";
|
||||||
ex_pressedreturn = TRUE;
|
ex_pressedreturn = TRUE;
|
||||||
@ -1671,7 +1688,10 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
|
|
||||||
/* ignore comment and empty lines */
|
/* ignore comment and empty lines */
|
||||||
if (*ea.cmd == '"' || *ea.cmd == NUL)
|
if (*ea.cmd == '"' || *ea.cmd == NUL)
|
||||||
|
{
|
||||||
|
ex_pressedreturn = TRUE;
|
||||||
goto doend;
|
goto doend;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2. handle command modifiers.
|
* 2. handle command modifiers.
|
||||||
@ -1936,7 +1956,7 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
*/
|
*/
|
||||||
if (ea.skip) /* skip this if inside :if */
|
if (ea.skip) /* skip this if inside :if */
|
||||||
goto doend;
|
goto doend;
|
||||||
if (*ea.cmd == '|')
|
if (*ea.cmd == '|' || (exmode_active && ea.line1 != ea.line2))
|
||||||
{
|
{
|
||||||
ea.cmdidx = CMD_print;
|
ea.cmdidx = CMD_print;
|
||||||
ea.argt = RANGE+COUNT+TRLBAR;
|
ea.argt = RANGE+COUNT+TRLBAR;
|
||||||
@ -1948,14 +1968,12 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
}
|
}
|
||||||
else if (ea.addr_count != 0)
|
else if (ea.addr_count != 0)
|
||||||
{
|
{
|
||||||
if (ea.line2 < 0)
|
if (ea.line2 < 0 || ea.line2 > curbuf->b_ml.ml_line_count)
|
||||||
errormsg = invalid_range(&ea);
|
errormsg = (char_u *)_(e_invrange);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ea.line2 == 0)
|
if (ea.line2 == 0)
|
||||||
curwin->w_cursor.lnum = 1;
|
curwin->w_cursor.lnum = 1;
|
||||||
else if (ea.line2 > curbuf->b_ml.ml_line_count)
|
|
||||||
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
|
|
||||||
else
|
else
|
||||||
curwin->w_cursor.lnum = ea.line2;
|
curwin->w_cursor.lnum = ea.line2;
|
||||||
beginline(BL_SOL | BL_FIX);
|
beginline(BL_SOL | BL_FIX);
|
||||||
@ -2090,7 +2108,7 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
*/
|
*/
|
||||||
if (!global_busy && ea.line1 > ea.line2)
|
if (!global_busy && ea.line1 > ea.line2)
|
||||||
{
|
{
|
||||||
if (sourcing)
|
if (sourcing || exmode_active)
|
||||||
{
|
{
|
||||||
errormsg = (char_u *)_("E493: Backwards range given");
|
errormsg = (char_u *)_("E493: Backwards range given");
|
||||||
goto doend;
|
goto doend;
|
||||||
@ -2280,9 +2298,13 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for <newline> to end a shell command.
|
* Check for <newline> to end a shell command.
|
||||||
* Also do this for ":read !cmd" and ":write !cmd".
|
* Also do this for ":read !cmd", ":write !cmd" and ":global".
|
||||||
|
* Any others?
|
||||||
*/
|
*/
|
||||||
else if (ea.cmdidx == CMD_bang || ea.usefilter)
|
else if (ea.cmdidx == CMD_bang
|
||||||
|
|| ea.cmdidx == CMD_global
|
||||||
|
|| ea.cmdidx == CMD_vglobal
|
||||||
|
|| ea.usefilter)
|
||||||
{
|
{
|
||||||
for (p = ea.arg; *p; ++p)
|
for (p = ea.arg; *p; ++p)
|
||||||
{
|
{
|
||||||
@ -2367,6 +2389,12 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
ea.line2 = curbuf->b_ml.ml_line_count;
|
ea.line2 = curbuf->b_ml.ml_line_count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for flags: 'l', 'p' and '#'.
|
||||||
|
*/
|
||||||
|
if (ea.argt & EXFLAGS)
|
||||||
|
get_flags(&ea);
|
||||||
/* no arguments allowed */
|
/* no arguments allowed */
|
||||||
if (!ni && !(ea.argt & EXTRA) && *ea.arg != NUL
|
if (!ni && !(ea.argt & EXTRA) && *ea.arg != NUL
|
||||||
&& vim_strchr((char_u *)"|\"", *ea.arg) == NULL)
|
&& vim_strchr((char_u *)"|\"", *ea.arg) == NULL)
|
||||||
@ -2661,6 +2689,7 @@ find_command(eap, full)
|
|||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
|
int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Isolate the command and search for it in the command table.
|
* Isolate the command and search for it in the command table.
|
||||||
@ -2669,6 +2698,7 @@ find_command(eap, full)
|
|||||||
* - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r'
|
* - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r'
|
||||||
* but :sre[wind] is another command, as are :scrip[tnames],
|
* but :sre[wind] is another command, as are :scrip[tnames],
|
||||||
* :scs[cope], :sim[alt], :sig[ns] and :sil[ent].
|
* :scs[cope], :sim[alt], :sig[ns] and :sil[ent].
|
||||||
|
* - the "d" command can directly be followed by 'l' or 'p' flag.
|
||||||
*/
|
*/
|
||||||
p = eap->cmd;
|
p = eap->cmd;
|
||||||
if (*p == 'k')
|
if (*p == 'k')
|
||||||
@ -2694,6 +2724,22 @@ find_command(eap, full)
|
|||||||
if (p == eap->cmd && vim_strchr((char_u *)"@*!=><&~#", *p) != NULL)
|
if (p == eap->cmd && vim_strchr((char_u *)"@*!=><&~#", *p) != NULL)
|
||||||
++p;
|
++p;
|
||||||
len = (int)(p - eap->cmd);
|
len = (int)(p - eap->cmd);
|
||||||
|
if (*eap->cmd == 'd' && (p[-1] == 'l' || p[-1] == 'p'))
|
||||||
|
{
|
||||||
|
/* Check for ":dl", ":dell", etc. to ":deletel": that's
|
||||||
|
* :delete with the 'l' flag. Same for 'p'. */
|
||||||
|
for (i = 0; i < len; ++i)
|
||||||
|
if (eap->cmd[i] != "delete"[i])
|
||||||
|
break;
|
||||||
|
if (i == len - 1)
|
||||||
|
{
|
||||||
|
--len;
|
||||||
|
if (p[-1] == 'l')
|
||||||
|
eap->flags |= EXFLAG_LIST;
|
||||||
|
else
|
||||||
|
eap->flags |= EXFLAG_PRINT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ASCII_ISLOWER(*eap->cmd))
|
if (ASCII_ISLOWER(*eap->cmd))
|
||||||
eap->cmdidx = cmdidxs[CharOrdLow(*eap->cmd)];
|
eap->cmdidx = cmdidxs[CharOrdLow(*eap->cmd)];
|
||||||
@ -2928,8 +2974,6 @@ set_one_cmd_context(xp, buff)
|
|||||||
/*
|
/*
|
||||||
* 4. parse command
|
* 4. parse command
|
||||||
*/
|
*/
|
||||||
|
|
||||||
cmd = skipwhite(cmd);
|
|
||||||
xp->xp_pattern = cmd;
|
xp->xp_pattern = cmd;
|
||||||
if (*cmd == NUL)
|
if (*cmd == NUL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -3281,6 +3325,7 @@ set_one_cmd_context(xp, buff)
|
|||||||
case CMD_botright:
|
case CMD_botright:
|
||||||
case CMD_browse:
|
case CMD_browse:
|
||||||
case CMD_confirm:
|
case CMD_confirm:
|
||||||
|
case CMD_debug:
|
||||||
case CMD_folddoclosed:
|
case CMD_folddoclosed:
|
||||||
case CMD_folddoopen:
|
case CMD_folddoopen:
|
||||||
case CMD_hide:
|
case CMD_hide:
|
||||||
@ -3633,6 +3678,7 @@ set_one_cmd_context(xp, buff)
|
|||||||
* Backslashed delimiters after / or ? will be skipped, and commands will
|
* Backslashed delimiters after / or ? will be skipped, and commands will
|
||||||
* not be expanded between /'s and ?'s or after "'".
|
* not be expanded between /'s and ?'s or after "'".
|
||||||
*
|
*
|
||||||
|
* Also skip white space and ":" characters.
|
||||||
* Returns the "cmd" pointer advanced to beyond the range.
|
* Returns the "cmd" pointer advanced to beyond the range.
|
||||||
*/
|
*/
|
||||||
char_u *
|
char_u *
|
||||||
@ -3642,8 +3688,7 @@ skip_range(cmd, ctx)
|
|||||||
{
|
{
|
||||||
int delim;
|
int delim;
|
||||||
|
|
||||||
while (*cmd != NUL && (vim_isspace(*cmd) || VIM_ISDIGIT(*cmd) ||
|
while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL)
|
||||||
vim_strchr((char_u *)".$%'/?-+,;", *cmd) != NULL))
|
|
||||||
{
|
{
|
||||||
if (*cmd == '\'')
|
if (*cmd == '\'')
|
||||||
{
|
{
|
||||||
@ -3662,6 +3707,11 @@ skip_range(cmd, ctx)
|
|||||||
if (*cmd != NUL)
|
if (*cmd != NUL)
|
||||||
++cmd;
|
++cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip ":" and white space. */
|
||||||
|
while (*cmd == ':')
|
||||||
|
cmd = skipwhite(cmd + 1);
|
||||||
|
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3855,6 +3905,25 @@ error:
|
|||||||
return lnum;
|
return lnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get flags from an Ex command argument.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
get_flags(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
while (vim_strchr((char_u *)"lp#", *eap->arg) != NULL)
|
||||||
|
{
|
||||||
|
if (*eap->arg == 'l')
|
||||||
|
eap->flags |= EXFLAG_LIST;
|
||||||
|
else if (*eap->arg == 'p')
|
||||||
|
eap->flags |= EXFLAG_PRINT;
|
||||||
|
else
|
||||||
|
eap->flags |= EXFLAG_NR;
|
||||||
|
eap->arg = skipwhite(eap->arg + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function called for command which is Not Implemented. NI!
|
* Function called for command which is Not Implemented. NI!
|
||||||
*/
|
*/
|
||||||
@ -4280,7 +4349,7 @@ separate_nextcmd(eap)
|
|||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
/* Skip over `=expr` when wildcards are expanded. */
|
/* Skip over `=expr` when wildcards are expanded. */
|
||||||
else if (p[0] == '`' && p[1] == '=')
|
else if (p[0] == '`' && p[1] == '=' && (eap->argt & XFILE))
|
||||||
{
|
{
|
||||||
p += 2;
|
p += 2;
|
||||||
(void)skip_expr(&p);
|
(void)skip_expr(&p);
|
||||||
@ -6116,31 +6185,27 @@ ex_exit(eap)
|
|||||||
ex_print(eap)
|
ex_print(eap)
|
||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
int save_list = 0; /* init for GCC */
|
if (curbuf->b_ml.ml_flags & ML_EMPTY)
|
||||||
|
EMSG(_(e_emptybuf));
|
||||||
if (eap->cmdidx == CMD_list)
|
else
|
||||||
{
|
{
|
||||||
save_list = curwin->w_p_list;
|
for ( ;!got_int; ui_breakcheck())
|
||||||
curwin->w_p_list = 1;
|
{
|
||||||
|
print_line(eap->line1,
|
||||||
|
(eap->cmdidx == CMD_number || eap->cmdidx == CMD_pound
|
||||||
|
|| (eap->flags & EXFLAG_NR)),
|
||||||
|
eap->cmdidx == CMD_list || (eap->flags & EXFLAG_LIST));
|
||||||
|
if (++eap->line1 > eap->line2)
|
||||||
|
break;
|
||||||
|
out_flush(); /* show one line at a time */
|
||||||
|
}
|
||||||
|
setpcmark();
|
||||||
|
/* put cursor at last line */
|
||||||
|
curwin->w_cursor.lnum = eap->line2;
|
||||||
|
beginline(BL_SOL | BL_FIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( ;!got_int; ui_breakcheck())
|
|
||||||
{
|
|
||||||
print_line(eap->line1,
|
|
||||||
(eap->cmdidx == CMD_number || eap->cmdidx == CMD_pound));
|
|
||||||
if (++eap->line1 > eap->line2)
|
|
||||||
break;
|
|
||||||
out_flush(); /* show one line at a time */
|
|
||||||
}
|
|
||||||
setpcmark();
|
|
||||||
/* put cursor at last line */
|
|
||||||
curwin->w_cursor.lnum = eap->line2;
|
|
||||||
beginline(BL_SOL | BL_FIX);
|
|
||||||
|
|
||||||
ex_no_reprint = TRUE;
|
ex_no_reprint = TRUE;
|
||||||
|
|
||||||
if (eap->cmdidx == CMD_list)
|
|
||||||
curwin->w_p_list = save_list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_BYTEOFF
|
#ifdef FEAT_BYTEOFF
|
||||||
@ -6689,7 +6754,45 @@ ex_find(eap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ":edit", ":badd".
|
* ":open" simulation: for now just work like ":visual".
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ex_open(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
regmatch_T regmatch;
|
||||||
|
char_u *p;
|
||||||
|
|
||||||
|
curwin->w_cursor.lnum = eap->line2;
|
||||||
|
beginline(BL_SOL | BL_FIX);
|
||||||
|
if (*eap->arg == '/')
|
||||||
|
{
|
||||||
|
/* ":open /pattern/": put cursor in column found with pattern */
|
||||||
|
++eap->arg;
|
||||||
|
p = skip_regexp(eap->arg, '/', p_magic, NULL);
|
||||||
|
*p = NUL;
|
||||||
|
regmatch.regprog = vim_regcomp(eap->arg, p_magic ? RE_MAGIC : 0);
|
||||||
|
if (regmatch.regprog != NULL)
|
||||||
|
{
|
||||||
|
regmatch.rm_ic = p_ic;
|
||||||
|
p = ml_get_curline();
|
||||||
|
if (vim_regexec(®match, p, (colnr_T)0))
|
||||||
|
curwin->w_cursor.col = regmatch.startp[0] - p;
|
||||||
|
else
|
||||||
|
EMSG(_(e_nomatch));
|
||||||
|
vim_free(regmatch.regprog);
|
||||||
|
}
|
||||||
|
/* Move to the NUL, ignore any other arguments. */
|
||||||
|
eap->arg += STRLEN(eap->arg);
|
||||||
|
}
|
||||||
|
check_cursor();
|
||||||
|
|
||||||
|
eap->cmdidx = CMD_visual;
|
||||||
|
do_exedit(eap, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ":edit", ":badd", ":visual".
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
ex_edit(eap)
|
ex_edit(eap)
|
||||||
@ -6711,6 +6814,7 @@ do_exedit(eap, old_curwin)
|
|||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
int need_hide;
|
int need_hide;
|
||||||
#endif
|
#endif
|
||||||
|
int exmode_was = exmode_active;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ":vi" command ends Ex mode.
|
* ":vi" command ends Ex mode.
|
||||||
@ -6720,7 +6824,45 @@ do_exedit(eap, old_curwin)
|
|||||||
{
|
{
|
||||||
exmode_active = FALSE;
|
exmode_active = FALSE;
|
||||||
if (*eap->arg == NUL)
|
if (*eap->arg == NUL)
|
||||||
|
{
|
||||||
|
/* Special case: ":global/pat/visual\NLvi-commands" */
|
||||||
|
if (global_busy)
|
||||||
|
{
|
||||||
|
int rd = RedrawingDisabled;
|
||||||
|
int nwr = no_wait_return;
|
||||||
|
int ms = msg_scroll;
|
||||||
|
#ifdef FEAT_GUI
|
||||||
|
int he = hold_gui_events;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (eap->nextcmd != NULL)
|
||||||
|
{
|
||||||
|
stuffReadbuff(eap->nextcmd);
|
||||||
|
eap->nextcmd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exmode_was != EXMODE_VIM)
|
||||||
|
settmode(TMODE_RAW);
|
||||||
|
RedrawingDisabled = 0;
|
||||||
|
no_wait_return = 0;
|
||||||
|
need_wait_return = FALSE;
|
||||||
|
msg_scroll = 0;
|
||||||
|
#ifdef FEAT_GUI
|
||||||
|
hold_gui_events = 0;
|
||||||
|
#endif
|
||||||
|
must_redraw = CLEAR;
|
||||||
|
|
||||||
|
main_loop(FALSE, TRUE);
|
||||||
|
|
||||||
|
RedrawingDisabled = rd;
|
||||||
|
no_wait_return = nwr;
|
||||||
|
msg_scroll = ms;
|
||||||
|
#ifdef FEAT_GUI
|
||||||
|
hold_gui_events = he;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((eap->cmdidx == CMD_new
|
if ((eap->cmdidx == CMD_new
|
||||||
@ -6961,7 +7103,9 @@ ex_syncbind(eap)
|
|||||||
ex_read(eap)
|
ex_read(eap)
|
||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
|
||||||
|
linenr_T lnum;
|
||||||
|
|
||||||
if (eap->usefilter) /* :r!cmd */
|
if (eap->usefilter) /* :r!cmd */
|
||||||
do_bang(1, eap, FALSE, FALSE, TRUE);
|
do_bang(1, eap, FALSE, FALSE, TRUE);
|
||||||
@ -7011,7 +7155,25 @@ ex_read(eap)
|
|||||||
EMSG2(_(e_notopen), eap->arg);
|
EMSG2(_(e_notopen), eap->arg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (empty && exmode_active)
|
||||||
|
{
|
||||||
|
/* Delete the empty line that remains. Historically ex does
|
||||||
|
* this but vi doesn't. */
|
||||||
|
if (eap->line2 == 0)
|
||||||
|
lnum = curbuf->b_ml.ml_line_count;
|
||||||
|
else
|
||||||
|
lnum = 1;
|
||||||
|
if (*ml_get(lnum) == NUL)
|
||||||
|
{
|
||||||
|
ml_delete(lnum, FALSE);
|
||||||
|
deleted_lines_mark(lnum, 1L);
|
||||||
|
if (curwin->w_cursor.lnum >= lnum)
|
||||||
|
--curwin->w_cursor.lnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
redraw_curbuf_later(VALID);
|
redraw_curbuf_later(VALID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7034,6 +7196,13 @@ ex_cd(eap)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
|
||||||
|
&& !eap->forceit)
|
||||||
|
{
|
||||||
|
EMSG(_("E747: Cannot change directory, buffer is modifed (add ! to override)"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* ":cd -": Change to previous directory */
|
/* ":cd -": Change to previous directory */
|
||||||
if (STRCMP(new_dir, "-") == 0)
|
if (STRCMP(new_dir, "-") == 0)
|
||||||
{
|
{
|
||||||
@ -7132,6 +7301,7 @@ ex_equal(eap)
|
|||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
smsg((char_u *)"%ld", (long)eap->line2);
|
smsg((char_u *)"%ld", (long)eap->line2);
|
||||||
|
ex_may_print(eap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -7361,6 +7531,7 @@ ex_operators(eap)
|
|||||||
#ifdef FEAT_VIRTUALEDIT
|
#ifdef FEAT_VIRTUALEDIT
|
||||||
virtual_op = MAYBE;
|
virtual_op = MAYBE;
|
||||||
#endif
|
#endif
|
||||||
|
ex_may_print(eap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -7377,7 +7548,8 @@ ex_put(eap)
|
|||||||
eap->forceit = TRUE;
|
eap->forceit = TRUE;
|
||||||
}
|
}
|
||||||
curwin->w_cursor.lnum = eap->line2;
|
curwin->w_cursor.lnum = eap->line2;
|
||||||
do_put(eap->regname, eap->forceit ? BACKWARD : FORWARD, 1L, PUT_LINE);
|
do_put(eap->regname, eap->forceit ? BACKWARD : FORWARD, 1L,
|
||||||
|
PUT_LINE|PUT_CURSLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -7395,6 +7567,7 @@ ex_copymove(eap)
|
|||||||
eap->nextcmd = NULL;
|
eap->nextcmd = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
get_flags(eap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* move or copy lines from 'eap->line1'-'eap->line2' to below line 'n'
|
* move or copy lines from 'eap->line1'-'eap->line2' to below line 'n'
|
||||||
@ -7414,6 +7587,22 @@ ex_copymove(eap)
|
|||||||
ex_copy(eap->line1, eap->line2, n);
|
ex_copy(eap->line1, eap->line2, n);
|
||||||
u_clearline();
|
u_clearline();
|
||||||
beginline(BL_SOL | BL_FIX);
|
beginline(BL_SOL | BL_FIX);
|
||||||
|
ex_may_print(eap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print the current line if flags were given to the Ex command.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ex_may_print(eap)
|
||||||
|
exarg_T *eap;
|
||||||
|
{
|
||||||
|
if (eap->flags != 0)
|
||||||
|
{
|
||||||
|
print_line(curwin->w_cursor.lnum, (eap->flags & EXFLAG_NR),
|
||||||
|
(eap->flags & EXFLAG_LIST));
|
||||||
|
ex_no_reprint = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -7451,6 +7640,7 @@ ex_join(eap)
|
|||||||
}
|
}
|
||||||
do_do_join(eap->line2 - eap->line1 + 1, !eap->forceit);
|
do_do_join(eap->line2 - eap->line1 + 1, !eap->forceit);
|
||||||
beginline(BL_WHITE | BL_FIX);
|
beginline(BL_WHITE | BL_FIX);
|
||||||
|
ex_may_print(eap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -7474,7 +7664,9 @@ ex_at(eap)
|
|||||||
c = '@';
|
c = '@';
|
||||||
/* put the register in mapbuf */
|
/* put the register in mapbuf */
|
||||||
if (do_execreg(c, TRUE, vim_strchr(p_cpo, CPO_EXECBUF) != NULL) == FAIL)
|
if (do_execreg(c, TRUE, vim_strchr(p_cpo, CPO_EXECBUF) != NULL) == FAIL)
|
||||||
|
{
|
||||||
beep_flush();
|
beep_flush();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int save_efr = exec_from_reg;
|
int save_efr = exec_from_reg;
|
||||||
@ -7602,18 +7794,36 @@ ex_redir(eap)
|
|||||||
/* make register empty */
|
/* make register empty */
|
||||||
write_reg_contents(redir_reg, (char_u *)"", -1, FALSE);
|
write_reg_contents(redir_reg, (char_u *)"", -1, FALSE);
|
||||||
}
|
}
|
||||||
if (*arg != NUL)
|
}
|
||||||
EMSG2(_(e_invarg2), eap->arg);
|
if (*arg != NUL)
|
||||||
|
{
|
||||||
|
EMSG2(_(e_invarg2), eap->arg);
|
||||||
|
redir_reg = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (*arg == '=' && arg[1] == '>')
|
||||||
|
{
|
||||||
|
int append;
|
||||||
|
|
||||||
|
/* redirect to a variable */
|
||||||
|
close_redir();
|
||||||
|
arg += 2;
|
||||||
|
|
||||||
|
if (*arg == '>')
|
||||||
|
{
|
||||||
|
++arg;
|
||||||
|
append = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
EMSG2(_(e_invarg2), eap->arg);
|
append = FALSE;
|
||||||
|
|
||||||
|
if (var_redir_start(skipwhite(arg), append) == OK)
|
||||||
|
redir_vname = 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TODO: redirect to a buffer */
|
/* TODO: redirect to a buffer */
|
||||||
|
|
||||||
/* TODO: redirect to an internal variable */
|
|
||||||
|
|
||||||
else
|
else
|
||||||
EMSG2(_(e_invarg2), eap->arg);
|
EMSG2(_(e_invarg2), eap->arg);
|
||||||
}
|
}
|
||||||
@ -7690,6 +7900,11 @@ close_redir()
|
|||||||
}
|
}
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
redir_reg = 0;
|
redir_reg = 0;
|
||||||
|
if (redir_vname)
|
||||||
|
{
|
||||||
|
var_redir_stop();
|
||||||
|
redir_vname = 0;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7774,8 +7989,7 @@ ex_mkrc(eap)
|
|||||||
#if defined(FEAT_SESSION) && defined(vim_mkdir)
|
#if defined(FEAT_SESSION) && defined(vim_mkdir)
|
||||||
/* When using 'viewdir' may have to create the directory. */
|
/* When using 'viewdir' may have to create the directory. */
|
||||||
if (using_vdir && !mch_isdir(p_vdir))
|
if (using_vdir && !mch_isdir(p_vdir))
|
||||||
if (vim_mkdir(p_vdir, 0755) != 0)
|
vim_mkdir_emsg(p_vdir, 0755);
|
||||||
EMSG2(_("E739: Cannot create directory: %s"), p_vdir);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fd = open_exfile(fname, eap->forceit, WRITEBIN);
|
fd = open_exfile(fname, eap->forceit, WRITEBIN);
|
||||||
@ -7893,6 +8107,22 @@ theend:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ((defined(FEAT_SESSION) || defined(FEAT_EVAL)) && defined(vim_mkdir)) \
|
||||||
|
|| defined(PROTO)
|
||||||
|
int
|
||||||
|
vim_mkdir_emsg(name, prot)
|
||||||
|
char_u *name;
|
||||||
|
int prot;
|
||||||
|
{
|
||||||
|
if (vim_mkdir(name, prot) != 0)
|
||||||
|
{
|
||||||
|
EMSG2(_("E739: Cannot create directory: %s"), name);
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open a file for writing for an Ex command, with some checks.
|
* Open a file for writing for an Ex command, with some checks.
|
||||||
* Return file descriptor, or NULL on failure.
|
* Return file descriptor, or NULL on failure.
|
||||||
|
18
src/fileio.c
18
src/fileio.c
@ -140,10 +140,6 @@ static int get_mac_fio_flags __ARGS((char_u *ptr));
|
|||||||
#endif
|
#endif
|
||||||
static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
|
static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
|
||||||
|
|
||||||
static linenr_T write_no_eol_lnum = 0; /* non-zero lnum when last line of
|
|
||||||
next binary write should not have
|
|
||||||
an end-of-line */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
filemess(buf, name, s, attr)
|
filemess(buf, name, s, attr)
|
||||||
buf_T *buf;
|
buf_T *buf;
|
||||||
@ -288,9 +284,7 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
|
|||||||
int conv_restlen = 0; /* nr of bytes in conv_rest[] */
|
int conv_restlen = 0; /* nr of bytes in conv_rest[] */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_AUTOCMD
|
|
||||||
write_no_eol_lnum = 0; /* in case it was set by the previous read */
|
write_no_eol_lnum = 0; /* in case it was set by the previous read */
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there is no file name yet, use the one for the read file.
|
* If there is no file name yet, use the one for the read file.
|
||||||
@ -308,6 +302,10 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
|
|||||||
curbuf->b_flags |= BF_NOTEDITED;
|
curbuf->b_flags |= BF_NOTEDITED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* After reading a file the cursor line changes but we don't want to
|
||||||
|
* display the line. */
|
||||||
|
ex_no_reprint = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For Unix: Use the short file name whenever possible.
|
* For Unix: Use the short file name whenever possible.
|
||||||
* Avoids problems with networks and when directory names are changed.
|
* Avoids problems with networks and when directory names are changed.
|
||||||
@ -2230,7 +2228,6 @@ failed:
|
|||||||
check_marks_read();
|
check_marks_read();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_AUTOCMD
|
|
||||||
/*
|
/*
|
||||||
* Trick: We remember if the last line of the read didn't have
|
* Trick: We remember if the last line of the read didn't have
|
||||||
* an eol for when writing it again. This is required for
|
* an eol for when writing it again. This is required for
|
||||||
@ -2238,6 +2235,7 @@ failed:
|
|||||||
*/
|
*/
|
||||||
write_no_eol_lnum = read_no_eol_lnum;
|
write_no_eol_lnum = read_no_eol_lnum;
|
||||||
|
|
||||||
|
#ifdef FEAT_AUTOCMD
|
||||||
if (!read_stdin && !read_buffer)
|
if (!read_stdin && !read_buffer)
|
||||||
{
|
{
|
||||||
int m = msg_scroll;
|
int m = msg_scroll;
|
||||||
@ -2628,6 +2626,10 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* After writing a file changedtick changes but we don't want to display
|
||||||
|
* the line. */
|
||||||
|
ex_no_reprint = TRUE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there is no file name yet, use the one for the written file.
|
* If there is no file name yet, use the one for the written file.
|
||||||
* BF_NOTEDITED is set to reflect this (in case the write fails).
|
* BF_NOTEDITED is set to reflect this (in case the write fails).
|
||||||
@ -6267,7 +6269,7 @@ buf_store_time(buf, st, fname)
|
|||||||
write_lnum_adjust(offset)
|
write_lnum_adjust(offset)
|
||||||
linenr_T offset;
|
linenr_T offset;
|
||||||
{
|
{
|
||||||
if (write_no_eol_lnum) /* only if there is a missing eol */
|
if (write_no_eol_lnum != 0) /* only if there is a missing eol */
|
||||||
write_no_eol_lnum += offset;
|
write_no_eol_lnum += offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +155,7 @@ EXTERN int did_endif INIT(= FALSE); /* just had ":endif" */
|
|||||||
EXTERN int did_emsg; /* set by emsg() when the message
|
EXTERN int did_emsg; /* set by emsg() when the message
|
||||||
is displayed or thrown */
|
is displayed or thrown */
|
||||||
EXTERN int called_emsg; /* always set by emsg() */
|
EXTERN int called_emsg; /* always set by emsg() */
|
||||||
|
EXTERN int ex_exitval INIT(= 0); /* exit value for ex mode */
|
||||||
EXTERN int emsg_on_display INIT(= FALSE); /* there is an error message */
|
EXTERN int emsg_on_display INIT(= FALSE); /* there is an error message */
|
||||||
EXTERN int rc_did_emsg INIT(= FALSE); /* vim_regcomp() called emsg() */
|
EXTERN int rc_did_emsg INIT(= FALSE); /* vim_regcomp() called emsg() */
|
||||||
|
|
||||||
@ -181,6 +182,7 @@ EXTERN int x_force_connect INIT(= FALSE); /* Do connect to X server.
|
|||||||
"exclude" in 'clipboard'. */
|
"exclude" in 'clipboard'. */
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
EXTERN int ex_keep_indent INIT(= FALSE); /* getexmodeline(): keep indent */
|
||||||
EXTERN int vgetc_busy INIT(= FALSE); /* inside vgetc() now */
|
EXTERN int vgetc_busy INIT(= FALSE); /* inside vgetc() now */
|
||||||
|
|
||||||
EXTERN int didset_vim INIT(= FALSE); /* did set $VIM ourselves */
|
EXTERN int didset_vim INIT(= FALSE); /* did set $VIM ourselves */
|
||||||
@ -927,6 +929,10 @@ EXTERN int autocmd_bufnr INIT(= 0); /* fnum for <abuf> on cmdline */
|
|||||||
EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
|
EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
EXTERN linenr_T write_no_eol_lnum INIT(= 0); /* non-zero lnum when last line
|
||||||
|
of next binary write should
|
||||||
|
not have an end-of-line */
|
||||||
|
|
||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
|
EXTERN int postponed_split INIT(= 0); /* for CTRL-W CTRL-] command */
|
||||||
EXTERN int postponed_split_flags INIT(= 0); /* args for win_split() */
|
EXTERN int postponed_split_flags INIT(= 0); /* args for win_split() */
|
||||||
@ -957,6 +963,7 @@ EXTERN int redir_off INIT(= FALSE); /* no redirection for a moment */
|
|||||||
EXTERN FILE *redir_fd INIT(= NULL); /* message redirection file */
|
EXTERN FILE *redir_fd INIT(= NULL); /* message redirection file */
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
EXTERN int redir_reg INIT(= 0); /* message redirection register */
|
EXTERN int redir_reg INIT(= 0); /* message redirection register */
|
||||||
|
EXTERN int redir_vname INIT(= 0); /* message redirection variable */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_LANGMAP
|
#ifdef FEAT_LANGMAP
|
||||||
@ -1399,14 +1406,12 @@ EXTERN char_u e_invexprmsg[] INIT(=N_("E449: Invalid expression received"));
|
|||||||
EXTERN char_u e_guarded[] INIT(=N_("E463: Region is guarded, cannot modify"));
|
EXTERN char_u e_guarded[] INIT(=N_("E463: Region is guarded, cannot modify"));
|
||||||
EXTERN char_u e_nbreadonly[] INIT(=N_("E744: NetBeans does not allow changes in read-only files"));
|
EXTERN char_u e_nbreadonly[] INIT(=N_("E744: NetBeans does not allow changes in read-only files"));
|
||||||
#endif
|
#endif
|
||||||
#if defined(FEAT_EVAL) || defined(FEAT_SYN_HL)
|
|
||||||
EXTERN char_u e_intern2[] INIT(=N_("E685: Internal error: %s"));
|
EXTERN char_u e_intern2[] INIT(=N_("E685: Internal error: %s"));
|
||||||
#endif
|
|
||||||
#if defined(HAVE_SETJMP_H) || defined(HAVE_TRY_EXCEPT)
|
#if defined(HAVE_SETJMP_H) || defined(HAVE_TRY_EXCEPT)
|
||||||
EXTERN char_u e_complex[] INIT(=N_("E361: Crash intercepted; regexp too complex?"));
|
EXTERN char_u e_complex[] INIT(=N_("E361: Crash intercepted; regexp too complex?"));
|
||||||
#endif
|
#endif
|
||||||
EXTERN char_u e_outofstack[] INIT(=N_("E363: pattern caused out-of-stack error"));
|
EXTERN char_u e_outofstack[] INIT(=N_("E363: pattern caused out-of-stack error"));
|
||||||
|
EXTERN char_u e_emptybuf[] INIT(=N_("E749: empty buffer"));
|
||||||
|
|
||||||
#ifdef MACOS_X_UNIX
|
#ifdef MACOS_X_UNIX
|
||||||
EXTERN short disallow_gui INIT(= FALSE);
|
EXTERN short disallow_gui INIT(= FALSE);
|
||||||
|
@ -2871,12 +2871,16 @@ enc_locale()
|
|||||||
# ifdef HAVE_NL_LANGINFO_CODESET
|
# ifdef HAVE_NL_LANGINFO_CODESET
|
||||||
if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL)
|
if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL)
|
||||||
# endif
|
# endif
|
||||||
# if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
|
# ifdef MACOS
|
||||||
|
s = "utf-8";
|
||||||
|
# else
|
||||||
|
# if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
|
||||||
if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL)
|
if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL)
|
||||||
# endif
|
# endif
|
||||||
if ((s = getenv("LC_ALL")) == NULL || *s == NUL)
|
if ((s = getenv("LC_ALL")) == NULL || *s == NUL)
|
||||||
if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL)
|
if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL)
|
||||||
s = getenv("LANG");
|
s = getenv("LANG");
|
||||||
|
# endif
|
||||||
|
|
||||||
if (s == NULL || *s == NUL)
|
if (s == NULL || *s == NUL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -5578,6 +5582,7 @@ convert_setup(vcp, from, to)
|
|||||||
# endif
|
# endif
|
||||||
if (vcp->vc_type == CONV_NONE)
|
if (vcp->vc_type == CONV_NONE)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -518,6 +518,7 @@ emsg(s)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
called_emsg = TRUE;
|
called_emsg = TRUE;
|
||||||
|
ex_exitval = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If "emsg_severe" is TRUE: When an error exception is to be thrown,
|
* If "emsg_severe" is TRUE: When an error exception is to be thrown,
|
||||||
@ -533,7 +534,7 @@ emsg(s)
|
|||||||
* If 'debug' is set: do error message anyway, but without side effects.
|
* If 'debug' is set: do error message anyway, but without side effects.
|
||||||
* If "emsg_skip" is set: never do error messages.
|
* If "emsg_skip" is set: never do error messages.
|
||||||
*/
|
*/
|
||||||
if ((emsg_off > 0 && *p_debug == NUL)
|
if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL)
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
|| emsg_skip > 0
|
|| emsg_skip > 0
|
||||||
#endif
|
#endif
|
||||||
@ -638,7 +639,7 @@ emsg2(s, a1)
|
|||||||
emsg3(s, a1, a2)
|
emsg3(s, a1, a2)
|
||||||
char_u *s, *a1, *a2;
|
char_u *s, *a1, *a2;
|
||||||
{
|
{
|
||||||
if ((emsg_off > 0 && *p_debug == NUL)
|
if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL)
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
|| emsg_skip > 0
|
|| emsg_skip > 0
|
||||||
#endif
|
#endif
|
||||||
@ -667,7 +668,7 @@ emsgn(s, n)
|
|||||||
char_u *s;
|
char_u *s;
|
||||||
long n;
|
long n;
|
||||||
{
|
{
|
||||||
if ((emsg_off > 0 && *p_debug == NUL)
|
if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL)
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
|| emsg_skip > 0
|
|| emsg_skip > 0
|
||||||
#endif
|
#endif
|
||||||
@ -677,6 +678,13 @@ emsgn(s, n)
|
|||||||
return emsg(IObuff);
|
return emsg(IObuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
emsg_invreg(name)
|
||||||
|
int name;
|
||||||
|
{
|
||||||
|
EMSG2(_("E354: Invalid register name: '%s'"), transchar(name));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Like msg(), but truncate to a single line if p_shm contains 't', or when
|
* Like msg(), but truncate to a single line if p_shm contains 't', or when
|
||||||
* "force" is TRUE. This truncates in another way as for normal messages.
|
* "force" is TRUE. This truncates in another way as for normal messages.
|
||||||
@ -1481,8 +1489,9 @@ str2specialbuf(sp, buf, len)
|
|||||||
* print line for :print or :list command
|
* print line for :print or :list command
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
msg_prt_line(s)
|
msg_prt_line(s, list)
|
||||||
char_u *s;
|
char_u *s;
|
||||||
|
int list;
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int col = 0;
|
int col = 0;
|
||||||
@ -1497,8 +1506,11 @@ msg_prt_line(s)
|
|||||||
char_u buf[MB_MAXBYTES + 1];
|
char_u buf[MB_MAXBYTES + 1];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (curwin->w_p_list)
|
||||||
|
list = TRUE;
|
||||||
|
|
||||||
/* find start of trailing whitespace */
|
/* find start of trailing whitespace */
|
||||||
if (curwin->w_p_list && lcs_trail)
|
if (list && lcs_trail)
|
||||||
{
|
{
|
||||||
trail = s + STRLEN(s);
|
trail = s + STRLEN(s);
|
||||||
while (trail > s && vim_iswhite(trail[-1]))
|
while (trail > s && vim_iswhite(trail[-1]))
|
||||||
@ -1507,7 +1519,7 @@ msg_prt_line(s)
|
|||||||
|
|
||||||
/* output a space for an empty line, otherwise the line will be
|
/* output a space for an empty line, otherwise the line will be
|
||||||
* overwritten */
|
* overwritten */
|
||||||
if (*s == NUL && !(curwin->w_p_list && lcs_eol != NUL))
|
if (*s == NUL && !(list && lcs_eol != NUL))
|
||||||
msg_putchar(' ');
|
msg_putchar(' ');
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
@ -1535,11 +1547,11 @@ msg_prt_line(s)
|
|||||||
{
|
{
|
||||||
attr = 0;
|
attr = 0;
|
||||||
c = *s++;
|
c = *s++;
|
||||||
if (c == TAB && (!curwin->w_p_list || lcs_tab1))
|
if (c == TAB && (!list || lcs_tab1))
|
||||||
{
|
{
|
||||||
/* tab amount depends on current column */
|
/* tab amount depends on current column */
|
||||||
n_extra = curbuf->b_p_ts - col % curbuf->b_p_ts - 1;
|
n_extra = curbuf->b_p_ts - col % curbuf->b_p_ts - 1;
|
||||||
if (!curwin->w_p_list)
|
if (!list)
|
||||||
{
|
{
|
||||||
c = ' ';
|
c = ' ';
|
||||||
c_extra = ' ';
|
c_extra = ' ';
|
||||||
@ -1551,7 +1563,7 @@ msg_prt_line(s)
|
|||||||
attr = hl_attr(HLF_8);
|
attr = hl_attr(HLF_8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (c == NUL && curwin->w_p_list && lcs_eol != NUL)
|
else if (c == NUL && list && lcs_eol != NUL)
|
||||||
{
|
{
|
||||||
p_extra = (char_u *)"";
|
p_extra = (char_u *)"";
|
||||||
c_extra = NUL;
|
c_extra = NUL;
|
||||||
@ -2521,7 +2533,7 @@ redir_write(str, maxlen)
|
|||||||
|
|
||||||
if ((redir_fd != NULL
|
if ((redir_fd != NULL
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
|| redir_reg
|
|| redir_reg || redir_vname
|
||||||
#endif
|
#endif
|
||||||
) && !redir_off)
|
) && !redir_off)
|
||||||
{
|
{
|
||||||
@ -2533,6 +2545,8 @@ redir_write(str, maxlen)
|
|||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
if (redir_reg)
|
if (redir_reg)
|
||||||
write_reg_contents(redir_reg, (char_u *)" ", -1, TRUE);
|
write_reg_contents(redir_reg, (char_u *)" ", -1, TRUE);
|
||||||
|
else if (redir_vname)
|
||||||
|
var_redir_str((char_u *)" ", -1);
|
||||||
else if (redir_fd)
|
else if (redir_fd)
|
||||||
#endif
|
#endif
|
||||||
fputs(" ", redir_fd);
|
fputs(" ", redir_fd);
|
||||||
@ -2543,13 +2557,15 @@ redir_write(str, maxlen)
|
|||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
if (redir_reg)
|
if (redir_reg)
|
||||||
write_reg_contents(redir_reg, s, maxlen, TRUE);
|
write_reg_contents(redir_reg, s, maxlen, TRUE);
|
||||||
|
if (redir_vname)
|
||||||
|
var_redir_str(s, maxlen);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Adjust the current column */
|
/* Adjust the current column */
|
||||||
while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen))
|
while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen))
|
||||||
{
|
{
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
if (!redir_reg && redir_fd != NULL)
|
if (!redir_reg && !redir_vname && redir_fd != NULL)
|
||||||
#endif
|
#endif
|
||||||
putc(*s, redir_fd);
|
putc(*s, redir_fd);
|
||||||
if (*s == '\r' || *s == '\n')
|
if (*s == '\r' || *s == '\n')
|
||||||
|
@ -114,14 +114,12 @@ BalloonEval *balloonEval = NULL;
|
|||||||
|
|
||||||
#ifdef FEAT_GUI_MOTIF
|
#ifdef FEAT_GUI_MOTIF
|
||||||
static void netbeans_Xt_connect __ARGS((void *context));
|
static void netbeans_Xt_connect __ARGS((void *context));
|
||||||
#else
|
#endif
|
||||||
# ifdef FEAT_GUI_GTK
|
#ifdef FEAT_GUI_GTK
|
||||||
static void netbeans_gtk_connect __ARGS((void));
|
static void netbeans_gtk_connect __ARGS((void));
|
||||||
# else
|
#endif
|
||||||
# ifdef FEAT_GUI_W32
|
#ifdef FEAT_GUI_W32
|
||||||
static void netbeans_w32_connect __ARGS((void));
|
static void netbeans_w32_connect __ARGS((void));
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int dosetvisible = FALSE;
|
static int dosetvisible = FALSE;
|
||||||
@ -2559,6 +2557,10 @@ netbeans_startup_done(void)
|
|||||||
#else
|
#else
|
||||||
# ifdef FEAT_GUI_GTK
|
# ifdef FEAT_GUI_GTK
|
||||||
netbeans_gtk_connect();
|
netbeans_gtk_connect();
|
||||||
|
# else
|
||||||
|
# ifdef FEAT_GUI_W32
|
||||||
|
netbeans_w32_connect();
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -232,7 +232,11 @@ static const struct nv_cmd
|
|||||||
{Ctrl_N, nv_down, NV_STS, FALSE},
|
{Ctrl_N, nv_down, NV_STS, FALSE},
|
||||||
{Ctrl_O, nv_ctrlo, 0, 0},
|
{Ctrl_O, nv_ctrlo, 0, 0},
|
||||||
{Ctrl_P, nv_up, NV_STS, FALSE},
|
{Ctrl_P, nv_up, NV_STS, FALSE},
|
||||||
|
#ifdef FEAT_VISUAL
|
||||||
|
{Ctrl_Q, nv_visual, 0, FALSE},
|
||||||
|
#else
|
||||||
{Ctrl_Q, nv_ignore, 0, 0},
|
{Ctrl_Q, nv_ignore, 0, 0},
|
||||||
|
#endif
|
||||||
{Ctrl_R, nv_redo, 0, 0},
|
{Ctrl_R, nv_redo, 0, 0},
|
||||||
{Ctrl_S, nv_ignore, 0, 0},
|
{Ctrl_S, nv_ignore, 0, 0},
|
||||||
{Ctrl_T, nv_tagpop, NV_NCW, 0},
|
{Ctrl_T, nv_tagpop, NV_NCW, 0},
|
||||||
@ -6852,11 +6856,15 @@ nv_regname(cap)
|
|||||||
* Handle "v", "V" and "CTRL-V" commands.
|
* Handle "v", "V" and "CTRL-V" commands.
|
||||||
* Also for "gh", "gH" and "g^H" commands: Always start Select mode, cap->arg
|
* Also for "gh", "gH" and "g^H" commands: Always start Select mode, cap->arg
|
||||||
* is TRUE.
|
* is TRUE.
|
||||||
|
* Handle CTRL-Q just like CTRL-V.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
nv_visual(cap)
|
nv_visual(cap)
|
||||||
cmdarg_T *cap;
|
cmdarg_T *cap;
|
||||||
{
|
{
|
||||||
|
if (cap->cmdchar == Ctrl_Q)
|
||||||
|
cap->cmdchar = Ctrl_V;
|
||||||
|
|
||||||
/* 'v', 'V' and CTRL-V can be used while an operator is pending to make it
|
/* 'v', 'V' and CTRL-V can be used while an operator is pending to make it
|
||||||
* characterwise, linewise, or blockwise. */
|
* characterwise, linewise, or blockwise. */
|
||||||
if (cap->oap->op_type != OP_NOP)
|
if (cap->oap->op_type != OP_NOP)
|
||||||
|
335
src/os_unix.c
335
src/os_unix.c
@ -165,6 +165,7 @@ static int sig_alarm_called;
|
|||||||
#endif
|
#endif
|
||||||
static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG);
|
static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG);
|
||||||
|
|
||||||
|
static void catch_int_signal __ARGS((void));
|
||||||
static void set_signals __ARGS((void));
|
static void set_signals __ARGS((void));
|
||||||
static void catch_signals __ARGS((RETSIGTYPE (*func_deadly)(), RETSIGTYPE (*func_other)()));
|
static void catch_signals __ARGS((RETSIGTYPE (*func_deadly)(), RETSIGTYPE (*func_other)()));
|
||||||
#ifndef __EMX__
|
#ifndef __EMX__
|
||||||
@ -175,6 +176,14 @@ static int have_dollars __ARGS((int, char_u **));
|
|||||||
#ifndef NO_EXPANDPATH
|
#ifndef NO_EXPANDPATH
|
||||||
static int pstrcmp __ARGS((const void *, const void *));
|
static int pstrcmp __ARGS((const void *, const void *));
|
||||||
static int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags));
|
static int unix_expandpath __ARGS((garray_T *gap, char_u *path, int wildoff, int flags));
|
||||||
|
# if defined(MACOS_X) && defined(FEAT_MBYTE)
|
||||||
|
extern char_u *mac_precompose_path __ARGS((char_u *decompPath, size_t decompLen, size_t *precompLen));
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(MACOS_X) && defined(FEAT_MBYTE)
|
||||||
|
extern void mac_conv_init __ARGS((void));
|
||||||
|
extern void mac_conv_cleanup __ARGS((void));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __EMX__
|
#ifndef __EMX__
|
||||||
@ -1083,6 +1092,10 @@ mch_init()
|
|||||||
|
|
||||||
out_flush();
|
out_flush();
|
||||||
set_signals();
|
set_signals();
|
||||||
|
|
||||||
|
#if defined(MACOS_X) && defined(FEAT_MBYTE)
|
||||||
|
mac_conv_init();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1113,11 +1126,8 @@ set_signals()
|
|||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* We want to catch CTRL-C (only works while in Cooked mode).
|
|
||||||
*/
|
|
||||||
#ifdef SIGINT
|
#ifdef SIGINT
|
||||||
signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
|
catch_int_signal();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1149,6 +1159,17 @@ set_signals()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(SIGINT) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Catch CTRL-C (only works while in Cooked mode).
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
catch_int_signal()
|
||||||
|
{
|
||||||
|
signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
reset_signals()
|
reset_signals()
|
||||||
{
|
{
|
||||||
@ -2694,6 +2715,8 @@ static void exit_scroll __ARGS((void));
|
|||||||
static void
|
static void
|
||||||
exit_scroll()
|
exit_scroll()
|
||||||
{
|
{
|
||||||
|
if (silent_mode)
|
||||||
|
return;
|
||||||
if (newline_on_exit || msg_didout)
|
if (newline_on_exit || msg_didout)
|
||||||
{
|
{
|
||||||
if (msg_use_printf())
|
if (msg_use_printf())
|
||||||
@ -2764,6 +2787,11 @@ mch_exit(r)
|
|||||||
if (gui.in_use)
|
if (gui.in_use)
|
||||||
gui_exit(r);
|
gui_exit(r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MACOS_X) && defined(FEAT_MBYTE)
|
||||||
|
mac_conv_cleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __QNX__
|
#ifdef __QNX__
|
||||||
/* A core dump won't be created if the signal handler
|
/* A core dump won't be created if the signal handler
|
||||||
* doesn't return, so we can't call exit() */
|
* doesn't return, so we can't call exit() */
|
||||||
@ -3282,6 +3310,27 @@ mch_new_shellsize()
|
|||||||
/* Nothing to do. */
|
/* Nothing to do. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef USE_SYSTEM
|
||||||
|
static void append_ga_line __ARGS((garray_T *gap));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Append the text in "gap" below the cursor line and clear "gap".
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
append_ga_line(gap)
|
||||||
|
garray_T *gap;
|
||||||
|
{
|
||||||
|
/* Remove trailing CR. */
|
||||||
|
if (gap->ga_len > 0
|
||||||
|
&& !curbuf->b_p_bin
|
||||||
|
&& ((char_u *)gap->ga_data)[gap->ga_len - 1] == CAR)
|
||||||
|
--gap->ga_len;
|
||||||
|
ga_append(gap, NUL);
|
||||||
|
ml_append(curwin->w_cursor.lnum++, gap->ga_data, 0, FALSE);
|
||||||
|
gap->ga_len = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
mch_call_shell(cmd, options)
|
mch_call_shell(cmd, options)
|
||||||
char_u *cmd;
|
char_u *cmd;
|
||||||
@ -3398,11 +3447,12 @@ mch_call_shell(cmd, options)
|
|||||||
|
|
||||||
#else /* USE_SYSTEM */ /* don't use system(), use fork()/exec() */
|
#else /* USE_SYSTEM */ /* don't use system(), use fork()/exec() */
|
||||||
|
|
||||||
#define EXEC_FAILED 122 /* Exit code when shell didn't execute. Don't use
|
# define EXEC_FAILED 122 /* Exit code when shell didn't execute. Don't use
|
||||||
127, some shell use that already */
|
127, some shells use that already */
|
||||||
|
|
||||||
char_u *newcmd = NULL;
|
char_u *newcmd = NULL;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
pid_t wpid = 0;
|
||||||
pid_t wait_pid = 0;
|
pid_t wait_pid = 0;
|
||||||
# ifdef HAVE_UNION_WAIT
|
# ifdef HAVE_UNION_WAIT
|
||||||
union wait status;
|
union wait status;
|
||||||
@ -3415,19 +3465,19 @@ mch_call_shell(cmd, options)
|
|||||||
int i;
|
int i;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
int inquote;
|
int inquote;
|
||||||
# ifdef FEAT_GUI
|
|
||||||
int pty_master_fd = -1; /* for pty's */
|
int pty_master_fd = -1; /* for pty's */
|
||||||
|
# ifdef FEAT_GUI
|
||||||
int pty_slave_fd = -1;
|
int pty_slave_fd = -1;
|
||||||
char *tty_name;
|
char *tty_name;
|
||||||
|
# endif
|
||||||
int fd_toshell[2]; /* for pipes */
|
int fd_toshell[2]; /* for pipes */
|
||||||
int fd_fromshell[2];
|
int fd_fromshell[2];
|
||||||
int pipe_error = FALSE;
|
int pipe_error = FALSE;
|
||||||
# ifdef HAVE_SETENV
|
# ifdef HAVE_SETENV
|
||||||
char envbuf[50];
|
char envbuf[50];
|
||||||
# else
|
# else
|
||||||
static char envbuf_Rows[20];
|
static char envbuf_Rows[20];
|
||||||
static char envbuf_Columns[20];
|
static char envbuf_Columns[20];
|
||||||
# endif
|
|
||||||
# endif
|
# endif
|
||||||
int did_settmode = FALSE; /* TRUE when settmode(TMODE_RAW) called */
|
int did_settmode = FALSE; /* TRUE when settmode(TMODE_RAW) called */
|
||||||
|
|
||||||
@ -3480,19 +3530,24 @@ mch_call_shell(cmd, options)
|
|||||||
}
|
}
|
||||||
argv[argc] = NULL;
|
argv[argc] = NULL;
|
||||||
|
|
||||||
# ifdef FEAT_GUI
|
|
||||||
/*
|
/*
|
||||||
* For the GUI: Try using a pseudo-tty to get the stdin/stdout of the
|
* For the GUI, when writing the output into the buffer and when reading
|
||||||
* executed command into the Vim window. Or use a pipe.
|
* input from the buffer: Try using a pseudo-tty to get the stdin/stdout
|
||||||
|
* of the executed command into the Vim window. Or use a pipe.
|
||||||
*/
|
*/
|
||||||
if (gui.in_use && show_shell_mess)
|
if ((options & (SHELL_READ|SHELL_WRITE))
|
||||||
|
# ifdef FEAT_GUI
|
||||||
|
|| (gui.in_use && show_shell_mess)
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
# ifdef FEAT_GUI
|
||||||
/*
|
/*
|
||||||
* Try to open a master pty.
|
* Try to open a master pty.
|
||||||
* If this works, open the slave pty.
|
* If this works, open the slave pty.
|
||||||
* If the slave can't be opened, close the master pty.
|
* If the slave can't be opened, close the master pty.
|
||||||
*/
|
*/
|
||||||
if (p_guipty)
|
if (p_guipty && !(options & (SHELL_READ|SHELL_WRITE)))
|
||||||
{
|
{
|
||||||
pty_master_fd = OpenPTY(&tty_name); /* open pty */
|
pty_master_fd = OpenPTY(&tty_name); /* open pty */
|
||||||
if (pty_master_fd >= 0 && ((pty_slave_fd =
|
if (pty_master_fd >= 0 && ((pty_slave_fd =
|
||||||
@ -3506,6 +3561,7 @@ mch_call_shell(cmd, options)
|
|||||||
* If not opening a pty or it didn't work, try using pipes.
|
* If not opening a pty or it didn't work, try using pipes.
|
||||||
*/
|
*/
|
||||||
if (pty_master_fd < 0)
|
if (pty_master_fd < 0)
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
pipe_error = (pipe(fd_toshell) < 0);
|
pipe_error = (pipe(fd_toshell) < 0);
|
||||||
if (!pipe_error) /* pipe create OK */
|
if (!pipe_error) /* pipe create OK */
|
||||||
@ -3526,8 +3582,6 @@ mch_call_shell(cmd, options)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!pipe_error) /* pty or pipe opened or not used */
|
if (!pipe_error) /* pty or pipe opened or not used */
|
||||||
# endif
|
|
||||||
|
|
||||||
{
|
{
|
||||||
# ifdef __BEOS__
|
# ifdef __BEOS__
|
||||||
beos_cleanup_read_thread();
|
beos_cleanup_read_thread();
|
||||||
@ -3535,15 +3589,20 @@ mch_call_shell(cmd, options)
|
|||||||
if ((pid = fork()) == -1) /* maybe we should use vfork() */
|
if ((pid = fork()) == -1) /* maybe we should use vfork() */
|
||||||
{
|
{
|
||||||
MSG_PUTS(_("\nCannot fork\n"));
|
MSG_PUTS(_("\nCannot fork\n"));
|
||||||
|
if ((options & (SHELL_READ|SHELL_WRITE))
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
if (gui.in_use && show_shell_mess)
|
|| (gui.in_use && show_shell_mess)
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
# ifdef FEAT_GUI
|
||||||
if (pty_master_fd >= 0) /* close the pseudo tty */
|
if (pty_master_fd >= 0) /* close the pseudo tty */
|
||||||
{
|
{
|
||||||
close(pty_master_fd);
|
close(pty_master_fd);
|
||||||
close(pty_slave_fd);
|
close(pty_slave_fd);
|
||||||
}
|
}
|
||||||
else /* close the pipes */
|
else /* close the pipes */
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
close(fd_toshell[0]);
|
close(fd_toshell[0]);
|
||||||
close(fd_toshell[1]);
|
close(fd_toshell[1]);
|
||||||
@ -3551,7 +3610,6 @@ mch_call_shell(cmd, options)
|
|||||||
close(fd_fromshell[1]);
|
close(fd_fromshell[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
else if (pid == 0) /* child */
|
else if (pid == 0) /* child */
|
||||||
{
|
{
|
||||||
@ -3593,13 +3651,17 @@ mch_call_shell(cmd, options)
|
|||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ((options & (SHELL_READ|SHELL_WRITE))
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
else if (gui.in_use)
|
|| gui.in_use
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
# ifdef HAVE_SETSID
|
# ifdef HAVE_SETSID
|
||||||
(void)setsid();
|
(void)setsid();
|
||||||
# endif
|
# endif
|
||||||
|
# ifdef FEAT_GUI
|
||||||
/* push stream discipline modules */
|
/* push stream discipline modules */
|
||||||
if (options & SHELL_COOKED)
|
if (options & SHELL_COOKED)
|
||||||
SetupSlavePTY(pty_slave_fd);
|
SetupSlavePTY(pty_slave_fd);
|
||||||
@ -3608,8 +3670,9 @@ mch_call_shell(cmd, options)
|
|||||||
* unless run by root) */
|
* unless run by root) */
|
||||||
ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
|
ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
|
||||||
# endif
|
# endif
|
||||||
|
# endif
|
||||||
/* Simulate to have a dumb terminal (for now) */
|
/* Simulate to have a dumb terminal (for now) */
|
||||||
# ifdef HAVE_SETENV
|
# ifdef HAVE_SETENV
|
||||||
setenv("TERM", "dumb", 1);
|
setenv("TERM", "dumb", 1);
|
||||||
sprintf((char *)envbuf, "%ld", Rows);
|
sprintf((char *)envbuf, "%ld", Rows);
|
||||||
setenv("ROWS", (char *)envbuf, 1);
|
setenv("ROWS", (char *)envbuf, 1);
|
||||||
@ -3617,7 +3680,7 @@ mch_call_shell(cmd, options)
|
|||||||
setenv("LINES", (char *)envbuf, 1);
|
setenv("LINES", (char *)envbuf, 1);
|
||||||
sprintf((char *)envbuf, "%ld", Columns);
|
sprintf((char *)envbuf, "%ld", Columns);
|
||||||
setenv("COLUMNS", (char *)envbuf, 1);
|
setenv("COLUMNS", (char *)envbuf, 1);
|
||||||
# else
|
# else
|
||||||
/*
|
/*
|
||||||
* Putenv does not copy the string, it has to remain valid.
|
* Putenv does not copy the string, it has to remain valid.
|
||||||
* Use a static array to avoid loosing allocated memory.
|
* Use a static array to avoid loosing allocated memory.
|
||||||
@ -3629,8 +3692,9 @@ mch_call_shell(cmd, options)
|
|||||||
putenv(envbuf_Rows);
|
putenv(envbuf_Rows);
|
||||||
sprintf(envbuf_Columns, "COLUMNS=%ld", Columns);
|
sprintf(envbuf_Columns, "COLUMNS=%ld", Columns);
|
||||||
putenv(envbuf_Columns);
|
putenv(envbuf_Columns);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef FEAT_GUI
|
||||||
if (pty_master_fd >= 0)
|
if (pty_master_fd >= 0)
|
||||||
{
|
{
|
||||||
close(pty_master_fd); /* close master side of pty */
|
close(pty_master_fd); /* close master side of pty */
|
||||||
@ -3646,6 +3710,7 @@ mch_call_shell(cmd, options)
|
|||||||
close(pty_slave_fd); /* has been dupped, close it now */
|
close(pty_slave_fd); /* has been dupped, close it now */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
/* set up stdin for the child */
|
/* set up stdin for the child */
|
||||||
close(fd_toshell[1]);
|
close(fd_toshell[1]);
|
||||||
@ -3664,7 +3729,7 @@ mch_call_shell(cmd, options)
|
|||||||
dup(1);
|
dup(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif /* FEAT_GUI */
|
|
||||||
/*
|
/*
|
||||||
* There is no type cast for the argv, because the type may be
|
* There is no type cast for the argv, because the type may be
|
||||||
* different on different machines. This may cause a warning
|
* different on different machines. This may cause a warning
|
||||||
@ -3679,21 +3744,27 @@ mch_call_shell(cmd, options)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* While child is running, ignore terminating signals.
|
* While child is running, ignore terminating signals.
|
||||||
|
* Do catch CTRL-C, so that "got_int" is set.
|
||||||
*/
|
*/
|
||||||
catch_signals(SIG_IGN, SIG_ERR);
|
catch_signals(SIG_IGN, SIG_ERR);
|
||||||
|
catch_int_signal();
|
||||||
# ifdef FEAT_GUI
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For the GUI we redirect stdin, stdout and stderr to our window.
|
* For the GUI we redirect stdin, stdout and stderr to our window.
|
||||||
|
* This is also used to pipe stdin/stdout to/from the external
|
||||||
|
* command.
|
||||||
*/
|
*/
|
||||||
if (gui.in_use && show_shell_mess)
|
if ((options & (SHELL_READ|SHELL_WRITE))
|
||||||
|
# ifdef FEAT_GUI
|
||||||
|
|| (gui.in_use && show_shell_mess)
|
||||||
|
# endif
|
||||||
|
)
|
||||||
{
|
{
|
||||||
# define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */
|
# define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */
|
||||||
char_u buffer[BUFLEN + 1];
|
char_u buffer[BUFLEN + 1];
|
||||||
# ifdef FEAT_MBYTE
|
# ifdef FEAT_MBYTE
|
||||||
int buffer_off = 0; /* valid bytes in buffer[] */
|
int buffer_off = 0; /* valid bytes in buffer[] */
|
||||||
# endif
|
# endif
|
||||||
char_u ta_buf[BUFLEN + 1]; /* TypeAHead */
|
char_u ta_buf[BUFLEN + 1]; /* TypeAHead */
|
||||||
int ta_len = 0; /* valid bytes in ta_buf[] */
|
int ta_len = 0; /* valid bytes in ta_buf[] */
|
||||||
int len;
|
int len;
|
||||||
@ -3702,7 +3773,10 @@ mch_call_shell(cmd, options)
|
|||||||
int c;
|
int c;
|
||||||
int toshell_fd;
|
int toshell_fd;
|
||||||
int fromshell_fd;
|
int fromshell_fd;
|
||||||
|
garray_T ga;
|
||||||
|
int noread_cnt;
|
||||||
|
|
||||||
|
# ifdef FEAT_GUI
|
||||||
if (pty_master_fd >= 0)
|
if (pty_master_fd >= 0)
|
||||||
{
|
{
|
||||||
close(pty_slave_fd); /* close slave side of pty */
|
close(pty_slave_fd); /* close slave side of pty */
|
||||||
@ -3710,6 +3784,7 @@ mch_call_shell(cmd, options)
|
|||||||
toshell_fd = dup(pty_master_fd);
|
toshell_fd = dup(pty_master_fd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
# endif
|
||||||
{
|
{
|
||||||
close(fd_toshell[0]);
|
close(fd_toshell[0]);
|
||||||
close(fd_fromshell[1]);
|
close(fd_fromshell[1]);
|
||||||
@ -3738,6 +3813,76 @@ mch_call_shell(cmd, options)
|
|||||||
old_State = State;
|
old_State = State;
|
||||||
State = EXTERNCMD; /* don't redraw at window resize */
|
State = EXTERNCMD; /* don't redraw at window resize */
|
||||||
|
|
||||||
|
if (options & SHELL_WRITE && toshell_fd >= 0)
|
||||||
|
{
|
||||||
|
/* Fork a process that will write the lines to the
|
||||||
|
* external program. */
|
||||||
|
if ((wpid = fork()) == -1)
|
||||||
|
{
|
||||||
|
MSG_PUTS(_("\nCannot fork\n"));
|
||||||
|
}
|
||||||
|
else if (wpid == 0)
|
||||||
|
{
|
||||||
|
linenr_T lnum = curbuf->b_op_start.lnum;
|
||||||
|
int written = 0;
|
||||||
|
char_u *p = ml_get(lnum);
|
||||||
|
char_u *s;
|
||||||
|
size_t l;
|
||||||
|
|
||||||
|
/* child */
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
l = STRLEN(p + written);
|
||||||
|
if (l == 0)
|
||||||
|
len = 0;
|
||||||
|
else if (p[written] == NL)
|
||||||
|
/* NL -> NUL translation */
|
||||||
|
len = write(toshell_fd, "", (size_t)1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s = vim_strchr(p + written, NL);
|
||||||
|
len = write(toshell_fd, (char *)p + written,
|
||||||
|
s == NULL ? l : s - (p + written));
|
||||||
|
}
|
||||||
|
if (len == l)
|
||||||
|
{
|
||||||
|
/* Finished a line, add a NL, unless this line
|
||||||
|
* should not have one. */
|
||||||
|
if (lnum != curbuf->b_op_end.lnum
|
||||||
|
|| !curbuf->b_p_bin
|
||||||
|
|| (lnum != write_no_eol_lnum
|
||||||
|
&& (lnum !=
|
||||||
|
curbuf->b_ml.ml_line_count
|
||||||
|
|| curbuf->b_p_eol)))
|
||||||
|
write(toshell_fd, "\n", (size_t)1);
|
||||||
|
++lnum;
|
||||||
|
if (lnum > curbuf->b_op_end.lnum)
|
||||||
|
{
|
||||||
|
/* finished all the lines, close pipe */
|
||||||
|
close(toshell_fd);
|
||||||
|
toshell_fd = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p = ml_get(lnum);
|
||||||
|
written = 0;
|
||||||
|
}
|
||||||
|
else if (len > 0)
|
||||||
|
written += len;
|
||||||
|
}
|
||||||
|
_exit(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
close(toshell_fd);
|
||||||
|
toshell_fd = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options & SHELL_READ)
|
||||||
|
ga_init2(&ga, 1, BUFLEN);
|
||||||
|
|
||||||
|
noread_cnt = 0;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -3745,12 +3890,15 @@ mch_call_shell(cmd, options)
|
|||||||
* if there are any. Don't do this if we are expanding
|
* if there are any. Don't do this if we are expanding
|
||||||
* wild cards (would eat typeahead). Don't get extra
|
* wild cards (would eat typeahead). Don't get extra
|
||||||
* characters when we already have one.
|
* characters when we already have one.
|
||||||
|
* Don't read characters unless we didn't get output for a
|
||||||
|
* while, avoids that ":r !ls" eats typeahead.
|
||||||
*/
|
*/
|
||||||
len = 0;
|
len = 0;
|
||||||
if (!(options & SHELL_EXPAND)
|
if (!(options & SHELL_EXPAND)
|
||||||
&& (ta_len > 0
|
&& (ta_len > 0
|
||||||
|| (len = ui_inchar(ta_buf, BUFLEN, 10L,
|
|| (noread_cnt > 4
|
||||||
0)) > 0))
|
&& (len = ui_inchar(ta_buf,
|
||||||
|
BUFLEN, 10L, 0)) > 0)))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* For pipes:
|
* For pipes:
|
||||||
@ -3759,19 +3907,23 @@ mch_call_shell(cmd, options)
|
|||||||
*/
|
*/
|
||||||
if (len == 1 && (pty_master_fd < 0 || cmd != NULL))
|
if (len == 1 && (pty_master_fd < 0 || cmd != NULL))
|
||||||
{
|
{
|
||||||
# ifdef SIGINT
|
# ifdef SIGINT
|
||||||
/*
|
/*
|
||||||
* Send SIGINT to the child's group or all
|
* Send SIGINT to the child's group or all
|
||||||
* processes in our group.
|
* processes in our group.
|
||||||
*/
|
*/
|
||||||
if (ta_buf[ta_len] == Ctrl_C
|
if (ta_buf[ta_len] == Ctrl_C
|
||||||
|| ta_buf[ta_len] == intr_char)
|
|| ta_buf[ta_len] == intr_char)
|
||||||
# ifdef HAVE_SETSID
|
{
|
||||||
|
# ifdef HAVE_SETSID
|
||||||
kill(-pid, SIGINT);
|
kill(-pid, SIGINT);
|
||||||
# else
|
# else
|
||||||
kill(0, SIGINT);
|
kill(0, SIGINT);
|
||||||
# endif
|
|
||||||
# endif
|
# endif
|
||||||
|
if (wpid > 0)
|
||||||
|
kill(wpid, SIGINT);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
if (pty_master_fd < 0 && toshell_fd >= 0
|
if (pty_master_fd < 0 && toshell_fd >= 0
|
||||||
&& ta_buf[ta_len] == Ctrl_D)
|
&& ta_buf[ta_len] == Ctrl_D)
|
||||||
{
|
{
|
||||||
@ -3799,10 +3951,10 @@ mch_call_shell(cmd, options)
|
|||||||
}
|
}
|
||||||
else if (ta_buf[i] == '\r')
|
else if (ta_buf[i] == '\r')
|
||||||
ta_buf[i] = '\n';
|
ta_buf[i] = '\n';
|
||||||
# ifdef FEAT_MBYTE
|
# ifdef FEAT_MBYTE
|
||||||
if (has_mbyte)
|
if (has_mbyte)
|
||||||
i += (*mb_ptr2len_check)(ta_buf + i) - 1;
|
i += (*mb_ptr2len_check)(ta_buf + i) - 1;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3815,7 +3967,7 @@ mch_call_shell(cmd, options)
|
|||||||
{
|
{
|
||||||
if (ta_buf[i] == '\n' || ta_buf[i] == '\b')
|
if (ta_buf[i] == '\n' || ta_buf[i] == '\b')
|
||||||
msg_putchar(ta_buf[i]);
|
msg_putchar(ta_buf[i]);
|
||||||
# ifdef FEAT_MBYTE
|
# ifdef FEAT_MBYTE
|
||||||
else if (has_mbyte)
|
else if (has_mbyte)
|
||||||
{
|
{
|
||||||
int l = (*mb_ptr2len_check)(ta_buf + i);
|
int l = (*mb_ptr2len_check)(ta_buf + i);
|
||||||
@ -3823,7 +3975,7 @@ mch_call_shell(cmd, options)
|
|||||||
msg_outtrans_len(ta_buf + i, l);
|
msg_outtrans_len(ta_buf + i, l);
|
||||||
i += l - 1;
|
i += l - 1;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
else
|
else
|
||||||
msg_outtrans_len(ta_buf + i, 1);
|
msg_outtrans_len(ta_buf + i, 1);
|
||||||
}
|
}
|
||||||
@ -3837,18 +3989,37 @@ mch_call_shell(cmd, options)
|
|||||||
* Write the characters to the child, unless EOF has
|
* Write the characters to the child, unless EOF has
|
||||||
* been typed for pipes. Write one character at a
|
* been typed for pipes. Write one character at a
|
||||||
* time, to avoid loosing too much typeahead.
|
* time, to avoid loosing too much typeahead.
|
||||||
|
* When writing buffer lines, drop the typed
|
||||||
|
* characters (only check for CTRL-C).
|
||||||
*/
|
*/
|
||||||
if (toshell_fd >= 0)
|
if (options & SHELL_WRITE)
|
||||||
|
ta_len = 0;
|
||||||
|
else if (toshell_fd >= 0)
|
||||||
{
|
{
|
||||||
len = write(toshell_fd, (char *)ta_buf, (size_t)1);
|
len = write(toshell_fd, (char *)ta_buf, (size_t)1);
|
||||||
if (len > 0)
|
if (len > 0)
|
||||||
{
|
{
|
||||||
ta_len -= len;
|
ta_len -= len;
|
||||||
mch_memmove(ta_buf, ta_buf + len, ta_len);
|
mch_memmove(ta_buf, ta_buf + len, ta_len);
|
||||||
|
noread_cnt = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (got_int)
|
||||||
|
{
|
||||||
|
/* CTRL-C sends a signal to the child, we ignore it
|
||||||
|
* ourselves */
|
||||||
|
# ifdef HAVE_SETSID
|
||||||
|
kill(-pid, SIGINT);
|
||||||
|
# else
|
||||||
|
kill(0, SIGINT);
|
||||||
|
# endif
|
||||||
|
if (wpid > 0)
|
||||||
|
kill(wpid, SIGINT);
|
||||||
|
got_int = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the child has any characters to be printed.
|
* Check if the child has any characters to be printed.
|
||||||
* Read them and write them to our window. Repeat this as
|
* Read them and write them to our window. Repeat this as
|
||||||
@ -3858,24 +4029,42 @@ mch_call_shell(cmd, options)
|
|||||||
* TODO: This should handle escape sequences, compatible
|
* TODO: This should handle escape sequences, compatible
|
||||||
* to some terminal (vt52?).
|
* to some terminal (vt52?).
|
||||||
*/
|
*/
|
||||||
|
++noread_cnt;
|
||||||
while (RealWaitForChar(fromshell_fd, 10L, NULL))
|
while (RealWaitForChar(fromshell_fd, 10L, NULL))
|
||||||
{
|
{
|
||||||
len = read(fromshell_fd, (char *)buffer
|
len = read(fromshell_fd, (char *)buffer
|
||||||
# ifdef FEAT_MBYTE
|
# ifdef FEAT_MBYTE
|
||||||
+ buffer_off, (size_t)(BUFLEN - buffer_off)
|
+ buffer_off, (size_t)(BUFLEN - buffer_off)
|
||||||
# else
|
# else
|
||||||
, (size_t)BUFLEN
|
, (size_t)BUFLEN
|
||||||
# endif
|
# endif
|
||||||
);
|
);
|
||||||
if (len <= 0) /* end of file or error */
|
if (len <= 0) /* end of file or error */
|
||||||
goto finished;
|
goto finished;
|
||||||
# ifdef FEAT_MBYTE
|
|
||||||
len += buffer_off;
|
noread_cnt = 0;
|
||||||
buffer[len] = NUL;
|
if (options & SHELL_READ)
|
||||||
if (has_mbyte)
|
{
|
||||||
|
/* Do NUL -> NL translation, append NL separated
|
||||||
|
* lines to the current buffer. */
|
||||||
|
for (i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
if (buffer[i] == NL)
|
||||||
|
append_ga_line(&ga);
|
||||||
|
else if (buffer[i] == NUL)
|
||||||
|
ga_append(&ga, NL);
|
||||||
|
else
|
||||||
|
ga_append(&ga, buffer[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# ifdef FEAT_MBYTE
|
||||||
|
else if (has_mbyte)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
|
len += buffer_off;
|
||||||
|
buffer[len] = NUL;
|
||||||
|
|
||||||
/* Check if the last character in buffer[] is
|
/* Check if the last character in buffer[] is
|
||||||
* incomplete, keep these bytes for the next
|
* incomplete, keep these bytes for the next
|
||||||
* round. */
|
* round. */
|
||||||
@ -3913,8 +4102,8 @@ mch_call_shell(cmd, options)
|
|||||||
}
|
}
|
||||||
buffer_off = 0;
|
buffer_off = 0;
|
||||||
}
|
}
|
||||||
|
# endif /* FEAT_MBYTE */
|
||||||
else
|
else
|
||||||
# endif /* FEAT_MBYTE */
|
|
||||||
{
|
{
|
||||||
buffer[len] = NUL;
|
buffer[len] = NUL;
|
||||||
msg_puts(buffer);
|
msg_puts(buffer);
|
||||||
@ -3931,11 +4120,11 @@ mch_call_shell(cmd, options)
|
|||||||
* Check if the child still exists, before checking for
|
* Check if the child still exists, before checking for
|
||||||
* typed characters (otherwise we would loose typeahead).
|
* typed characters (otherwise we would loose typeahead).
|
||||||
*/
|
*/
|
||||||
# ifdef __NeXT__
|
# ifdef __NeXT__
|
||||||
wait_pid = wait4(pid, &status, WNOHANG, (struct rusage *) 0);
|
wait_pid = wait4(pid, &status, WNOHANG, (struct rusage *) 0);
|
||||||
# else
|
# else
|
||||||
wait_pid = waitpid(pid, &status, WNOHANG);
|
wait_pid = waitpid(pid, &status, WNOHANG);
|
||||||
# endif
|
# endif
|
||||||
if ((wait_pid == (pid_t)-1 && errno == ECHILD)
|
if ((wait_pid == (pid_t)-1 && errno == ECHILD)
|
||||||
|| (wait_pid == pid && WIFEXITED(status)))
|
|| (wait_pid == pid && WIFEXITED(status)))
|
||||||
{
|
{
|
||||||
@ -3946,20 +4135,29 @@ mch_call_shell(cmd, options)
|
|||||||
}
|
}
|
||||||
finished:
|
finished:
|
||||||
p_more = p_more_save;
|
p_more = p_more_save;
|
||||||
|
if (options & SHELL_READ)
|
||||||
|
{
|
||||||
|
if (ga.ga_len > 0)
|
||||||
|
{
|
||||||
|
append_ga_line(&ga);
|
||||||
|
/* remember that the NL was missing */
|
||||||
|
write_no_eol_lnum = curwin->w_cursor.lnum;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
write_no_eol_lnum = 0;
|
||||||
|
ga_clear(&ga);
|
||||||
|
}
|
||||||
|
|
||||||
# ifndef MACOS_X_UNIX /* TODO: Is it needed for MACOS_X ? */
|
|
||||||
/*
|
/*
|
||||||
* Give all typeahead that wasn't used back to ui_inchar().
|
* Give all typeahead that wasn't used back to ui_inchar().
|
||||||
*/
|
*/
|
||||||
if (ta_len)
|
if (ta_len)
|
||||||
ui_inchar_undo(ta_buf, ta_len);
|
ui_inchar_undo(ta_buf, ta_len);
|
||||||
# endif
|
|
||||||
State = old_State;
|
State = old_State;
|
||||||
if (toshell_fd >= 0)
|
if (toshell_fd >= 0)
|
||||||
close(toshell_fd);
|
close(toshell_fd);
|
||||||
close(fromshell_fd);
|
close(fromshell_fd);
|
||||||
}
|
}
|
||||||
# endif /* FEAT_GUI */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wait until our child has exited.
|
* Wait until our child has exited.
|
||||||
@ -3970,7 +4168,7 @@ finished:
|
|||||||
*/
|
*/
|
||||||
while (wait_pid != pid)
|
while (wait_pid != pid)
|
||||||
{
|
{
|
||||||
#ifdef _THREAD_SAFE
|
# ifdef _THREAD_SAFE
|
||||||
/* Ugly hack: when compiled with Python threads are probably
|
/* Ugly hack: when compiled with Python threads are probably
|
||||||
* used, in which case wait() sometimes hangs for no obvious
|
* used, in which case wait() sometimes hangs for no obvious
|
||||||
* reason. Use waitpid() instead and loop (like the GUI). */
|
* reason. Use waitpid() instead and loop (like the GUI). */
|
||||||
@ -3985,9 +4183,9 @@ finished:
|
|||||||
mch_delay(10L, TRUE);
|
mch_delay(10L, TRUE);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#else
|
# else
|
||||||
wait_pid = wait(&status);
|
wait_pid = wait(&status);
|
||||||
#endif
|
# endif
|
||||||
if (wait_pid <= 0
|
if (wait_pid <= 0
|
||||||
# ifdef ECHILD
|
# ifdef ECHILD
|
||||||
&& errno == ECHILD
|
&& errno == ECHILD
|
||||||
@ -3996,6 +4194,11 @@ finished:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure the child that writes to the external program is
|
||||||
|
* dead. */
|
||||||
|
if (wpid > 0)
|
||||||
|
kill(wpid, SIGKILL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set to raw mode right now, otherwise a CTRL-C after
|
* Set to raw mode right now, otherwise a CTRL-C after
|
||||||
* catch_signals() will kill Vim.
|
* catch_signals() will kill Vim.
|
||||||
@ -4656,7 +4859,19 @@ unix_expandpath(gap, path, wildoff, flags)
|
|||||||
if (*path_end != NUL)
|
if (*path_end != NUL)
|
||||||
backslash_halve(buf + len + 1);
|
backslash_halve(buf + len + 1);
|
||||||
if (mch_getperm(buf) >= 0) /* add existing file */
|
if (mch_getperm(buf) >= 0) /* add existing file */
|
||||||
|
{
|
||||||
|
#if defined(MACOS_X) && defined(FEAT_MBYTE)
|
||||||
|
size_t precomp_len = STRLEN(buf)+1;
|
||||||
|
char_u *precomp_buf =
|
||||||
|
mac_precompose_path(buf, precomp_len, &precomp_len);
|
||||||
|
if (precomp_buf)
|
||||||
|
{
|
||||||
|
mch_memmove(buf, precomp_buf, precomp_len);
|
||||||
|
vim_free(precomp_buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
addfile(gap, buf, flags);
|
addfile(gap, buf, flags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,9 +10,9 @@
|
|||||||
# language (xx) and add it to the next three lines.
|
# language (xx) and add it to the next three lines.
|
||||||
#
|
#
|
||||||
|
|
||||||
LANGUAGES = af ca cs de en_GB es fr it ja ko no pl ru sk sv uk zh_TW \
|
LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk zh_TW \
|
||||||
zh_TW.UTF-8 zh_CN zh_CN.UTF-8
|
zh_TW.UTF-8 zh_CN zh_CN.UTF-8
|
||||||
MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo it.mo ja.mo \
|
MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \
|
||||||
ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \
|
ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \
|
||||||
zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo
|
zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
# Note: ja.sjis, *.cp1250 and zh_CN.cp936 are only for MS-Windows, they are
|
# Note: ja.sjis, *.cp1250 and zh_CN.cp936 are only for MS-Windows, they are
|
||||||
# not installed on Unix
|
# not installed on Unix
|
||||||
|
|
||||||
LANGUAGES = af ca cs de en_GB es fr it ja ko no pl ru sk sv uk zh_TW \
|
LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk zh_TW \
|
||||||
zh_TW.UTF-8 zh_CN zh_CN.UTF-8
|
zh_TW.UTF-8 zh_CN zh_CN.UTF-8
|
||||||
MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo it.mo ja.mo \
|
MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \
|
||||||
ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \
|
ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo \
|
||||||
zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo
|
zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ void alist_slash_adjust __ARGS((void));
|
|||||||
void ex_splitview __ARGS((exarg_T *eap));
|
void ex_splitview __ARGS((exarg_T *eap));
|
||||||
void do_exedit __ARGS((exarg_T *eap, win_T *old_curwin));
|
void do_exedit __ARGS((exarg_T *eap, win_T *old_curwin));
|
||||||
void do_sleep __ARGS((long msec));
|
void do_sleep __ARGS((long msec));
|
||||||
|
int vim_mkdir_emsg __ARGS((char_u *name, int prot));
|
||||||
FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
|
FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
|
||||||
void update_topline_cursor __ARGS((void));
|
void update_topline_cursor __ARGS((void));
|
||||||
void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent));
|
void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent));
|
||||||
|
@ -39,6 +39,7 @@ void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb));
|
|||||||
int gui_mch_adjust_charsize __ARGS((void));
|
int gui_mch_adjust_charsize __ARGS((void));
|
||||||
int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
|
int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
|
||||||
GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
|
GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
|
||||||
|
char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
|
||||||
GuiFont gui_mac_find_font __ARGS((char_u *font_name));
|
GuiFont gui_mac_find_font __ARGS((char_u *font_name));
|
||||||
void gui_mch_set_font __ARGS((GuiFont font));
|
void gui_mch_set_font __ARGS((GuiFont font));
|
||||||
int gui_mch_same_font __ARGS((GuiFont f1, GuiFont f2));
|
int gui_mch_same_font __ARGS((GuiFont f1, GuiFont f2));
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* main.c */
|
/* main.c */
|
||||||
void main_loop __ARGS((int cmdwin));
|
void main_loop __ARGS((int cmdwin, int noexmode));
|
||||||
void getout_preserve_modified __ARGS((int exitval));
|
void getout_preserve_modified __ARGS((int exitval));
|
||||||
void getout __ARGS((int exitval));
|
void getout __ARGS((int exitval));
|
||||||
int process_env __ARGS((char_u *env, int is_viminit));
|
int process_env __ARGS((char_u *env, int is_viminit));
|
||||||
|
@ -9,6 +9,7 @@ int emsg __ARGS((char_u *s));
|
|||||||
int emsg2 __ARGS((char_u *s, char_u *a1));
|
int emsg2 __ARGS((char_u *s, char_u *a1));
|
||||||
int emsg3 __ARGS((char_u *s, char_u *a1, char_u *a2));
|
int emsg3 __ARGS((char_u *s, char_u *a1, char_u *a2));
|
||||||
int emsgn __ARGS((char_u *s, long n));
|
int emsgn __ARGS((char_u *s, long n));
|
||||||
|
void emsg_invreg __ARGS((int name));
|
||||||
char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
|
char_u *msg_trunc_attr __ARGS((char_u *s, int force, int attr));
|
||||||
char_u *msg_may_trunc __ARGS((int force, char_u *s));
|
char_u *msg_may_trunc __ARGS((int force, char_u *s));
|
||||||
void ex_messages __ARGS((exarg_T *eap));
|
void ex_messages __ARGS((exarg_T *eap));
|
||||||
@ -31,7 +32,7 @@ void msg_make __ARGS((char_u *arg));
|
|||||||
int msg_outtrans_special __ARGS((char_u *strstart, int from));
|
int msg_outtrans_special __ARGS((char_u *strstart, int from));
|
||||||
char_u *str2special __ARGS((char_u **sp, int from));
|
char_u *str2special __ARGS((char_u **sp, int from));
|
||||||
void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
|
void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
|
||||||
void msg_prt_line __ARGS((char_u *s));
|
void msg_prt_line __ARGS((char_u *s, int list));
|
||||||
void msg_puts __ARGS((char_u *s));
|
void msg_puts __ARGS((char_u *s));
|
||||||
void msg_puts_title __ARGS((char_u *s));
|
void msg_puts_title __ARGS((char_u *s));
|
||||||
void msg_puts_long __ARGS((char_u *longstr));
|
void msg_puts_long __ARGS((char_u *longstr));
|
||||||
|
@ -1456,7 +1456,7 @@ qf_list(eap)
|
|||||||
qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
|
qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
|
||||||
? skipwhite(qfp->qf_text) : qfp->qf_text,
|
? skipwhite(qfp->qf_text) : qfp->qf_text,
|
||||||
IObuff, IOSIZE);
|
IObuff, IOSIZE);
|
||||||
msg_prt_line(IObuff);
|
msg_prt_line(IObuff, FALSE);
|
||||||
out_flush(); /* show one line at a time */
|
out_flush(); /* show one line at a time */
|
||||||
need_return = TRUE;
|
need_return = TRUE;
|
||||||
last_printed = i;
|
last_printed = i;
|
||||||
@ -2279,7 +2279,6 @@ ex_vimgrep(eap)
|
|||||||
exarg_T *eap;
|
exarg_T *eap;
|
||||||
{
|
{
|
||||||
regmmatch_T regmatch;
|
regmmatch_T regmatch;
|
||||||
char_u *save_cpo;
|
|
||||||
int fcount;
|
int fcount;
|
||||||
char_u **fnames;
|
char_u **fnames;
|
||||||
char_u *s;
|
char_u *s;
|
||||||
@ -2317,10 +2316,6 @@ ex_vimgrep(eap)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */
|
|
||||||
save_cpo = p_cpo;
|
|
||||||
p_cpo = empty_option;
|
|
||||||
|
|
||||||
/* Get the search pattern: either white-separated or enclosed in // */
|
/* Get the search pattern: either white-separated or enclosed in // */
|
||||||
regmatch.regprog = NULL;
|
regmatch.regprog = NULL;
|
||||||
p = skip_vimgrep_pat(eap->arg, &s);
|
p = skip_vimgrep_pat(eap->arg, &s);
|
||||||
@ -2545,12 +2540,6 @@ jumpend:
|
|||||||
|
|
||||||
theend:
|
theend:
|
||||||
vim_free(regmatch.regprog);
|
vim_free(regmatch.regprog);
|
||||||
|
|
||||||
/* Only resture 'cpo' when it wasn't set in the mean time. */
|
|
||||||
if (p_cpo == empty_option)
|
|
||||||
p_cpo = save_cpo;
|
|
||||||
else
|
|
||||||
free_string_option(save_cpo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
407
src/regexp.c
407
src/regexp.c
@ -74,11 +74,12 @@
|
|||||||
* (Here we have one of the subtle syntax dependencies: an individual BRANCH
|
* (Here we have one of the subtle syntax dependencies: an individual BRANCH
|
||||||
* (as opposed to a collection of them) is never concatenated with anything
|
* (as opposed to a collection of them) is never concatenated with anything
|
||||||
* because of operator precedence). The "next" pointer of a BRACES_COMPLEX
|
* because of operator precedence). The "next" pointer of a BRACES_COMPLEX
|
||||||
* node points to the node after the stuff to be repeated. The operand of some
|
* node points to the node after the stuff to be repeated.
|
||||||
* types of node is a literal string; for others, it is a node leading into a
|
* The operand of some types of node is a literal string; for others, it is a
|
||||||
* sub-FSM. In particular, the operand of a BRANCH node is the first node of
|
* node leading into a sub-FSM. In particular, the operand of a BRANCH node
|
||||||
* the branch. (NB this is *not* a tree structure: the tail of the branch
|
* is the first node of the branch.
|
||||||
* connects to the thing following the set of BRANCHes.)
|
* (NB this is *not* a tree structure: the tail of the branch connects to the
|
||||||
|
* thing following the set of BRANCHes.)
|
||||||
*
|
*
|
||||||
* pattern is coded like:
|
* pattern is coded like:
|
||||||
*
|
*
|
||||||
@ -97,6 +98,14 @@
|
|||||||
* +---------------------------------------------+
|
* +---------------------------------------------+
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
* +----------------------+
|
||||||
|
* V |
|
||||||
|
* <aa>\+ BRANCH <aa> --> BRANCH --> BACK BRANCH --> NOTHING --> END
|
||||||
|
* | | ^ ^
|
||||||
|
* | +----------+ |
|
||||||
|
* +-------------------------------------------------+
|
||||||
|
*
|
||||||
|
*
|
||||||
* +-------------------------+
|
* +-------------------------+
|
||||||
* V |
|
* V |
|
||||||
* <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END
|
* <aa>\{} BRANCH BRACE_LIMITS --> BRACE_COMPLEX <aa> --> BACK END
|
||||||
@ -386,7 +395,10 @@ static char_u REGEXP_INRANGE[] = "]^-n\\";
|
|||||||
static char_u REGEXP_ABBR[] = "nrtebdoxuU";
|
static char_u REGEXP_ABBR[] = "nrtebdoxuU";
|
||||||
|
|
||||||
static int backslash_trans __ARGS((int c));
|
static int backslash_trans __ARGS((int c));
|
||||||
static int skip_class_name __ARGS((char_u **pp));
|
static int get_char_class __ARGS((char_u **pp));
|
||||||
|
static int get_equi_class __ARGS((char_u **pp));
|
||||||
|
static void reg_equi_class __ARGS((int c));
|
||||||
|
static int get_coll_element __ARGS((char_u **pp));
|
||||||
static char_u *skip_anyof __ARGS((char_u *p));
|
static char_u *skip_anyof __ARGS((char_u *p));
|
||||||
static void init_class_tab __ARGS((void));
|
static void init_class_tab __ARGS((void));
|
||||||
|
|
||||||
@ -408,12 +420,12 @@ backslash_trans(c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for a character class name. "pp" points to the '['.
|
* Check for a character class name "[:name:]". "pp" points to the '['.
|
||||||
* Returns one of the CLASS_ items. CLASS_NONE means that no item was
|
* Returns one of the CLASS_ items. CLASS_NONE means that no item was
|
||||||
* recognized. Otherwise "pp" is advanced to after the item.
|
* recognized. Otherwise "pp" is advanced to after the item.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
skip_class_name(pp)
|
get_char_class(pp)
|
||||||
char_u **pp;
|
char_u **pp;
|
||||||
{
|
{
|
||||||
static const char *(class_names[]) =
|
static const char *(class_names[]) =
|
||||||
@ -466,55 +478,6 @@ skip_class_name(pp)
|
|||||||
return CLASS_NONE;
|
return CLASS_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip over a "[]" range.
|
|
||||||
* "p" must point to the character after the '['.
|
|
||||||
* The returned pointer is on the matching ']', or the terminating NUL.
|
|
||||||
*/
|
|
||||||
static char_u *
|
|
||||||
skip_anyof(p)
|
|
||||||
char_u *p;
|
|
||||||
{
|
|
||||||
int cpo_lit; /* 'cpoptions' contains 'l' flag */
|
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
int l;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
|
|
||||||
|
|
||||||
if (*p == '^') /* Complement of range. */
|
|
||||||
++p;
|
|
||||||
if (*p == ']' || *p == '-')
|
|
||||||
++p;
|
|
||||||
while (*p != NUL && *p != ']')
|
|
||||||
{
|
|
||||||
#ifdef FEAT_MBYTE
|
|
||||||
if (has_mbyte && (l = (*mb_ptr2len_check)(p)) > 1)
|
|
||||||
p += l;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (*p == '-')
|
|
||||||
{
|
|
||||||
++p;
|
|
||||||
if (*p != ']' && *p != NUL)
|
|
||||||
mb_ptr_adv(p);
|
|
||||||
}
|
|
||||||
else if (*p == '\\'
|
|
||||||
&& (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
|
|
||||||
|| (!cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
|
|
||||||
p += 2;
|
|
||||||
else if (*p == '[')
|
|
||||||
{
|
|
||||||
if (skip_class_name(&p) == CLASS_NONE)
|
|
||||||
++p; /* It was not a class name */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Specific version of character class functions.
|
* Specific version of character class functions.
|
||||||
* Using a table to keep this fast.
|
* Using a table to keep this fast.
|
||||||
@ -695,6 +658,8 @@ static char_u *regnext __ARGS((char_u *));
|
|||||||
static void regc __ARGS((int b));
|
static void regc __ARGS((int b));
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
static void regmbc __ARGS((int c));
|
static void regmbc __ARGS((int c));
|
||||||
|
#else
|
||||||
|
# define regmbc(c) regc(c)
|
||||||
#endif
|
#endif
|
||||||
static void reginsert __ARGS((int, char_u *));
|
static void reginsert __ARGS((int, char_u *));
|
||||||
static void reginsert_limits __ARGS((int, long, long, char_u *));
|
static void reginsert_limits __ARGS((int, long, long, char_u *));
|
||||||
@ -724,6 +689,210 @@ re_lookbehind(prog)
|
|||||||
return (prog->regflags & RF_LOOKBH);
|
return (prog->regflags & RF_LOOKBH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for an equivalence class name "[=a=]". "pp" points to the '['.
|
||||||
|
* Returns a character representing the class. Zero means that no item was
|
||||||
|
* recognized. Otherwise "pp" is advanced to after the item.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
get_equi_class(pp)
|
||||||
|
char_u **pp;
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int l = 1;
|
||||||
|
char_u *p = *pp;
|
||||||
|
|
||||||
|
if (p[1] == '=')
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte)
|
||||||
|
l = mb_ptr2len_check(p + 2);
|
||||||
|
#endif
|
||||||
|
if (p[l + 2] == '=' && p[l + 3] == ']')
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte)
|
||||||
|
c = mb_ptr2char(p + 2);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
c = p[2];
|
||||||
|
*pp += l + 4;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Produce the bytes for equivalence class "c".
|
||||||
|
* Currently only handles latin1, latin9 and utf-8.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
reg_equi_class(c)
|
||||||
|
int c;
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (enc_utf8 || STRCMP(p_enc, "latin1") == 0
|
||||||
|
|| STRCMP(p_enc, "latin9") == 0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case 'A': case 'À': case 'Á': case 'Â':
|
||||||
|
case 'Ã': case 'Ä': case 'Å':
|
||||||
|
regmbc('A'); regmbc('À'); regmbc('Á'); regmbc('Â');
|
||||||
|
regmbc('Ã'); regmbc('Ä'); regmbc('Å');
|
||||||
|
return;
|
||||||
|
case 'C': case 'Ç':
|
||||||
|
regmbc('C'); regmbc('Ç');
|
||||||
|
return;
|
||||||
|
case 'E': case 'È': case 'É': case 'Ê': case 'Ë':
|
||||||
|
regmbc('E'); regmbc('È'); regmbc('É'); regmbc('Ê');
|
||||||
|
regmbc('Ë');
|
||||||
|
return;
|
||||||
|
case 'I': case 'Ì': case 'Í': case 'Î': case 'Ï':
|
||||||
|
regmbc('I'); regmbc('Ì'); regmbc('Í'); regmbc('Î');
|
||||||
|
regmbc('Ï');
|
||||||
|
return;
|
||||||
|
case 'N': case 'Ñ':
|
||||||
|
regmbc('N'); regmbc('Ñ');
|
||||||
|
return;
|
||||||
|
case 'O': case 'Ò': case 'Ó': case 'Ô': case 'Õ': case 'Ö':
|
||||||
|
regmbc('O'); regmbc('Ò'); regmbc('Ó'); regmbc('Ô');
|
||||||
|
regmbc('Õ'); regmbc('Ö');
|
||||||
|
return;
|
||||||
|
case 'U': case 'Ù': case 'Ú': case 'Û': case 'Ü':
|
||||||
|
regmbc('U'); regmbc('Ù'); regmbc('Ú'); regmbc('Û');
|
||||||
|
regmbc('Ü');
|
||||||
|
return;
|
||||||
|
case 'Y': case 'Ý':
|
||||||
|
regmbc('Y'); regmbc('Ý');
|
||||||
|
return;
|
||||||
|
case 'a': case 'à': case 'á': case 'â':
|
||||||
|
case 'ã': case 'ä': case 'å':
|
||||||
|
regmbc('a'); regmbc('à'); regmbc('á'); regmbc('â');
|
||||||
|
regmbc('ã'); regmbc('ä'); regmbc('å');
|
||||||
|
return;
|
||||||
|
case 'c': case 'ç':
|
||||||
|
regmbc('c'); regmbc('ç');
|
||||||
|
return;
|
||||||
|
case 'e': case 'è': case 'é': case 'ê': case 'ë':
|
||||||
|
regmbc('e'); regmbc('è'); regmbc('é'); regmbc('ê');
|
||||||
|
regmbc('ë');
|
||||||
|
return;
|
||||||
|
case 'i': case 'ì': case 'í': case 'î': case 'ï':
|
||||||
|
regmbc('i'); regmbc('ì'); regmbc('í'); regmbc('î');
|
||||||
|
regmbc('ï');
|
||||||
|
return;
|
||||||
|
case 'n': case 'ñ':
|
||||||
|
regmbc('n'); regmbc('ñ');
|
||||||
|
return;
|
||||||
|
case 'o': case 'ò': case 'ó': case 'ô': case 'õ': case 'ö':
|
||||||
|
regmbc('o'); regmbc('ò'); regmbc('ó'); regmbc('ô');
|
||||||
|
regmbc('õ'); regmbc('ö');
|
||||||
|
return;
|
||||||
|
case 'u': case 'ù': case 'ú': case 'û': case 'ü':
|
||||||
|
regmbc('u'); regmbc('ù'); regmbc('ú'); regmbc('û');
|
||||||
|
regmbc('ü');
|
||||||
|
return;
|
||||||
|
case 'y': case 'ý': case 'ÿ':
|
||||||
|
regmbc('y'); regmbc('ý'); regmbc('ÿ');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
regmbc(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for a collating element "[.a.]". "pp" points to the '['.
|
||||||
|
* Returns a character. Zero means that no item was recognized. Otherwise
|
||||||
|
* "pp" is advanced to after the item.
|
||||||
|
* Currently only single characters are recognized!
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
get_coll_element(pp)
|
||||||
|
char_u **pp;
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int l = 1;
|
||||||
|
char_u *p = *pp;
|
||||||
|
|
||||||
|
if (p[1] == '.')
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte)
|
||||||
|
l = mb_ptr2len_check(p + 2);
|
||||||
|
#endif
|
||||||
|
if (p[l + 2] == '.' && p[l + 3] == ']')
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte)
|
||||||
|
c = mb_ptr2char(p + 2);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
c = p[2];
|
||||||
|
*pp += l + 4;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Skip over a "[]" range.
|
||||||
|
* "p" must point to the character after the '['.
|
||||||
|
* The returned pointer is on the matching ']', or the terminating NUL.
|
||||||
|
*/
|
||||||
|
static char_u *
|
||||||
|
skip_anyof(p)
|
||||||
|
char_u *p;
|
||||||
|
{
|
||||||
|
int cpo_lit; /* 'cpoptions' contains 'l' flag */
|
||||||
|
int cpo_bsl; /* 'cpoptions' contains '\' flag */
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
int l;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
|
||||||
|
cpo_bsl = (!reg_syn && vim_strchr(p_cpo, CPO_BACKSL) != NULL);
|
||||||
|
|
||||||
|
if (*p == '^') /* Complement of range. */
|
||||||
|
++p;
|
||||||
|
if (*p == ']' || *p == '-')
|
||||||
|
++p;
|
||||||
|
while (*p != NUL && *p != ']')
|
||||||
|
{
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (has_mbyte && (l = (*mb_ptr2len_check)(p)) > 1)
|
||||||
|
p += l;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (*p == '-')
|
||||||
|
{
|
||||||
|
++p;
|
||||||
|
if (*p != ']' && *p != NUL)
|
||||||
|
mb_ptr_adv(p);
|
||||||
|
}
|
||||||
|
else if (*p == '\\'
|
||||||
|
&& !cpo_bsl
|
||||||
|
&& (vim_strchr(REGEXP_INRANGE, p[1]) != NULL
|
||||||
|
|| (!cpo_lit && vim_strchr(REGEXP_ABBR, p[1]) != NULL)))
|
||||||
|
p += 2;
|
||||||
|
else if (*p == '[')
|
||||||
|
{
|
||||||
|
if (get_char_class(&p) == CLASS_NONE
|
||||||
|
&& get_equi_class(&p) == 0
|
||||||
|
&& get_coll_element(&p) == 0)
|
||||||
|
++p; /* It was not a class name */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Skip past regular expression.
|
* Skip past regular expression.
|
||||||
* Stop at end of "startp" or where "dirc" is found ('/', '?', etc).
|
* Stop at end of "startp" or where "dirc" is found ('/', '?', etc).
|
||||||
@ -1251,16 +1420,6 @@ regpiece(flagp)
|
|||||||
*flagp = flags;
|
*flagp = flags;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (!(flags & HASWIDTH) && re_multi_type(op) == MULTI_MULT)
|
|
||||||
{
|
|
||||||
if (op == Magic('*'))
|
|
||||||
EMSG_M_RET_NULL(_("E56: %s* operand could be empty"),
|
|
||||||
reg_magic >= MAGIC_ON);
|
|
||||||
if (op == Magic('+'))
|
|
||||||
EMSG_M_RET_NULL(_("E57: %s+ operand could be empty"),
|
|
||||||
reg_magic == MAGIC_ALL);
|
|
||||||
/* "\{}" is checked below, it's allowed when there is an upper limit */
|
|
||||||
}
|
|
||||||
/* default flags */
|
/* default flags */
|
||||||
*flagp = (WORST | SPSTART | (flags & (HASNL | HASLOOKBH)));
|
*flagp = (WORST | SPSTART | (flags & (HASNL | HASLOOKBH)));
|
||||||
|
|
||||||
@ -1338,10 +1497,6 @@ regpiece(flagp)
|
|||||||
case Magic('{'):
|
case Magic('{'):
|
||||||
if (!read_limits(&minval, &maxval))
|
if (!read_limits(&minval, &maxval))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!(flags & HASWIDTH) && (maxval > minval
|
|
||||||
? maxval >= MAX_LIMIT : minval >= MAX_LIMIT))
|
|
||||||
EMSG_M_RET_NULL(_("E58: %s{ operand could be empty"),
|
|
||||||
reg_magic == MAGIC_ALL);
|
|
||||||
if (flags & SIMPLE)
|
if (flags & SIMPLE)
|
||||||
{
|
{
|
||||||
reginsert(BRACE_SIMPLE, ret);
|
reginsert(BRACE_SIMPLE, ret);
|
||||||
@ -1391,6 +1546,7 @@ regatom(flagp)
|
|||||||
char_u *ret;
|
char_u *ret;
|
||||||
int flags;
|
int flags;
|
||||||
int cpo_lit; /* 'cpoptions' contains 'l' flag */
|
int cpo_lit; /* 'cpoptions' contains 'l' flag */
|
||||||
|
int cpo_bsl; /* 'cpoptions' contains '\' flag */
|
||||||
int c;
|
int c;
|
||||||
static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU";
|
static char_u *classchars = (char_u *)".iIkKfFpPsSdDxXoOwWhHaAlLuU";
|
||||||
static int classcodes[] = {ANY, IDENT, SIDENT, KWORD, SKWORD,
|
static int classcodes[] = {ANY, IDENT, SIDENT, KWORD, SKWORD,
|
||||||
@ -1406,6 +1562,7 @@ regatom(flagp)
|
|||||||
|
|
||||||
*flagp = WORST; /* Tentatively. */
|
*flagp = WORST; /* Tentatively. */
|
||||||
cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
|
cpo_lit = (!reg_syn && vim_strchr(p_cpo, CPO_LITERAL) != NULL);
|
||||||
|
cpo_bsl = (!reg_syn && vim_strchr(p_cpo, CPO_BACKSL) != NULL);
|
||||||
|
|
||||||
c = getchr();
|
c = getchr();
|
||||||
switch (c)
|
switch (c)
|
||||||
@ -1827,7 +1984,10 @@ collection:
|
|||||||
|
|
||||||
/* At the start ']' and '-' mean the literal character. */
|
/* At the start ']' and '-' mean the literal character. */
|
||||||
if (*regparse == ']' || *regparse == '-')
|
if (*regparse == ']' || *regparse == '-')
|
||||||
|
{
|
||||||
|
startc = *regparse;
|
||||||
regc(*regparse++);
|
regc(*regparse++);
|
||||||
|
}
|
||||||
|
|
||||||
while (*regparse != NUL && *regparse != ']')
|
while (*regparse != NUL && *regparse != ']')
|
||||||
{
|
{
|
||||||
@ -1845,15 +2005,22 @@ collection:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Also accept "a-[.z.]" */
|
||||||
|
endc = 0;
|
||||||
|
if (*regparse == '[')
|
||||||
|
endc = get_coll_element(®parse);
|
||||||
|
if (endc == 0)
|
||||||
|
{
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
if (has_mbyte)
|
if (has_mbyte)
|
||||||
endc = mb_ptr2char_adv(®parse);
|
endc = mb_ptr2char_adv(®parse);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
endc = *regparse++;
|
endc = *regparse++;
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle \o40, \x20 and \u20AC style sequences */
|
/* Handle \o40, \x20 and \u20AC style sequences */
|
||||||
if (endc == '\\' && !cpo_lit)
|
if (endc == '\\' && !cpo_lit && !cpo_bsl)
|
||||||
endc = coll_get_char();
|
endc = coll_get_char();
|
||||||
|
|
||||||
if (startc > endc)
|
if (startc > endc)
|
||||||
@ -1892,8 +2059,10 @@ collection:
|
|||||||
* Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
|
* Only "\]", "\^", "\]" and "\\" are special in Vi. Vim
|
||||||
* accepts "\t", "\e", etc., but only when the 'l' flag in
|
* accepts "\t", "\e", etc., but only when the 'l' flag in
|
||||||
* 'cpoptions' is not included.
|
* 'cpoptions' is not included.
|
||||||
|
* Posix doesn't recognize backslash at all.
|
||||||
*/
|
*/
|
||||||
else if (*regparse == '\\'
|
else if (*regparse == '\\'
|
||||||
|
&& !cpo_bsl
|
||||||
&& (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
|
&& (vim_strchr(REGEXP_INRANGE, regparse[1]) != NULL
|
||||||
|| (!cpo_lit
|
|| (!cpo_lit
|
||||||
&& vim_strchr(REGEXP_ABBR,
|
&& vim_strchr(REGEXP_ABBR,
|
||||||
@ -1942,15 +2111,30 @@ collection:
|
|||||||
int c_class;
|
int c_class;
|
||||||
int cu;
|
int cu;
|
||||||
|
|
||||||
c_class = skip_class_name(®parse);
|
c_class = get_char_class(®parse);
|
||||||
startc = -1;
|
startc = -1;
|
||||||
/* Characters assumed to be 8 bits! */
|
/* Characters assumed to be 8 bits! */
|
||||||
switch (c_class)
|
switch (c_class)
|
||||||
{
|
{
|
||||||
case CLASS_NONE:
|
case CLASS_NONE:
|
||||||
/* literal '[', allow [[-x] as a range */
|
c_class = get_equi_class(®parse);
|
||||||
startc = *regparse++;
|
if (c_class != 0)
|
||||||
regc(startc);
|
{
|
||||||
|
/* produce equivalence class */
|
||||||
|
reg_equi_class(c_class);
|
||||||
|
}
|
||||||
|
else if ((c_class =
|
||||||
|
get_coll_element(®parse)) != 0)
|
||||||
|
{
|
||||||
|
/* produce a collating element */
|
||||||
|
regmbc(c_class);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* literal '[', allow [[-x] as a range */
|
||||||
|
startc = *regparse++;
|
||||||
|
regc(startc);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case CLASS_ALNUM:
|
case CLASS_ALNUM:
|
||||||
for (cu = 1; cu <= 255; cu++)
|
for (cu = 1; cu <= 255; cu++)
|
||||||
@ -2354,6 +2538,8 @@ initchr(str)
|
|||||||
static int
|
static int
|
||||||
peekchr()
|
peekchr()
|
||||||
{
|
{
|
||||||
|
static int after_slash = FALSE;
|
||||||
|
|
||||||
if (curchr == -1)
|
if (curchr == -1)
|
||||||
{
|
{
|
||||||
switch (curchr = regparse[0])
|
switch (curchr = regparse[0])
|
||||||
@ -2392,10 +2578,16 @@ peekchr()
|
|||||||
curchr = Magic(curchr);
|
curchr = Magic(curchr);
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
/* * is not magic as the very first character, eg "?*ptr" and when
|
/* * is not magic as the very first character, eg "?*ptr", when
|
||||||
* after '^', eg "/^*ptr" */
|
* after '^', eg "/^*ptr" and when after "\(", "\|", "\&". But
|
||||||
if (reg_magic >= MAGIC_ON && !at_start
|
* "\(\*" is not magic, thus must be magic if "after_slash" */
|
||||||
&& !(prev_at_start && prevchr == Magic('^')))
|
if (reg_magic >= MAGIC_ON
|
||||||
|
&& !at_start
|
||||||
|
&& !(prev_at_start && prevchr == Magic('^'))
|
||||||
|
&& (after_slash
|
||||||
|
|| (prevchr != Magic('(')
|
||||||
|
&& prevchr != Magic('&')
|
||||||
|
&& prevchr != Magic('|'))))
|
||||||
curchr = Magic('*');
|
curchr = Magic('*');
|
||||||
break;
|
break;
|
||||||
case '^':
|
case '^':
|
||||||
@ -2460,8 +2652,10 @@ peekchr()
|
|||||||
prev_at_start = at_start;
|
prev_at_start = at_start;
|
||||||
at_start = FALSE; /* be able to say "/\*ptr" */
|
at_start = FALSE; /* be able to say "/\*ptr" */
|
||||||
++regparse;
|
++regparse;
|
||||||
|
++after_slash;
|
||||||
peekchr();
|
peekchr();
|
||||||
--regparse;
|
--regparse;
|
||||||
|
--after_slash;
|
||||||
curchr = toggle_Magic(curchr);
|
curchr = toggle_Magic(curchr);
|
||||||
}
|
}
|
||||||
else if (vim_strchr(REGEXP_ABBR, c))
|
else if (vim_strchr(REGEXP_ABBR, c))
|
||||||
@ -2723,7 +2917,7 @@ read_limits(minval, maxval)
|
|||||||
*maxval = MAX_LIMIT; /* It was \{} or \{-} */
|
*maxval = MAX_LIMIT; /* It was \{} or \{-} */
|
||||||
if (*regparse == '\\')
|
if (*regparse == '\\')
|
||||||
regparse++; /* Allow either \{...} or \{...\} */
|
regparse++; /* Allow either \{...} or \{...\} */
|
||||||
if (*regparse != '}' || (*maxval == 0 && *minval == 0))
|
if (*regparse != '}')
|
||||||
{
|
{
|
||||||
sprintf((char *)IObuff, _("E554: Syntax error in %s{...}"),
|
sprintf((char *)IObuff, _("E554: Syntax error in %s{...}"),
|
||||||
reg_magic == MAGIC_ALL ? "" : "\\");
|
reg_magic == MAGIC_ALL ? "" : "\\");
|
||||||
@ -2815,7 +3009,7 @@ static void save_se_one __ARGS((save_se_T *savep, char_u **pp));
|
|||||||
*(pp) = (savep)->se_u.ptr; }
|
*(pp) = (savep)->se_u.ptr; }
|
||||||
|
|
||||||
static int re_num_cmp __ARGS((long_u val, char_u *scan));
|
static int re_num_cmp __ARGS((long_u val, char_u *scan));
|
||||||
static int regmatch __ARGS((char_u *prog));
|
static int regmatch __ARGS((char_u *prog, regsave_T *startp));
|
||||||
static int regrepeat __ARGS((char_u *p, long maxcount));
|
static int regrepeat __ARGS((char_u *p, long maxcount));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -3273,7 +3467,7 @@ regtry(prog, col)
|
|||||||
need_clear_zsubexpr = TRUE;
|
need_clear_zsubexpr = TRUE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (regmatch(prog->program + 1))
|
if (regmatch(prog->program + 1, NULL))
|
||||||
{
|
{
|
||||||
cleanup_subexpr();
|
cleanup_subexpr();
|
||||||
if (REG_MULTI)
|
if (REG_MULTI)
|
||||||
@ -3379,8 +3573,9 @@ static long bl_maxval;
|
|||||||
* undefined state!
|
* undefined state!
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
regmatch(scan)
|
regmatch(scan, startp)
|
||||||
char_u *scan; /* Current node. */
|
char_u *scan; /* Current node. */
|
||||||
|
regsave_T *startp; /* start position for BACK */
|
||||||
{
|
{
|
||||||
char_u *next; /* Next node. */
|
char_u *next; /* Next node. */
|
||||||
int op;
|
int op;
|
||||||
@ -3803,6 +3998,10 @@ regmatch(scan)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BACK:
|
case BACK:
|
||||||
|
/* When we run into BACK without matching something non-empty, we
|
||||||
|
* fail. */
|
||||||
|
if (startp != NULL && reg_save_equal(startp))
|
||||||
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOPEN + 0: /* Match start: \zs */
|
case MOPEN + 0: /* Match start: \zs */
|
||||||
@ -3823,7 +4022,7 @@ regmatch(scan)
|
|||||||
cleanup_subexpr();
|
cleanup_subexpr();
|
||||||
save_se(&save, ®_startpos[no], ®_startp[no]);
|
save_se(&save, ®_startpos[no], ®_startp[no]);
|
||||||
|
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
restore_se(&save, ®_startpos[no], ®_startp[no]);
|
restore_se(&save, ®_startpos[no], ®_startp[no]);
|
||||||
@ -3833,7 +4032,7 @@ regmatch(scan)
|
|||||||
|
|
||||||
case NOPEN: /* \%( */
|
case NOPEN: /* \%( */
|
||||||
case NCLOSE: /* \) after \%( */
|
case NCLOSE: /* \) after \%( */
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
/* break; Not Reached */
|
/* break; Not Reached */
|
||||||
@ -3856,7 +4055,7 @@ regmatch(scan)
|
|||||||
cleanup_zsubexpr();
|
cleanup_zsubexpr();
|
||||||
save_se(&save, ®_startzpos[no], ®_startzp[no]);
|
save_se(&save, ®_startzpos[no], ®_startzp[no]);
|
||||||
|
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
restore_se(&save, ®_startzpos[no], ®_startzp[no]);
|
restore_se(&save, ®_startzpos[no], ®_startzp[no]);
|
||||||
@ -3883,7 +4082,7 @@ regmatch(scan)
|
|||||||
cleanup_subexpr();
|
cleanup_subexpr();
|
||||||
save_se(&save, ®_endpos[no], ®_endp[no]);
|
save_se(&save, ®_endpos[no], ®_endp[no]);
|
||||||
|
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
restore_se(&save, ®_endpos[no], ®_endp[no]);
|
restore_se(&save, ®_endpos[no], ®_endp[no]);
|
||||||
@ -3909,7 +4108,7 @@ regmatch(scan)
|
|||||||
cleanup_zsubexpr();
|
cleanup_zsubexpr();
|
||||||
save_se(&save, ®_endzpos[no], ®_endzp[no]);
|
save_se(&save, ®_endzpos[no], ®_endzp[no]);
|
||||||
|
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
restore_se(&save, ®_endzpos[no], ®_endzp[no]);
|
restore_se(&save, ®_endzpos[no], ®_endzp[no]);
|
||||||
@ -4076,7 +4275,7 @@ regmatch(scan)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(OPERAND(scan)))
|
if (regmatch(OPERAND(scan), &save))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
scan = regnext(scan);
|
scan = regnext(scan);
|
||||||
@ -4134,7 +4333,7 @@ regmatch(scan)
|
|||||||
? brace_min[no] : brace_max[no]))
|
? brace_min[no] : brace_max[no]))
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(OPERAND(scan)))
|
if (regmatch(OPERAND(scan), &save))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
--brace_count[no]; /* failed, decrement match count */
|
--brace_count[no]; /* failed, decrement match count */
|
||||||
@ -4148,11 +4347,11 @@ regmatch(scan)
|
|||||||
if (brace_count[no] <= brace_max[no])
|
if (brace_count[no] <= brace_max[no])
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(OPERAND(scan)))
|
if (regmatch(OPERAND(scan), &save))
|
||||||
return TRUE; /* matched some more times */
|
return TRUE; /* matched some more times */
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
--brace_count[no]; /* matched just enough times */
|
--brace_count[no]; /* matched just enough times */
|
||||||
/* continue with the items after \{} */
|
/* { continue with the items after \{} */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -4161,7 +4360,7 @@ regmatch(scan)
|
|||||||
if (brace_count[no] <= brace_min[no])
|
if (brace_count[no] <= brace_min[no])
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(next))
|
if (regmatch(next, &save))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
next = OPERAND(scan);
|
next = OPERAND(scan);
|
||||||
@ -4234,7 +4433,7 @@ regmatch(scan)
|
|||||||
|| *reginput == nextb_ic)
|
|| *reginput == nextb_ic)
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
}
|
}
|
||||||
@ -4271,7 +4470,7 @@ regmatch(scan)
|
|||||||
|| *reginput == nextb_ic)
|
|| *reginput == nextb_ic)
|
||||||
{
|
{
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(next))
|
if (regmatch(next, &save))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
}
|
}
|
||||||
@ -4295,7 +4494,7 @@ regmatch(scan)
|
|||||||
/* If the operand matches, we fail. Otherwise backup and
|
/* If the operand matches, we fail. Otherwise backup and
|
||||||
* continue with the next item. */
|
* continue with the next item. */
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (regmatch(OPERAND(scan)))
|
if (regmatch(OPERAND(scan), startp))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
}
|
}
|
||||||
@ -4309,7 +4508,7 @@ regmatch(scan)
|
|||||||
/* If the operand doesn't match, we fail. Otherwise backup
|
/* If the operand doesn't match, we fail. Otherwise backup
|
||||||
* and continue with the next item. */
|
* and continue with the next item. */
|
||||||
reg_save(&save);
|
reg_save(&save);
|
||||||
if (!regmatch(OPERAND(scan)))
|
if (!regmatch(OPERAND(scan), startp))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (op == MATCH) /* zero-width */
|
if (op == MATCH) /* zero-width */
|
||||||
reg_restore(&save);
|
reg_restore(&save);
|
||||||
@ -4331,7 +4530,7 @@ regmatch(scan)
|
|||||||
* faster.
|
* faster.
|
||||||
*/
|
*/
|
||||||
reg_save(&save_start);
|
reg_save(&save_start);
|
||||||
if (regmatch(next))
|
if (regmatch(next, startp))
|
||||||
{
|
{
|
||||||
/* save the position after the found match for next */
|
/* save the position after the found match for next */
|
||||||
reg_save(&save_after);
|
reg_save(&save_after);
|
||||||
@ -4347,7 +4546,7 @@ regmatch(scan)
|
|||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
reg_restore(&save_start);
|
reg_restore(&save_start);
|
||||||
if (regmatch(OPERAND(scan))
|
if (regmatch(OPERAND(scan), startp)
|
||||||
&& reg_save_equal(&behind_pos))
|
&& reg_save_equal(&behind_pos))
|
||||||
{
|
{
|
||||||
behind_pos = save_behind_pos;
|
behind_pos = save_behind_pos;
|
||||||
|
@ -38,6 +38,7 @@ STARTTEST
|
|||||||
:au BufReadPost *.gz !gzip <afile>:r
|
:au BufReadPost *.gz !gzip <afile>:r
|
||||||
:e! Xtestfile.gz " Edit compressed file
|
:e! Xtestfile.gz " Edit compressed file
|
||||||
:w>>test.out " Append it to the output file
|
:w>>test.out " Append it to the output file
|
||||||
|
:set shelltemp " need temp files here
|
||||||
:au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>").".t")
|
:au FilterReadPre *.out call rename(expand("<afile>"), expand("<afile>").".t")
|
||||||
:au FilterReadPre *.out !sed s/e/E/ <afile>.t ><afile>
|
:au FilterReadPre *.out !sed s/e/E/ <afile>.t ><afile>
|
||||||
:au FilterReadPre *.out !rm <afile>.t
|
:au FilterReadPre *.out !rm <afile>.t
|
||||||
|
@ -782,6 +782,8 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
|
|||||||
#define SHELL_COOKED 4 /* set term to cooked mode */
|
#define SHELL_COOKED 4 /* set term to cooked mode */
|
||||||
#define SHELL_DOOUT 8 /* redirecting output */
|
#define SHELL_DOOUT 8 /* redirecting output */
|
||||||
#define SHELL_SILENT 16 /* don't print error returned by command */
|
#define SHELL_SILENT 16 /* don't print error returned by command */
|
||||||
|
#define SHELL_READ 32 /* read lines and insert into buffer */
|
||||||
|
#define SHELL_WRITE 64 /* write lines from buffer */
|
||||||
|
|
||||||
/* Values returned by mch_nodetype() */
|
/* Values returned by mch_nodetype() */
|
||||||
#define NODE_NORMAL 0 /* file or directory, check with mch_isdir()*/
|
#define NODE_NORMAL 0 /* file or directory, check with mch_isdir()*/
|
||||||
@ -885,9 +887,10 @@ extern char *(*dyn_libintl_textdomain)(const char *domainname);
|
|||||||
/* flags for do_put() */
|
/* flags for do_put() */
|
||||||
#define PUT_FIXINDENT 1 /* make indent look nice */
|
#define PUT_FIXINDENT 1 /* make indent look nice */
|
||||||
#define PUT_CURSEND 2 /* leave cursor after end of new text */
|
#define PUT_CURSEND 2 /* leave cursor after end of new text */
|
||||||
#define PUT_LINE 4 /* put register as lines */
|
#define PUT_CURSLINE 4 /* leave cursor on last line of new text */
|
||||||
#define PUT_LINE_SPLIT 8 /* split line for linewise register */
|
#define PUT_LINE 8 /* put register as lines */
|
||||||
#define PUT_LINE_FORWARD 16 /* put linewise register below Visual sel. */
|
#define PUT_LINE_SPLIT 16 /* split line for linewise register */
|
||||||
|
#define PUT_LINE_FORWARD 32 /* put linewise register below Visual sel. */
|
||||||
|
|
||||||
/* flags for set_indent() */
|
/* flags for set_indent() */
|
||||||
#define SIN_CHANGED 1 /* call changed_bytes() when line changed */
|
#define SIN_CHANGED 1 /* call changed_bytes() when line changed */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user