ไม่สามารถใช้ปุ่ม Enter เพื่อรันคำสั่งใน zsh


1

ฉันเพิ่งติดตั้ง zsh (v5.1.1) ในการตั้งค่า ubuntu ใหม่ แต่เมื่อฉันเปลี่ยนไปใช้ใน gnome-terminal ฉันไม่สามารถใช้คีย์ Enter เพื่อเรียกใช้คำสั่งได้ CTRL+Jวิธีเดียวที่ฉันสามารถรันคำสั่งโดยใช้ ผมสามารถทำซ้ำนี้ทั่วเลียนแบบคำอื่น ๆ เช่นและxtermuxterm

ปุ่มอื่น ๆ ทั้งหมดทำงานได้ดีรวมถึงปุ่ม HOME, END, PGUP, PGDOWN, DEL และ INSERT

ฉันติดตั้งzshระบบอื่น ๆ มาแล้วหลายครั้ง แต่ไม่เคยเจอปัญหาแบบนี้มาก่อน ฉันต้องเปลี่ยนอะไรเพื่อให้ปุ่ม Enter ทำงานได้ตามปกติ

/etc/zsh/zshrcไฟล์ของฉัน:

typeset -ga debian_missing_features

if [[ -z "$DEBIAN_PREVENT_KEYBOARD_CHANGES" ]] &&
[[ "$TERM" != 'emacs' ]]
then

    typeset -A key
    key=(
        BackSpace  "${terminfo[kbs]}"
        Home       "${terminfo[khome]}"
        End        "${terminfo[kend]}"
        Insert     "${terminfo[kich1]}"
        Delete     "${terminfo[kdch1]}"
        Up         "${terminfo[kcuu1]}"
        Down       "${terminfo[kcud1]}"
        Left       "${terminfo[kcub1]}"
        Right      "${terminfo[kcuf1]}"
        PageUp     "${terminfo[kpp]}"
        PageDown   "${terminfo[knp]}"
    )

    function bind2maps () {
        local i sequence widget
        local -a maps

        while [[ "$1" != "--" ]]; do
            maps+=( "$1" )
            shift
        done
        shift

        sequence="${key[$1]}"
        widget="$2"

        [[ -z "$sequence" ]] && return 1

        for i in "${maps[@]}"; do
            bindkey -M "$i" "$sequence" "$widget"
        done
    }

    bind2maps emacs             -- BackSpace   backward-delete-char
    bind2maps       viins       -- BackSpace   vi-backward-delete-char
    bind2maps             vicmd -- BackSpace   vi-backward-char
    bind2maps emacs             -- Home        beginning-of-line
    bind2maps       viins vicmd -- Home        vi-beginning-of-line
    bind2maps emacs             -- End         end-of-line
    bind2maps       viins vicmd -- End         vi-end-of-line
    bind2maps emacs viins       -- Insert      overwrite-mode
    bind2maps             vicmd -- Insert      vi-insert
    bind2maps emacs             -- Delete      delete-char
    bind2maps       viins vicmd -- Delete      vi-delete-char
    bind2maps emacs viins vicmd -- Up          up-line-or-history
    bind2maps emacs viins vicmd -- Down        down-line-or-history
    bind2maps emacs             -- Left        backward-char
    bind2maps       viins vicmd -- Left        vi-backward-char
    bind2maps emacs             -- Right       forward-char
    bind2maps       viins vicmd -- Right       vi-forward-char

    # Make sure the terminal is in application mode, when zle is
    # active. Only then are the values from $terminfo valid.
    if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
        function zle-line-init () {
            emulate -L zsh
            printf '%s' ${terminfo[smkx]}
        }
        function zle-line-finish () {
            emulate -L zsh
            printf '%s' ${terminfo[rmkx]}
        }
        zle -N zle-line-init
        zle -N zle-line-finish
    else
        for i in {s,r}mkx; do
            (( ${+terminfo[$i]} )) || debian_missing_features+=($i)
        done
        unset i
    fi

    unfunction bind2maps
fi # [[ -z "$DEBIAN_PREVENT_KEYBOARD_CHANGES" ]] && [[ "$TERM" != 'emacs' ]]

zstyle ':completion:*:sudo:*' command-path /usr/local/sbin \
                                        /usr/local/bin  \
                                        /usr/sbin       \
                                        /usr/bin        \
                                        /sbin           \
                                        /bin            \
                                        /usr/X11R6/bin

(( ${+aliases[run-help]} )) && unalias run-help
autoload -Uz run-help

# If you don't want compinit called here, place the line
# skip_global_compinit=1
# in your $ZDOTDIR/.zshenv or $ZDOTDIR/.zprofile
if [[ -z "$skip_global_compinit" ]]; then
autoload -U compinit
compinit
fi

อันดับแรกฉันจะตรวจสอบการเชื่อมโยงที่สำคัญCTRL+JและCTRL+Mเช่นกับคำสั่งbindkey | grep -E "^\"\^(J|M)"นี้
mpy

ฉันได้รับaccept-lineทั้งสองอย่าง "^J" accept-line "^M" accept-line
Mike A

ที่ไม่ENTERสำคัญผลิตสายใหม่หลังจากที่เริ่มต้นcatโดยไม่ขัดแย้งใด ๆ ลองนอกจากนี้ยังถ้ามันทำงานตามที่คาดไว้เมื่ออัญเชิญzshโดยไม่ต้องตั้งค่าใด ๆ zsh -fผ่านทาง
mpy

ENTERที่สำคัญไม่ได้ผลิตสายใหม่ใด ๆ อย่างไรก็ตามzsh -fทำงานได้ ดูเหมือนว่าบางอย่างในฉัน/etc/zsh/zshrcแล้ว?
Mike A

ไม่ENTERจริงสร้างอย่างใดอย่างหนึ่งของลำดับที่สำคัญและ^M ^Jคุณควรจะสามารถที่จะตรวจสอบเรื่องนี้ด้วยตามมาด้วยCTRL+V ENTER
Adaephon

คำตอบ:


2

หากต้องการส่งออกอักขระ zsh ที่เชื่อมโยงกับแต่ละคีย์ให้พิมพ์+ vจากนั้นอักขระ (โดยที่เป็นCtrlคีย์)

ตัวอย่างเช่น:

  • เอาต์พุตส่งคืนคีย์ของฉัน: ^M
  • เอาท์พุทคีย์ของฉัน: ^[OM

ในการทำให้คีย์ Enter ของฉันทำงานเหมือนรหัสส่งคืน

bindkey '^[OM' accept-line
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.