顯示具有 VIM 標籤的文章。 顯示所有文章
顯示具有 VIM 標籤的文章。 顯示所有文章

2013年8月4日 星期日

VIM Tab切換

用法

指令模式

指令 描述
:tabnew [++opt] [+cmd] 文件 建立對指定文件新的tab
:tabc 關閉目前的tab
:tabo 關閉所有其他的tab
:tabs 查看所有打開的tab
:tabp 切換前一個tab
:tabn 切換後一個tab
:help table 查看tab幫助

標準模式

gt, gT 可直接切換tab


如果你覺得這篇文章很有用,可以請我喝杯咖啡,讓我提供更多優質文章給您。感謝所有支持的朋友。

Vere Perrot 資訊人.科技人.行銷人,現為軟體分析師。定位自己為網路觀察家,永遠保持好奇心與熱情,學習跨領域新事物,希望最終能成為一個全方位的人。 Mail: vereperrot@gmail.com

2013年7月24日 星期三

安裝browser.vim外掛

用途
開啟url,並用lynx將伺服器回傳的網頁,dump到新開的分割視窗中。

下載
lynx
browser.vim

安裝lynx到windows 7
在c槽開一個資料夾,取名為lynx_w32。將下載的壓縮檔,解壓縮到這個資料夾。
雙擊lynx.bat可以執行,預設首頁是google。可在lynx.cfg檔案中修改,搜尋文字STARTFILE,例如:STARTFILE:http://programfeelings.blogspot.tw/。

安裝browser.vim

  1. 將檔案browser.vim中,的lynx字串改為lynx.bat。
  2. 將路徑C:\lynx_w32加到系統環境變數。
  3. 移動檔案到vim\Plugin資料夾中。
使用
 :WebBrowser www.vim.org 
開啟網頁
:Wikipedia the life of brian 
開啟en.wikipedia.org/wiki/

依附檔名指定編譯器,按下同個按鍵執行編譯動作

在.vimrc檔案中,加入下行:
au BufEnter,BufNew *.rb map <F5>  :rubyf %

au BufEnter,BufNew *.py map <F5>  :python %
au BufEnter,BufNew *.cs map <F5> :csc %
au BufEnter,BufNew *.html map <F5> :chrome %
au BufEnter,BufNew *.c map <F5> :gcc %
au BufEnter,BufNew *.pl map <F5> :perl %
按下F5按鍵就能執行編譯動作。
au BufEnter,BufNew *.ahk,*.iss map <F5> :silent ! "%"<CR>
隱藏dos視窗,直接開啟檔案執行。

參考
http://stackoverflow.com/questions/903057/how-to-perform-file-extension-based-actions-in-vim

執行指令

:!cmd
:!python %
%為目前編輯的檔案路徑。
:!python "%"
如路徑中含有空白,可用雙引號包括。
:cd
查看目前所在路徑
:pwd
查看目前所在路徑

VIM儲存分割視窗

儲存分割視窗

範例

  • :mks <指令session名稱>
  • :mks test
  • :mks D:\test
  • :mks test.vim
  • 可將session 副檔名指定為.vim,以利識別。會將session檔案儲存在目前所在路徑。
  • :mks! test如果session檔案存在,可用mks!指令覆寫。
  • 也能儲存目前所有開啟分頁。
  • 如更換檔名,所有摺疊會跟著原檔案名。所以新檔名之檔案內,會沒有任何摺疊。
  • 如有一分頁開NERDTree,再次載入分頁會是一片空白。

載入分割視窗

範例

  • :source <指令session名稱>
  • :source test
  • :source D:\test
  • :source test.vim

    如果你覺得這篇文章很有用,可以請我喝杯咖啡,讓我提供更多優質文章給您。感謝所有支持的朋友。

Vere Perrot 資訊人.科技人.行銷人,現為軟體分析師。定位自己為網路觀察家,永遠保持好奇心與熱情,學習跨領域新事物,希望最終能成為一個全方位的人。 Mail: vereperrot@gmail.com

2013年7月23日 星期二

VIM NERDTree切換路徑

問題Please wait, caching a Large dir...

  • :NERDTree 預設路徑開啟,會出現訊息Please wait, caching a Large dir...
  • 可以改成指定路徑開啟 :NERDTree 指定路徑
  • 或目前路徑 :NERDTree .

切換路徑

  • :NERDTree C:\
  • :NERDTree C:\Google Drive\Doc

參考

* Vim becomes unresponsive when toggling NERDTREE

如果你覺得這篇文章很有用,可以請我喝杯咖啡,讓我提供更多優質文章給您。感謝所有支持的朋友。

Vere Perrot 資訊人.科技人.行銷人,現為軟體分析師。定位自己為網路觀察家,永遠保持好奇心與熱情,學習跨領域新事物,希望最終能成為一個全方位的人。 Mail: vereperrot@gmail.com

NERDTree用預設程式開啟檔案


  1. 下載檔案execute_menuitem.vim
  2. 將檔案放到vim\vim73\plugin路徑下
  3. 重新開啟gvim
  4. 選擇檔案
  5. 按下m鍵,開啟選單
  6. 按下x鍵,用系統預設程式開啟檔案

NERDTree重新命名與複製檔案

重新命名

  1. 選擇檔案
  2. 按下m叫出選單
  3. 按下m移動node
  4. 輸入要改的檔名後,按下enter鍵改名
複製檔案

  1. 選擇檔案
  2. 按下m叫出選單
  3. 按下a移動node
  4. 輸入檔案路徑,按下enter鍵複製

VIM摺疊保存

需求
Windows 7
gvim 7.3

摺疊操作
zf 摺疊選定行
zo 開啟摺疊
zc 關閉摺疊
zM 關閉所有摺疊
zR 打開所有摺疊
zd 刪除折疊
:help zf 查看摺疊幫助

保存摺疊
:mkview 保存當前view
:loadview 恢復之前做的摺疊
會將摺疊的訊息保存在 .vim/view/路徑中。

自動保存摺疊
在.vimrc檔案中加入:
au BufWinLeave * silent mkview
au BufWinEnter * silent loadview
這樣每次關閉文件都會自動執行mkview,每次開啟文件都會自動執行loadview。

錯誤
Error detected while processing BufWinEnter Auto commands for "*":
E32: No file name

加入自動保存摺疊功能,出現如上錯誤。
將加入的兩行,改為:
au BufWinLeave *.* silent mkview
au BufWinEnter *.* silent loadview
就能解決這個問題。

參考
http://objectmix.com/editors/149632-vim-automatic-loadview-every-window.html
http://techbbs.zol.com.cn/1/60_1387.html

2013年2月20日 星期三

A Beginner's guide to vi and ex

Using vi
Beginning Your Editing Session 
   To edit a file                       vi [ filename ]
   To recover an editing session        vi -r [ filename ]

Notes on vi commands and modal editing 

 All vi commands are entered in command mode. To enter command mode, press the ESC key. Some vi commands cause vi to enter another mode. For example, the i (insert command) causes vi to enter insert mode after which all keystrokes are inserted as text. To return to command mode from insert mode, press the ESC key. The :set showmode command will cause vi to display the current editing mode in the lower right corner of the editing screen. 

Controlling The Screen Display of Your Session 
   Repaint the current screen           {ctrl-l}
   Display line #, # of lines, etc..    {ctrl-g}

Moving the Cursor 
   Beginning of current line            0 or ^
   Beginning of first screen line       H
   Beginning of last screen line        L
   Beginning of middle screen line      M
   Down one line                        j, {return}, +
   End of current line                  $
   Left one character                   h, {ctrl-h}
   Left to beggining of word            b, B
   Right one character                  l, {space}
   Right to end of word                 e, E
   Right to beginning of word           w, W
   Up one line                          k, -
   Beginning of next sentence           )
   Beginning of previous sentence       (

Paging Through Text 
   Back one screen                      {ctrl-b}
   Down half a screen                   {ctrl-d}
   Down one screen                      {ctrl-f}
   Forware to end of file               G
   Move cursor to specified line        line no. G
   Up half a screen                     {ctrl-j}

Special Pattern Characters 
   Beginning of line                            ^
   End of line                                  $
   Any character except newline                 .
   Any number of the preceding character        *
   Any set of characters (except newline)       .*

Searching Through Text 
   Backward for pattern                         ?pattern
   Forward for pattern                          /pattern
   Repeat previous search                       n
   Reverse direction of previous search         N

   Show *all* lines containing pattern          :beg,endg/pattern/p
   :1,$g/compiler/p Will print all lines with the pattern compiler.

   Substitute patt2 for all patt1 found.        :beg,ends/patt1/patt2/g
   :%s/notfound/found/g Will change all occurences of notfound to found.

Creating Text 
   Append text after cursor             a
   Append text after end of line        A
   Insert text before cursor            i
   Insert text at beginning of line     I
   Open new line after current line     o
   Open new line before current line    O
   Take next character literally
    (i.e. control characters...)
    and display it                      {ctrl-v}

Modifying Text 
   Change current word                  cw, cW
   Change current line (cursor to end)  C
   Delete character (cursor forward)    x
   Delete character (before cursor)     X
   Delete word                          dw, dW
   Delete line                          dd
   Delete text to end of line           D
   Duplicate text                       (use yank and put)
   Join current line with next line     J
   Move text                            (use delete and put)
   Put buffer text after/below cursor   p
   Put buffer text before/above cursor  P
   Repeat last modification command     .
   Replace current character            r
   Replace text to end of line          R
   Substitute text for character        s
   Undo your previous command           u
   Transpose characters                 xp
   Yank (copy) word into buffer         yw
   Yank (copy) current line into buffer Y

Making Corrections During Text Insertions 
   Overwrite last character             {delete}
   Overwrite last word                  {ctrl-w}

Ending Your Editing Sessions 
   Quit (no changes made)               :q
   Quit and save changes                ZZ, :wq
   Quit and discard changes             :q!

Using ex Commands From Within vi 
   Copy specified lines                 :co, t
   Display line numbers                 :set nu
   Disable display of line numbers      :set nonu
   Move lines after specified line      :m
   Read file in after specified line    :r filename
   Review current editor options        :set 
   Review editor options                :set all
   Set new editor option                :set option
   Write changes to original file       :w
   Write to specified file              :w filename
   Force write to a file                :w! filename

Some Useful ex commands for use in vi

 Some useful set options for your ~/.exrc file: 
   :set all             Display all Set options
   :set autoindent      Automagically indent following lines to the indentation
                          of previous line.
   :set ignorecase      Ignore case during pattern matching.
   :set list            Show special characters in the file.
   :set number          Display line numbers.
   :set shiftwidth=n    Width for shifting operators << and >>
   :set showmode        Display mode when in Insert, Append, or Replace mode.
   :set wrapmargin=n    Set right margin 80-n for autowrapping lines 
                          (inserting newlines).  0 turns it off.

2012年12月4日 星期二

gvim 設定 顏色

gvim 設定

作者:Tsung's Blog 

Windows 的 Gvim 背景色彩和一些雜七雜八的設定.
之前都是在 Linux 使用 vim, 突然轉換到 Windows 不太習慣.
不過還是裝 gvim 來玩玩. 深入看看設定哪些會比較好用..
設定檔於 C:\Program Files\Vim\_vimrc
預設存檔會存在 C:\Documents and Settings\自己登入的帳號\

參考連結 Vim for Perl developers
http://www.leonid.maks.net/blog/item/vim_for_perl_developers

colorscheme desert 設定 配色設定

vimrc 設定檔如下(於最下面自行加入即可)
set cindent
set nu
set smartindent
"set backup
"set backupdir=~/.bak
"set backupdir=D:\bak
set hls
set nocompatible
set sw=3
set showmatch
set background=light
colorscheme desert
syntax on

" 將註解由深藍色變綠色
" hi Comment ctermfg=Green
" 搜尋到的字加 hilight
set hlsearch

" 將註解由深藍色變淺藍色
highlight Comment ctermfg=darkcyan
highlight Search term=reverse ctermbg=4 ctermfg=7
highlight Normal ctermbg=black ctermfg=white


" 設定 tab 預設 4 格(並且自動把 tab(\t) 轉換成 空白)
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
" 設定摺疊 {{{ , }}}
set foldmethod=marker
" 設定 細明體 字體大小 12
set guifont=mingliu:h12


最終版: gvim 完整設定. 可以自動判斷 UTF-8, Big5.
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
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
if &sh =~ '\ silent execute '!""C:\Program Files\Vim\vim63\diff" ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . '"'
else
silent execute '!C:\Program" Files\Vim\vim63\diff" ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
endif
endfunction

"set fileencoding=taiwan
"set fileencoding=utf-8
"set guifontset=8x16,kc15f,-*-16-*-big5-0
set cindent
set smartindent
"set backup
"set backupdir=~/.bak
set backupdir=D:\bak
"set enc=taiwan
set hls
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
set nocompatible
set sw=3
set showmatch
set background=light
set nu
colorscheme desert
syntax on
set guifont=mingliu:h12

highlight Comment ctermfg=darkcyan
highlight Search term=reverse ctermbg=4 ctermfg=7
highlight Normal ctermbg=black ctermfg=white
" Necessary. This setting tells vim to load latex-suite
" when a tex file opened.
filetype plugin on
" Optional. This enables automatic indentation as you
" type.
filetype indent on


"============utf8 ===============
" piaip's gvim settings for gvim/win32 with UTF8
" optimized for Traditional Chinese users
" last update: Mon Jun 7 17:59:54 CST 2004
"let $LANG="zh_TW.UTF-8" " locales
"set encoding=utf-8 " ability
"set fileencoding=big5 " prefer
" charset detect list. ucs-bom must be earlier than ucs*.
"set fileencodings=ascii,ucs-bom,utf-8,ucs-2,ucs-le,sjis,big5,latin1
" for console mode we use big5
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1
"set encoding=utf8
set tenc=utf8

if has("gui_running")
set termencoding=utf-8
else
set termencoding=big5
endif
" vim:ft=vim
"============utf8 ===============

WinXP下Vim与Python的相关安装与配置

如果你和我一样是个新手,想尝试一下Vim与Python,那么下面的一些文字也许适合你。

注:以下过程全部在WinXP下完成。

1、先说Python的安装与配置:

首先去Python的老家下载Python 2.3.3 Windows installer版本,如果你想使用wxPython的话,去http://www.wxpython.org(现在可以直接访问)下载wxPython2.5.1版本。没有什么特别注意的,都直接安装就可以了,wxPython缺省安装在 你的盘符:\Python23\Lib\site-packages下。现在你应该已经成功安装了Python2.3.3与wxPython2.5.1,拥有了IDLE与Python(command line)环境,开始你的Python之旅吧!

当然,如果你想在Windows下使用Python进行Win32编程,你可能还需要Win32all---Mark Hammond's add-on for the regular Python installer (also including the Win32 API, COM support, and Pythonwin),访问这里,下载最新版本。

如果你觉得IDLE太过简单,那么你还可以尝试一下DrPython---a highly customizable cross-platform ide to aid programming in Python. It was developed with teaching in mind, and has a clean, simple interface. It is written in Python, using wxPython as the gui. 访问这里,下载最新版本,解压后执行DrPython.pyw即可。

2、关于Vim的安装与配置

我最喜欢的编辑器是Vim,它也完全可以胜任Python编程的工作。5月6日,Vim 6.3a beta release。跟我一起来配置与试用吧!首先去www.vim.org的ftp上下载gvim63a.exe文件,执行安装,选择full安装吧,Vim够小巧的啦。我安装在D:\vim下。

这里有必要列一下Vim6.3a beta的新特性,虽然这只是一个test版本,但是针对MS-Windows而言还是增加了不少不容忽视的特性,这也更增加了我对Vim的喜爱 :-)

Support for translated help files. The files themselves are available separately.
More conversions are possible on Macintosh and MS-Windows without help of the iconv library.
The Win32 self-installing exe now also includes vim.exe, the console version.
When formatting text, marks are kept at the same position.
Support for the NetBeans interface on MS-Windows.
MS-Windows: Vim can run inside an MDI window of another application.
...
安装完Vim以后,你还需要到这里,下载Vim的中文帮助文件vimcdoc-0.6.0,一路安装下去就可以了,这样你可以在Vim中使用中文帮助。

现在开始使用Vim进行Python编程工作吧,如果你想在Vim环境下直接执行当前程序文件,在你的_vimrc文件中加入如下一行:

map :!d:\python23\python.exe %

作用是将键盘上的F12健映射为使用Python执行当前文件,存盘退出Vim,重新进入后编辑一个py文件,按F12试一下吧!

想更好的在Vim下进行Python编程,你可能还需要以下几个Plugin与相关配置:

去http://sourceforge.net/projects/ctags下载ctags for windows版本;将下载文件解压至某一目录下,如D:\ctags。

去http://www.vim.org/scripts/index.php搜索并下载taglist与python_fold插件;将下载文件中的所有.vim结尾的插件文件放入D:\Vim\vim63a\plugin目录下(替换成你自己的安装路径)。

打开你的_vimrc文件加入如下两行:

filetype onlet Tlist_Ctags_Cmd = 'd:\ctags\ctags.exe'

存盘退出Vim,重新启动Vim打开一个有function的Python文件看一看效果吧!

注:python_fold插件实现了折叠功能,在有+的折叠行输入zo和zc可以打开折叠和重新折叠(注意这两个命令不需要: 直接输入即可。taglist与ctags一起实现了tag功能,使用:Tlist打开/关闭taglist功能,它们的功能很强大,仔细看看帮助吧。

OK,目前为止,我们安装了Python+wxPython+win32all+DrPython,也安装了最新的Vim与几个基础型的插件,Python相对易学易用,Vim功能强大,希望它们的结合能帮助的学习与工作。

后记:为什么要写这样一篇东西呢?我不敢保证以上文字的准确与精确性,但这些过程是我作为一个菜鸟的一些摸索,我想同我一样的新手们应该也多看Doc,多用Google,多点思考,多点耐心,让我们一起进步。

I like Vim, I use Vim.I like Python, I use Python.

Vim的設定檔

9. set 功能設定

本單元可說是 Vim 的微調功能,可依您個人的喜好做有限度的調整。由於 Vim 做了相當多的擴充,文內主要是述敘 Vim 的設定,但 elvis 沒有的也會標明。但並不打算一網打盡,只說明重要、常用的部份,其它的可以 :h option-list 來查閱。

在系統上,會有個 vimrc_example.vim 檔,可以依據這個檔案來設定一些常要用到的內容。


9.1 該在何處設定呢?

9.1.1 Vim 的設定檔

可在線上做設定,例如 :set ai 或 :set noai,ai 是 autoindent 的縮寫,這樣就可以馬上改變縮格的設定,但離開 vim 後就又恢復原狀。要永久設定就得設在設定檔中。 vim 的設定檔在:

~/.exrc
~/.vimrc
~/.gvimrc    GUI 版本
$VIM/vimrc   系統預設值,最好不去修改
$VIM/gvimrc  GUI 版本
$VIM\_vimrc  Windows 版本
$VIM\_gvimrc
您要把 GUI 的設定設在 $HOME/.vimrc 也是可以的,但分開來可能對以後要修改時會比較找得到地方改。那 $VIM 在哪裡呢?/usr/share/vim 或 /usr/local/share/vim 這是編譯時就決定的,但可在 $HOME/.bash_profie 或 $HOME/.bashrc 中另設。Windows 版本的 $VIM 則在 C:\Vim 這個目錄中,亦可設在 autoexec.bat 中。

9.1.2 elvis 的設定檔

~/.exrc
~/.elvislib/elvis.rc
C:\Program Files\elvis\elvis.rc  Windows 版本
如果您的系統上同時有 Vim 及 elvis,則使用 $HOME/.exrc 要小心,以免互相影響了設定。好處是可以把共同的設定設在 $HOME/.exrc 裡。提醒您一下!設在設定檔中時 set 前當然是不必冒號的。

9.1.3 nvi-m17n 的設定檔

~/.exrc
~/.nexrc

9.2 如何得知目前的設定

:set 或 :se    會顯示所有經過修改的部份,就是和預設值不一樣的部份。
:set all       顯示目前所有設定值內容。
:scriptnames   顯示各種設定檔的所在路徑及其檔名。
:set option?   顯示 option 這設定的目前值。
:option        直接線上設定,有些設定需加 = 後加上設定值內容。
:set nooption  取消該設定。:set 後面是可以多重設定的。例如
:set autoindent noconfirm autowrite,這樣三種設定就會同時重設。
您當然可以改設定檔來改變設定值。在 Vim 也可以使用 :opt[ion] 來直接線上設定,會列出目前的設定,在 set 這個字上按 Enter 即可改變設定,或就直接修改其值亦可,改完後按 :q 就可以了。在簡短說明處按 Enter 則會叫出該部份的說明檔給您參考,您說方不方便?改好後

:mk[exrc]    則會寫入 ~/.exrc 檔
:mkv[imrc]   則會寫入 ~/.vimrc 檔
當然您得先搞清楚您目前所在目錄在什麼地方,如果您是在家目錄啟動的那就不用擔心了,否則找不到您的新 .vimrc 可不要寫信來罵我。:-) elvis 可就沒這麼方便了,得自行修改 $HOME/.exrc 或 $HOME/.elvislib/elvis.rc。


9.3 各種 set 功能說明

方括號內的是縮寫,由於 Vim 新增的指令、設定項實在是相當多,建議一開始使用完整的寫法,等熟悉後再來使用縮寫會比較好。

9.3.0.1 autoindent[ai]

自動縮排,也就是說如果本行是從第五個字元開始寫的,您按 Enter 後游標就會停在次行第五個字元處。預設是不打開的。
9.3.0.2 autowrite[aw]

檔案一有更動就會自動存檔。預設不打開。
9.3.0.3 background[bg] (Vim 才有)

可設成 dark 或 light,這是兩種不同的 highlight 顏色設定,系統預設的內容是在一個 synload.vim 檔中,詳見 $VIMRUNTIME/syntax/synload.vim。不過您要更動顏色的設定,最好是設在 $HOME/.vimrc 或 $HOME/.gvimrc 中,原始檔預設檔盡量不要去動她。
ㄟㄟㄟ,你從沒提過 $VIMRUNTIME 好不好!其實這是最近版本的 Vim 為了不至安裝新版本時把舊版本的一些設定或 macro 檔幹掉,所以 $VIMRUNTIME 就是 $VIM/vimxx,xx 就是版本號碼啦!例如您使用的是 Vim 6.1 版,那麼就是 $VIM/vim61,往後安裝 6.2 版時,會把 runtime files 裝在 $VIM/vim62,這樣就不會把舊的 runtime files 給蓋掉。

9.3.0.4 backup[bk]

是否要 backup file。預設不打開。
9.3.0.5 writebackup[wb] (Vim 才有)

在寫入檔案前先備份一份,和 backup 的作用不盡相同,請 :h backup-table。預設是打開的,所以您如果不要 backup,那要關掉的是這個項目,而不是 backup。但請先檢查一下您編譯時是不是有編譯進去,請 :ver。
9.3.0.6 backupdir[bdir] (Vim 才有)

設定存放 backup file 的目錄。預設在所編輯的檔案之所在目錄。
9.3.0.7 binary[bin] (Vim 才有)

設在編輯二進位檔狀態,這是防止存二進位檔時把 EOL 也寫進二進位檔,那就會悔不當初,如果是圖檔將會無法再觀看,如果是可執行檔就無法執行了!因此預設是 off。elvis 會自動判斷是否為二進位檔,而且會分成左右兩半,左半部會以 16 進位的方式顯示,右半部則是以 ASCII 的方式來顯示。
9.3.0.8 browsedir[bsdir] (Vim 才有)

瀏覽檔案的目錄,GUI 版本始有。預設是上一次瀏覽的目錄。就是 GUI 版本功能表上的 [File] 234 [Open] 會打開的目錄。
9.3.0.9 cindent[cin] (Vim 才有)

寫 C 時很好用,indent 比一般敏感,專為 C 程式碼而設。預設 off。編輯 C/C++ code 時會自動打開。
9.3.0.10 cmdheight[ch] (Vim 才有)

狀態列的行數,預設一行,建議設成兩行。
9.3.0.11 compatible[cp] (Vim 才有)

設為和原始 vi 相容的狀態,vim 的擴充功能會被抑制。預設 off。
9.3.0.12 confirm[cf] (Vim 才有)

各種確認動作。預設 off。
9.3.0.13 directory[dir]

swap 檔存放的目錄。前面單元已有說明。
9.3.0.14 fileformat[ff] (Vim 才有)

這是寫入檔案時置放 EOL(end of line) 的形式
dos 是以 0x0D0A 來斷行。
unix 是以 0x0A 來斷行。
mac 是以 0x0D 來斷行。
預設以各系統平檯而定,在 Linux 當然是 unix 形式。
9.3.0.15 fileformats[ffs] (Vim 才有)

可指定多個,會依載入的檔案形式來調整 ff。
例如 :set ffs=unix,dos ff=unix
則預設為 unix 格式,但如讀入的是 dos 格式的檔案,會自動調整為 dos 格式,這樣存檔時就會以 dos 格式存檔(狀態列會顯示)。。此時如要改成 unix 格式,可 :set ff=unix 然後存檔就會轉成 unix 格式,反之亦然。
如果不這樣設,也就是您不管 ff 或 ffs 都設成 unix,那讀入 dos 格式的檔案時在每行尾會出現 ^M 這個字元(就是 0x0D 啦!)這時縱使 :set ff=unix 也來不及了!只好 :%s/^M//g 來消去這個 ^M。ㄟ,還記得怎麼替換嗎?就是把 ^M 換成沒有啦!而且 ^M 怎麼打出來的還記得吧!翻一翻前面的單元吧!

Hey,你怎麼知道是 0x0D 呀!好吧!告訴您一個密秘,您把游標移到 ^M 那個位置,然後按 ga 在狀態列就會顯示 10,16,8 進位的值。其它的字元也是可以如此顯示。a 就是 ascii 的意思。但這是 Vim 的擴充功能,elvis 沒有。elvis 縱使載入 dos 格式的檔案,也是會自動把 ^M 隱藏起來。

9.3.0.16 ignorecase[ic]

尋找時不分大小寫,這對中文會造成困擾。預設 off。
9.3.0.17 incsearch[is] (Vim 才有)

加強式尋找功能,在鍵入 patern 時會立即反應移動至目前鍵入之 patern 上。預設 off。
9.3.0.18 hlsearch[hls] (Vim 才有)

尋找時,符合字串會反白表示。預設 off。如果您是使用 vim 的預設的 vimrc 檔的話,可設在 F8 鍵來切換。
9.3.0.19 textwidth[tw]

是一種 word wrap 的功能,從左起算之固定每行的最大字元寬度。超過此寬度就會自動折行,這可是真的折行,也就是說在折行處會插入 EOL。預設是 0,也就是沒有 word wrap 的功能。
9.3.0.20 wrapmargin[wm]

和 textwidth 作用相同,只是是從右視窗邊向左算起要幾個字元起折行。預設是 0。
9.3.0.21 wrap

這也是折行功能,可是只是螢幕效果的折行,實際上並沒有插入 EOL。
9.3.0.22 wrapscan[ws]

這和折行沒有關係,是指尋找時,找至檔尾時,是否要從檔首繼續找。預設是要。
9.3.0.23 paste (Vim 才有)

這是防止在做剪貼時位置會不正確,前面單元已有說明。
9.3.0.24 ruler[ru] (Vim 才有)

會在狀態列顯示游標所在處之行列狀態,預設不打開,但建議打開。最右邊之代號的意義如下:
Top  檔案第一行在螢幕可見範圍。
Bot  檔案最後一行在螢幕可見範圍。
All  檔案首尾皆在一個螢幕範圍內。
如非以上三種情形,則會顯示相對百分比位置。
9.3.0.25 statusline[stl] (Vim 才有)

狀態列顯示的格式,使用預設就可以了,如果您想騷包一下的話,那就請您 :h stl。
9.3.0.26 shiftwidth[sw]

指由 »移動整行內容時,一次移動的字元寬度,一般是使用 Tab 的值,但可由這個設定來改變。
9.3.0.27 tabstop[ts]

一個 Tab 鍵寬度。預設是 8 個字元寬度。最好不要隨便改,以免您寫的東西由其它編輯器來閱讀時造成困擾,為解決這個問題,Vim 另有種 softtabstop 及 modeline 的機制,在以下各節會詳細說明。
9.3.0.28 showcmd[sc]

在狀態列顯示目前所執行的指令,未完成的指令片段亦會顯示出來。
9.3.0.29 showmode[smd]

在狀態列顯示目前的模式,例如是 Insert mode 或是 Visual mode。當然平常的 normal mode(commond mode)是不顯示的。在載入檔案的同時,會在這個地方顯示檔案名稱及其總行數、總字元數。
9.3.0.30 viusalbell[vb] (Vim 才有)

以螢幕閃動代替 beep 聲。
9.3.0.31 number[nu]

顯示行號。注意,冒號命令也有 :nu 這是顯示游標所在行的行號,您嫌多打一個字的話,:# 也行。不過如果 ruler 打開的話,在狀態列本就會顯示門前游標所在處的行列值。
9.3.0.32 list

這也可以算是一種模式,list mode。就是 Tab 的地方會以 ^I 顯示,而行尾之 EOL 會顯示成 $。可以讓您清楚的知道 Tab 在哪裡,折行是不是真的。
9.3.0.33 swapfile[swf] (Vim 才有)

是否需 swap 至磁碟。如果設為 noswf 的話,那將不會有 swapfile 產生,通通會載入在記憶體中。預設是要 swapfile。
9.3.0.34 fileencoding[fe] (Vim 才有)

首先,先鼓掌一下,啪啪啪……,因為有支援 Taiwan,也支援 XIM,也就是說可以使用 xcin-2.5x 來作輸入,當然您用 xcin-2.3x 配合 XA 也是可以啦!但前提是您要把 multi_byte 編譯進去,這在一開始就講過了。預設是使用 ansi。set guifont 及 set guifontset 已在一開始講過,在此就不重複了。
9.3.0.35 history[hi]

記錄冒號命令的歷史紀錄檔,就是可以用上下方向鍵叫出來的那鍋。預設是 20 筆。

9.4 關於 softtabstop[sts]

幾乎所有的 OS 及軟體都設定 Tab 就是 8 個字元長,這已經是個公認值,您硬要去改變它的話恐怕帶來許多不便,但實際上關於程式風格,許多人又認為 8 個字元太長了,幾個巢狀迴圈下來就需折行,反而不方便。因此 Vim 體貼您,內建了 softtabstop 的功能,就是由 Vim 來代您製造出一個假的 Tab,實際上是空白字元組成的 Tab。

舉個例子來說明比較清楚。

set softtabstop=4
set shiftwidth=4
這樣會由 4 個空白字元取代一個 Tab,您按 Tab 鍵 vim 就跳 4 格,需注意的是,如果您按了三次 Tab 鍵,那就是一個實際的 Tab 加上四個空白字元,可不是 12 個空白字元喔!是混合 Tab 及 Space 的。

問題來了!那我要按真正的 8 字元的 Tab 時怎麼辦?簡單,還記得怎麼按特殊字元嗎?Ctrl+v Tab 或 Ctrl+v I 就可以了,那就是如假包換的 8 字元長之 Tab。當然,您按兩次 Tab 不就得了!:-)

另一個更大的問題也來了!在 Un*x 系統的有些設定檔,例如 Makefile, snedmail 的設定檔,他們會認真正的 Tab,因此如果您有程式開發或系統管理的需要的話,最好是不要隨意更動 Tab 值,也不要使用 softtabstop,可以使用 Vim 獨特的 modeline 來控制,請繼續研讀下一節。


9.5 Vim 的 modeline

這個是什麼哇?簡單的說,Vim 有能力去解讀所編輯檔案內的 Vim 控制參數,而這些控制參數是寫在檔案的註解行裡頭的,例如 sh script 的註解行是以 # 來開頭的,那 Vim 的控制參數就可以寫在這些註解裡頭,Vim 在開這個檔的同時,也會去控制自己的一些行為,當然,包括了上一節所說的 Tab 的長短,而 shell 本身則會忽略這些註解。

例如,現在把一個 sh script 檔裡頭,在檔案最後一行,設了個:

# vim: ts=2
這樣一來,按個 Tab,實際上顯示出來會只有兩個空格,別擔心仍然是正港 Tab ,不相信的話,可用另一種編輯器打開就知道了。這個好用吧!詳細請進入 vim 後 :h modeline。

當然,這個功能很方便,但並不是全然沒有限制的,以下有些限制要注意:

1. 控制 modeline 本身的設定,不能寫在檔案裡頭,vim 會來不及讀他。
   例如:在 sh script 檔案中設定 # vim: set modelines=0 這是行
   不通的。
2. 這些設定必須要在檔案的開頭五行,或結尾五行內設定,否則 vim 會忽略。
3. 註解符號後要至少一個空白(sapce 或 Tab 皆可)隔開。例如:
   /* vim:noai:sw=3 ts=4 */  => C 程式碼 /* 和 vim 間至少要有個空白
   // vim:ts=2               => C++
   # vim:ts=2                => sh script, perl, python, tcl
   " vim:ts=2                => vim script

9.6 關於折行

前面已說過 set wrap 就可以造成螢幕折行,可是卻會把一個英文單字折成兩半,實在很不雅觀。好了,Vim 再體貼您一次,:set linebreak(lbr) 就會避免這種問題發生,會在空白或標點符號的地方來折行,但也仍屬螢幕折行,並不會插入 EOL。

在一般的文書排版處理,甚至是寫程式碼,設定系統的設定檔,這些時機,可能自動折行並不很適合(指會插入 EOL 的),很容易把寫好的內容,因為一個不小心就都弄亂了,因為程式一般是一行一行在讀的,把一整行分成兩半,所讀的結果就不一樣了,除非加入程式碼的折行標誌,例如一般的倒斜線9.1\ 或 TeX/LaTeX 的百分號 %。而在排版軟體如 TeX/LaTeX,插入 EOL 的折行,會造成中文字間多出個空白,這在 HTML 格式的檔案亦同,因此,在做折行的決定時,也請考慮一下其他的『副作用』。


9.7 我的設定檔

以下是我個人的設定檔,僅供參考用:

9.7.1 .vimrc 範例

" ~/.vimrc by Edward G.J. Lee
" 這個記號就是 vim 的註解,通常情形 vim 會忽略。
" This code is Public Domain
"
set backspace=indent,eol,start

set autoindent     " always set autoindenting on
set history=50     " keep 50 lines of command line history
set ruler          " show the cursor position all the time
set showcmd        " display incomplete commands

set enc=big5       " 檔案編碼設成 big5

"使用 :update 代替 :w,以便在有修改時才會存檔,注意,這和 vi 不相容。
map  :up
map  :up:q    " 存檔後離開
map  :q!    " 不存檔離開
map  :bp    " 前一個 buffer 檔案
map  :bn    " 下一個 buffer 檔案
" 單鍵  控制 syntax on/off。倒斜線是 Vim script 的折行標誌
" 按一次  是 on 的話,再按一次則是 off,再按一次又是 on。
" 原因是有時候顏色太多會妨礙閱讀。
map  :if exists("syntax_on") 
     \   syntax off 
     \ else 
     \   syntax enable 
     \ endif 
" 按 F8 會在 searching highlight 及非 highlight 間切換
map  :set hls!set hls?
" Toggle on/off paste mode
map  :set paste!set paste?
set pastetoggle=

map  :read !date    " 插入日期
map  :%!xxd       " 呼叫 xxd 做 16 進位顯示
map  :%!xxd -r    " 回復正常顯示

"Default backspace like normal
set bs=2

"Display a status-bar.
"set laststatus=2

"Show matching parenthese.
set showmatch

" 以下是顏色設定,詳細請 :h hi
hi Comment      term=bold ctermfg=darkcyan
hi Constant     term=underline ctermfg=Red
hi Special      term=bold ctermfg=Magenta
hi Identifier   term=underline ctermfg=cyan
hi Statement    term=bold ctermfg=Brown
hi PreProc      term=bold ctermfg=DarkYellow
hi Type         term=bold ctermfg=DarkGreen
hi Ignore       ctermfg=white
hi Error        term=reverse ctermbg=Red ctermfg=White
hi Todo         term=standout ctermbg=Yellow ctermfg=Red
hi Search       term=standout ctermbg=Yellow ctermfg=Black
hi ErrorMsg     term=reverse ctermbg=Red ctermfg=White
hi StatusLine   ctermfg=darkblue  ctermbg=gray
hi StatusLineNC ctermfg=brown   ctermbg=darkblue

set viminfo='20,\"50    " read/write a .viminfo file, don't store more
                        " than 50 lines of registers

" 方便中文重排設定
set formatoptions=mtcql

" 設定 modeline
" vim: ts=2:
9.7.2 .gvimrc 範例

" ~/.gvimrc by Edward G.J. Lee
" This code is Public Domain
"
set mousehide           " 當輸入文字時隱藏 mouse
map  
map!  

" Only do this for Vim version 5.0 and later.
if version >= 500
  let c_comment_strings=1
  if !exists("syntax_on")
    syntax on
  endif

  hi Comment      guifg=DarkBlue
  hi Constant     gui=bold guifg=Magenta guibg=#fffff5f2eed8
  hi Special      guifg=Blue guibg=#fffff5f2eed8
  hi Identifier   gui=bold guifg=DarkCyan
  hi Statement    gui=bold guifg=brown
  hi PreProc      gui=bold guifg=black
  hi Type         guifg=darkgreen
  hi Ignore       guifg=bg
  hi Error        guibg=Red gui=bold guifg=White
  hi Todo         guifg=Blue guibg=Yellow
  hi ErrorMsg     guibg=Red gui=bold guifg=White
  hi Normal       guibg=#fffff5f2eed8
  hi ModeMsg      guifg=DarkBlue guibg=yellow
  hi StatusLine   gui=bold guifg=lightgray guibg=DarkBlue
  hi StatusLineNC gui=bold guifg=lightgray guibg=brown
  hi Cursor guibg=green guifg=NONE
  hi lCursor guibg=Cyan guifg=NONE

endif

" 讓 ex(:) mode 時可以輸入中文(gvim)
set imcmdline
" 讓 xcin 在 insert mode 不自動出現(gvim)
set imdisable
9.7.3 .vim 目錄範例

其實,一些設定檔除了家目錄下的 .vimrc 及 .gvimrc 外,可以置放於家目錄下的一個子目錄 .vim,其目錄結構可以仿 $VIMRUNTIME 這個系統上的結構。例如,我的 .vim 結構如下:

edt1023:~$ tree .vim
.vim
|-- filetype.vim
|-- plugin
|   |-- format.vim
|   `-- tex.vim
|-- syntax
|   |-- lily.vim
|   `-- svg.vim
`-- view
    `-- ~=+bg5.txt=

    3 directories, 6 files
其中,filetype.vim 會在系統的 filetype.vim 載入後蓋過去,也就是家目錄的會先優使用。format.vim 及 tex.vim 是進入 vim 馬上會載入的 Vim script,主要用於中文重排及 TeX/LaTeX 排版系統編輯時的方便指令、按鍵。lily.vim 則是 GNU LilyPond 這個樂譜排版系統檔案的語法顏色定義檔,svg.vim 則是 SVG 向量圖檔的語法顏色定檔加強版。那 view 那個子目錄下的又是什麼呢?這是下 :mkview 指令時所存的一些狀態檔,在 :loadview 要參考到,請參考第 11 章,第 11.1.3 小節,頁 ,這個檔是個隱藏檔。

2012年10月3日 星期三

combine lines to one line

:%s/\n//g

reference

http://stackoverflow.com/questions/6577508/how-to-merge-mulitple-lines-into-one-line-in-vim