.vimrc加上下面两句话可以高亮光标所在的行列
set cursorcolumn
set cursorline

.VIMRC的写法

 if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"set fileencodings=ucs-bom,utf-8,latin1
endifset nocompatible   " Use Vim defaults (much better!)
set bs=indent,eol,start        " allow backspacing over everything in insert mode
"set ai            " always set autoindenting on
"set backup        " keep a backup file
set viminfo='20,\"50 " read/write a .viminfo file, don't store more" than 50 lines of registers
set history=50     " keep 50 lines of command line history
set ruler       " show the cursor position all the time
set backspace=2" Only do this part when compiled with support for autocommands
if has("autocmd")augroup redhatautocmd!" In text files, always limit the width of text to 78 characters" autocmd BufRead *.txt set tw=78" When editing a file, always jump to the last cursor positionautocmd BufReadPost *\ if line("'\"") > 0 && line ("'\"") <= line("$") |\   exe "normal! g'\"" |\ endif" don't write swapfile on most commonly used directories for NFS mounts or USB sticksautocmd BufNewFile,BufReadPre /media/*,/run/media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp" start with spec file templateautocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.specaugroup END
endifif has("cscope") && filereadable("/usr/bin/cscope")set csprg=/usr/bin/cscopeset csto=0set cstset nocsverb" add any database in current directoryif filereadable("cscope.out")cs add $PWD/cscope.out" else add database pointed to by environmentelseif $CSCOPE_DB != ""cs add $CSCOPE_DBendifset csverb
endif" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")syntax onset hlsearch
endiffiletype plugin onif &term=="xterm"set t_Co=8set t_Sb=[4%dmset t_Sf=[3%dm
endif" Don't wake up system with blinking cursor:
" http://www.linuxpowertop.org/known.php
let &guicursor = &guicursor . ",a:blinkon0"let b:match_words='\<begin\>:\<end\>,'
\ . '\<module\>:\<endmodule\>,'
\ . '\<class\>:\<endclass\>,'
\ . '\<fork\>:\<join\>,'
\ . '\<task\>:\<endtask\>,'
\ . '\<function\>:\<endfunction\>,'
\ . '\<if\>:\<else if\>:\<else\>,'
\ . '\<if\>:\<else\>,'
\ . '\<ifdef\>:\<endif\>,'
\ . '\<ifndef\>:\<endif\>,'
\ . '\<ifdef\>:\<elsif\>:\<endif\>,'
\ . '\<program\>:\<endprogram\>,'
\ . '\<while\>:\<continue\>:<break\>:\<endwhile\>'
let b:matchit_ignorecase=1    " write by myself
:set number
colorscheme desert " below is for coding style
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"" Text, tab and indent related
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Be smart when using tabs
set smarttab" Use spaces instead of tabs
set et      " expandtab" 1 tab == 4 spaces
set tabstop=4
set softtabstop=4
set shiftwidth=4" Linebreak on 500 characters
set lbr
set tw=500set ai      " Auto indent
set si      " Smart indent
set wrap    " Wrap lines
set hls     " high light serch
set is      " incsearch""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"" autocmd  i think guangbiao more convenint
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
au BufRead,BufNewFile *.v,*.sv,*.vh,*.svh,*.inc  set syntax=systemverilog
au BufRead,BufNewFile *.md set syntax=markdown
au BufRead,BufNewFile *cshrc set syntax=cshimap    <C-x>   <Del>
imap    <C-H>   <Left>
imap    <C-J>   <Down>
imap    <C-K>   <Up>
imap    <C-L>   <Right>""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vmap    <F2>          :s/\(\/\*\_.\{-}\*\/\\|\/\/.*$\)*\(\_.\)/\2/g<CR>\:'<,'>s/\(\<output\>\\|\<input\>\\|\<inout\>\\|\<parameter\>\\|\<localparam\>\\|\[\_.\{-}]\\|=\_.\{-}\(,\\|)\)\)*\\|\(\_.\)/\2\3/g<CR>\:'<,'>s/module\_s*\(\w\+\)\_s*\(#\_s*(\_.\{-})\)\?\_s*\((\_.\{-})\)\_s*;/\1 \2 u_\1 \3;/g<CR>\:'<,'>s/\_s*\(#\?\)\_s*\((\\|)\)\_s*/\r\1 \2\r/g<CR>\:'<,'>s/\s*\(\w\+\)\_s*(/\t\1\r(/g<CR>\:'<,'>s/^\s*//g<CR>\:'<,'>s/\s*$//g<CR>\:'<,'>s/\_s*\(,\\|;\)/\1/g<CR>\:'<,'>s/\s\+/ /g<CR>\:'<,'>s/\n\?\s*\(\w\+\)\(\_s*\)\(,\\|)\)/\r\1\2\3/g<CR>:retab<CR>\:'<,'>s/^\(\<\w\{1,6}\)\(\_s*\)\(,\\|)\)/\t.\1\t\t\t(\1\t\t\t)\2\3/g<CR>:retab<CR>\:'<,'>s/^\(\<\w\{7,14}\)\(\_s*\)\(,\\|)\)/\t.\1\t\t(\1\t\t)\2\3/g<CR>:retab<CR>\:'<,'>s/^\(\<\w\{15,22}\)\(\_s*\)\(,\\|)\)/\t.\1\t(\1\t)\2\3/g<CR>:retab<CR>\:'<,'>s/^\(\<\w\{23,}\)\(\_s*\)\(,\\|)\)/\t.\1(\1)\2\3/g<CR>:retab<CR>map     <F3>    :call SetFileHeader()<CR>
"nmap    <F4>    A<End> import dlgms__pkg::*; <Esc>
"imap    <F5>     <End> // modified by shawang, <Esc>:read !date +\%F\ \%T<CR>kJi
"nmap    <F5>    i<End> // modified by shawang, <Esc>:read !date +\%F\ \%T<CR>kJ
"autocmd BufNewFile               *.v,*.sv,*.vh,*.svh,*.va,*.vams exec ':call SetFileHeader()' | exec ':call SetFileBody()'
autocmd BufNewFile               *.v,*.sv,*.vh,*.svh,*.va,*.vams exec ':call SetFileHeader()'
autocmd FileWritePre,BufWritePre *.v,*.sv,*.vh,*.svh,*.va,*.vams call UpdateFileHeader()func SetFileBody()
if expand("%:e") == 'v' || expand("%:e") == 'sv'call append(24, '`timescale 1ns / 100ps')call append(25, '')
elseif expand("%:e") == 'va'call append(24, '`include "discipline.h"')call append(25, '`include "constants.h"')
elseif expand("%:e") == 'vams'call append(24, '`include "disciplines.vams"')call append(25, '`include "constants.vams"')
elsecall append(24, '')call append(25, '')
endifcall append(26, '')call append(27, 'module '.expand("%:t:r"))call append(28, '(')call append(29, ');')call append(30, '')call append(31, '// ---------------------------------------------------------------------------')call append(32, '//')call append(33, '// ---------------------------------------------------------------------------')call append(34, '')call append(35, '// ---------------------------------------------------------------------------')call append(36, '// endmodule')call append(37, '// ---------------------------------------------------------------------------')call append(38, 'endmodule')call append(39, '')normal 28G
endfuncfunc SetFileHeader()call append( 0, '// ---------------------------------------------------------------------------')call append( 1, '//      Copyright (C) '.strftime("%Y").' Dialog Semiconductor GmbH and its Affiliates,')call append( 2, '//      unpublished work')call append( 3, '//')call append( 4, '//      This computer program includes Confidential, Proprietary Information')call append( 5, '//      and is a Trade Secret of Dialog Semiconductor GmbH and its Affiliates.')call append( 6, '//      All use, disclosure, and/or reproduction is prohibited unless ')call append( 7, '//      authorized in writing. All Rights Reserved.')call append( 8, '//')call append( 9, '// ---------------------------------------------------------------------------')
if expand("%:e") == 'v' call append(10, '//      Verilog (LRM 1985-2001) Source')
elseif expand("%:e") == 'sv' || expand("%:e") == 'vh' || expand("%:e") == 'svh'call append(10, '//      System Verilog Source ')
elseif expand("%:e") == 'va' || expand("%:e") == 'vams'call append(10, '//      Verilog-A/AMS Source ')
elsecall append(10, '//')
endifcall append(11, '// ---------------------------------------------------------------------------')call append(12, '//')call append(13, '//      File name       : '.expand("%:t"))call append(14, '//      Project         : '.expand("$PROJ_NAME"))call append(15, '//      Date            : $Date: '.strftime("%A %Y-%m-%d %H:%M:%S").' $')"call append(15, '//      Date            : $Date: '.strftime("%a %b %d %T %Y")."$")call append(16, '//      Revision        : $Revision: 1.0 $')call append(17, '//      Original Author : '.expand("$USER").', '.strftime("%A %Y-%m-%d %H:%M:%S"))"call append(17, '//      Original Author : $USER, '.strftime("%a %b %d %T %Y"))call append(18, '//      Last changed by : $Author: '.expand("$USER").' $')call append(19, '//      Department      : CTC-DIG')call append(20, '//')call append(21, '// ---------------------------------------------------------------------------')call append(22, '// Description:')call append(23, '// ---------------------------------------------------------------------------')normal 25G
if expand("%:e") == 'v' || expand("%:e") == 'va' || expand("%:e") == 'vams'call SetFileBody()
endif
endfuncfunc UpdateFileHeader()
let cur_line = line('.')
let cur_col  = col ('.')
call cursor(15,1)
if search ('Last modified :') != 0let line = line('.')call setline(line, '// Last modified : '.strftime("%A %Y-%m-%d %H:%M:%S"))
endif
call cursor(19,1)
if search ('Last changed by') != 0let line = line('.')call setline(line, '//      Last changed by : $Author: '.expand("$USER").' $')
endif
call cursor(16,1)
if search ('//      Date') != 0let line = line('.')call setline(line, '//      Date            : $Date: '.strftime("%A %Y %m %d %H:%M:%S").' $')
endif
call cursor(cur_line,cur_col)
endfunc"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"" verilog/systemverilog insert
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap    mb      :call SetFileBody()<CR>nmap    ma      o <ESC>00dwi\always @ (posedge clk or negedge rst_n) begin<CR>\    if (!rst_n)<CR>\end<CR><ESC><UP>00dw<Up>onmap    mc      o<ESC>i\// ---------------------------------------------------------------------------<CR>\//<CR>\// ---------------------------------------------------------------------------<CR>\<ESC><Up><Up>A nmap    md      :call Setdefine()<CR>
func Setdefine()let a:defname = toupper('DIA_'.expand("$PROJ_NAME").'_'.expand("%:t:r").'_'.expand("%:e"))call cursor(23,1)if search ('// Description:') != 0let line = 24elselet line = 0endifcall append(line+0, '`ifndef '.a:defname)call append(line+1, '`define '.a:defname)normal Gcall append(line('.'), '`endif')
endfuncnmap    mm      A // modified by dachen, <Esc>:read !date +\%F\ \%T<CR>kJ nmap    mi      A import dlgms__pkg::*; <Esc>"" not worked yet
map <C-s> <ESC> :call Setalways()<CR>
func Setalways()call append(line(".")+0, 'always @ ( posedge clk or negedge rst_n ) begin')call append(line(".")+1, '    if (!rst_n)')call append(line(".")+2, '    else')call append(line(".")+3, 'end')call append(line(".")+4, '')
endfunc"" not worked yet
map <C-1> :call SetSeparator()<CR>
func SetSeparator()call append(line('.')+0, '// ---------------------------------------------------------------------------')call append(line('.')+1, '// ')call append(line('.')+2, '// ---------------------------------------------------------------------------')call append(line('.')+3, '')
endfunc

在.vim文件夹下mkdir doc,然后创建matchit.txt

*matchit.txt*   Extended "%" matchingFor instructions on installing this file, type:help matchit-install
inside Vim.For Vim version 6.3.  Last change:  2007 Aug 29VIM REFERENCE MANUAL    by Benji Fisher*matchit* *matchit.vim*1. Extended matching with "%"             |matchit-intro|
2. Activation                       |matchit-activate|
3. Configuration                    |matchit-configure|
4. Supporting a New Language                |matchit-newlang|
5. Known Bugs and Limitations               |matchit-bugs|The functionality mentioned here is a plugin, see |add-plugin|.
This plugin is only available if 'compatible' is not set.
You can avoid loading this plugin by setting the "loaded_matchit" variable
in your |vimrc| file: >:let loaded_matchit = 1{Vi does not have any of this}==============================================================================
1. Extended matching with "%"             *matchit-intro**matchit-%*
%   Cycle forward through matching groups, such as "if", "else", "endif",as specified by |b:match_words|.*g%* *v_g%* *o_g%*
g%  Cycle backwards through matching groups, as specified by|b:match_words|.  For example, go from "if" to "endif" to "else".*[%* *v_[%* *o_[%*
[%  Go to [count] previous unmatched group, as specified by|b:match_words|.  Similar to |[{|.*]%* *v_]%* *o_]%*
]%  Go to [count] next unmatched group, as specified by|b:match_words|.  Similar to |]}|.*v_a%*
a%  In Visual mode, select the matching group, as specified by|b:match_words|, containing the cursor.  Similar to |v_a[|.A [count] is ignored, and only the first character of the closingpattern is selected.In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace,
bracket, or paren to its match.  This can be configured with the 'matchpairs'
option.  The matchit plugin extends this in several ways:You can match whole words, such as "if" and "endif", not justsingle characters.  You can also specify a |regular-expression|.You can define groups with more than two words, such as "if","else", "endif".  Banging on the "%" key will cycle from the "if" tothe first "else", the next "else", ..., the closing "endif", and backto the opening "if".  Nested structures are skipped.  Using |g%| goesin the reverse direction.By default, words inside comments and strings are ignored, unlessthe cursor is inside a comment or string when you type "%".  If theonly thing you want to do is modify the behavior of "%" so that itbehaves this way, you do not have to define |b:match_words|, since thescript uses the 'matchpairs' option as well as this variable.See |matchit-details| for details on what the script does, and |b:match_words|
for how to specify matching patterns.MODES:         *matchit-modes* *matchit-v_%* *matchit-o_%*Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in
|motion| commands in |Operator-pending| and |Visual| modes.  However, you
cannot make these motions |linewise| or |characterwise|, since the |:omap|s
that define them start with "v" in order to make the default behavior
inclusive.  (See |o_v|.)  In other words, "dV%" will not work.  The
work-around is to go through Visual mode:  "V%d" will work.LANGUAGES:                 *matchit-languages*Currently, the following languages are supported:  Ada, ASP with VBS, Csh,
DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal,
SGML, Shell, Tcsh, Vim, XML.  Other languages may already have support via
the default |filetype-plugin|s in the standard vim distribution.To support a new language, see |matchit-newlang| below.DETAILS:             *matchit-details* *matchit-parse*Here is an outline of what matchit.vim does each time you hit the "%" key.  If
there are |backref|s in |b:match_words| then the first step is to produce a
version in which these back references have been eliminated; if there are no
|backref|s then this step is skipped.  This step is called parsing.  For
example, "\(foo\|bar\):end\1" is parsed to yield
"\(foo\|bar\):end\(foo\|bar\)".  This can get tricky, especially if there are
nested groups.  If debugging is turned on, the parsed version is saved as
|b:match_pat|.*matchit-choose*
Next, the script looks for a word on the current line that matches the pattern
just constructed.  It includes the patterns from the 'matchpairs' option.
The goal is to do what you expect, which turns out to be a little complicated.
The script follows these rules:Insist on a match that ends on or after the cursor.Prefer a match that includes the cursor position (that is, one thatstarts on or before the cursor).Prefer a match that starts as close to the cursor as possible.If more than one pattern in |b:match_words| matches, choose the onethat is listed first.Examples:Suppose you >:let b:match_words = '<:>,<tag>:</tag>'
<    and hit "%" with the cursor on or before the "<" in "a <tag> is born".The pattern '<' comes first, so it is preferred over '<tag>', whichalso matches.  If the cursor is on the "t", however, then '<tag>' ispreferred, because this matches a bit of text containing the cursor.If the two groups of patterns were reversed then '<' would never bepreferred.Suppose you >:let b:match_words = 'if:end if'
<    (Note the space!) and hit "%" with the cursor at the end of "end if".Then "if" matches, which is probably not what you want, but if thecursor starts on the "end " then "end if" is chosen.  (You can avoidthis problem by using a more complicated pattern.)If there is no match, the cursor does not move.  (Before version 1.13 of the
script, it would fall back on the usual behavior of |%|).  If debugging is
turned on, the matched bit of text is saved as |b:match_match| and the cursor
column of the start of the match is saved as |b:match_col|.Next, the script looks through |b:match_words| (original and parsed versions)
for the group and pattern that match.  If debugging is turned on, the group is
saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest).  If
there are |backref|s then, in addition, the matching pattern is saved as
|b:match_word| and a table of translations is saved as |b:match_table|.  If
there are |backref|s, these are determined from the matching pattern and
|b:match_match| and substituted into each pattern in the matching group.The script decides whether to search forwards or backwards and chooses
arguments for the |searchpair()| function.  Then, the cursor is moved to the
start of the match, and |searchpair()| is called.  By default, matching
structures inside strings and comments are ignored.  This can be changed by
setting |b:match_skip|.==============================================================================
2. Activation                       *matchit-activate*You can use this script as a plugin, by copying it to your plugin directory.
See |add-global-plugin| for instructions.  You can also add a line to your
|vimrc| file, such as >:source $VIMRUNTIME/macros/matchit.vim
or >:runtime macros/matchit.vim
Either way, the script should start working the next time you start up Vim.(Earlier versions of the script did nothing unless a |buffer-variable| named
|b:match_words| was defined.  Even earlier versions contained autocommands
that set this variable for various file types.  Now, |b:match_words| is
defined in many of the default |filetype-plugin|s instead.)For a new language, you can add autocommands to the script or to your vimrc
file, but the recommended method is to add a line such as >let b:match_words = '\<foo\>:\<bar\>'
to the |filetype-plugin| for your language.  See |b:match_words| below for how
this variable is interpreted.TROUBLESHOOTING                    *matchit-troubleshoot*The script should work in most installations of Vim.  It may not work if Vim
was compiled with a minimal feature set, for example if the |+syntax| option
was not enabled.  If your Vim has support for syntax compiled in, but you do
not have |syntax| highlighting turned on, matchit.vim should work, but it may
fail to skip matching groups in comments and strings.  If the |filetype|
mechanism is turned off, the |b:match_words| variable will probably not be
defined automatically.==============================================================================
3. Configuration                    *matchit-configure*There are several variables that govern the behavior of matchit.vim.  Note
that these are variables local to the buffer, not options, so use |:let| to
define them, not |:set|.  Some of these variables have values that matter; for
others, it only matters whether the variable has been defined.  All of these
can be defined in the |filetype-plugin| or autocommand that defines
|b:match_words| or "on the fly."The main variable is |b:match_words|.  It is described in the section below on
supporting a new language.*MatchError* *matchit-hl* *matchit-highlight*
MatchError is the highlight group for error messages from the script.  By
default, it is linked to WarningMsg.  If you do not want to be bothered by
error messages, you can define this to be something invisible.  For example,
if you use the GUI version of Vim and your command line is normally white, you
can do >:hi MatchError guifg=white guibg=white
<*b:match_ignorecase*
If you >:let b:match_ignorecase = 1
then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END"
are equivalent.  If you >:let b:match_ignorecase = 0
then matchit.vim treats "end" and "END" differently.  (There will be no
b:match_infercase option unless someone requests it.)*b:match_debug*
Define b:match_debug if you want debugging information to be saved.  See
|matchit-debug|, below.*b:match_skip*
If b:match_skip is defined, it is passed as the skip argument to
|searchpair()|.  This controls when matching structures are skipped, or
ignored.  By default, they are ignored inside comments and strings, as
determined by the |syntax| mechanism.  (If syntax highlighting is turned off,
nothing is skipped.)  You can set b:match_skip to a string, which evaluates to
a non-zero, numerical value if the match is to be skipped or zero if the match
should not be skipped.  In addition, the following special values are
supported by matchit.vim:s:foo becomes (current syntax item) =~ fooS:foo becomes (current syntax item) !~ foor:foo becomes (line before cursor) =~ fooR:foo becomes (line before cursor) !~ foo
(The "s" is meant to suggest "syntax", and the "r" is meant to suggest
"regular expression".)Examples:You can get the default behavior with >:let b:match_skip = 's:comment\|string'
<If you want to skip matching structures unless they are at the startof the line (ignoring whitespace) then you can >:let b:match_skip = 'R:^\s*'
<    Do not do this if strings or comments can span several lines, sincethe normal syntax checking will not be done if you set b:match_skip.In LaTeX, since "%" is used as the comment character, you can >:let b:match_skip = 'r:%'
<    Unfortunately, this will skip anything after "\%", an escaped "%".  Toallow for this, and also "\\%" (an excaped backslash followed by thecomment character) you can >:let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%'
<See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses bothsyntax and a regular expression.==============================================================================
4. Supporting a New Language                *matchit-newlang**b:match_words*
In order for matchit.vim to support a new language, you must define a suitable
pattern for |b:match_words|.  You may also want to set some of the
|matchit-configure| variables, as described above.  If your language has a
complicated syntax, or many keywords, you will need to know something about
Vim's |regular-expression|s.The format for |b:match_words| is similar to that of the 'matchpairs' option:
it is a comma (,)-separated list of groups; each group is a colon(:)-separated
list of patterns (regular expressions).  Commas and backslashes that are part
of a pattern should be escaped with backslashes ('\:' and '\,').  It is OK to
have only one group; the effect is undefined if a group has only one pattern.
A simple example is >:let b:match_words = '\<if\>:\<endif\>,'\ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>'
(In Vim regular expressions, |\<| and |\>| denote word boundaries.  Thus "if"
matches the end of "endif" but "\<if\>" does not.)  Then banging on the "%"
key will bounce the cursor between "if" and the matching "endif"; and from
"while" to any matching "continue" or "break", then to the matching "endwhile"
and back to the "while".  It is almost always easier to use |literal-string|s
(single quotes) as above:  '\<if\>' rather than "\\<if\\>" and so on.Exception:  If the ":" character does not appear in b:match_words, then it is
treated as an expression to be evaluated.  For example, >:let b:match_words = 'GetMatchWords()'
allows you to define a function.  This can return a different string depending
on the current syntax, for example.Once you have defined the appropriate value of |b:match_words|, you will
probably want to have this set automatically each time you edit the
appropriate file type.  The recommended way to do this is by adding the
definition to a |filetype-plugin| file.Tips: Be careful that your initial pattern does not match your final pattern.
See the example above for the use of word-boundary expressions.  It is usually
better to use ".\{-}" (as many as necessary) instead of ".*" (as many as
possible).  See |\{-|.  For example, in the string "<tag>label</tag>", "<.*>"
matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "<tag>" and
"</tag>".*matchit-spaces* *matchit-s:notend*
If "if" is to be paired with "end if" (Note the space!) then word boundaries
are not enough.  Instead, define a regular expression s:notend that will match
anything but "end" and use it as follows: >:let s:notend = '\%(\<end\s\+\)\@<!':let b:match_words = s:notend . '\<if\>:\<end\s\+if\>'
<                            *matchit-s:sol*
This is a simplified version of what is done for Ada.  The s:notend is a
|script-variable|.  Similarly, you may want to define a start-of-line regular
expression >:let s:sol = '\%(^\|;\)\s*'
if keywords are only recognized after the start of a line or after a
semicolon (;), with optional white space.*matchit-backref* *matchit-\1*
In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the
INITIAL pattern enclosed in |\(|escaped parentheses|\)|.  These are referred
to as back references, or backrefs.  For example, >:let b:match_words = '\<b\(o\+\)\>:\(h\)\1\>'
means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on.  Note
that "\1" does not refer to the "\(h\)" in this example.  If you have
"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything
up to and including the matching "\)":  in "\(nested\(parentheses\)\)", "\1"
refers to everything and "\2" refers to "\(parentheses\)".  If you use a
variable such as |s:notend| or |s:sol| in the previous paragraph then remember
to count any "\(" patterns in this variable.  You do not have to count groups
defined by |\%(\)|.It should be possible to resolve back references from any pattern in the
group.  For example, >:let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2'
would not work because "\2" cannot be determined from "morefoo" and "\1"
cannot be determined from "andbar".  On the other hand, >:let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1'
should work (and have the same effect as "foobar:barfoo:endfoobar"), although
this has not been thoroughly tested.You can use |zero-width| patterns such as |\@<=| and |\zs|.  (The latter has
not been thouroughly tested in matchit.vim.)  For example, if the keyword "if"
must occur at the start of the line, with optional white space, you might use
the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of
at the start of the line.  For another example, if HTML had only one tag then
one could >:let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>'
so that "%" can bounce between matching "<" and ">" pairs or (starting on
"tag" or "/tag") between matching tags.  Without the |\@<=|, the script would
bounce from "tag" to the "<" in "</tag>", and another "%" would not take you
back to where you started.DEBUGGING             *matchit-debug* *:MatchDebug*If you are having trouble figuring out the appropriate definition of
|b:match_words| then you can take advantage of the same information I use when
debugging the script.  This is especially true if you are not sure whether
your patterns or my script are at fault!  To make this more convenient, I have
made the command :MatchDebug, which defines the variable |b:match_debug| and
creates a Matchit menu.  This menu makes it convenient to check the values of
the variables described below.  You will probably also want to read
|matchit-details| above.Defining the variable |b:match_debug| causes the script to set the following
variables, each time you hit the "%" key.  Several of these are only defined
if |b:match_words| includes |backref|s.*b:match_pat*
The b:match_pat variable is set to |b:match_words| with |backref|s parsed.*b:match_match*
The b:match_match variable is set to the bit of text that is recognized as a
match.*b:match_col*
The b:match_col variable is set to the cursor column of the start of the
matching text.*b:match_wholeBR*
The b:match_wholeBR variable is set to the comma-separated group of patterns
that matches, with |backref|s unparsed.*b:match_iniBR*
The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|.*b:match_ini*
The b:match_ini variable is set to the first pattern in |b:match_wholeBR|,
with |backref|s resolved from |b:match_match|.*b:match_tail*
The b:match_tail variable is set to the remaining patterns in
|b:match_wholeBR|, with |backref|s resolved from |b:match_match|.*b:match_word*
The b:match_word variable is set to the pattern from |b:match_wholeBR| that
matches |b:match_match|.*b:match_table*
The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in
|b:match_word|.==============================================================================
5. Known Bugs and Limitations               *matchit-bugs*Just because I know about a bug does not mean that it is on my todo list.  I
try to respond to reports of bugs that cause real problems.  If it does not
cause serious problems, or if there is a work-around, a bug may sit there for
a while.  Moral:  if a bug (known or not) bothers you, let me know.The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may
have undesired effects in Select mode |Select-mode-mapping|.  At least, if you
want to replace the selection with any character in "ag%[]" there will be a
pause of |'updatetime'| first.It would be nice if "\0" were recognized as the entire pattern.  That is, it
would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1".  I may
try to implement this in a future version.  (This is not so easy to arrange as
you might think!)==============================================================================
vim:tw=78:fo=tcq2:

在.vim文件夹下mkdir plugin,然后创建matchit.vim

"  matchit.vim: (global plugin) Extended "%" matching
"  Last Change: Fri Jan 25 10:00 AM 2008 EST
"  Maintainer:  Benji Fisher PhD   <benji@member.AMS.org>
"  Version:     1.13.2, for Vim 6.3+
"  URL:        http://www.vim.org/script.php?script_id=39" Documentation:
"  The documentation is in a separate file, matchit.txt ." Credits:
"  Vim editor by Bram Moolenaar (Thanks, Bram!)
"  Original script and design by Raul Segura Acevedo
"  Support for comments by Douglas Potts
"  Support for back references and other improvements by Benji Fisher
"  Support for many languages by Johannes Zellner
"  Suggestions for improvement, bug reports, and support for additional
"  languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark
"  Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner." Debugging:
"  If you'd like to try the built-in debugging commands...
"   :MatchDebug      to activate debugging for the current buffer
"  This saves the values of several key script variables as buffer-local
"  variables.  See the MatchDebug() function, below, for details." TODO:  I should think about multi-line patterns for b:match_words.
"   This would require an option:  how many lines to scan (default 1).
"   This would be useful for Python, maybe also for *ML.
" TODO:  Maybe I should add a menu so that people will actually use some of
"   the features that I have implemented.
" TODO:  Eliminate the MultiMatch function.  Add yet another argument to
"   Match_wrapper() instead.
" TODO:  Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1'
" TODO:  Make backrefs safer by using '\V' (very no-magic).
" TODO:  Add a level of indirection, so that custom % scripts can use my
"   work but extend it." allow user to prevent loading
" and prevent duplicate loading
if exists("loaded_matchit") || &cpfinish
endif
let loaded_matchit = 1
let s:last_mps = ""
let s:last_words = ":"let s:save_cpo = &cpo
set cpo&vimnnoremap <silent> %  :<C-U>call <SID>Match_wrapper('',1,'n') <CR>
nnoremap <silent> g% :<C-U>call <SID>Match_wrapper('',0,'n') <CR>
vnoremap <silent> %  :<C-U>call <SID>Match_wrapper('',1,'v') <CR>m'gv``
vnoremap <silent> g% :<C-U>call <SID>Match_wrapper('',0,'v') <CR>m'gv``
onoremap <silent> %  v:<C-U>call <SID>Match_wrapper('',1,'o') <CR>
onoremap <silent> g% v:<C-U>call <SID>Match_wrapper('',0,'o') <CR>" Analogues of [{ and ]} using matching patterns:
nnoremap <silent> [% :<C-U>call <SID>MultiMatch("bW", "n") <CR>
nnoremap <silent> ]% :<C-U>call <SID>MultiMatch("W",  "n") <CR>
vmap [% <Esc>[%m'gv``
vmap ]% <Esc>]%m'gv``
" vnoremap <silent> [% :<C-U>call <SID>MultiMatch("bW", "v") <CR>m'gv``
" vnoremap <silent> ]% :<C-U>call <SID>MultiMatch("W",  "v") <CR>m'gv``
onoremap <silent> [% v:<C-U>call <SID>MultiMatch("bW", "o") <CR>
onoremap <silent> ]% v:<C-U>call <SID>MultiMatch("W",  "o") <CR>" text object:
vmap a% <Esc>[%v]%" Auto-complete mappings:  (not yet "ready for prime time")
" TODO Read :help write-plugin for the "right" way to let the user
" specify a key binding.
"   let g:match_auto = '<C-]>'
"   let g:match_autoCR = '<C-CR>'
" if exists("g:match_auto")
"   execute "inoremap " . g:match_auto . ' x<Esc>"=<SID>Autocomplete()<CR>Pls'
" endif
" if exists("g:match_autoCR")
"   execute "inoremap " . g:match_autoCR . ' <CR><C-R>=<SID>Autocomplete()<CR>'
" endif
" if exists("g:match_gthhoh")
"   execute "inoremap " . g:match_gthhoh . ' <C-O>:call <SID>Gthhoh()<CR>'
" endif " gthhoh = "Get the heck out of here!"let s:notslash = '\\\@<!\%(\\\\\)*'function! s:Match_wrapper(word, forward, mode) range" In s:CleanUp(), :execute "set" restore_options .let restore_options = (&ic ? " " : " no") . "ignorecase"if exists("b:match_ignorecase")let &ignorecase = b:match_ignorecaseendiflet restore_options = " ve=" . &ve . restore_optionsset ve=" If this function was called from Visual mode, make sure that the cursor" is at the correct end of the Visual range:if a:mode == "v"execute "normal! gv\<Esc>"endif" In s:CleanUp(), we may need to check whether the cursor moved forward.let startline = line(".")let startcol = col(".")" Use default behavior if called with a count.if v:countexe "normal! " . v:count . "%"return s:CleanUp(restore_options, a:mode, startline, startcol)end" First step:  if not already done, set the script variables"   s:do_BR  flag for whether there are backrefs"   s:pat   parsed version of b:match_words"   s:all   regexp based on s:pat and the default groups"if !exists("b:match_words") || b:match_words == ""let match_words = """ Allow b:match_words = "GetVimMatchWords()" .elseif b:match_words =~ ":"let match_words = b:match_wordselseexecute "let match_words =" b:match_wordsendif
" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion!if (match_words != s:last_words) || (&mps != s:last_mps) ||\ exists("b:match_debug")let s:last_words = match_wordslet s:last_mps = &mps" The next several lines were here before" BF started messing with this script." quote the special chars in 'matchpairs', replace [,:] with \| and then" append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif)" let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+',"  \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>'let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") .\ '\/\*:\*\/,#\s*if\%(def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'" s:all = pattern with all the keywordslet match_words = match_words . (strlen(match_words) ? "," : "") . defaultif match_words !~ s:notslash . '\\\d'let s:do_BR = 0let s:pat = match_wordselselet s:do_BR = 1let s:pat = s:ParseWords(match_words)endiflet s:all = substitute(s:pat, s:notslash . '\zs[,:]\+', '\\|', 'g')let s:all = '\%(' . s:all . '\)'" let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)'if exists("b:match_debug")let b:match_pat = s:patendifendif" Second step:  set the following local variables:"     matchline = line on which the cursor started"     curcol    = number of characters before match"     prefix    = regexp for start of line to start of match"     suffix    = regexp for end of match to end of line" Require match to end on or after the cursor and prefer it to" start on or before the cursor.let matchline = getline(startline)if a:word != ''" word givenif a:word !~ s:allechohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONEreturn s:CleanUp(restore_options, a:mode, startline, startcol)endiflet matchline = a:wordlet curcol = 0let prefix = '^\%('let suffix = '\)$'" Now the case when "word" is not givenelse   " Find the match that ends on or after the cursor and set curcol.let regexp = s:Wholematch(matchline, s:all, startcol-1)let curcol = match(matchline, regexp)" If there is no match, give up.if curcol == -1return s:CleanUp(restore_options, a:mode, startline, startcol)endiflet endcol = matchend(matchline, regexp)let suf = strlen(matchline) - endcollet prefix = (curcol ? '^.*\%'  . (curcol + 1) . 'c\%(' : '^\%(')let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$'  : '\)$')endifif exists("b:match_debug")let b:match_match = matchstr(matchline, regexp)let b:match_col = curcol+1endif" Third step:  Find the group and single word that match, and the original" (backref) versions of these.  Then, resolve the backrefs." Set the following local variable:" group = colon-separated list of patterns, one of which matches"       = ini:mid:fin or ini:fin"" Reconstruct the version with unresolved backrefs.let patBR = substitute(match_words.',',\ s:notslash.'\zs[,:]*,[,:]*', ',', 'g')let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g')" Now, set group and groupBR to the matching group: 'if:endif' or" 'while:endwhile' or whatever.  A bit of a kluge:  s:Choose() returns" group . "," . groupBR, and we pick it apart.let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR)let i = matchend(group, s:notslash . ",")let groupBR = strpart(group, i)let group = strpart(group, 0, i-1)" Now, matchline =~ prefix . substitute(group,':','\|','g') . suffixif s:do_BR " Do the hard part:  resolve those backrefs!let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline)endifif exists("b:match_debug")let b:match_wholeBR = groupBRlet i = matchend(groupBR, s:notslash . ":")let b:match_iniBR = strpart(groupBR, 0, i-1)endif" Fourth step:  Set the arguments for searchpair().let i = matchend(group, s:notslash . ":")let j = matchend(group, '.*' . s:notslash . ":")let ini = strpart(group, 0, i-1)let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g')let fin = strpart(group, j)"Un-escape the remaining , and : characters.let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g')let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g')let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g')" searchpair() requires that these patterns avoid \(\) groups.let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g')let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g')let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g')" Set mid.  This is optimized for readability, not micro-efficiency!if a:forward && matchline =~ prefix . fin . suffix\ || !a:forward && matchline =~ prefix . ini . suffixlet mid = ""endif" Set flag.  This is optimized for readability, not micro-efficiency!if a:forward && matchline =~ prefix . fin . suffix\ || !a:forward && matchline !~ prefix . ini . suffixlet flag = "bW"elselet flag = "W"endif" Set skip.if exists("b:match_skip")let skip = b:match_skipelseif exists("b:match_comment") " backwards compatibility and testing!let skip = "r:" . b:match_commentelselet skip = 's:comment\|string'endiflet skip = s:ParseSkip(skip)if exists("b:match_debug")let b:match_ini = inilet b:match_tail = (strlen(mid) ? mid.'\|' : '') . finendif" Fifth step:  actually start moving the cursor and call searchpair()." Later, :execute restore_cursor to get to the original screen.let restore_cursor = virtcol(".") . "|"normal! g0let restore_cursor = line(".") . "G" .  virtcol(".") . "|zs" . restore_cursornormal! Hlet restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursorexecute restore_cursorcall cursor(0, curcol + 1)" normal! 0" if curcol"   execute "normal!" . curcol . "l"" endifif skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))let skip = "0"elseexecute "if " . skip . "| let skip = '0' | endif"endiflet sp_return = searchpair(ini, mid, fin, flag, skip)let final_position = "call cursor(" . line(".") . "," . col(".") . ")"" Restore cursor position and original screen.execute restore_cursornormal! m'if sp_return > 0execute final_positionendifreturn s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin)
endfun" Restore options and do some special handling for Operator-pending mode.
" The optional argument is the tail of the matching group.
fun! s:CleanUp(options, mode, startline, startcol, ...)execute "set" a:options" Open folds, if appropriate.if a:mode != "o"if &foldopen =~ "percent"normal! zvendif" In Operator-pending mode, we want to include the whole match" (for example, d%)." This is only a problem if we end up moving in the forward direction.elseif (a:startline < line(".")) ||\ (a:startline == line(".") && a:startcol < col("."))if a:0" Check whether the match is a single character.  If not, move to the" end of the match.let matchline = getline(".")let currcol = col(".")let regexp = s:Wholematch(matchline, a:1, currcol-1)let endcol = matchend(matchline, regexp)if endcol > currcol  " This is NOT off by one!execute "normal!" . (endcol - currcol) . "l"endifendif " a:0endif " a:mode != "o" && etc.return 0
endfun" Example (simplified HTML patterns):  if
"   a:groupBR  = '<\(\k\+\)>:</\1>'
"   a:prefix   = '^.\{3}\('
"   a:group    = '<\(\k\+\)>:</\(\k\+\)>'
"   a:suffix   = '\).\{2}$'
"   a:matchline    =  "123<tag>12" or "123</tag>12"
" then extract "tag" from a:matchline and return "<tag>:</tag>" .
fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)if a:matchline !~ a:prefix .\ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffixreturn a:groupendiflet i = matchend(a:groupBR, s:notslash . ':')let ini = strpart(a:groupBR, 0, i-1)let tailBR = strpart(a:groupBR, i)let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix,\ a:groupBR)let i = matchend(word, s:notslash . ":")let wordBR = strpart(word, i)let word = strpart(word, 0, i-1)" Now, a:matchline =~ a:prefix . word . a:suffixif wordBR != inilet table = s:Resolve(ini, wordBR, "table")else" let table = "----------"let table = ""let d = 0while d < 10if tailBR =~ s:notslash . '\\' . d" let table[d] = dlet table = table . delselet table = table . "-"endiflet d = d + 1endwhileendiflet d = 9while dif table[d] != "-"let backref = substitute(a:matchline, a:prefix.word.a:suffix,\ '\'.table[d], "")" Are there any other characters that should be escaped?let backref = escape(backref, '*,:')execute s:Ref(ini, d, "start", "len")let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len)let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d,\ escape(backref, '\\&'), 'g')endiflet d = d-1endwhileif exists("b:match_debug")if s:do_BRlet b:match_table = tablelet b:match_word = wordelselet b:match_table = ""let b:match_word = ""endifendifreturn ini . ":" . tailBR
endfun" Input a comma-separated list of groups with backrefs, such as
"   a:groups = '\(foo\):end\1,\(bar\):end\1'
" and return a comma-separated list of groups with backrefs replaced:
"   return '\(foo\):end\(foo\),\(bar\):end\(bar\)'
fun! s:ParseWords(groups)let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g')let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g')let parsed = ""while groups =~ '[^,:]'let i = matchend(groups, s:notslash . ':')let j = matchend(groups, s:notslash . ',')let ini = strpart(groups, 0, i-1)let tail = strpart(groups, i, j-i-1) . ":"let groups = strpart(groups, j)let parsed = parsed . inilet i = matchend(tail, s:notslash . ':')while i != -1" In 'if:else:endif', ini='if' and word='else' and then word='endif'.let word = strpart(tail, 0, i-1)let tail = strpart(tail, i)let i = matchend(tail, s:notslash . ':')let parsed = parsed . ":" . s:Resolve(ini, word, "word")endwhile " Now, tail has been used up.let parsed = parsed . ","endwhile " groups =~ '[^,:]'let parsed = substitute(parsed, ',$', '', '')return parsed
endfun" TODO I think this can be simplified and/or made more efficient.
" TODO What should I do if a:start is out of range?
" Return a regexp that matches all of a:string, such that
" matchstr(a:string, regexp) represents the match for a:pat that starts
" as close to a:start as possible, before being preferred to after, and
" ends after a:start .
" Usage:
" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1)
" let i      = match(getline("."), regexp)
" let j      = matchend(getline("."), regexp)
" let match  = matchstr(getline("."), regexp)
fun! s:Wholematch(string, pat, start)let group = '\%(' . a:pat . '\)'let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^')let len = strlen(a:string)let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$')if a:string !~ prefix . group . suffixlet prefix = ''endifreturn prefix . group . suffix
endfun" No extra arguments:  s:Ref(string, d) will
" find the d'th occurrence of '\(' and return it, along with everything up
" to and including the matching '\)'.
" One argument:  s:Ref(string, d, "start") returns the index of the start
" of the d'th '\(' and any other argument returns the length of the group.
" Two arguments:  s:Ref(string, d, "foo", "bar") returns a string to be
" executed, having the effect of
"   :let foo = s:Ref(string, d, "start")
"   :let bar = s:Ref(string, d, "len")
fun! s:Ref(string, d, ...)let len = strlen(a:string)if a:d == 0let start = 0elselet cnt = a:dlet match = a:stringwhile cntlet cnt = cnt - 1let index = matchend(match, s:notslash . '\\(')if index == -1return ""endiflet match = strpart(match, index)endwhilelet start = len - strlen(match)if a:0 == 1 && a:1 == "start"return start - 2endiflet cnt = 1while cntlet index = matchend(match, s:notslash . '\\(\|\\)') - 1if index == -2return ""endif" Increment if an open, decrement if a ')':let cnt = cnt + (match[index]=="(" ? 1 : -1)  " ')'" let cnt = stridx('0(', match[index]) + cntlet match = strpart(match, index+1)endwhilelet start = start - 2let len = len - start - strlen(match)endifif a:0 == 1return lenelseif a:0 == 2return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . lenelsereturn strpart(a:string, start, len)endif
endfun" Count the number of disjoint copies of pattern in string.
" If the pattern is a literal string and contains no '0' or '1' characters
" then s:Count(string, pattern, '0', '1') should be faster than
" s:Count(string, pattern).
fun! s:Count(string, pattern, ...)let pat = escape(a:pattern, '\\')if a:0 > 1let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g")let foo = substitute(a:string, pat, a:2, "g")let foo = substitute(foo, '[^' . a:2 . ']', "", "g")return strlen(foo)endiflet result = 0let foo = a:stringlet index = matchend(foo, pat)while index != -1let result = result + 1let foo = strpart(foo, index)let index = matchend(foo, pat)endwhilereturn result
endfun" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where
" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'.  That is, the first
" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this
" indicates that all other instances of '\1' in target are to be replaced
" by '\3'.  The hard part is dealing with nesting...
" Note that ":" is an illegal character for source and target,
" unless it is preceded by "\".
fun! s:Resolve(source, target, output)let word = a:targetlet i = matchend(word, s:notslash . '\\\d') - 1let table = "----------"while i != -2 " There are back references to be replaced.let d = word[i]let backref = s:Ref(a:source, d)" The idea is to replace '\d' with backref.  Before we do this," replace any \(\) groups in backref with :1, :2, ... if they" correspond to the first, second, ... group already inserted" into backref.  Later, replace :1 with \1 and so on.  The group" number w+b within backref corresponds to the group number" s within a:source." w = number of '\(' in word before the current onelet w = s:Count(\ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1')let b = 1 " number of the current '\(' in backreflet s = d " number of the current '\(' in a:sourcewhile b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1')\ && s < 10if table[s] == "-"if w + b < 10" let table[s] = w + blet table = strpart(table, 0, s) . (w+b) . strpart(table, s+1)endiflet b = b + 1let s = s + 1elseexecute s:Ref(backref, b, "start", "len")let ref = strpart(backref, start, len)let backref = strpart(backref, 0, start) . ":". table[s]\ . strpart(backref, start+len)let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1')endifendwhilelet word = strpart(word, 0, i-1) . backref . strpart(word, i+1)let i = matchend(word, s:notslash . '\\\d') - 1endwhilelet word = substitute(word, s:notslash . '\zs:', '\\', 'g')if a:output == "table"return tableelseif a:output == "word"return wordelsereturn table . wordendif
endfun" Assume a:comma = ",".  Then the format for a:patterns and a:1 is
"   a:patterns = "<pat1>,<pat2>,..."
"   a:1 = "<alt1>,<alt2>,..."
" If <patn> is the first pattern that matches a:string then return <patn>
" if no optional arguments are given; return <patn>,<altn> if a:1 is given.
fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...)let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma)let i = matchend(tail, s:notslash . a:comma)if a:0let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma)let j = matchend(alttail, s:notslash . a:comma)endiflet current = strpart(tail, 0, i-1)if a:branch == ""let currpat = currentelselet currpat = substitute(current, s:notslash . a:branch, '\\|', 'g')endifwhile a:string !~ a:prefix . currpat . a:suffixlet tail = strpart(tail, i)let i = matchend(tail, s:notslash . a:comma)if i == -1return -1endiflet current = strpart(tail, 0, i-1)if a:branch == ""let currpat = currentelselet currpat = substitute(current, s:notslash . a:branch, '\\|', 'g')endifif a:0let alttail = strpart(alttail, j)let j = matchend(alttail, s:notslash . a:comma)endifendwhileif a:0let current = current . a:comma . strpart(alttail, 0, j-1)endifreturn current
endfun" Call this function to turn on debugging information.  Every time the main
" script is run, buffer variables will be saved.  These can be used directly
" or viewed using the menu items below.
if !exists(":MatchDebug")command! -nargs=0 MatchDebug call s:Match_debug()
endiffun! s:Match_debug()let b:match_debug = 1 " Save debugging information." pat = all of b:match_words with backrefs parsedamenu &Matchit.&pat    :echo b:match_pat<CR>" match = bit of text that is recognized as a matchamenu &Matchit.&match   :echo b:match_match<CR>" curcol = cursor column of the start of the matching textamenu &Matchit.&curcol :echo b:match_col<CR>" wholeBR = matching group, original versionamenu &Matchit.wh&oleBR    :echo b:match_wholeBR<CR>" iniBR = 'if' piece, original versionamenu &Matchit.ini&BR  :echo b:match_iniBR<CR>" ini = 'if' piece, with all backrefs resolved from matchamenu &Matchit.&ini   :echo b:match_ini<CR>" tail = 'else\|endif' piece, with all backrefs resolved from matchamenu &Matchit.&tail  :echo b:match_tail<CR>" fin = 'endif' piece, with all backrefs resolved from matchamenu &Matchit.&word    :echo b:match_word<CR>" '\'.d in ini refers to the same thing as '\'.table[d] in word.amenu &Matchit.t&able  :echo '0:' . b:match_table . ':9'<CR>
endfun" Jump to the nearest unmatched "(" or "if" or "<tag>" if a:spflag == "bW"
" or the nearest unmatched "</tag>" or "endif" or ")" if a:spflag == "W".
" Return a "mark" for the original position, so that
"   let m = MultiMatch("bW", "n") ... execute m
" will return to the original position.  If there is a problem, do not
" move the cursor and return "", unless a count is given, in which case
" go up or down as many levels as possible and again return "".
" TODO This relies on the same patterns as % matching.  It might be a good
" idea to give it its own matching patterns.
fun! s:MultiMatch(spflag, mode)if !exists("b:match_words") || b:match_words == ""return ""endlet restore_options = (&ic ? "" : "no") . "ignorecase"if exists("b:match_ignorecase")let &ignorecase = b:match_ignorecaseendiflet startline = line(".")let startcol = col(".")" First step:  if not already done, set the script variables"   s:do_BR    flag for whether there are backrefs"   s:pat   parsed version of b:match_words"   s:all   regexp based on s:pat and the default groups" This part is copied and slightly modified from s:Match_wrapper().let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") .\ '\/\*:\*\/,#\s*if\%(def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'" Allow b:match_words = "GetVimMatchWords()" .if b:match_words =~ ":"let match_words = b:match_wordselseexecute "let match_words =" b:match_wordsendifif (match_words != s:last_words) || (&mps != s:last_mps) ||\ exists("b:match_debug")let s:last_words = match_wordslet s:last_mps = &mpsif match_words !~ s:notslash . '\\\d'let s:do_BR = 0let s:pat = match_wordselselet s:do_BR = 1let s:pat = s:ParseWords(match_words)endiflet s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default,\  '[,:]\+','\\|','g') . '\)'if exists("b:match_debug")let b:match_pat = s:patendifendif" Second step:  figure out the patterns for searchpair()" and save the screen, cursor position, and 'ignorecase'." - TODO:  A lot of this is copied from s:Match_wrapper()." - maybe even more functionality should be split off" - into separate functions!let cdefault = (s:pat =~ '[^,]$' ? "," : "") . defaultlet open =  substitute(s:pat . cdefault,\ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g')let open =  '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '')let close = substitute(s:pat . cdefault,\ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g')let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)'if exists("b:match_skip")let skip = b:match_skipelseif exists("b:match_comment") " backwards compatibility and testing!let skip = "r:" . b:match_commentelselet skip = 's:comment\|string'endiflet skip = s:ParseSkip(skip)" let restore_cursor = line(".") . "G" . virtcol(".") . "|"" normal! H" let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursorlet restore_cursor = virtcol(".") . "|"normal! g0let restore_cursor = line(".") . "G" .  virtcol(".") . "|zs" . restore_cursornormal! Hlet restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursorexecute restore_cursor" Third step: call searchpair()." Replace '\('--but not '\\('--with '\%(' and ',' with '\|'.let openpat =  substitute(open, '\(\\\@<!\(\\\\\)*\)\@<=\\(', '\\%(', 'g')let openpat = substitute(openpat, ',', '\\|', 'g')let closepat = substitute(close, '\(\\\@<!\(\\\\\)*\)\@<=\\(', '\\%(', 'g')let closepat = substitute(closepat, ',', '\\|', 'g')if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))let skip = '0'elseexecute "if " . skip . "| let skip = '0' | endif"endifmark 'let level = v:count1while levelif searchpair(openpat, '', closepat, a:spflag, skip) < 1call s:CleanUp(restore_options, a:mode, startline, startcol)return ""endiflet level = level - 1endwhile" Restore options and return a string to restore the original position.call s:CleanUp(restore_options, a:mode, startline, startcol)return restore_cursor
endfun" Search backwards for "if" or "while" or "<tag>" or ...
" and return "endif" or "endwhile" or "</tag>" or ... .
" For now, this uses b:match_words and the same script variables
" as s:Match_wrapper() .  Later, it may get its own patterns,
" either from a buffer variable or passed as arguments.
" fun! s:Autocomplete()
"   echo "autocomplete not yet implemented :-("
"   if !exists("b:match_words") || b:match_words == ""
"     return ""
"   end
"   let startpos = s:MultiMatch("bW")
"
"   if startpos == ""
"     return ""
"   endif
"   " - TODO:  figure out whether 'if' or '<tag>' matched, and construct
"   " - the appropriate closing.
"   let matchline = getline(".")
"   let curcol = col(".") - 1
"   " - TODO:  Change the s:all argument if there is a new set of match pats.
"   let regexp = s:Wholematch(matchline, s:all, curcol)
"   let suf = strlen(matchline) - matchend(matchline, regexp)
"   let prefix = (curcol ? '^.\{'  . curcol . '}\%(' : '^\%(')
"   let suffix = (suf ? '\).\{' . suf . '}$'  : '\)$')
"   " Reconstruct the version with unresolved backrefs.
"   let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g')
"   let patBR = substitute(patBR, ':\{2,}', ':', "g")
"   " Now, set group and groupBR to the matching group: 'if:endif' or
"   " 'while:endwhile' or whatever.
"   let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR)
"   let i = matchend(group, s:notslash . ",")
"   let groupBR = strpart(group, i)
"   let group = strpart(group, 0, i-1)
"   " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix
"   if s:do_BR
"     let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline)
"   endif
" " let g:group = group
"
"   " - TODO:  Construct the closing from group.
"   let fake = "end" . expand("<cword>")
"   execute startpos
"   return fake
" endfun" Close all open structures.  "Get the heck out of here!"
" fun! s:Gthhoh()
"   let close = s:Autocomplete()
"   while strlen(close)
"     put=close
"     let close = s:Autocomplete()
"   endwhile
" endfun" Parse special strings as typical skip arguments for searchpair():
"   s:foo becomes (current syntax item) =~ foo
"   S:foo becomes (current syntax item) !~ foo
"   r:foo becomes (line before cursor) =~ foo
"   R:foo becomes (line before cursor) !~ foo
fun! s:ParseSkip(str)let skip = a:strif skip[1] == ":"if skip[0] == "s"let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" .\ strpart(skip,2) . "'"elseif skip[0] == "S"let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" .\ strpart(skip,2) . "'"elseif skip[0] == "r"let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'"elseif skip[0] == "R"let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'"endifendifreturn skip
endfunlet &cpo = s:save_cpo
unlet s:save_cpo" vim:sts=2:sw=2:

高亮system verilog

在.vim下mkdir syntax,然后编辑systemverilog.vim

" Vim syntax file
" Language:    SystemVerilog
" Maintainer:  Stephen Hobbs <stephenh@cadence.com>
" Last Update:  Wed Jun 14 15:56:00 BST 2006
" Built on verilog.vim from vim63" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600syntax clear
elseif exists("b:current_syntax")finish
endif" Set the local value of the 'iskeyword' option
if version >= 600setlocal iskeyword=@,48-57,_,192-255
elseset iskeyword=@,48-57,_,192-255
endif" Taken from the SystemVerilog 3.1a Annex B:
syn keyword systemverilogStatement   alias always always_comb always_ff always_latch
syn keyword systemverilogStatement   and assert assign assume automatic before begin
syn keyword systemverilogStatement   bind bins binsof bit break buf bufif0 bufif1
syn keyword systemverilogStatement   byte case casex casez cell chandle class clocking
syn keyword systemverilogStatement   cmos config const constraint context continue cover
syn keyword systemverilogStatement   covergroup coverpoint cross deassign default
syn keyword systemverilogStatement   defparam design disable dist do edge else end
syn keyword systemverilogStatement   endcase endclass endclocking endconfig endfunction
syn keyword systemverilogStatement   endgenerate endgroup endinterface endmodule
syn keyword systemverilogStatement   endpackage endprimitive endprogram endproperty
syn keyword systemverilogStatement   endspecify endsequence endtable endtask enum event
syn keyword systemverilogStatement   expect export extends extern final first_match for
syn keyword systemverilogStatement   force foreach forever fork forkjoin function generate
syn keyword systemverilogStatement   genvar highz0 highz1 if iff ifnone ignore_bins
syn keyword systemverilogStatement   illegal_bins import incdir include initial inout
syn keyword systemverilogStatement   input inside instance int integer interface intersect
syn keyword systemverilogStatement   join join_any join_none large liblist library local
syn keyword systemverilogStatement   localparam logic longint macromodule matches medium
syn keyword systemverilogStatement   modport module nand negedge new nmos nor
syn keyword systemverilogStatement   noshowcancelled not notif0 notif1 null or output
syn keyword systemverilogStatement   package packed parameter pmos posedge primitive
syn keyword systemverilogStatement   priority program property protected pull0 pull1
syn keyword systemverilogStatement   pulldown pullup pulsestyle_onevent pulsestyle_ondetect
syn keyword systemverilogStatement   pure rand randc randcase randsequence rcmos
syn keyword systemverilogStatement   real realtime ref reg release repeat return uvm_reg_data_t
syn keyword systemverilogStatement   rnmos rpmos rtran rtranif0 rtranif1 scalared sequence
syn keyword systemverilogStatement   shortint shortreal showcancelled signed small solve
syn keyword systemverilogStatement   specify specparam static string strong0 strong1 struct
syn keyword systemverilogStatement   super supply0 supply1 table tagged task this
syn keyword systemverilogStatement   throughout time timeprecision timeunit tran
syn keyword systemverilogStatement   tranif0 tranif1 tri tri0 tri1 triand trior trireg type
syn keyword systemverilogStatement   typedef union unique unsigned use var vectored virtual
syn keyword systemverilogStatement   void wait wait_order wand weak0 weak1
syn keyword systemverilogStatement   while wildcard wire with within wor xnor xor" LRM 3.7 String methods:
syn keyword systemverilogStatement   len getc putc toupper tolower compare
syn keyword systemverilogStatement   icompare substr
syn keyword systemverilogStatement   itoa hextoa octtoa bintoa realtoa
syn keyword systemverilogStatement   atoi atohex atooct atobin atoreal
" LRM 3.8 events:
syn keyword systemverilogStatement   triggered
" LRM 3.10 methods for enumerated types:
syn keyword systemverilogStatement   first last next prev num name
" LRM 4.6 Dynamic Arrays:
syn keyword systemverilogStatement   delete
" LRM 4.10 Associative Array methods:
syn keyword systemverilogStatement   num exists
" LRM 4.15.1 Array locator methods:
syn keyword systemverilogStatement   find find_index find_first find_first_index
syn keyword systemverilogStatement   find_last find_last_index min max unique unique_index
" LRM 4.15.2 Array ordering methods:
syn keyword systemverilogStatement   reverse sort rsort shuffle
" LRM 4.15.3 Array reduction methods:
syn keyword systemverilogStatement   sum product
" LRM 4.15.4 Array iterator query:
syn keyword systemverilogStatement   index
"" LRM 7.10.1 Builtin package:
syn keyword systemverilogStatement   std
" LRM Annex C standard library
syn keyword systemverilogStatement   get put try_get try_put peek try_peek
syn keyword systemverilogStatement   status kill self await suspend resume
" LRM Annex D List methods
syn keyword systemverilogStatement   next prev eq neq data
syn keyword systemverilogStatement   size empty push_front push_back
syn keyword systemverilogStatement   front back pop_front pop_back
syn keyword systemverilogStatement   start finish insert insert_range
syn keyword systemverilogStatement   erase erase_range set swap clear purge" New time specification:
" #1step or #1ps
syn match   systemverilogNumber "\<[0-9_]\+\([munpf]\|\)s\>"
syn match   systemverilogNumber "\<[0-9_]\+step\>"" Original systemverilog syntax below heresyn keyword systemverilogTodo contained TODOsyn match   systemverilogOperator "[&|~><!)(*#%@+/=?:;}{,.\^\-\[\]]"syn region  systemverilogComment start="/\*" end="\*/" contains=systemverilogTodo
syn match   systemverilogComment "//.*" contains=systemverilogTodo"syn match   systemverilogGlobal "`[a-zA-Z0-9_]\+\>"
syn match systemverilogGlobal "`celldefine"
syn match systemverilogGlobal "`default_nettype"
syn match systemverilogGlobal "`define"
syn match systemverilogGlobal "`else"
syn match systemverilogGlobal "`elsif"
syn match systemverilogGlobal "`endcelldefine"
syn match systemverilogGlobal "`endif"
syn match systemverilogGlobal "`ifdef"
syn match systemverilogGlobal "`ifndef"
syn match systemverilogGlobal "`include"
syn match systemverilogGlobal "`line"
syn match systemverilogGlobal "`nounconnected_drive"
syn match systemverilogGlobal "`resetall"
syn match systemverilogGlobal "`timescale"
syn match systemverilogGlobal "`unconnected_drive"
syn match systemverilogGlobal "`undef"
syn match   systemverilogGlobal "$[a-zA-Z0-9_]\+\>"syn match   systemverilogConstant "\<[A-Z][A-Z0-9_]\+\>"syn match   systemverilogNumber "\(\<\d\+\|\)'[bB]\s*[0-1_xXzZ?]\+\>"
syn match   systemverilogNumber "\(\<\d\+\|\)'[oO]\s*[0-7_xXzZ?]\+\>"
syn match   systemverilogNumber "\(\<\d\+\|\)'[dD]\s*[0-9_xXzZ?]\+\>"
syn match   systemverilogNumber "\(\<\d\+\|\)'[hH]\s*[0-9a-fA-F_xXzZ?]\+\>"
syn match   systemverilogNumber "\<[+-]\=[0-9_]\+\(\.[0-9_]*\|\)\(e[0-9_]*\|\)\>"syn region  systemverilogString start=+"+ skip=+\\"+ end=+"+ contains=systemverilogEscape
syn match   systemverilogEscape +\\[nt"\\]+ contained
syn match   systemverilogEscape "\\\o\o\=\o\=" contained
syn match   systemverilogEscape "uvm_test_top" contained" kong add for uvm
"syn match   systemverilogUVM    "uvm_\w\+"
syn keyword systemverilogUVM     UVM_LOW UVM_MEDIUM UVM_HIGH
syn keyword systemverilogUVM     UVM_ACTIVE UVM_PASSIVE UVM_ALL_ON
syn match   systemverilogUVM     "`uvm_info"
syn match   systemverilogUVM     "`uvm_warning"
syn match   systemverilogUVM     "`uvm_error"
syn match   systemverilogUVM     "`uvm_fatal"
syn match   systemverilogUVM     "`uvm_component_utils"
syn match   systemverilogUVM     "`uvm_object_utils"
syn match   systemverilogUVM     "`uvm_object_utils_begin"
syn match   systemverilogUVM     "`uvm_object_utils_end"
syn match   systemverilogUVM     "`uvm_field_int"
syn match   systemverilogUVM     "`uvm_field_array_int"
syn keyword systemverilogStatement  uvm_driver uvm_component uvm_phase uvm_config_db
syn keyword systemverilogStatement  uvm_sequence uvm_sequencer uvm_sequence_item
syn keyword systemverilogStatement  uvm_env uvm_monitor uvm_agent uvm_object_wrapper
syn keyword systemverilogStatement  uvm_analysis_port uvm_blocking_get_port uvm_tlm_analysis_fifo
syn keyword systemverilogStatement  uvm_test
syn keyword systemverilogStatement  run_test raise_objection drop_objection
syn keyword systemverilogStatement  main_phase build_phase configure_phase connect_phase
syn keyword systemverilogStatement  randomize post_randomize" Directives
syn match   systemverilogDirective   "//\s*synopsys\>.*$"
syn region  systemverilogDirective   start="/\*\s*synopsys\>" end="\*/"
syn region  systemverilogDirective   start="//\s*synopsys dc_script_begin\>" end="//\s*synopsys dc_script_end\>"syn match   systemverilogDirective   "//\s*\$s\>.*$"
syn region  systemverilogDirective   start="/\*\s*\$s\>" end="\*/"
syn region  systemverilogDirective   start="//\s*\$s dc_script_begin\>" end="//\s*\$s dc_script_end\>""Modify the following as needed.  The trade-off is performance versus
"functionality.
syn sync lines=80" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version >= 508 || !exists("did_systemverilog_syn_inits")if version < 508let did_systemverilog_syn_inits = 1command -nargs=+ HiLink hi link <args>elsecommand -nargs=+ HiLink hi def link <args>endif" The default highlighting.HiLink systemverilogCharacter       CharacterHiLink systemverilogConditional     ConditionalHiLink systemverilogRepeat      RepeatHiLink systemverilogString        StringHiLink systemverilogTodo      TodoHiLink systemverilogComment     CommentHiLink systemverilogConstant     ConstantHiLink systemverilogLabel       LabelHiLink systemverilogNumber         NumberHiLink systemverilogOperator  SpecialHiLink systemverilogStatement    StatementHiLink systemverilogGlobal         DefineHiLink systemverilogDirective     SpecialCommentHiLink systemverilogEscape        SpecialHiLink systemverilogUVM      Specialdelcommand HiLink
endiflet b:current_syntax = "systemverilog"" vim: ts=2

加begin-end匹配,高亮语言,相关推荐

  1. c语言任意两个整数相减_大整数加减运算的C语言实现

    大整数加减运算的 C 语言实现 一 . 问题提出培训老师给出一个题目:用 C 语言实现一 个大整数计算器.初步要求支持大整数的加.减运算,例如 8888888888888+1112=888888889 ...

  2. python正则表达式匹配c语言的函数

    背景 当前在工程中有已经实现好了的很多c函数,由于某些原因,需要在所有c函数中临时加些一样的语句,这些语句最后会删除 解决方案1 参考: https://codeantenna.com/a/Rh6TZ ...

  3. 为什么onenote一直在加载_OneNote代码高亮完美解决方案(全网最全)

    0. 引子 OneNote作为一款记笔记的软件,免费实用,有助于自己形成树状结构知识框架.但是它有一个令人头疼的问题就是:无法代码高亮.而NoteHightlight2016正是解决这个问题的完美利器 ...

  4. ue默认高亮mysql_UE设置打开文件的默认高亮语言

    最近使用UE时,需要频繁地打开.ec文件,.ec文件参照的是C/C++的语法,每次打开时,都需要在工具栏上点击"查看方式->C/C++".觉得很繁琐,于是想查找一下设置,让U ...

  5. go 正则表达式分组匹配_Go语言正则表达式用法实例小结【查找、匹配、替换等】...

    本文实例讲述了Go语言正则表达式用法.分享给大家供大家参考,具体如下: Go语言的正则表达式使用很简单,示例代码: 复制代码 代码如下: package test import ( "fmt ...

  6. vim加载systemverilog语法高亮

    需要加载systemVerilog.vim的脚本,该脚本的下载路径为 systemVerilog的vim语法高亮脚本https://download.csdn.net/download/cy41302 ...

  7. Typora更改斜体字、加粗字、高亮、强调字等颜色

    Step 1 在Typora中打开其偏好设置,然后在外观的主题中选择打开主题文件夹,并选择正在使用的主题的css文件. Step 2 在css文件(以github.css为例)的末尾添加如下内容: / ...

  8. 单片机c语言编程 时钟加日历转换,单片机C语言电子时钟加日历显示编程

    一. 任务和要求设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间.年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后一 ...

  9. UE设置打开的文件默认高亮语言

    最近使用UE时,需要频繁地打开.ec文件,.ec文件参照的是C/C++的语法,每次打开时,都需要在工具栏上点击"查看方式->C/C++".觉得很繁琐,于是想查找一下设置,让U ...

  10. 字符串括号匹配c语言,数据结构C语言括号的检验源程序 , 数据结构(C) 请用类C语言实现括号匹配的检验这个算法...

    问题标题 数据结构C语言括号的检验源程序 , 数据结构(C) 请用类C语言实现括号匹配的检验这个算法 2019-8-21来自ip:13.149.196.77的网友咨询 浏览量:270 手机版 问题补充 ...

最新文章

  1. 一份传世典文:十年编程(Teach Yourself Programming in Ten Years)
  2. Swift游戏实战-跑酷熊猫 00 游戏预览
  3. 微信小程序图片上传(文字识别)
  4. matlab实现脑电信号的相位同步分析,视听刺激脑电信号的相位同步分析
  5. Java中JDBC连接数据库(MySQL)
  6. 喂不饱的滴滴,也要撇开腾讯另立门户了
  7. 在苹果Mac中如何一键转换繁体与简体中文?
  8. 【R图秀-2】社交网络数据可视化(一)
  9. Oracle数据库学习思维导图
  10. 表情包产业靠什么“上位”:机遇、玩法、IP
  11. 贴片电容造成短路烧毁的原因分析
  12. js表单提交enter触发提交
  13. TP笔记5、模型 文件上传 分页 会话技术与验证码
  14. 《管理者必读12篇》如何购买
  15. gitlab常用网址
  16. LoadRunner的组成
  17. A non-optional actual argument must be present when invoking a procedure with an explicit interface
  18. 开源的python有限元软件_python有限元
  19. 解决ORA-01033: ORACLE initialization or shutdown in progress
  20. GitHub集成Circle CI(附 Circle CI 配置示例文件)

热门文章

  1. 计算机课初中文化的学生招,我是一名初中信息技术教师,有时候想在理论课上讲..._教师招聘考试_帮考网...
  2. 线性表的动态数组实现ArrayList
  3. IDEA中external libraries里没有maven包
  4. 这是我的第一个博客文章
  5. 洞悉“她”个性,保险业务开拓倍增术
  6. N32G430学习笔记20--- spi外设单工模式下spi1中断发送和spi2中断数据接收
  7. 开心!奥运门票在手 :)
  8. 我开了个游戏,为什么老是被人攻击呀,怎么才能防止这个情况
  9. 免备案服务器的选址地方
  10. ECS之初体验(Linux)