zsh-workers
 help / color / mirror / code / Atom feed
486268ed7b2f4c12df1a25e6b7e3fd0ceaf98f1c blob 2596 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
 
#compdef setxkbmap

# TODO:
# model, option, symbols and types suggestions
# take -layout and -variant into account

_setxkbmap() {
    emulate -L zsh
    setopt extendedglob

    # xkb files may be in different places depending on system
    local dir sourcedir fullname
    local -a searchdirs=(${XDG_DATA_HOME:-~/.local/share} ${(s.:.)XDG_DATA_DIRS:-/usr/lib:/usr/share:/usr/local/lib:/usr/local/share})
    for dir in $searchdirs; do
        fullname="$dir/X11/xkb"
        if [ -d $fullname ] ; then
           sourcedir=$fullname
           break
        fi
    done
    [ -d $sourcedir ] || return 1

    local -a arguments

    arguments=(
        '-compat[compability map]:compability:_setxkbmap_compat'
        '-config[configuration file]:configuration:_files'
        '-display[display]:display:_x_display'
        '-geometry[geometry component]:geometry:_setxkbmap_geometry'
        '-model[model name]:model:'
        '-option[xkb option]:option:'
        '(-)'-print'[print component names]'
        '-rules[rules file]:rules:_files'
        '-symbols[symbols components]:symbols:'
        '(-)'{-help,-h}'[display help message]'
        '-synch[force synchronization]'
        '-types[types components]:types:'
        '(-verbose -v)'{-verbose,-v}'[set verbosity level]:verbosity:(0 1 2 3 4 5 6 7 8 9)'
        '*::keyboard:_setxkbmap_dispatcher'
    )
    _arguments $arguments
}

_setxkbmap_dispatcher () {

    case $CURRENT in
        1)
            _setxkbmap_layout
        ;;
        2)
            _setxkbmap_variant "$words[1]"
        ;;
    esac
}

_setxkbmap_files () {
    local dir="$1"
    local label="$2"

    local -a fullpath shortpath expl

    fullpath=($sourcedir/$dir/**/*~*README(.))
    shortpath=(${fullpath#$sourcedir\/$dir\/})

    _wanted layout expl $label compadd -a - shortpath

}

(( $+functions[_setxkbmap_compat] )) ||
_setxkbmap_compat() {
    _setxkbmap_files "compat" "compatibility"
}

(( $+functions[_setxkbmap_layout] )) ||
_setxkbmap_layout () {
    _setxkbmap_files "symbols" "layout"
}

(( $+functions[_setxkbmap_geometry] )) ||
_setxkbmap_geometry () {
    _setxkbmap_files "geometry" "geometry"
}

(( $+functions[_setxkbmap_variant] )) ||
_setxkbmap_variant () {
    local file=$sourcedir/symbols/${1}
    local -a variants lines expl

    if [ ! -f $file ]; then
        _message "no such layout: ${1}"
        return 1
    fi

    lines=("${(f)$(< ${file})}")
    variants=(${${${(M)lines:#*xkb_symbols*\"([^\"])##\"*}##*xkb_symbols([^\"])##\"}%%\"*})
    
    _wanted variant expl 'variant' compadd -a variants

}

_setxkbmap "$@"
debug log:

solving 486268ed7 ...
found 486268ed7 in https://git.vuxu.org/mirror/zsh/

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).