Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108578
  • 博文数量: 45
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-03 21:57
文章分类
文章存档

2010年(26)

2009年(19)

我的朋友

分类: LINUX

2010-05-06 21:04:25

这是我的vim 配饰文件,基本的功能都能实现,在这里做一个备份,省的以后重装系统还要到处找这个配置文件:

set fileencodings=utf-8,gbk,ucs-bom,cp936
set encoding=utf-8
set nocompatible
set number
filetype on 
set history=1000 
set background=dark 
syntax on 
"set autoindent
"set smartindent
set showmatch
set guioptions-=T
set vb t_vb=
set ruler
set nohls
:set cindent
set tabstop=4
set shiftwidth=4
set incsearch
set cursorline
set nobackup


如果还有支持cscope的话,清参考本博客里的关于cscope 使用的文章。


我的Windows 下 gVIM 配置 :

C:\Program Files\Vim/_vimrc(应该在你安装 vim 的 路径下)




set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()

set fileencoding=gb2312 
set fileencodings=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936
set nocompatible
set number
filetype on 
set history=1000 
set background=dark 
syntax on 
:color default 
set selectmode=mouse,key
"set autoindent
"set smartindent
set showmatch
set guioptions-=T
set vb t_vb=
set ruler
set nohls
:set cindent
set tabstop=8
set shiftwidth=8
set incsearch
"set cursorline                     
"高亮显示当前行
 hi LineNr guifg=black
set nobackup
set noerrorbells

set foldenable 
set foldmethod=manual




function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\
      let cmd = '""' . $VIMRUNTIME . '\diff"'
      let eq = '"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction








转载:

关键字: vim 翻译 状态栏

在Vim编辑器的底部,你可以发现两个东西:一个是命令行缓冲(可以输入命令),另外一个是状态栏。在默认情况下,Vim显示的信息是很简短的,只是在右边显示当前光标所在的行和列以及当前打开的文件(如果有的话)。

当你执行一个命令的时候,状态栏将会被命令行替代,如果命令执行后输出了信息,则也会显示在状态栏的右边。

如果只是为了简单和快速的编辑,则这个状态栏也已经足够了,但是
如果你每天使用Vim来编辑许多不同类型的文件,则最好使用一个信息丰富的状态栏。在这个技巧中,我们将看到状态栏如何显示丰富的文件信息。

设置状态栏如何显示可以简单的调用命令:

: set  statusline format


这里的format是一个类似printf的字符串(从c语言中借鉴过来),用来描述状态栏如何显示。

如果你使用 :help 'statusline' 来查看Vim帮助,你可以看到状态栏包含大量的信息,可能有些在你日常工作中还有用。

我的状态栏中总是包含下面的信息:

  • 正在编辑的文件名
  • 正在编辑的文件格式(DOS, Unix)
  • 当前文件的类型
  • 当前光标下字符的ASCII和16进制值
  • 当前光标所在的行和列
  • 文件的长度(包括行数)

下面的命令可以使得状态栏显示上面所有的信息

:set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [ASCII=\%03.3b]\ [HEX=\%02.2B]\ [POS=%04l,%04v][%p%%]\ [LEN=%L]


我在其中加了'[]'用来分割各个类型的信息,这仅仅是为了显示加入的,如果需要的话可以去掉。


 
尽管如此,我们可以看到在默认情况下状态栏还是会显示旧的状态栏,这是因为Vim默认根本就不显示状态栏,而仅仅显示命令缓冲区的一些信息。为了告诉Vim你真的需要一个状态栏,可以将下面的语句加入到vimrc中,这个命令将保证状态栏显示在编辑器窗口的倒数第二行。

: set  laststatus = 2


可以看到现在命令缓冲区总是在编辑器窗口的最下边,而状态栏则也总是显示在下面。当然,状态栏确实会占据一些编辑空间,但是你随时可以决定是否需要显示状态栏。你可以在Vim中执行下面的命令来隐藏状态栏:

: set  laststatus = 0

设置命令行和状态栏 
set cmdheight=1 " 设定命令行的行数为 1 
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏) 
set statusline=%F%m%r,%Y,%{&fileformat}\ \ \ ASCII=\%b,HEX=\%B\ \ \ %l,%c%V\ %p%%\ \ \ [\ %
L\ lines\ in\ all\ ] 
" 设置在状态行显示的信息如下: 
                            " %F 当前文件名 
" %m 当前文件修改状态 
                            " %r 当前文件是否只读 
" %Y 当前文件类型 
                            " %{&fileformat} 
" 当前文件编码 
                            " %b 当前光标处字符的 ASCII 码值 
" %B 当前光标处字符的十六进制值 
                            " %l 当前光标行号 
" %c 当前光标列号 
                            " %V 当前光标虚拟列号 (根据字符所占字节数计算) 
" %p 当前行占总行数的百分比 
                            " %% 百分号 
" %L 当前文件总行数 



为了是vim 能够很好的支持 Verilog 代码的编写,我尝试了以下的方法,
把从网上找到的 verilog.vim 的内容粘贴到 .vimrc 里面
文件内容如下:

" Title:        Verilog HDL/SystemVerilog HDVL indent file
" Maintainer: Mingzhi Li
" Last Change: 2007-12-16 20:10:57 CST
"
" Buffer Variables:
"     b:verilog_indent_width   : indenting width(default value: shiftwidth)
"
" Install:
"     Drop it to ~/.vim/indent 
"
" URL:
"    
"
" Revision Comments:
"     Mingzhi Li  2007-12-16 20:09:39 CST Version 1.2      
"        Bug fixes
"     Mingzhi Li  2007-12-13 23:47:54 CST Version 1.1      
"        Bug fix, improve performance and add introductions
"     Mingzhi Li  2007-12-7  22:16:41 CST Version 1.0  
"        Initial version
"       
" Known Limited:
"     This indent file can not work well, when you break the long line into
"     multi-line manually, such as:
"      always @(posedge a or posedge b 
"          or posedge c ) begin
"         //...
"      end 
"     Recommend to use the coding style(wraped by vim automatically) as following:
"       always @(posedge a or posedge b or posedge c ) begin
"         //...
"       end 

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
  finish
endif
let b:did_indent = 1

setlocal indentexpr=GetVerilog_SystemVerilogIndent()
setlocal indentkeys=!^F,o,O,0),0},0{,=begin,=end,=fork,=join,=endcase,=join_any,=join_none
setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify
setlocal indentkeys+==endclass,=endpackage,=endsequence,=endclocking
setlocal indentkeys+==endinterface,=endgroup,=endprogram,=endproperty
setlocal indentkeys+==`else,=`endif

" Only define the function once.
if exists("*GetVerilog_SystemVerilogIndent")
  finish
endif

set cpo-=C

function s:comment_ind(lnum)
  let line = getline(a:lnum)
  if line =~ '^\s*\/\/'
    return -1
  endif

  let firstPos = match(line,'\S') + 1
  if firstPos == 0
    return -1
  endif

  let endPos   = match(line,'\s*$') 
  let flag1 = 0
  let flag2 = 0
  if (synIDattr(synID(a:lnum, firstPos, 1), "name") =~? '\(Comment\|String\)$')
    let flag1 = 1
  endif

  if (synIDattr(synID(a:lnum, endPos, 1), "name") =~? '\(Comment\|String\)$' )
    let flag2 = 1
  endif

  if ((1 == flag1)&&(1 == flag2))
    let firstPos = match(line,'\*\/') + 2

    if (synIDattr(synID(a:lnum, firstPos, 1), "name") =~? '\(Comment\|String\)$')
      return -1
    else
      return 3
    endif
  endif

  if (1 == flag1)
    return 1
  endif

  if (1 == flag2)
    return 0
  endif


  return 2

endfunction

function s:prevnonblanknoncomment(lnum)
  let lnum = prevnonblank(a:lnum)

  while lnum > 0
    if (-1 != s:comment_ind(lnum))
      break
    endif
    let lnum = prevnonblank(lnum - 1)
  endwhile
  return lnum
endfunction

function s:removecommment(line,comment_ind)

  if (a:comment_ind ==  2)
    return a:line
  endif

  if (a:comment_ind == -1)
    return ""
  endif

  if (a:comment_ind == 1)
    return substitute(a:line,'^.\{-}\*\/',"","")
  endif

  let myline01 = a:line;
  
  if (a:comment_ind == 3)
    let myline01 = substitute(myline01,'^.\{-}\*\/',"","")
  endif

  let myline01 = substitute(myline01,'\/\*.*$',"","")
  return substitute(myline01,'\/\/.*$',"","")

endfunction


function GetVerilog_SystemVerilogIndent()

  if exists('b:verilog_indent_width')
    let offset = b:verilog_indent_width
  else
    let offset = &sw
  endif


  " Find a non-blank and valid line above the current line.
  let lnum = s:prevnonblanknoncomment(v:lnum - 1)

  " At the start of the file use zero indent.
  if lnum == 0
    return 0
  endif

  let ind  = indent(lnum)

  let curr_line_ind = s:comment_ind(v:lnum)
  "if curr_line_ind == -1
  "  return ind
  "endif

  let curr_line  = s:removecommment(getline(v:lnum),curr_line_ind)
  let curr_line2 = substitute(curr_line,'^\s*','','')

  let match_result = matchstr(curr_line2,'^\<\(end\|else\|end\(case\|task\|function\|clocking\|interface\|module\|class\|specify\|package\|sequence\|group\|property\)\|join\|join_any\|join_none\)\>\|^}\|`endif\|`else')


    if len(match_result) > 0
      if match_result =~ '\'
        let match_start = '\'
        let match_mid   = ''
        let match_end   = '\'

      elseif match_result =~ '\'
        let last_line_ind = s:comment_ind(lnum)
        let last_line  = s:removecommment(getline(lnum),last_line_ind)

        if last_line =~ '^\s*end\|^\s*}'
          return indent(lnum)
        else
          let match_start = '\'
          let match_mid   = ''
          let match_end   = '\'
        endif

      elseif match_result =~ 'join'
        let match_start = '\'
        let match_mid   = ''
        let match_end   = '\<\(join\|join_none\|join_any\)\>'

      elseif match_result =~ '}'
        let match_start = '{'
        let match_mid   = ''
        let match_end   = '}'

      elseif match_result =~ '`else'
        let match_start = '`if'
        let match_mid   = ''
        let match_end   = '`else'

      elseif match_result =~ '`endif'
        let match_start = '`if'
        let match_mid   = '`else'
        let match_end   = '`endif'

      else
        let match_start = substitute(match_result,'^end','','')
        let match_start = '\<' . match_start . '\>'
        let match_mid   = ''
        let match_end   = '\<' . match_result. '\>'
      endif


      call cursor(v:lnum,1)
      let match_line = searchpair(match_start,match_mid,match_end,'bW',
            \" synIDattr(synID(line('.'),col('.'),1),'name')"
            \. "=~? '\\(Comment\\|String\\)$'")

      if match_line > 0
        return indent(match_line)
      endif

    endif


  let last_line_ind = s:comment_ind(lnum)
  let last_line  = s:removecommment(getline(lnum),last_line_ind)
 

  let indent0 = 0
  let indent1 = 0
  let indent2 = 0

  let de_indent0 = 0

  let pat0 = '[{(]\s*$'
  let pat1 = '\<\(begin\|fork\)\>\s*\(:\s*\w\+\s*\)\=\s*$'
  let pat2 = '`\@'
  let pat3 = '\<\(always\|initial\|for\|foreach\|always_comb\|always_ff\|always_latch\|final\|repeat\|while\|constraint\|do\)\>'
  let pat5 = '\<\(case\%[[zx]]\|task\|function\|class\|interface\|clocking\|randcase\|package\|specify\)\>'
  let pat6 = '^\s*\(\w\+\s*:\)\=\s*\'
  let pat7 = '^\s*\<\(begin\|fork\)\>\s*\(:\s*\w\+\s*\)\='

  """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

  if last_line =~ pat0 || last_line =~ pat1
    let indent0 = 1
  endif

  " Indent after if/else/for/case/always/initial/specify/fork blocks

  if (last_line =~ pat2 ||  last_line =~ pat3 || last_line =~ ':\s*$') && (last_line !~ ';\s*$')
    let indent1 = 1

  elseif  last_line =~ pat5 || last_line =~ pat6
    let indent2 = 1

  elseif last_line =~ '^\s*`\<\(ifdef\|else\|ifndef\)\>'
    return ind + offset
  endif

  let sum1 = indent0 + indent1 + indent2

  """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

  if (curr_line =~ pat7 || curr_line =~ '^\s*{')
    let de_indent0 = 1
  endif

  if (sum1 == 0) && (last_line !~ '^\s*end\|\') &&
        \ (curr_line =~ ')\s*;\s*$') && 
        \ (last_line =~ ',\s*$' || last_line =~ '\w\s*$\|]\s*$\|)\s*$')
    return ind - offset
  endif

  let sum2 = de_indent0 

  if indent0 + indent1 + sum2 == 0
    let lnum2 = s:prevnonblanknoncomment(lnum - 1)
    let last_line2_ind = s:comment_ind(lnum2)
    let last_line2 = s:removecommment(getline(lnum2),last_line2_ind)

    if ((last_line2 !~ pat0 && last_line2 !~ pat1) && 
          \ (last_line2 =~ pat2 || last_line2 =~ pat3 || last_line2 =~ ':\s*$') &&
          \ (last_line =~ ';\s*$'))
      return indent(lnum2)
    endif
  endif
  

  " Return the indention
  if (indent0 == 0 && indent1 == 1 && de_indent0 == 1)
    return ind
  elseif  sum1 > 0
    return ind + offset
  elseif  sum2 > 0
    return ind - offset
  else
    return ind
  endif 

endfunction

" vim:sw=2

感觉这样对verilog 代码的支持更好些……
(这只是本人的拙见,如有更好地方法,可以交流下,使vim 很好的支持verilog)
阅读(1203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~