Wybór przesunięcia Zsh

5

Jak użyć Shift, aby wybrać część linii poleceń (jak w wielu edytorach tekstu)?

Ugo
źródło
Powłoki zazwyczaj nie mają tej funkcji. Gdyby był dostępny, prawdopodobnie byłby zapewniony przez terminal, ale nie znam się na żadnym innym.
Dennis Williamson
2
@Dennis Williamson Zaskakująco mam takie same komentarze na temat SO. To jest po prostu złe. Zsh implementuje zaznaczenie w ZLE (jednak ze znakami). W rzeczywistości edycja linii poleceń nie ma prawie nic wspólnego z terminalem ...
Ugo
Pytałeś o używanie zmiany. Nie pytałeś, jak ogólnie można wybrać tekst.
Dennis Williamson

Odpowiedzi:

4

Jednym ze sposobów na to jest

  1. zdefiniuj nowe widgety, które aktywują znakowanie na przesuniętych klawiszach ruchu,
  2. przedefiniować wszystkie widgety działania, aby działały w regionie (jeśli taki istnieje), oraz
  3. przedefiniować wszystkie domyślne widgety ruchu, aby dezaktywować znakowanie.

Oto dowód koncepcji (dla xterm ), pracować dla:

  • Shift-Left i Shift-Right: zacznij wybierać odpowiednio lewy / prawy
  • Left, Right: anuluj wybór i przesuń odpowiednio w lewo / w prawo,
  • Delete: usuń zaznaczenie, jeśli istnieje, w przeciwnym razie znak pod kursorem.

Obowiązują zwykłe zastrzeżenia (mogą istnieć inne i lepsze sposoby, twój kot może jeść toster itp.).

bindkey -e

function zle-line-init {
    marking=0
}
zle -N zle-line-init

function select-char-right {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .forward-char
}
zle -N select-char-right

function select-char-left {
    if (( $marking != 1 )) 
    then
        marking=1
        zle set-mark-command
    fi
    zle .backward-char
}
zle -N select-char-left

function forward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .forward-char
}
zle -N forward-char

function backward-char {
    if (( $marking == 1 ))
    then
        marking=0
        NUMERIC=-1 zle set-mark-command
    fi
    zle .backward-char
}
zle -N backward-char

function delete-char {
    if (( $marking == 1 ))
    then
        zle kill-region
        marking=0
    else
        zle .delete-char
    fi
}
zle -N delete-char

bindkey '^[[1;2D' select-char-left   # assuming xterm
bindkey '^[[1;2C' select-char-right  # assuming xterm
peth
źródło
To dobry przykład personalizacji zle. Nie tak często w Internecie.
Ugo