مفاتيح الصفحة الرئيسية/النهاية في zsh لا تعمل مع المعجون

StackOverflow https://stackoverflow.com/questions/161676

سؤال

أقوم بتشغيل zsh باعتباره الصدفة الافتراضية في صندوق Ubuntu، وكل شيء يعمل بشكل جيد باستخدام gnome-terminal (الذي على حد علمي يحاكي xterm).عندما أقوم بتسجيل الدخول من صندوق Windows عبر ssh و المعجون (الذي يحاكي أيضًا xterm) فجأة لم تعد مفاتيح الصفحة الرئيسية/النهاية تعمل.

لقد تمكنت من حل هذه المشكلة بإضافة هذه السطور إلى ملف zshrc الخاص بي ...

bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line

...ولكنني ما زلت أتساءل ما هو الخطأ هنا.اي فكرة؟

هل كانت مفيدة؟

المحلول

لقد وجدت أنه مزيج:

واحد

لا يعتقد مطورو ZSH أنه يجب على ZSH تحديد إجراءات بيت, نهاية, ديل, ، ...مفاتيح.

يعمل كل من Debian وUbuntu على إصلاح هذه المشكلة من خلال تحديد الإجراءات العادية التي يتوقعها المستخدم العادي على المستوى العالمي /etc/zsh/zshrc ملف.باتباع الكود ذي الصلة (وهو نفسه في Debian وUbuntu):

if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode

[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char

# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi

لذا، إذا كنت متصلاً بجهاز Debian أو Ubuntu، فلن يتعين عليك القيام بأي شيء.يجب أن يعمل كل شيء تلقائيًا (إذا لم يكن الأمر كذلك، انظر أدناه).

لكن...إذا كنت متصلاً بمربع آخر (على سبيل المثال.FreeBSD)، قد لا يكون هناك أي إعدادات افتراضية سهلة الاستخدام zshrc.الحل بالطبع هو إضافة الأسطر من Debian/Ubuntu zshrc الخاص بك .zshrc.

اثنين

المعجون يرسل xterm كنوع المحطة الطرفية للمضيف البعيد.ولكن هناك عبث في مكان ما ولا يرسل رموز التحكم الصحيحة له بيت, نهاية, ، ...الذي يتوقعه المرء من xterm.أو xterm من غير المتوقع أن ترسل المحطة هؤلاء أو أي شيء ...(ديل المفتاح يعمل في xterm ومع ذلك، إذا قمت بتكوينه في ZSH).لاحظ أيضًا أن مفاتيح Numpad الخاصة بك تعمل بشكل مضحك في Vim على سبيل المثال xterm صالة.

الحل هو تكوين المعجون لإرسال نوع محطة آخر.لقد حاولت xterm-color و linux. xterm-color ثابت بيت/نهاية المشكلة، ولكن Numpad كان لا يزال مضحكا.ضبطه على linux إصلاح كلتا المشكلتين.

يمكنك ضبط نوع المحطة الطرفية في المعجون ضمن الاتصال -> البيانات.لا تميل إلى ضبط نوع المحطة الطرفية الخاصة بك في .zshrc مع export TERM=linux, هذا مجرد خطأ.يجب تحديد نوع المحطة الطرفية بواسطة تطبيقك الطرفي.لذلك، على سبيل المثال، إذا قمت بالاتصال من جهاز Mac مع عميل Mac SSH، فيمكنه تعيين نوع المحطة الطرفية الخاصة به.

لاحظ أن TERM يحدد نوع المحطة الطرفية الخاصة بك وليس له علاقة بالمضيف الذي تتصل به.يمكنني ضبط نوع المحطة الطرفية الخاصة بي على linux في المعجون والاتصال بخوادم FreeBSD دون مشاكل.

لذا، قم بإصلاح هذين الأمرين وستكون بخير :)

نصائح أخرى

في مربع حوار تكوين PuTTY، انتقل إلى الاتصال -> البيانات واكتب لينكس في سلسلة النوع الطرفي قبل الاتصال.

ويعمل هذا بالنسبة لي

bindkey -v

bindkey '\eOH'  beginning-of-line
bindkey '\eOF'  end-of-line

ويبدو شيء المعجون. جنوم محطة يرسل ^[OH رموز و^[OF للمنازل ونهاية على التوالي، في حين يرسل المعجون ^[[1~ و^[[4~. هناك خيار في المعجون لتغيير مفاتيح الرئيسية / نهاية من معيار وضع إلى <م> rxvt واسطة، والتي يبدو أن إصلاح مفتاح المنزل، ولكن ليس مفتاح النهاية (والذي الآن يرسل ^[Ow). اعتقد انه حان الوقت لتقديم تقرير خلل في مكان ما ...: -)

والإجابة المناسبة التي ينبغي أن تكون محمولة عبر <م> جميع توزيعات (لا necessarly كافة إصدارات zsh على الرغم من YMMV هنا) هو استخدام الأداة المساعدة المساعد zkbd من zkbd.

<اقتباس فقرة>   

لوحة المفاتيح تعريف
  عدد كبير من التوليفات الممكنة لوحات المفاتيح، ومحطات العمل، والمحطات، محاكاة، والأنظمة النافذة يجعل من المستحيل على zsh لقد بنيت في ربط مفتاح لكل حالة. الأداة المساعدة zkbd، وجدت في وظائف / متفرقات، يمكن أن تساعدك بسرعة إنشاء الارتباطات الرئيسية التكوين الخاص بك.

     

وتشغيل zkbd إما وظيفة autoloaded، أو على شكل شيل:

zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
<اقتباس فقرة>   

عند تشغيل zkbd، فإنه يسألك أول من أدخل نوع المحطة الطرفية. إذا الافتراضي وهو يقدم هو الصحيح، فقط اضغط على العودة. ومن ثم يطلب منك الضغط على عدد من مفاتيح مختلفة لتحديد خصائص لوحة المفاتيح والمعبر. zkbd يحذرك          اذا وجدت أي شيء خارج عن المألوف، مثل مفتاح Delete التي ترسل لا ^ H ولا ^؟.

     

ويتم تسجيل ضربات المفاتيح قرأه zkbd كتعريف للحصول على مفتاح مجموعة النقابي اسمه، ومكتوب على الملف في الدليل الفرعي .zkbd سواء داخل المنزل أو ZDOTDIR الدليل. ويتكون اسم الملف من مصطلح، VENDOR وOSTYPE          المعلمات والتي شاركت فيها الواصلات.

     

ويمكنك قراءة هذا الملف إلى .zshrc الخاص بك أو ملف بدء التشغيل آخر مع source' or. الأوامر، ثم الرجوع المعلمة الرئيسية في الأوامر bindkey، مثل هذا:

          source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
          [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
          [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
          # etc.
<اقتباس فقرة>   

ملاحظة أنه من أجل `autoload zkbd في العمل، يجب أن يكون الملف zkdb في واحدة من الدلائل المسمى في مجموعة fpath (انظر zshparam (1)). ينبغي أن يكون هذا الحال بالفعل إذا كان لديك تثبيت zsh القياسية. إذا لم يكن، نسخ وظائف / متفرقات / zkbd إلى الدليل المناسب.

ونرى man -P "less -p 'keyboard definition'" zshcontrib، أو البحث في zshall التلوي manpage

وهذه الارتباطات ببساطة لا يبدو أن تكون جزءا من الارتباطات الافتراضي تعيين في وضع ايماكس.

وتنفيذ "حيث، بدأ من الخط" على بلدي تركيب zsh الافتراضية بعد تشغيل "-e bindkey" يظهر أنه منضم فقط إلى ^ أ. ربما يجب عليك أن تسأل المطورين zsh لماذا: -)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top