New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

端末機能について議論する #1057

Closed
k-takata opened this Issue Jul 22, 2017 · 307 comments

Comments

Projects
None yet
@k-takata
Member

k-takata commented Jul 22, 2017

8.0.0693 から開発が始まった端末機能について議論しましょう。

  • バグ報告
  • 改善点の提案
  • etc.

関連: #915

既知のバグ
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 22, 2017

Member

:terminal (引数なし) で落ちる

向こうにも書きましたが、引数なしだと 'shell' オプションに基づいてシェルを自動で起動してくれると良くないでしょうか。(nvimはどうなっているのだろう?)

Member

k-takata commented Jul 22, 2017

:terminal (引数なし) で落ちる

向こうにも書きましたが、引数なしだと 'shell' オプションに基づいてシェルを自動で起動してくれると良くないでしょうか。(nvimはどうなっているのだろう?)

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 22, 2017

Member

はい。その予定で考えていますが、例えばシェルの設定が間違ってる場合にエラーになるのですが、その際に落ちます。

Member

mattn commented Jul 22, 2017

はい。その予定で考えていますが、例えばシェルの設定が間違ってる場合にエラーになるのですが、その際に落ちます。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 22, 2017

Member

おっと来たw vim/vim@5a1feb8

Member

mattn commented Jul 22, 2017

おっと来たw vim/vim@5a1feb8

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 22, 2017

Member

どんどん片付いてくw

Member

mattn commented Jul 22, 2017

どんどん片付いてくw

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 22, 2017

Member

'pythondll' みたいに winpty.dll のパスをオプションで指定できるようになるといいかもしれません。

Member

k-takata commented Jul 22, 2017

'pythondll' みたいに winpty.dll のパスをオプションで指定できるようになるといいかもしれません。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 24, 2017

Member

いろいろ修正。
https://groups.google.com/d/msg/vim_dev/s2_4gPDWlyA/F979NC6kCQAJ

課題:

  • if_perl_msvc/stdboo.h を vterm でも利用するようになったので、もう少しわかりやすいディレクトリ名に変えるべきか?
  • src/Makefile は、libvterm 以下のファイルを(ライブラリを作らずに)直接コンパイル・リンクする作りになっているが、Windows 向け (src/Make_mvc.mak, src/Make_cyg_ming.mak) も同じようにすべきか? 現状では、libvtermの作業ディレクトリを分けていないので、同じソースディレクトリ内で 32bit, 64bit 等複数の vim をビルドすることができない。
Member

k-takata commented Jul 24, 2017

いろいろ修正。
https://groups.google.com/d/msg/vim_dev/s2_4gPDWlyA/F979NC6kCQAJ

課題:

  • if_perl_msvc/stdboo.h を vterm でも利用するようになったので、もう少しわかりやすいディレクトリ名に変えるべきか?
  • src/Makefile は、libvterm 以下のファイルを(ライブラリを作らずに)直接コンパイル・リンクする作りになっているが、Windows 向け (src/Make_mvc.mak, src/Make_cyg_ming.mak) も同じようにすべきか? 現状では、libvtermの作業ディレクトリを分けていないので、同じソースディレクトリ内で 32bit, 64bit 等複数の vim をビルドすることができない。
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 24, 2017

Member

ちなみに、現時点のTODOがterminal.cの先頭に書いてありますので、これを見ればBramがどのように拡張しようと考えているかが分かるかもしれません。
https://github.com/vim/vim/blob/81bdd6a02575b024db3dd5d91ec4ac4dfd41aa7a/src/terminal.c#L35-L65

Member

k-takata commented Jul 24, 2017

ちなみに、現時点のTODOがterminal.cの先頭に書いてありますので、これを見ればBramがどのように拡張しようと考えているかが分かるかもしれません。
https://github.com/vim/vim/blob/81bdd6a02575b024db3dd5d91ec4ac4dfd41aa7a/src/terminal.c#L35-L65

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 24, 2017

Member

terminal.c に書いてある eval 系関数、term_T のメンバを参照する必要があるので term_T の定義を structs.h かなんかに持っていくか、広域関数作るしかない。

Member

mattn commented Jul 24, 2017

terminal.c に書いてある eval 系関数、term_T のメンバを参照する必要があるので term_T の定義を structs.h かなんかに持っていくか、広域関数作るしかない。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 24, 2017

Member

いずれ誰かが実装する際に、ご自由にお使い下さい。

https://gist.github.com/b770f0bf14e1294d73959df70addc37f

既に実装してしまった。

Member

mattn commented Jul 24, 2017

いずれ誰かが実装する際に、ご自由にお使い下さい。

https://gist.github.com/b770f0bf14e1294d73959df70addc37f

既に実装してしまった。

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 25, 2017

Member

lingrにも書いたのですが、画面の色が灰色になります

Member

Tatsuki-I commented Jul 25, 2017

lingrにも書いたのですが、画面の色が灰色になります

@splhack

This comment has been minimized.

Show comment
Hide comment
@splhack

splhack Jul 25, 2017

Member

im_is_preediting()がTRUEのとき、channelにテキストは送らないが、buffer自体は更新する、的な何かが必要かなと

Member

splhack commented Jul 25, 2017

im_is_preediting()がTRUEのとき、channelにテキストは送らないが、buffer自体は更新する、的な何かが必要かなと

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

@Tatsuki-I 画面の色は background オプションに依存します。おそらく light なのではないかと。

Member

mattn commented Jul 25, 2017

@Tatsuki-I 画面の色は background オプションに依存します。おそらく light なのではないかと。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

@splhack なるほど。次に Linux 触る機会に試します。

Member

mattn commented Jul 25, 2017

@splhack なるほど。次に Linux 触る機会に試します。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

その他、仕様が固まってしまうまでに要望あげておいてもらえると助かります。 > all

Member

mattn commented Jul 25, 2017

その他、仕様が固まってしまうまでに要望あげておいてもらえると助かります。 > all

@thinca

This comment has been minimized.

Show comment
Hide comment
@thinca

thinca Jul 25, 2017

Member

現状 <C-w>:: に入って Ex コマンドが実行できますが、私は普段 ;: を入れ替えているので、この <C-w>: の部分を何かしらの方法でカスタマイズできると嬉しいです。
どういう仕様がいいかはちょっと煮詰まってないですが…。

Member

thinca commented Jul 25, 2017

現状 <C-w>:: に入って Ex コマンドが実行できますが、私は普段 ;: を入れ替えているので、この <C-w>: の部分を何かしらの方法でカスタマイズできると嬉しいです。
どういう仕様がいいかはちょっと煮詰まってないですが…。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

<C-w> については termkey というオプションで変更可能ですが、: も含めて入れ替えられるかは試してません。

Member

mattn commented Jul 25, 2017

<C-w> については termkey というオプションで変更可能ですが、: も含めて入れ替えられるかは試してません。

@equal-l2

This comment has been minimized.

Show comment
Hide comment
@equal-l2

equal-l2 Jul 25, 2017

こんにちは。
Neovimだと端末でExitすると端末を開いていたバッファが自動で閉じるのですが、こちらでもそのようにしてみてはどうでしょうか?

equal-l2 commented Jul 25, 2017

こんにちは。
Neovimだと端末でExitすると端末を開いていたバッファが自動で閉じるのですが、こちらでもそのようにしてみてはどうでしょうか?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

今の所、Bram は :terminal <autoclose> みたいな事をやろうとしている様です。

vim/vim#1870

<autoclose> がほんとにそういう表記なのかはツッコミどころではありますが。

Member

mattn commented Jul 25, 2017

今の所、Bram は :terminal <autoclose> みたいな事をやろうとしている様です。

vim/vim#1870

<autoclose> がほんとにそういう表記なのかはツッコミどころではありますが。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 25, 2017

Member

@Tatsuki-I 現状の background オプションに依存する動作が嫌という事でしょうか?

Member

mattn commented Jul 25, 2017

@Tatsuki-I 現状の background オプションに依存する動作が嫌という事でしょうか?

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

@mattn
元々プラグインを使って背景を透明(端末の色と同じ)にしているので、backgroundがどういう設定になっているのかが分からないのですが、Vimと同じ色になってくれないのが嫌だなあとは思っています
ちなみにset background=darkにしているはずなのですが、terminalの方は反映されていないです(これは僕の環境のせいかも知れません)

Member

Tatsuki-I commented Jul 26, 2017

@mattn
元々プラグインを使って背景を透明(端末の色と同じ)にしているので、backgroundがどういう設定になっているのかが分からないのですが、Vimと同じ色になってくれないのが嫌だなあとは思っています
ちなみにset background=darkにしているはずなのですが、terminalの方は反映されていないです(これは僕の環境のせいかも知れません)

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

画面分割や移動を以下のベージのように設定していますが、この設定が効きません
使えるようになるととても有り難いです
http://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca

Member

Tatsuki-I commented Jul 26, 2017

画面分割や移動を以下のベージのように設定していますが、この設定が効きません
使えるようになるととても有り難いです
http://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Jul 26, 2017

Member

あと lingr でも聞いたのですが iTerm2 で backspace が効かないとの事。

  • iTerm2 上でのシェル ok
  • iTerm2 上のシェル上の vim ok
  • iTerm2 上のシェル上の vim 上の terminal ok
  • iTerm2 上のシェル上の vim 上の terminal 上の ghci ng

@Tatsuki-I これであってますでしょうか?

Member

mattn commented Jul 26, 2017

あと lingr でも聞いたのですが iTerm2 で backspace が効かないとの事。

  • iTerm2 上でのシェル ok
  • iTerm2 上のシェル上の vim ok
  • iTerm2 上のシェル上の vim 上の terminal ok
  • iTerm2 上のシェル上の vim 上の terminal 上の ghci ng

@Tatsuki-I これであってますでしょうか?

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

HaskellのGHCi内でBS、カーソルキーが使えない
カーソルが一切表示されない
環境
macOS Sierra
iTerm2、macデフォルトターミナルの両方
zsh
Vimはversion 8.0.771(homebrewにてインストール)

Member

Tatsuki-I commented Jul 26, 2017

HaskellのGHCi内でBS、カーソルキーが使えない
カーソルが一切表示されない
環境
macOS Sierra
iTerm2、macデフォルトターミナルの両方
zsh
Vimはversion 8.0.771(homebrewにてインストール)

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

@mattn
合っています
あの後でMacのデフォルトターミナルでも試しましたが、同じ結果でした
環境の情報は他に必要なものはありますか?

Member

Tatsuki-I commented Jul 26, 2017

@mattn
合っています
あの後でMacのデフォルトターミナルでも試しましたが、同じ結果でした
環境の情報は他に必要なものはありますか?

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

ちなみにElixirのiEXでも試したところ、全く問題無く動作しました
もしかするとGHCiの問題なのかも知れません

Member

Tatsuki-I commented Jul 26, 2017

ちなみにElixirのiEXでも試したところ、全く問題無く動作しました
もしかするとGHCiの問題なのかも知れません

@Tatsuki-I

This comment has been minimized.

Show comment
Hide comment
@Tatsuki-I

Tatsuki-I Jul 26, 2017

Member

追記
Swiftの対話環境ではGHCiと同じようにBS等が使えませんでした
RubyのirbはiEXと同様、動作しました
nodeも問題なく動作しています

Member

Tatsuki-I commented Jul 26, 2017

追記
Swiftの対話環境ではGHCiと同じようにBS等が使えませんでした
RubyのirbはiEXと同様、動作しました
nodeも問題なく動作しています

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 26, 2017

Member

Win32 CUI版で、色がRとBが入れ替わっている気がします。

Member

k-takata commented Jul 26, 2017

Win32 CUI版で、色がRとBが入れ替わっている気がします。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Jul 26, 2017

Member

端末内からクリップボードとデータをやりとりしたい場合は、どうすればいいのだろう。

Member

k-takata commented Jul 26, 2017

端末内からクリップボードとデータをやりとりしたい場合は、どうすればいいのだろう。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 19, 2017

Member

#1057 (comment) の件、CUIは patch 8.0.1126 で直りましたが、GUIは直ってない。
再度報告。
https://groups.google.com/d/msg/vim_dev/2oLpiSiztwo/U_rSKcCQDgAJ

Member

h-east commented Sep 19, 2017

#1057 (comment) の件、CUIは patch 8.0.1126 で直りましたが、GUIは直ってない。
再度報告。
https://groups.google.com/d/msg/vim_dev/2oLpiSiztwo/U_rSKcCQDgAJ

@ichitera

This comment has been minimized.

Show comment
Hide comment
@ichitera

ichitera Sep 19, 2017

h-eastさん、ありがとうございます。頂いたパッチを当ててみました。
マウスカーソルの表示どおりにウィンドウをリサイズできました。
(見直しは中身を読んだことがないので判断つきませんでした。)

ichitera commented Sep 19, 2017

h-eastさん、ありがとうございます。頂いたパッチを当ててみました。
マウスカーソルの表示どおりにウィンドウをリサイズできました。
(見直しは中身を読んだことがないので判断つきませんでした。)

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 19, 2017

Member

【速報】terminal.c 消える

Member

mattn commented Sep 19, 2017

【速報】terminal.c 消える

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 20, 2017

Member

ところで intro.txt に名前が載りましたね。おめでとうございます。

vim/vim@37c64c7#diff-0c035b0a8597a0a87f61ae3d128f81d9

Member

mattn commented Sep 20, 2017

ところで intro.txt に名前が載りましたね。おめでとうございます。

vim/vim@37c64c7#diff-0c035b0a8597a0a87f61ae3d128f81d9

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 20, 2017

Member

【速報】terminal.c 消える

Vim 8.0.1128 の直後のRuntimeファイル更新で消えちゃってるので、更新は 8.0.1128 までに留めておくべきですね。

Member

h-east commented Sep 20, 2017

【速報】terminal.c 消える

Vim 8.0.1128 の直後のRuntimeファイル更新で消えちゃってるので、更新は 8.0.1128 までに留めておくべきですね。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 20, 2017

Member

ところで intro.txt に名前が載りましたね。おめでとうございます。

おめでとうございます。
ChrisBさん載ってなかったのかよッ!

Member

h-east commented Sep 20, 2017

ところで intro.txt に名前が載りましたね。おめでとうございます。

おめでとうございます。
ChrisBさん載ってなかったのかよッ!

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 20, 2017

Member

ChrisBさん載ってなかったのかよッ!

😱

Member

mattn commented Sep 20, 2017

ChrisBさん載ってなかったのかよッ!

😱

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 23, 2017

Member

#1057 (comment) この件も関係するんですが、'mouse'オプションにt (Terminal-Jobモード)を追加しないと仕様的に整合が取れない気がします。
Terminal-Normalモードは現状でも内部的にはノーマルモードと同じなので、'mouse'オプションのnの有無でマウス操作の挙動を変える。
Terminal-Jobモードは既存の値で属せそうなものが無いのでt追加でいいんじゃないでしょうか?

@ichitera patchの確認ありがとうございます。

Member

h-east commented Sep 23, 2017

#1057 (comment) この件も関係するんですが、'mouse'オプションにt (Terminal-Jobモード)を追加しないと仕様的に整合が取れない気がします。
Terminal-Normalモードは現状でも内部的にはノーマルモードと同じなので、'mouse'オプションのnの有無でマウス操作の挙動を変える。
Terminal-Jobモードは既存の値で属せそうなものが無いのでt追加でいいんじゃないでしょうか?

@ichitera patchの確認ありがとうございます。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 29, 2017

Member

LANGがja_JP.UTF-8だとmake testがpassしない。LANG=C make testだとpassする。

これ、他の人起きてないの?

Member

h-east commented Sep 29, 2017

LANGがja_JP.UTF-8だとmake testがpassしない。LANG=C make testだとpassする。

これ、他の人起きてないの?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 29, 2017

Member

OSX で1行が1000バイト以上の物を送った時にハングする件の修正テストですね。一見、ロケール関係内容にも見えますね。なんだろう。

  for c in ['a','b','c','d','e','f','g','h','i','j','k']
    call term_sendkeys(g:buf, 'echo ' . repeat(c, len) . "\<cr>")
  endfor
  call term_sendkeys(g:buf, "echo done\<cr>")

  " On MS-Windows there is an extra empty line below "done".  Find "done" in
  " the last-but-one or the last-but-two line.
  let g:lnum = term_getsize(g:buf)[0] - 1
  call WaitFor('term_getline(g:buf, g:lnum) =~ "done" || term_getline(g:buf, g:lnum - 1) =~ "done"', 3000)
  let line = term_getline(g:buf, g:lnum)
  if line !~ 'done'
    let line = term_getline(g:buf, g:lnum - 1)
  endif
  call assert_match('done', line)
Member

mattn commented Sep 29, 2017

OSX で1行が1000バイト以上の物を送った時にハングする件の修正テストですね。一見、ロケール関係内容にも見えますね。なんだろう。

  for c in ['a','b','c','d','e','f','g','h','i','j','k']
    call term_sendkeys(g:buf, 'echo ' . repeat(c, len) . "\<cr>")
  endfor
  call term_sendkeys(g:buf, "echo done\<cr>")

  " On MS-Windows there is an extra empty line below "done".  Find "done" in
  " the last-but-one or the last-but-two line.
  let g:lnum = term_getsize(g:buf)[0] - 1
  call WaitFor('term_getline(g:buf, g:lnum) =~ "done" || term_getline(g:buf, g:lnum - 1) =~ "done"', 3000)
  let line = term_getline(g:buf, g:lnum)
  if line !~ 'done'
    let line = term_getline(g:buf, g:lnum - 1)
  endif
  call assert_match('done', line)
@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 29, 2017

Member

LANGがja_JP.UTF-8だとmake testがpassしない。LANG=C make testだとpassする。

これ Mac ですか?

Test_terminal_noblock は、Linux でも sh==bash の環境だと結構 fail します。
Debian 系の sh==dash 環境では、1行の入力が改行込みで4096byteに切り詰められるので、testは通るものの多分期待とは違う動作をしている。

Member

ichizok commented Sep 29, 2017

LANGがja_JP.UTF-8だとmake testがpassしない。LANG=C make testだとpassする。

これ Mac ですか?

Test_terminal_noblock は、Linux でも sh==bash の環境だと結構 fail します。
Debian 系の sh==dash 環境では、1行の入力が改行込みで4096byteに切り詰められるので、testは通るものの多分期待とは違う動作をしている。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Sep 29, 2017

Member

これ Mac ですか?

Fedora 25 です。

Member

h-east commented Sep 29, 2017

これ Mac ですか?

Fedora 25 です。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Sep 30, 2017

Member

bash のソースを見ると、LC_CTYPEC or POSIX のとき挙動を変えている部分があるので、その辺が関係あるかもしれません。
実際、Vim側は LANG=C.UTF-8 のまま、term_start で起動したshell内で LC_CTYPE=C にした場合もテストpassしました。

Vim shell 結果
LC_CTYPE=C.UTF-8 LC_CTYPE=POSIX OK
LC_CTYPE=C.UTF-8 LC_CTYPE=C.UTF-8 Fail
LC_CTYPE=C LC_CTYPE=C OK
LC_CTYPE=C LC_CTYPE=C.UTF-8 Fail
LC_CTYPE=C.UTF-8 LC_CTYPE=C, LANG=C.UTF-8 OK
LC_CTYPE=C.UTF-8 LC_CTYPE=C.UTF-8, LANG=C Fail
Member

ichizok commented Sep 30, 2017

bash のソースを見ると、LC_CTYPEC or POSIX のとき挙動を変えている部分があるので、その辺が関係あるかもしれません。
実際、Vim側は LANG=C.UTF-8 のまま、term_start で起動したshell内で LC_CTYPE=C にした場合もテストpassしました。

Vim shell 結果
LC_CTYPE=C.UTF-8 LC_CTYPE=POSIX OK
LC_CTYPE=C.UTF-8 LC_CTYPE=C.UTF-8 Fail
LC_CTYPE=C LC_CTYPE=C OK
LC_CTYPE=C LC_CTYPE=C.UTF-8 Fail
LC_CTYPE=C.UTF-8 LC_CTYPE=C, LANG=C.UTF-8 OK
LC_CTYPE=C.UTF-8 LC_CTYPE=C.UTF-8, LANG=C Fail
@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Oct 3, 2017

Member

#1057 (comment) この件も関係するんですが、'mouse'オプションにt (Terminal-Jobモード)を追加しないと仕様的に整合が取れない気がします。

まだ途中だけどやろうとしていることは分かってもらえると思う。
https://gist.github.com/h-east/4cf6b54942ab45de9e1e650db96ea338

Member

h-east commented Oct 3, 2017

#1057 (comment) この件も関係するんですが、'mouse'オプションにt (Terminal-Jobモード)を追加しないと仕様的に整合が取れない気がします。

まだ途中だけどやろうとしていることは分かってもらえると思う。
https://gist.github.com/h-east/4cf6b54942ab45de9e1e650db96ea338

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Oct 4, 2017

Member

gvim 8.0.1159 on Windows 10 で :term cd<CR> と入力すると、terminalウィンドウが開かれずに以下のメッセージが表示されます。

CreateProcess failed

*レジスタに出力させると、

redir @*
term cd
redir END

以下のようになっていました。

CreateProcess failed
function <SNR>6_BMRemove の処理中にエラーが検出されました:
行    9:
E329: "!cd (2)	C:\Program Files\vim\vim80" というメニューはありません

CreateProcess failedとそれ以外は別問題っぽいですね。

情報:

  • vim取得先: Official の gvim_8.0.1159_x64.zip
  • gvim --cleanでもgvim -Nu NONEでも発生。
  • :term<CR>はterminalウィンドウが開く。
  • vim.exeでも同じ結果。
Member

h-east commented Oct 4, 2017

gvim 8.0.1159 on Windows 10 で :term cd<CR> と入力すると、terminalウィンドウが開かれずに以下のメッセージが表示されます。

CreateProcess failed

*レジスタに出力させると、

redir @*
term cd
redir END

以下のようになっていました。

CreateProcess failed
function <SNR>6_BMRemove の処理中にエラーが検出されました:
行    9:
E329: "!cd (2)	C:\Program Files\vim\vim80" というメニューはありません

CreateProcess failedとそれ以外は別問題っぽいですね。

情報:

  • vim取得先: Official の gvim_8.0.1159_x64.zip
  • gvim --cleanでもgvim -Nu NONEでも発生。
  • :term<CR>はterminalウィンドウが開く。
  • vim.exeでも同じ結果。
@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Oct 4, 2017

Member

terminal は CreateProcess に失敗すると terminal ウィンドウを閉じる様に作られています。cd はプロセスではないので(cmd の内部コマンド)、閉じられるのが期待する結果になりますが、何か認識間違い(僕が)していますか?

:term cmd /c cd

ですか?

Member

mattn commented Oct 4, 2017

terminal は CreateProcess に失敗すると terminal ウィンドウを閉じる様に作られています。cd はプロセスではないので(cmd の内部コマンド)、閉じられるのが期待する結果になりますが、何か認識間違い(僕が)していますか?

:term cmd /c cd

ですか?

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Oct 4, 2017

Member

@mattn あー、そうでした。失礼しました。
細かいですがエラーメッセージ(CreateProcess failed)にはエラー番号(例: E999:)付けた方がいい気がしますね。

Member

h-east commented Oct 4, 2017

@mattn あー、そうでした。失礼しました。
細かいですがエラーメッセージ(CreateProcess failed)にはエラー番号(例: E999:)付けた方がいい気がしますね。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Oct 4, 2017

Member

なんか、昔は unix 版とインタフェース合わせたつもりだったけど、今見たら UNIX 版は terminal 残したままそこにエラーが出てますね。。。
いつ変わったんや。

Member

mattn commented Oct 4, 2017

なんか、昔は unix 版とインタフェース合わせたつもりだったけど、今見たら UNIX 版は terminal 残したままそこにエラーが出てますね。。。
いつ変わったんや。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Oct 5, 2017

Member

vim/vim#2010 これ、どういう状況なんでしたっけ。
Windows GUI版は、これ無しだと正直使い物にならないくらい遅いのですが。(type eval.c とかすると 10秒以上掛かる。)
Bramの言っていることがよく理解できていない…。

Member

k-takata commented Oct 5, 2017

vim/vim#2010 これ、どういう状況なんでしたっけ。
Windows GUI版は、これ無しだと正直使い物にならないくらい遅いのですが。(type eval.c とかすると 10秒以上掛かる。)
Bramの言っていることがよく理解できていない…。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Oct 5, 2017

Member

端末では、スクロールが起きると画面の転写と最終行の再描画だけになるので遅い回線で有利だというのが理由なんですが、その転写が遅いのですよねー。Windows GUI の場合、全画面書き直した方が速い結果になってしまっています。

Member

mattn commented Oct 5, 2017

端末では、スクロールが起きると画面の転写と最終行の再描画だけになるので遅い回線で有利だというのが理由なんですが、その転写が遅いのですよねー。Windows GUI の場合、全画面書き直した方が速い結果になってしまっています。

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Oct 5, 2017

Member

いくつか試した結果、こんな感じ。
Time of type eval.c or cat eval.c:

Win32 GUI Win32 CUI Cygwin
without PR#2010 > 10 sec (F) ~ 2 sec (F) ~ 1 sec (F)
with PR#2010 < 1 sec (N) ~ 1 sec (N) ~ 1 sec (N)

F: Flicker, N: No flicker

Member

k-takata commented Oct 5, 2017

いくつか試した結果、こんな感じ。
Time of type eval.c or cat eval.c:

Win32 GUI Win32 CUI Cygwin
without PR#2010 > 10 sec (F) ~ 2 sec (F) ~ 1 sec (F)
with PR#2010 < 1 sec (N) ~ 1 sec (N) ~ 1 sec (N)

F: Flicker, N: No flicker

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Oct 5, 2017

Member

ttyfast gui.in_use とかで条件付けるのはどうですか?

Member

ichizok commented Oct 5, 2017

ttyfast gui.in_use とかで条件付けるのはどうですか?

@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Oct 5, 2017

Member

いいかも。

--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1912,6 +1912,11 @@ handle_moverect(VTermRect dest, VTermRec
 	VTermColor  fg, bg;
 	VTermScreenCellAttrs attr;
 	int	    clear_attr;
+	int	    disable_redraw = p_tf
+#ifdef FEAT_GUI
+					    || gui.in_use
+#endif
+					    ;
 
 	/* Set the color to clear lines with. */
 	vterm_state_get_default_colors(vterm_obtain_state(term->tl_vterm),
@@ -1919,6 +1924,8 @@ handle_moverect(VTermRect dest, VTermRec
 	vim_memset(&attr, 0, sizeof(attr));
 	clear_attr = cell2attr(attr, fg, bg);
 
+	if (disable_redraw)
+	    ++RedrawingDisabled;
 	FOR_ALL_WINDOWS(wp)
 	{
 	    if (wp->w_buffer == term->tl_buffer)
@@ -1926,6 +1933,8 @@ handle_moverect(VTermRect dest, VTermRec
 				 src.start_row - dest.start_row, FALSE, FALSE,
 				 clear_attr);
 	}
+	if (disable_redraw)
+	    --RedrawingDisabled;
     }
 
     term->tl_dirty_row_start = MIN(term->tl_dirty_row_start, dest.start_row);
Member

k-takata commented Oct 5, 2017

いいかも。

--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1912,6 +1912,11 @@ handle_moverect(VTermRect dest, VTermRec
 	VTermColor  fg, bg;
 	VTermScreenCellAttrs attr;
 	int	    clear_attr;
+	int	    disable_redraw = p_tf
+#ifdef FEAT_GUI
+					    || gui.in_use
+#endif
+					    ;
 
 	/* Set the color to clear lines with. */
 	vterm_state_get_default_colors(vterm_obtain_state(term->tl_vterm),
@@ -1919,6 +1924,8 @@ handle_moverect(VTermRect dest, VTermRec
 	vim_memset(&attr, 0, sizeof(attr));
 	clear_attr = cell2attr(attr, fg, bg);
 
+	if (disable_redraw)
+	    ++RedrawingDisabled;
 	FOR_ALL_WINDOWS(wp)
 	{
 	    if (wp->w_buffer == term->tl_buffer)
@@ -1926,6 +1933,8 @@ handle_moverect(VTermRect dest, VTermRec
 				 src.start_row - dest.start_row, FALSE, FALSE,
 				 clear_attr);
 	}
+	if (disable_redraw)
+	    --RedrawingDisabled;
     }
 
     term->tl_dirty_row_start = MIN(term->tl_dirty_row_start, dest.start_row);
@k-takata

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Oct 10, 2017

Member

https://groups.google.com/d/msg/vim_dev/s94z0GkdX4o/pijoEBo9AwAJ
Linuxでもこのパッチで速度改善するとのことですが、GUIはそれでも遅いらしい。

Member

k-takata commented Oct 10, 2017

https://groups.google.com/d/msg/vim_dev/s94z0GkdX4o/pijoEBo9AwAJ
Linuxでもこのパッチで速度改善するとのことですが、GUIはそれでも遅いらしい。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Oct 30, 2017

Member

https://twitter.com/shiena/statuses/924855776568414208

Windows 版で env が渡っていない模様。

diff --git a/src/os_win32.c b/src/os_win32.c
index f1e1cad8e..7654c3100 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5033,8 +5033,8 @@ job_io_file_open(
  * Turn the dictionary "env" into a NUL separated list that can be used as the
  * environment argument of vim_create_process().
  */
-    static void
-make_job_env(garray_T *gap, dict_T *env)
+    void
+win32_build_env(dict_T *env, garray_T *gap)
 {
     hashitem_T	*hi;
     int		todo = (int)env->dv_hashtab.ht_used;
@@ -5133,7 +5133,7 @@ mch_job_start(char *cmd, job_T *job, jobopt_T *options)
     }
 
     if (options->jo_env != NULL)
-	make_job_env(&ga, options->jo_env);
+	win32_build_env(options->jo_env, &ga);
 
     ZeroMemory(&pi, sizeof(pi));
     ZeroMemory(&si, sizeof(si));
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 7e6953c7d..188a45be0 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -67,4 +67,5 @@ void used_file_arg(char *name, int literal, int full_path, int diff_mode);
 void set_alist_count(void);
 void fix_arg_enc(void);
 int mch_setenv(char *var, char *value, int x);
+void win32_build_env(dict_T *l, garray_T *gap);
 /* vim: set ft=c : */
diff --git a/src/terminal.c b/src/terminal.c
index efd803c6f..e9d1c983c 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -3390,6 +3390,7 @@ term_and_job_init(
 {
     WCHAR	    *cmd_wchar = NULL;
     WCHAR	    *cwd_wchar = NULL;
+    WCHAR	    *env_wchar = NULL;
     channel_T	    *channel = NULL;
     job_T	    *job = NULL;
     DWORD	    error;
@@ -3398,7 +3399,7 @@ term_and_job_init(
     HANDLE	    child_thread_handle;
     void	    *winpty_err;
     void	    *spawn_config = NULL;
-    garray_T	    ga;
+    garray_T	    ga_cmd, ga_env;
     char_u	    *cmd;
 
     if (dyn_winpty_init(TRUE) == FAIL)
@@ -3408,10 +3409,10 @@ term_and_job_init(
 	cmd = argvar->vval.v_string;
     else
     {
-	ga_init2(&ga, (int)sizeof(char*), 20);
-	if (win32_build_cmd(argvar->vval.v_list, &ga) == FAIL)
+	ga_init2(&ga_cmd, (int)sizeof(char*), 20);
+	if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL)
 	    goto failed;
-	cmd = ga.ga_data;
+	cmd = ga_cmd.ga_data;
     }
 
     cmd_wchar = enc_to_utf16(cmd, NULL);
@@ -3419,6 +3420,12 @@ term_and_job_init(
 	return FAIL;
     if (opt->jo_cwd != NULL)
 	cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL);
+    if (opt->jo_env != NULL)
+    {
+	ga_init2(&ga_env, (int)sizeof(char*), 20);
+	win32_build_env(opt->jo_env, &ga_env);
+	env_wchar = ga_env.ga_data;
+    }
 
     job = job_alloc();
     if (job == NULL)
@@ -3446,7 +3453,7 @@ term_and_job_init(
 	    NULL,
 	    cmd_wchar,
 	    cwd_wchar,
-	    NULL,
+	    env_wchar,
 	    &winpty_err);
     if (spawn_config == NULL)
 	goto failed;
@@ -3519,7 +3526,9 @@ term_and_job_init(
 
 failed:
     if (argvar->v_type == VAR_LIST)
-	vim_free(ga.ga_data);
+	vim_free(ga_cmd.ga_data);
+    if (opt->jo_env != NULL)
+	vim_free(ga_env.ga_data);
     vim_free(cmd_wchar);
     vim_free(cwd_wchar);
     if (spawn_config != NULL)

後でテスト書きます。 書いた。

https://travis-ci.org/mattn/vim/builds/294696621

Member

mattn commented Oct 30, 2017

https://twitter.com/shiena/statuses/924855776568414208

Windows 版で env が渡っていない模様。

diff --git a/src/os_win32.c b/src/os_win32.c
index f1e1cad8e..7654c3100 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5033,8 +5033,8 @@ job_io_file_open(
  * Turn the dictionary "env" into a NUL separated list that can be used as the
  * environment argument of vim_create_process().
  */
-    static void
-make_job_env(garray_T *gap, dict_T *env)
+    void
+win32_build_env(dict_T *env, garray_T *gap)
 {
     hashitem_T	*hi;
     int		todo = (int)env->dv_hashtab.ht_used;
@@ -5133,7 +5133,7 @@ mch_job_start(char *cmd, job_T *job, jobopt_T *options)
     }
 
     if (options->jo_env != NULL)
-	make_job_env(&ga, options->jo_env);
+	win32_build_env(options->jo_env, &ga);
 
     ZeroMemory(&pi, sizeof(pi));
     ZeroMemory(&si, sizeof(si));
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
index 7e6953c7d..188a45be0 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -67,4 +67,5 @@ void used_file_arg(char *name, int literal, int full_path, int diff_mode);
 void set_alist_count(void);
 void fix_arg_enc(void);
 int mch_setenv(char *var, char *value, int x);
+void win32_build_env(dict_T *l, garray_T *gap);
 /* vim: set ft=c : */
diff --git a/src/terminal.c b/src/terminal.c
index efd803c6f..e9d1c983c 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -3390,6 +3390,7 @@ term_and_job_init(
 {
     WCHAR	    *cmd_wchar = NULL;
     WCHAR	    *cwd_wchar = NULL;
+    WCHAR	    *env_wchar = NULL;
     channel_T	    *channel = NULL;
     job_T	    *job = NULL;
     DWORD	    error;
@@ -3398,7 +3399,7 @@ term_and_job_init(
     HANDLE	    child_thread_handle;
     void	    *winpty_err;
     void	    *spawn_config = NULL;
-    garray_T	    ga;
+    garray_T	    ga_cmd, ga_env;
     char_u	    *cmd;
 
     if (dyn_winpty_init(TRUE) == FAIL)
@@ -3408,10 +3409,10 @@ term_and_job_init(
 	cmd = argvar->vval.v_string;
     else
     {
-	ga_init2(&ga, (int)sizeof(char*), 20);
-	if (win32_build_cmd(argvar->vval.v_list, &ga) == FAIL)
+	ga_init2(&ga_cmd, (int)sizeof(char*), 20);
+	if (win32_build_cmd(argvar->vval.v_list, &ga_cmd) == FAIL)
 	    goto failed;
-	cmd = ga.ga_data;
+	cmd = ga_cmd.ga_data;
     }
 
     cmd_wchar = enc_to_utf16(cmd, NULL);
@@ -3419,6 +3420,12 @@ term_and_job_init(
 	return FAIL;
     if (opt->jo_cwd != NULL)
 	cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL);
+    if (opt->jo_env != NULL)
+    {
+	ga_init2(&ga_env, (int)sizeof(char*), 20);
+	win32_build_env(opt->jo_env, &ga_env);
+	env_wchar = ga_env.ga_data;
+    }
 
     job = job_alloc();
     if (job == NULL)
@@ -3446,7 +3453,7 @@ term_and_job_init(
 	    NULL,
 	    cmd_wchar,
 	    cwd_wchar,
-	    NULL,
+	    env_wchar,
 	    &winpty_err);
     if (spawn_config == NULL)
 	goto failed;
@@ -3519,7 +3526,9 @@ term_and_job_init(
 
 failed:
     if (argvar->v_type == VAR_LIST)
-	vim_free(ga.ga_data);
+	vim_free(ga_cmd.ga_data);
+    if (opt->jo_env != NULL)
+	vim_free(ga_env.ga_data);
     vim_free(cmd_wchar);
     vim_free(cwd_wchar);
     if (spawn_config != NULL)

後でテスト書きます。 書いた。

https://travis-ci.org/mattn/vim/builds/294696621

@mattn

This comment has been minimized.

Show comment
Hide comment
@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Nov 12, 2017

Member

#1057 (comment) のWindows 版で env が渡っていない件、2017-10-31 に 8.0.1240 で取り込まれています。👍

Member

h-east commented Nov 12, 2017

#1057 (comment) のWindows 版で env が渡っていない件、2017-10-31 に 8.0.1240 で取り込まれています。👍

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east Nov 12, 2017

Member

#1057 (comment) のGUIでterminal windowのステータスラインをドラッグしてwindowサイズが変更できない件、8.0.1288で直りました。

Member

h-east commented Nov 12, 2017

#1057 (comment) のGUIでterminal windowのステータスラインをドラッグしてwindowサイズが変更できない件、8.0.1288で直りました。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Nov 14, 2017

Member

本件、GitHub issue の折り畳みで検索も出来ず使い辛いので一旦閉じませんか? > all

Member

mattn commented Nov 14, 2017

本件、GitHub issue の折り畳みで検索も出来ず使い辛いので一旦閉じませんか? > all

@mattn mattn closed this Nov 14, 2017

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment