【求救】vim调用cmd.exe执行命令==乱码

Vim、Emacs配置和使用
回复
futa
帖子: 25
注册时间: 2012-10-25 14:28
系统: linux

【求救】vim调用cmd.exe执行命令==乱码

#1

帖子 futa » 2013-07-07 18:14

vimrc的设置

代码: 全选

set encoding=utf-8 
set fileencoding=utf-8 
set fileencodings=ucs-bom,utf-8,default,chinese,big5
set ambiwidth=double
cmd.exe代码页设置为utf-8(cp65001)

在vim中调用cmd执行命令。

代码: 全选

:!echo %
结果为乱码:
试试.JPG
试试.JPG (18.9 KiB) 查看 5462 次

只有当vim启动前将encoding设置为chinese才行

代码: 全选

set encoding=chinese
cmd.exe 代码页设置为gb2312(cp936)

但是只有当encoding=utf-8时,才能使用guifontwide指定字体。悲剧啊。。怎么解?
上次由 futa 在 2013-07-08 1:39,总共编辑 1 次。
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 【求救】vim调用cmd.exe执行命令==乱码

#2

帖子 cjxgm » 2013-07-07 19:34

文件名是 gb2312 编码的
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
futa
帖子: 25
注册时间: 2012-10-25 14:28
系统: linux

Re: 【求救】vim调用cmd.exe执行命令==乱码

#3

帖子 futa » 2013-07-07 23:01

cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 【求救】vim调用cmd.exe执行命令==乱码

#4

帖子 lilydjwg » 2013-07-08 23:15

futa 写了:
cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
gvim 用的 API 是 MBCS 编码的。设置 termencoding 行不?
futa
帖子: 25
注册时间: 2012-10-25 14:28
系统: linux

Re: 【求救】vim调用cmd.exe执行命令==乱码

#5

帖子 futa » 2013-07-08 23:44

lilydjwg 写了:
futa 写了:
cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
gvim 用的 API 是 MBCS 编码的。设置 termencoding 行不?
将termencoding设置为chinese(gb2312), 在GUI和终端测试都不行。
wangjun403
帖子: 433
注册时间: 2009-07-06 14:26

Re: 【求救】vim调用cmd.exe执行命令==乱码

#6

帖子 wangjun403 » 2013-07-11 12:38

这个貌似还没有解决的方法
生命只不过是上帝借你一用的资本!
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 【求救】vim调用cmd.exe执行命令==乱码

#7

帖子 lilydjwg » 2013-07-11 16:01

wangjun403 写了:这个貌似还没有解决的方法
有办法啊。换个 encoding,换个操作系统,或者使用专门的 shell。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: 【求救】vim调用cmd.exe执行命令==乱码

#8

帖子 sarrow » 2013-07-26 0:53

我写了一组函数用来解决上述问题。

command! -nargs=* -complete=file Shell call system#Shell_{MySys()}(<f-args>)

function! system#Shell_windows(args)
if a:args =~ '^\s*$'
silent execute '!start cmd /K'
else
echom a:args
silent execute '!start cmd /C '. system#ToTermEnc(escape(a:args, '!'))
endif
endfunction

function! system#ToTermEnc(cmd)
if &enc!=&termencoding
return iconv(a:cmd, &enc, &termencoding)
else
return a:cmd
endif
endfunction

至于 @termencoding 需要根据 当前shell用的编码进行设定

另外,MySys() 函数就是用来判断当前操作系统的一个函数;windows下,返回'windows';linux下返回'linux';就是说,针对linux,你还需要单独编写system#Shell_linux(args)函数,比如:

function! system#Shell_linux(args)
let g:sys_shell = '!gnome-terminal '. a:args
if a:args =~ '^\s*$'
silent execute g:sys_shell . ' &'
else
silent execute g:sys_shell . system#ToTermEnc(a:args) . ' &'
endif
endfunction
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 【求救】vim调用cmd.exe执行命令==乱码

#9

帖子 lilydjwg » 2013-07-26 19:15

sarrow 写了:
另外,MySys() 函数就是用来判断当前操作系统的一个函数;windows下,返回'windows';linux下返回'linux';就是说,针对linux,你还需要单独编写system#Shell_linux(args)函数,比如:

function! system#Shell_linux(args)
let g:sys_shell = '!gnome-terminal '. a:args
if a:args =~ '^\s*$'
silent execute g:sys_shell . ' &'
else
silent execute g:sys_shell . system#ToTermEnc(a:args) . ' &'
endif
endfunction
Linux 下直接用 :! 嘛。
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: 【求救】vim调用cmd.exe执行命令==乱码

#10

帖子 sarrow » 2013-07-26 19:33

主要是为了都打开终端窗口。所以这样写。
回复