Farklı komutlar için farklı zsh menü seçim davranışını kullanmak mümkün müdür?


13

Buradaki menu selectdavranışı kullanıyorum zsh, bu imlecin altında çeşitli olasılıkları görebileceğiniz bir menüyü çağırıyor. Bunun için belirlediğim .zshrc seçeneği

zstyle ':completion:*' menu select=2

Varsayılan olarak, Returnbu menüde bir olasılık seçmek için basılması yalnızca kelimeyi tamamlar - aslında komutu göndermez. Mesela böyle bir menü alabilirim

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

ReturnBuraya basarak sonuçlanır

~ % cd Desktop/

Sonra basmak gerekiyor Returnbir ikinci aslında komutu göndermek için zaman.

Bunu yapmak için bu davranışı değiştirebilirim, böylece Returnher iki basışta tamamlamayı seçer ve bunu yaparak komutu gönderir

bindkey -M menuselect '^M' .accept-line

Ancak, bu bir problem var: bazen bir dosya veya dizin tamamlamak için gereken olmadan komutu gönderme. Örneğin, yapmanız gerekebilir ln -s Desktop Desktop2- bu bindkeydavranışla Masaüstü'nü tamamlamaya çalışmak ln -s Desktop/komut olarak gönderilmesine neden olur ve açıkçası bunu istemiyorum.

Sadece boşluklara basmama emri vermeme izin vereceğini biliyorum, ama bu şimdi bir alışkanlık.
Bunu göz önüne alarak, yalnızca bazı komutların bir Returnkez basmanıza izin vermesini sağlayacak bir yol var mı cd, ancak diğer tüm komutlar iki kez basılmasını mı gerektiriyor?


Eğer .zshrcdosya bunu daha sonra cevap basitçe komut tabanlı davranışı desteklemek için kaynak kodu kendiniz ayarlamak sürece, hiçbir olacak yapmaya izin vermez. Ama o zaman hala hangi komutları yapabileceğini tanımlamak zorundasın, bu da kendi başına ek bir
girişe

Yanıtlar:


3

Buna gerçekten ihtiyacınız varsa, teorik olarak, yürüttüğünüz komutu kontrol eden ve satırı tamamlayan veya gönderen bir işlev ayarlayabilirsiniz.

Böyle bir şeyi deneyin (denenmemiş):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Kaynak: zsh içindeki eski .inputrc dosyasından özel komut kullanılması?


0

Teknik olarak sorduğunuz şekilde mümkün değil. Başka bir çıkış yolu olup olmadığını bilmiyorum

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.