← All posts tagged bike

запилил русские шорткаты для conkeror - просто переделав define_key (чтоб вызывался два раза для каждой раскладки)
Костыльно, вроде работает, единственные косяки - из-за user_pref("conkeror.load.bindings/default/bindings", 0) нужно два раза перезапустить. Ну и "M-ч" вместо "M-x" забавно смотрится
//--------------------------------
ru = decodeURIComponent(escape('ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ'));
en = '`qwertyuiop[]asdfghjkl;\'zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>';

function e2r (ch) {
    let (idx = en.indexOf(ch)) {
        return (idx == -1)? ch : ru[idx];
    }
}

function tr (seq) {
    var nseq = [];
    seq.forEach(
        function (tmp) {
            if (typeof tmp == "string") {
                var m = tmp.match(/^(M-|)(.)$/);
                if (m)
                    nseq.push(m[1] + e2r(m[2]));
                else
                    nseq.push(tmp);
            }
        }
    );
    return nseq;
}


define_keywords("$fallthrough", "$repeat", "$browser_object");
function define_key (kmap, seq, cmd) {
    keywords(arguments);
    var orig_seq = seq;
    try {
        var ref = get_caller_source_code_reference();

        if (typeof seq == "string" && seq.length > 1)
            seq = seq.split(" ");

        if (!(typeof seq == "object") || !(seq instanceof Array))
            seq = [seq];

        // normalize the order of modifiers in key combos
        seq = seq.map(
            function (k) {
                if (typeof(k) == "string")
                    return format_key_combo(unformat_key_combo(k));
                else
                    return k;
            });

        var new_command = null;
        var new_keymap = null;
        if (typeof cmd == "string" || typeof cmd == "function")
            new_command = cmd;
        else if (cmd instanceof keymap)
            new_keymap = cmd;
        else if (cmd != null)
            throw new Error("Invalid `cmd' argument: " + cmd);

        define_key_internal(ref, kmap, seq, new_command, new_keymap,
                            forward_keywords(arguments));

        define_key_internal(ref, kmap, tr(seq), new_command, new_keymap,
                          forward_keywords(arguments));

    } catch (e if (typeof e == "string")) {
        dumpln("Warning: Error occurred while binding sequence: " + orig_seq);
        dumpln(e);
    }
}

user_pref("conkeror.load.bindings/default/bindings", 0);
require("bindings/default/bindings");

//----------------------

прикрутил примитивный паверменеджмент через dbus-send

(defparameter dbus-power-template "dbus-send --system --print-reply --dest=\"org.freedesktop.Hal\" /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement." )

(defmacro pm-command (name command)
`(defcommand ,name () ()
(run-shell-command (concatenate 'string
dbus-power-template ,command))))
(pm-command suspend "Suspend int32:0")
(pm-command hibernate "Hibernate")
(pm-command reboot "Reboot")
(pm-command shutdown "Shutdown")