Zsh'nin vim modunu nasıl kişiselleştiririm?


25

Tamam, sonunda büyük bir değişiklik yaptım. .Zshenv içinde EDITOR'umu değiştirdim:

export EDITOR=vim

O kadar küçük olan birkaç soru var ki onlar için ayrı sorular başlatmak istemedim. İşte buradalar:

  1. Vsh gibi ekleme modu ve komut modu arasında ayrım yapmak için zsh nasıl alabilirim? Tercihen bu, imleci bir alt çizgiden vim'deki gibi bir bloğa değiştirecektir, fakat altta metni görüntülemek de işe yarayacaktır.

  2. Vim gibi davranmasını nasıl sağlayabilirim? Örneğin, varsayılan olarak komut modunda olmasını ve bir komuttan sonra çıkmamasını tercih ederim.


//, komut satırı düzenlemeleri ile ilgili tuhaf davranışlar gördünüz mü? Tuşa ~bastığımda, girdiğim karakterin içine giriyorum . Burada bunun hakkında bir soru sordum: superuser.com/questions/997593/…Deletezsh
Nathan Basanese

Yanıtlar:


25

1. ) (bkz. Http://zshwiki.org/home/examples/zlewidgets ve http://pthree.org/2009/03/28/add-vim-editing-mode-to-your-zsh-prompt/ ) :

işlev zle-line-init zle-keymap-select {
    RPS1 = "$ {$ {KEYMAP / vicmd / - NORMAL -} / (ana | viins) / - INSERT -}"
    RPS2 = $ RPS1
    sıfırlama istemi
}
zle -N zle-line-init
zle -N zle-keymap-select

Nerede:

2. ) Bunu yapmak için başka bir zsh-widget yazmanız gerektiğinden şüpheleniyorum, ilk problem için iki bağlantının ilkinden ilham alın.


22

akira'nın çözümü çok satırlı bilgi istemleri kullanırken şu problemi yaşar: insd'den cmd moduna geçerken bilgi istemi önceki satırdan birkaç satırın silinmesine neden olur (ve yeni bilgi istemi yukarıda birkaç satır görüntülenir). Kaç tane satırınız, isteminizde kaç tane satırınızın olduğuna bağlıdır.

Bununla baş etmenin yolu, orada kullanmadan zle-line-finishkullanmaktır zle reset-prompt. Bir örnek:

# perform parameter expansion/command substitution in prompt
setopt PROMPT_SUBST

vim_ins_mode="[INS]"
vim_cmd_mode="[CMD]"
vim_mode=$vim_ins_mode

function zle-keymap-select {
  vim_mode="${${KEYMAP/vicmd/${vim_cmd_mode}}/(main|viins)/${vim_ins_mode}}"
  zle reset-prompt
}
zle -N zle-keymap-select

function zle-line-finish {
  vim_mode=$vim_ins_mode
}
zle -N zle-line-finish

Ardından, sağ isteminize ekleyebilirsiniz, örneğin:

RPROMPT='${vim_mode}'

Bu benim blog yazımdan direkt olarak:


Bu cevap çok oy almalı. Bu çözümü ilk defa görüyorum ve diğerlerinin olmadığı yerlerde çalışıyor. Boş yere zle-line-initwidget ile uğraşarak bir saat geçirdim . Pawel’in sağladığı ve bingo ile eşleşmesi için değiştirildi!
Colin R

Teşekkürler! Hala% 100 kurşun geçirmez değildir - zaman zaman önceki çıktılarımdan bazı satırların silindiği bir durumla karşılaşıyorum - ancak nadiren görmezden geliyorum.
Paweł Gościcki

1
RPROMPT2Durum devam satırlarında gösterilecek şekilde de ayarlanmalıdır. Ayrıca, bunu setopt transient_rpromptkullanırken daha önce kabul edilen hatlar için modların görüntülenmemesini isteyebilirsiniz .
qqx

Hala eksik olan bir şey: Geri emacs moduna ( bindkey -e) geçersem yine gösterir [INS].
Daniel,

1
@cheflo bu kurulumun şu anki sürümünü burada görebilirsiniz: github.com/pjg/dotfiles/blob/master/.zshrc#L518-L584 - belki bu size yardımcı olacak
Paweł Gościcki

5
zle-line-init() { zle -K vicmd; }
zle -N zle-line-init

bu iki satır komut modunda başladığından emin olun


Çalışmaz, zsh yine de insert modunda başlar
baldrs

0

Aşağıda. Değiştirilmiş bir imleç ve içinde bulunduğunuz hangi modda gösteren bir istem ile kurar değiştirebilirsiniz DEFAULT_VI_MODEbirine viinsveya vicmd. .zshrcBaşlamak için aşağıdakini bir yeniye yapıştırın :

# Prefer vi shortcuts
bindkey -v
DEFAULT_VI_MODE=viins
KEYTIMEOUT=1

__set_cursor() {
    local style
    case $1 in
        reset) style=0;; # The terminal emulator's default
        blink-block) style=1;;
        block) style=2;;
        blink-underline) style=3;;
        underline) style=4;;
        blink-vertical-line) style=5;;
        vertical-line) style=6;;
    esac

    [ $style -ge 0 ] && print -n -- "\e[${style} q"
}

# Set your desired cursors here...
__set_vi_mode_cursor() {
    case $KEYMAP in
        vicmd)
          __set_cursor block
          ;;
        main|viins)
          __set_cursor vertical-line
          ;;
    esac
}

__get_vi_mode() {
    local mode
    case $KEYMAP in
        vicmd)
          mode=NORMAL
          ;;
        main|viins)
          mode=INSERT
          ;;
    esac
    print -n -- $mode
}

zle-keymap-select() {
    __set_vi_mode_cursor
    zle reset-prompt
}

zle-line-init() {
    zle -K $DEFAULT_VI_MODE
}

zle -N zle-line-init
zle -N zle-keymap-select

# Optional: allows you to open the in-progress command inside of $EDITOR
autoload -Uz edit-command-line
bindkey -M vicmd 'v' edit-command-line
zle -N edit-command-line

# PROMPT_SUBST enables functions and variables to re-run everytime the prompt
# is rendered
setopt PROMPT_SUBST

# Single quotes are important so that function is not run immediately and saved
# in the variable
RPROMPT='$(__get_vi_mode)'

Not: Bunu yalnızca MacOS'ta (10.12.6) Terminal.app (2.7.3) 'te zsh (5.3.1) ile test ettim. Ayrıca, edit-command-linedaha önce eklerseniz , mod da doğru şekilde ayarlanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.