分页: 1 / 1
【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-07 18:14
由 futa
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执行命令。
结果为乱码:

- 试试.JPG (18.9 KiB) 查看 5705 次
只有当vim启动前将encoding设置为chinese才行
代码: 全选
set encoding=chinese
cmd.exe 代码页设置为gb2312(cp936)
但是只有当encoding=utf-8时,才能使用guifontwide指定字体。悲剧啊。。怎么解?
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-07 19:34
由 cjxgm
文件名是 gb2312 编码的
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-07 23:01
由 futa
cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-08 23:15
由 lilydjwg
futa 写了:cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
gvim 用的 API 是 MBCS 编码的。设置 termencoding 行不?
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-08 23:44
由 futa
lilydjwg 写了:futa 写了:cjxgm 写了:文件名是 gb2312 编码的
不是哦,win7应该是utf-16编码哦
gvim 用的 API 是 MBCS 编码的。设置 termencoding 行不?
将termencoding设置为chinese(gb2312), 在GUI和终端测试都不行。
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-11 12:38
由 wangjun403
这个貌似还没有解决的方法
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-11 16:01
由 lilydjwg
wangjun403 写了:这个貌似还没有解决的方法
有办法啊。换个 encoding,换个操作系统,或者使用专门的 shell。
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-26 0:53
由 sarrow
我写了一组函数用来解决上述问题。
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
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-26 19:15
由 lilydjwg
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 下直接用 :! 嘛。
Re: 【求救】vim调用cmd.exe执行命令==乱码
发表于 : 2013-07-26 19:33
由 sarrow
主要是为了都打开终端窗口。所以这样写。