Чи можна використовувати різні поведінки вибору меню zsh для різних команд?


13

Я використовую menu selectповедінку zsh, яка викликає меню під курсором, де можна побачити різні можливості. Варіант .zshrc, який я встановив для цього, є

zstyle ':completion:*' menu select=2

За замовчуванням натискання Returnдля вибору можливості в цьому меню лише завершує слово - воно фактично не надсилає команду. Наприклад, я можу отримати таке меню

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

Натискання Returnтут призведе до

~ % cd Desktop/

Потім я повинен натиснути Returnна другий раз , насправді відправити команду.

Я можу змінити цю поведінку, щоб зробити так, що натискання Returnобох вибирає завершення і відправляє команду, виконуючи це

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

Однак у цьому є проблема: іноді мені потрібно заповнити файл або каталог, не надсилаючи команду. Наприклад, мені може знадобитися ln -s Desktop Desktop2- при такій bindkeyповедінці спроба завершити Desktop призведе до ln -s Desktop/того, що вона буде надіслана як команда, і явно цього не хочу.

Я усвідомлюю, що просто натискання клавіші пробілу дозволить мені продовжувати команду, але тепер це звичка.
З огляду на це, чи існує спосіб зробити так, щоб лише деякі команди дозволяли натискати Returnодин раз (як cd), але всі інші команди вимагають натискання на нього двічі?


Якщо .zshrcфайл не дозволяє вам це зробити, то відповідь просто не буде, якщо ви самі не налаштуєте вихідний код для підтримки поведінки на основі команд. Але тоді вам залишається визначити, для яких команд це робити, що саме по собі є набагато стомлюючим, ніж просто натискання додаткового клавіші ...
Tamara Wijsman

Відповіді:


3

Якщо вам це справді потрібно, теоретично ви можете встановити функцію, яка перевіряє команду, яку ви виконуєте, і завершує або надсилає рядок.

Спробуйте щось подібне (неперевірене):

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

Джерело: використання користувацької команди зі старого .inputrc в zsh?


0

Технічно це неможливо тим способом, про який ви просите. Не знаю, чи є якийсь інший вихід

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.