zshでユーザー入力の行を読み取るより良い方法は?(例えばzleを使って?)


11

Zsh readは何らかの理由で^M<Enter>キーストロークとして受け入れる代わりにをエコーします。(-dが設定されている場合、それらはとして認識され<Enter>ますが、エコーされます。)また、バックスペースキーなどの基本的な機能もサポートしていません。

ハッキング/実行することでこれを回避できますbash

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

しかし、もっとすっきりした方法があるかどうか疑問に思っています。


新規zsh4.3.10インストールでは確認できません。% read aここで正常に動作します。
user1686

これはOS Xでitermを使用しています。readLinuxマシンでは動作しません。
Nicholas Tung

回答:


19

zshで快適にテキスト行を入力するには、を使用しますvaredvared代わりにを使用すると、zleread呼び出されます。これは、bashを渡してreadlineを呼び出すのと同じです。-e

vared -p 'What would you like to do?: ' -c tmp

プレーンで記述した動作readは、シェルの問題というよりは、正しく設定されていない端末のように見えます。stty -a端末設定を表示するために実行し、それeolがに設定されて^MおりeraseBackspace鍵が送信するものに設定されていることを確認します。オペレーティングシステムとその設定方法、および端末に応じて、またはをBackspace送信します。バックスペースの設定は、手動で設定しようとする構成ファイルが原因で通常は失敗します。そのため、最初に行うべきことは、そのような誤った構成を追跡して削除することです。見つからない場合は、ターミナルエミュレータの設定を確認して、過去の互換モードに設定されていないことを確認してください。他のすべてが失敗した場合は、このようなものをあなたに追加してください:^H^?~/.zshrc

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi

1
vared -p 'どうしますか?:' -c tmp
zzapper '16

とてもクール!vared組み込みについては知りませんでした。結局のところ、zshzlemanページは少なくともざっと読む価値があります。
ratijas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.