windows - Vim:Windows 下终端中的编码(Unicode)

标签 windows winapi vim unicode terminal

我不知道为什么,但是这个话题似乎没有很好的记录并且充满了争议,因为没有人知道真正的答案(也许 Moolenaar 先生除外,他很少回答)。

基本上我已经提出了一个讨论 here ,它很快就死了,可能是因为在 Windows 上没有太多人在终端模式下使用 Vim。

我的编码设置如下:

if has('multi_byte')
  if empty(&termencoding)
    let &termencoding = &encoding
  endif
  let &encoding     = 'utf-8'
  let &fileencoding = 'utf-8'
endif

当然,我在 GVim 下运行没有问题:可以输入任何字符,而且我为 Powerline 打补丁的 Consolas 工作得很好。当我尝试在终端模式下运行 Vim 时,问题就开始了。我使用 ConEmu ,一个功能丰富的 Windows 终端模拟器。它声称开箱即用地正式支持 Unicode。例如,我可以运行以下测试脚本:

chcp 65001 & (cmd /c type "%~dpn0.cmd") & pause & goto :EOF

English:     texts, web pages and documents
Graves,etc:  à á â ã ä å æ ç è é ê ë ì í î ï
Greek:       ΐ Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο
Arabic:      ڠ ڡ ڢ ڣ ڤ ڥ ڦ ڧ ڨ ک ڪ ګ ڬ ڭ ڮ گ
Full width:  @ A B C D E F G H I J K L M N O
Romanian:    texte, pagini Web şi a documentelor
Vietnamese:  văn bản, các trang web và các tài liệu
Russian:     тексты, веб-страницы и документы
Japanese:    テキスト、Webページや文書
Yiddish:     טעקסץ, וועב זייַטלעך און דאָקומענטן
Hindi:       पाठ, वेब पृष्ठों और दस्तावेज
Thai:        ข้อความ หน้า เว็บ และ เอกสาร
Korean:      텍스트, 웹 페이지 및 문서
Chinese:     文本,網頁和文件

而且我可以在 ConEmu 中正确看到所有符号。是的,测试脚本打开 65001 代码页。我已经发现 Vim 根本无法使用 65001 代码页,所以这似乎不是一个选择。终端中的默认代码页是 437,我也可以使用此默认代码页在 ConEmu 中键入俄语之类的内容,并且可以正确显示。

通读 :h termencoding,我发现 Windows 默认使用 Unicode 来传递符号。然后,我不明白为什么当我在终端 Vim 中键入任何非 ANSI 时,我看到 ? 符号?航空公司也不会显示来自补丁 Consolas 的奇特符号。如何在 Windows 上为终端 Vim 配置真正的 Unicode?顺便说一下,&termencoding 也报告 437。

谁能一劳永逸地向我解释一下 Windows 上的终端 Vim 是否支持 Unicode(以及如何配置它)?

最佳答案

我自己也想知道这个问题,过去曾尝试过 ConEmu,但在努力获得具有 256 种颜色和精美字体的控制台 vim 后放弃了。

所以今天我再次尝试了一段时间,惊喜,惊喜 - 事情似乎奏效了。考虑到对版本的所有极端敏感性,我将尝试列出所有内容的版本

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug  1 2014 09:38:34)
MS-Windows 32-bit console version
Included patches: 1-389
Compiled by raghuramanr@ADITI

ConEmu

140723 Alpha

Windows:赢 7x64

.vimrc 中的 ConEmu 设置:

" ConEmu
if !empty($CONEMUBUILD)
    echom "Running in conemu"
    set termencoding=utf8
    set term=xterm
    set t_Co=256
    let &t_AB="\e[48;5;%dm"
    let &t_AF="\e[38;5;%dm"
    " termcap codes for cursor shape changes on entry and exit to
    " /from insert mode
    " doesn't work
    "let &t_ti="\e[1 q"
    "let &t_SI="\e[5 q"
    "let &t_EI="\e[1 q"
    "let &t_te="\e[0 q"
endif

步骤:

chcp 65001
vim.exe

我仍然无法在 vim 中获得闪烁的光标,这令人困惑。仍然比以前乱七八糟的时候好。

关于windows - Vim:Windows 下终端中的编码(Unicode),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034851/

相关文章:

c++ - 使用手动 CreateFile() 复制单个大文件(>100 MB)

python - 有没有办法让 python omnicomplete 与 vim 中的非系统模块一起工作?

java - 如何更改Windows桌面背景

windows - 安装docker后需要安装kubectl吗?

windows - Windows NT 是否缓存或刷新 INI 文件写入内容?

vim - 在 (neo)vim 中禁用背景透明度

vim - vim 中的缓冲区和寄存器有什么区别?

windows - 在没有管理员权限的情况下更改注册表

c++ - 只发生在客户端系统的非法内存访问崩溃如何解决?

c# - 除了 WinAPI 之外,还有其他模拟用户鼠标输入的方法吗?