vim-在windows下安裝gvim亂碼問題

 貌似以前就有遇到過在windows系統下vim出現中文亂碼的狀況,只是用得較少並且也懶得去搗鼓它/// 這問題直到昨晚由於試用了個Caspatant同窗介紹的一款用於實現twitter客戶端功能Vim插件---TwitVim的時候查看消息的時候出現的根本都是亂碼。。。因此決定搞定關於Vim編輯器編碼方式致使中文亂碼的問題///

      上網瞭解了下才知道原來Vim有四個跟字符編碼方式有關的選項,分別是:encoding、fileencoding、fileencodings、 termencoding (這些選項可能的取值請參考 Vim 在線幫助 :help encoding-names),它們各自的意義:
      * encoding: Vim 內部使用的字符編碼方式,包括 Vim 的 buffer (緩衝區)、菜單文本、消息文本等。用戶手冊上建議只在 .vimrc 中改變它的值,事實上彷佛也只有在 .vimrc 中改變它的值纔有意義。
      * fileencoding: Vim 中當前編輯的文件的字符編碼方式,Vim 保存文件時也會將文件保存爲這種字符編碼方式 (無論是否新文件都如此)。
      * fileencodings: Vim 啓動時會按照它所列出的字符編碼方式逐一探測即將打開的文件的字符編碼方式,而且將 fileencoding 設置爲最終探測到的字符編碼方式。所以最好將 Unicode 編碼方式放到這個列表的最前面,將拉丁語系編碼方式 latin1 放到最後面。
      * termencoding: Vim 所工做的終端 (或者 Windows 的 Console 窗口) 的字符編碼方式。這個選項在 Windows 下對咱們經常使用的 GUI 模式的 gVim 無效,而對 Console 模式的 Vim 而言就是 Windows 控制檯的代碼頁,而且一般咱們不須要改變它。
      因爲 Unicode 可以包含幾乎全部的語言的字符,Unicode的 UTF-8 編碼方式又是很是具備性價比的編碼方式,所以encoding 的值設置爲utf-8。同時將encoding設置爲utf-8時,Vim自動探測文件的編碼方式會更準確。在中文 Windows裏編輯的文件,爲了兼顧與其餘軟件的兼容性,文件編碼仍是設置爲GB2312/GBK比較合適,所以fileencoding建議設置爲 chinese (chinese 是個別名,在Unix裏表示gb2312,在Windows裏表示cp936,也就是GBK的代碼頁)。
      最終對於文件中顯示亂碼、菜單亂碼、右鍵菜單亂碼以及Conlse輸出亂碼問題的解決方案,修改Vim編輯器所對應的配置文件_vimrc,添加以下配置:
    
      "處理文本中顯示亂碼
      set encoding=utf-8
      set fileencodings=utf-8,chinese,latin-1
      if has("win32")
      set fileencoding=chinese
      else
      set fileencoding=utf-8
      endif
    
      "處理菜單及右鍵菜單亂碼
      source $VIMRUNTIME/delmenu.vim
      source $VIMRUNTIME/menu.vim
    
      "處理consle輸出亂碼
      language messages zh_CN.utf-8

      關於Vim的支持多字符編碼方式工做的運做原理是:
      首先、Vim 啓動,根據_vimrc配置文件中設置的encoding的值來設置buffer、菜單文本、消息文的字符編碼方式。
      緊接、讀取要編輯的文件,根據fileencodings中列出的字符編碼方式逐一探測該文件編碼方式。並設置fileencoding 爲探測到的字符編碼方式。
      而後、對比fileencoding和encoding的值,若不一樣則調用iconv將文件內容轉換爲encoding所描述的字符編碼方式,而且把轉換後的內容放到爲此文件開闢的buffer裏,完成後就能夠開始編輯這個文件。
      最後、編輯完成後保存文件時,再次對比fileencoding和encoding的值。若不一樣再次調用iconv將即將保存的buffer中的文本轉換爲fileencoding所描述的字符編碼方式,並保存到指定的文件中。
注:須要調用外部的iconv.dll,須要保證這個文件存在於$VIMRUNTIME或者其餘列在PATH環境變量中的目錄裏。php

最後貼一下我本身的文件:shell

source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswinvim

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 $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      if empty(&shellxquote)
        let l:shxq_sav = ''
        set shellxquote&
      endif
      let cmd = '"' . $VIMRUNTIME . '\diff"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
  if exists('l:shxq_sav')
    let &shellxquote=l:shxq_sav
  endif
endfunctionwindows

set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_CN.utf-8編輯器

相關文章
相關標籤/搜索