分页: 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执行命令。

代码: 全选

:!echo %
结果为乱码:
试试.JPG
试试.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
主要是为了都打开终端窗口。所以这样写。