zle читати перше слово в рядку?


1

Скажімо:

% ls ./ _

коли fooвикликається, де _знаходиться позиція курсору.

foo(){
    echo $COMMAND
}
zle -N foo

Як можна COMMANDвстановити таке, що fooбуде виписати команду (як, наприклад, перше слово рядка - не потрібно перераховувати або нічого, де &&використовується тощо), що була видана?

Відповіді:


2

Отже, ви хочете lsбіт від початку поточного рядка? Подивимося, що встановлено zsh

% foo(){ set > whatallisset }
% zle -N foo
% bindkey "^W" foo
% ls ./  # here I mash control+w, etc
% fgrep 'ls ./' whatallisset
BUFFER='ls ./ '
LBUFFER='ls ./ '

Таким чином, ми, мабуть, дивимось на розбір однієї з цих змінних для "першого слова", тому припущення BUFFERє найбільш підходящим, а потім після поглиблення в zshexpn(1)документи і пошуку "розділення" пов'язаних речей:

foo(){ echo -n ${${(z)BUFFER}[1]} }

Дякую за відповідь, яку я насправді можу прослідкувати, а не просто дати заключний однокласник! :)
OJFord

Якщо $BUFFERце одне слово, то воно повертає лише першу букву. Чи є спосіб вирішити це питання, щоб отримати ціле слово, коли це лише одне слово?
spex

1

Ви маєте доступ до ряду змінних у віджетах , визначених користувачем , зокрема, BUFFERякі містять вміст рядка (або, ширше, весь буфер, який може бути багаторядковим).

Як отримати перше слово, BUFFERзалежить від вашого визначення слів. У цьому контексті найбільш корисне визначення, ймовірно, засноване на синтаксисі оболонки, який доступний через z прапор розширення параметра .

first_word=${${(z)BUFFER}[1]}

Інші розумні визначення - використовувати слова з обмеженим пробілом або слова, що складаються з $WORDCHARS. Для цього існують команди руху , але, хоча ви можете викликати їх через zleвбудований і спостерігати за CURSORпереміщенням, було б простіше розділити рядок вручну $BUFFER.

У віджетах для завершення слова команди, для якої відбувається завершення, знаходяться в words параметрі .

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