vim-jp / issues

有志で既知のバグや要望を検討・管理し、オフィシャルへの還元をしていきます。
https://vim-jp.org/
342 stars 11 forks source link

パスがマルチバイトを含む場合にエラーが出る #103

Closed tyru closed 12 years ago

tyru commented 12 years ago

vim_jp@googlegroups.comにも送りましたが、 パスがマルチバイトを含む場合にエラーになります。 空白を含むパスは大丈夫のようです。

menu.vimの方は分かりませんが、 gvimrcで出たエラーはkaoriya版のみの問題かと思います。

エラー

C:\日本語\vim\vim73\menu.vim の処理中にエラーが検出され
ました:
行  156:
E121: 未定義の変数です: paste#paste_cmd
E15: 無効な式です: 'vnoremenu <script> &Edit.&Paste<Tab>"+gP^I' . paste#paste_cm
d['v']
C:\日本語\vim\gvimrc の処理中にエラーが検出されました:
行   65:
E185: カラースキーム morning がみつかりません

.vimrc

syntax on
filetype plugin indent on

set enc=utf8

:versionの結果

VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Dec  2 2011 09:17:46)
MS-Windows 32 ビット GUI 版
適用済パッチ: 1-364
Modified by koron.kaoriya@gmail.com
Compiled by koron.kaoriya@gmail.com
Big 版 with GUI.  機能の一覧 有効(+)/無効(-)
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con_gui +diff +digraphs
-dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +gettext/dyn +guess_encode -hangul_input +iconv/dyn +insert_expand +jumplist +keymap +kaoriya +langmap +libcall
+linebreak +lispindent +listcmds +localmap +lua/dyn +menu +migemo/dyn +mksession +modify_fname +mouse +mouseshape +multi_byte_ime/dyn +multi_lang -mzscheme +netbeans_intg -ole +path_extra +perl/dyn +persistent_undo -postscript +printer
-profile +python/dyn +python3/dyn +quickfix +reltime +rightleft +ruby/dyn +scrollbind +signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white -tcl -tgetent -termresponse
+textobjects +title +toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup -xfontset -xim -xterm_save -xpm_w32
    システム vimrc: "$VIM\vimrc"
        ユーザ vimrc: "$HOME\_vimrc"
    第2ユーザ vimrc: "$VIM\_vimrc"
        ユーザ exrc: "$HOME\_exrc"
    第2ユーザ exrc: "$VIM\_exrc"
    システム gvimrc: "$VIM\gvimrc"
    ユーザ gvimrc: "$HOME\_gvimrc"
    第2ユーザ gvimrc: "$VIM\_gvimrc"
    システムメニュー: "$VIMRUNTIME\menu.vim"
コンパイル: cl -c /W3 /nologo  -I. -Iproto -DHAVE_PATHDEF -DWIN32   -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG     /DMODIFIED_BY=\"koron.kaoriya@gmail.com\" /DDYNAMIC_MSVCRT_DLL=\"msvcr100.dll\" /DGETTEXT_DLL=\"intl.dll\" /D_BIND_TO_CURRENT_VCLI
BS_VERSION=1 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\Obj\GULYHR-x86/ /Ox /GL -DNDEBUG /MD -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DDYNAMIC_MIGEMO -DFEAT_LUA -DDYNAMIC_LUA -DDYNAMIC_LUA_DLL=\"lu
a51.dll\" -DFEAT_PYTHON -DDYNAMIC_PYTHON -DDYNAMIC_PYTHON_DLL=\"python27.dll\" -DFEAT_PYTHON3 -DDYNAMIC_PYTHON3 -DDYNAMIC_PYTHON3_DLL=\"python32.dll\" -DFEAT_PERL -DDYNAMIC_PERL -DDYNAMIC_PERL_DLL=\"perl512.dll\" -DFEAT_RUBY -DDYNAMIC_RU
BY -DDYNAMIC_RUBY_VER=192 -DDYNAMIC_RUBY_DLL=\"msvcrt-ruby191.dll\" -DFEAT_BIG /Fd.\Obj\GULYHR-x86/ /Zi
リンク: link /RELEASE /nologo /subsystem:windows /LTCG:STATUS oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib  comdlg32.lib ole32.lib uuid.lib /machine:i386 /nodefaultlib gdi32.lib version.lib   winspool.lib comctl32.lib adv
api32.lib shell32.lib  /machine:i386 /nodefaultlib msvcrt.lib   user32.lib   /nodefaultlib:lua51.lib   /nodefaultlib:python27.lib /nodefaultlib:python32.lib    WSock32.lib  /PDB:gvim.pdb -debug
tyru commented 12 years ago

バージョンはkaoriyaの現行で最新版のVimを使いました。

koron commented 12 years ago

あとで追うつもりですが、香り屋版だけで起きるとは思えない動作ですよね。 敢えて言えばWindowsで日本語用に設定されたVim、というところなんでしょうか。 もしくは香り屋固有設定のせいか。

直感的にはenc=utf-8の設定のせいかも。

ところで起動オプションで -u NONE -U NONE とかするとどうですか?

tyru commented 12 years ago

あ、そうですね。タイトルと冒頭のせいでちょっとややこしいですが マルチバイトを含むパスでエラーが出るのはkaoriya版だけの問題じゃないと思います。 すいません、ちょっと今家にWindows環境がなくてすぐに作れないので明日バイト先のPCで試します...(もちろん空き時間に)

直感的にはenc=utf-8の設定のせいかも。

そうですね。enc=utf-8書いた直後だった気がします。

ところで起動オプションで -u NONE -U NONE とかするとどうですか?

了解です。これも明日試してみます。

tyru commented 12 years ago

タイトル修正しました。

tyru commented 12 years ago

明日試すことをメモのためにリストしておきます。

  1. enc=utf-8の設定で起こる?
  2. 起動オプションで-u NONE -U NONEするとどうなる?
  3. kaoriya版だけでなく本家Vimを起動するとどうなる?
h-east commented 12 years ago

上記設定でこちらでも再現しました。(フォルダは C:\temp\日本語\vim) 'runtimepath'の値がcp932で入っていますね。(これで良いのかは分からないけど)

:scriptnamesしたら以下のように表示されました。

  1: C:\temp\<93><fa><96>{<8c><ea>\vim\vimrc
  2: C:\temp\<93><fa><96>{<8c><ea>\vim\plugins\kaoriya\encode_japan.vim
  3: C:\temp\<93><fa><96>{<8c><ea>\vim\plugins\kaoriya\autoload\kaoriya\switch.vim
  4: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\vimrc_example.vim
  5: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\syntax\syntax.vim
  6: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\syntax\synload.vim
  7: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\syntax\syncolor.vim
  8: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\filetype.vim
  9: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\ftplugin.vim
 10: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\indent.vim
 11: C:\temp\<93><fa><96>{<8c><ea>\vim\_vimrc
 12: C:\temp\<93><fa><96>{<8c><ea>\vim\vim73\syntax\nosyntax.vim
 13: C:\temp\日本語\vim\vim73\menu.vim
 14: C:\temp\日本語\vim\gvimrc
 15: C:\temp\日本語\vim\vim73\gvimrc_example.vim
 16: C:\temp\日本語\vim\_gvimrc

ちなみにset enc=utf8をコメントにしたら発生しませんでした。 とりあえず情報のみ。

mattn commented 12 years ago

じつはこれ、原因しってるんだーw

mattn commented 12 years ago

encoding変更前の状態だとcp932になってるはずなんですが、まずそのエンコーディングでrtpが決定してしまい、encodingを変更するとそこからrtpがutf-8に変わる。よって古いrtpが不正になる...。

これ前にvim_devに流れた気がする。

koron commented 12 years ago

あ。うっすらと記憶にあるかもw

解決策としてはencを変えた瞬間に、いくつかのオプションの値を変換する必要があるってことかな?

mattn commented 12 years ago

ですね。

set encoding=utf-8
let &rtp=iconv(&rtp, 'cp932', 'utf-8')

的なworkaroundもあるかと思いますが、オフィシャルから直したいかも

koron commented 12 years ago

とりあえずはrtpだけでも良いけど、理想を言えば全部の文字列型オプションだよね?

mattn commented 12 years ago

デフォルトのrtpが決定する段階で、scriptencodingの様な扱いを持っていれば、全て解決しそうな気もしなくない。

koron commented 12 years ago

スクリプトでやるならEncodingChangedイベント…か。変更前のエンコードわかんないとダメだけどw

ynkdir commented 12 years ago

win版はもう完全ユニコード化して欲しいです。 A系API呼び出しを全廃したい。 できたらいいなー。

mattn commented 12 years ago

この前、bramが「enc!=utf-8」使ってる人なんてまだいたの的な発言をしててフイた

koron commented 12 years ago

DOSのプログラムすらまだ動くしなぁw

とりあえずKaoriYa版はあとでencode_japan.vimに対策してみます。 autocmd EncodingChangedでrtpとか変換する予定。

できたら試験ヨロです。

tyru commented 12 years ago

明日試すことをメモのためにリストしておきます。

  1. enc=utf-8の設定で起こる?
  2. 起動オプションで-u NONE -U NONEするとどうなる?
  3. kaoriya版だけでなく本家Vimを起動するとどうなる?

試した結果を貼っておきます。 vim_jp@googlegroups.comに送ったメールを引用します。

https://github.com/vim-jp/issues/issues/103 なんだかmattnさんKoRoNさんが核心に近づいているので検証しなくてもいい気がしますが、一応検証結果をメモしておきます。 あとでissuesの方には追加します。

明日試すことをメモのためにリストしておきます。

enc=utf-8の設定で起こる?

.vimrcの「set enc=utf-8」の部分をコメントアウトしたらエラーメッセージが出なくなったのでそのようです。

起動オプションで-u NONE -U NONEするとどうなる?

kaoriya:エラーが出ませんでした。 本家:エラーが出ませんでした。

kaoriya版だけでなく本家Vimを起動するとどうなる?

エラーメッセージは出ませんでしたが、vimの起動画面とメニューが盛大に文字化けしました。(添付してあります) やはり.vimrcの「set enc=utf-8」をコメントアウトしたら正常に起動しました。

本家Vimは下記URLから取得しました。 http://www.vim.org/download.php#pc

Runtime files vim##rt.zip vim73_46rt.zip GUI executable gvim##.zip gvim73_46.zip

$ unzip gvim73_46.zip $ unzip vim73_46rt.zip して「vim/vim73/gvim.exe」を実行しました。

tyru commented 12 years ago

できたら試験ヨロです。

了解です!

koron commented 12 years ago

作ってみた。ちょっとしたテストでは大丈夫だったけど…どうかな?

https://gist.github.com/1436273

koron commented 12 years ago

おっと。last_encの更新忘れてた。というわけで一行だけ追加した。

koron commented 12 years ago

ポイントを抜粋しておきます。

"===========================================================================
" パスに日本語を含む際にencを変更した場合の処置.

let s:last_enc = &enc

function! s:OnEncodingChanged()
  " runtimepath(rtp)を変換する.
  if s:last_enc !=# &enc
    let &rtp = iconv(&rtp, s:last_enc, &enc)
    let s:last_enc = &enc
  endif
endfunction

augroup EncodeJapan
autocmd!
autocmd EncodingChanged * call <SID>OnEncodingChanged()
augroup END
tyru commented 12 years ago

エラー出ませんでした。 最新版のvimにはすでにencode_japan.vimが含まれているようなので同じくエラー出なかったです。

2011/12/11 MURAOKA Taro < reply@reply.github.com

ポイントを抜粋しておきます。


"===========================================================================
" パスに日本語を含む際にencを変更した場合の処置.

let s:last_enc = &enc

function! s:OnEncodingChanged()
 " runtimepath(rtp)を変換する.
 if s:last_enc !=# &enc
   let &rtp = iconv(&rtp, s:last_enc, &enc)
   let s:last_enc = &enc
 endif
endfunction

augroup EncodeJapan
autocmd!
autocmd EncodingChanged * call <SID>OnEncodingChanged()
augroup END

Reply to this email directly or view it on GitHub: https://github.com/vim-jp/issues/issues/103#issuecomment-3095037

mattn commented 12 years ago

@tyru おそらくメーラから送ったせいか、JISになってたのでnkfして貼りなおしておきました。

koron commented 12 years ago

これ、どうしようか?

少なくともドキュメントには記載したほうが良いのかなぁ。

Shougo commented 12 years ago

この前、bramが「enc!=utf-8」使ってる人なんてまだいたの的な発言をしててフイた

Windows環境では多そう……。 utf-8でない場合、外部コマンドとのencoding変換が鬼門ですからね。

koron commented 12 years ago

本質的な問題は #229 にて継続ってことでこっちは閉じます。