Skip to content
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

Fix Inappropriate ioctl for device #3

Closed
golddranks opened this issue Jun 17, 2019 · 4 comments
Closed

Fix Inappropriate ioctl for device #3

golddranks opened this issue Jun 17, 2019 · 4 comments

Comments

@golddranks
Copy link

標準アウトプットはTTYじゃないとき、パニックしてしまいます。もっとましなエラーメッセージがでたらいいなと思います。なお、TTYじゃない場合は初期設定のサイズのウィンドウで出力を出して終了するのもありかなと思ったりしますが、いかがでしょうか。

peep Hello.txt | cat
thread 'main' panicked at 'terminal_size get error: Os { code: 25, kind: Other, message: "Inappropriate ioctl for device" }', src/libcore/result.rs:999:5
stack backtrace:
   0: std::panicking::default_hook::{{closure}}
   1: std::panicking::default_hook
   2: std::panicking::rust_panic_with_hook
   3: std::panicking::continue_panic_fmt
   4: rust_begin_unwind
   5: core::panicking::panic_fmt
   6: core::result::unwrap_failed
   7: peep::pane::Pane::new
   8: peep::app::App::run
   9: peep::main
  10: std::rt::lang_start::{{closure}}
  11: std::panicking::try::do_call
  12: __rust_maybe_catch_panic
  13: std::rt::lang_start_internal
  14: main
@ryochack
Copy link
Owner

あー、なるほど。そのケースは想定していなかったです。

TTYじゃない場合は初期設定のサイズのウィンドウで出力を出して終了するのもありかなと思ったりしますが、いかがでしょうか。

lessはどうなってるのか気になってみたら、こちらも出力して終了する挙動になっていますね。

$ more hello.txt | cat
Hello!
$ less hello.txt | cat
Hello!

ありがとうございます。いただいたアイディアで実装を考えてみます。

@golddranks
Copy link
Author

golddranks commented Jun 19, 2019

peepはもともと「いい感じの小さめのウインドウ」というイメージがあるので、スタートはs行目から、という設定さえあれば、 cat file.txt | sed -n 15,20p | hogeよりも cat file.txt | peep -s 15 -n 5 | hogeをつい使っちゃうと想定できそうです。(sedは「置き換え」というイメージ逆に強いので、この動作のためにググらないといけなかったんです)現在の使い方の外でも、めちゃめちゃ貢献できる余裕はありそうです。

@ryochack
Copy link
Owner

#4 でpanicの修正と--start STARTオプションの対応を入れました。

ただし、「ファイルへのリダイレクトでも、パイプで他のプログラムにつなげる場合でも、peepは一律その時のttyのウインドウ幅でトリミングした出力をする」という制約があります。

これは、peepではテキストの表示を指定行内に収めるためにウィンドウ幅を取得する必要があるのですが、標準出力がttyではない場合に出力先が許容するウインドウ幅を知ることができないため、一律ttyの幅でトリミングして出力するようにしているためです。

また、パイプやリダイレクトをする場合でも、peepの出力にエスケープシーケンスが含まれてしまっているので、それは #5 のIssueで対応します。

@ryochack
Copy link
Owner

それとは別に、sedの代わりに使うご提案についてなのですが、peepをsedの代わりに使うのは(少なくとも今の時点では)あまり推奨できません。
というのも、peepはlessのような人間に対してのText Viewerとしての意味合いが強く、入力データをそのまま出力することを保証していないからです。
例えば、エスケープシーケンスは含まれていますし、タブはスペースに置き換えていますし、ウィンドウ幅に収まらないときはテキストをトリミングしてExtended Markを行末に付与します。
(前述の #5 で入力をそのままで出力するraw-output-modeを追加するつもりですので、それが実装完了したら今よりは良くなるかもしれません)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants