[PYTHON] keyhac Zusammenfassung der persönlichen Einstellungen

Wenn ich nur einen auf eine unbewohnte Insel bringen könnte, würde ich [keyhac] mitbringen (https://sites.google.com/site/craftware/keyhac-ja).

Grundlegende Konfiguration

Bearbeiten Sie die Funktion configure () in config.py im selben Verzeichnis wie exe.

config.py


import sys
import os
import datetime
import re #hinzufügen
import time #hinzufügen
import urllib.parse #hinzufügen

import pyauto
from keyhac import *

def configure(keymap):

    #Bearbeiten Sie mit vscode von scoop (oder Notepad, wenn nicht)
    EDITOR_PATH = r"C:\Users\{}\scoop\apps\vscode\current\Code.exe".format(os.environ.get("USERNAME"))
    if not os.path.exists(EDITOR_PATH):
        EDITOR_PATH = "notepad.exe"
    keymap.editor = EDITOR_PATH

    # theme
    keymap.setFont("HackGen Console", 16)
    keymap.setTheme("black")

    #Legen Sie den Konvertierungs- / Nichtkonvertierungsschlüssel als Benutzermodifikator fest
    keymap.replaceKey("(29)", 235)      #Sei nicht konvertiert (29) 235
    keymap.defineModifier(235, "User0") #Verwenden Sie keine Konvertierung als U0-qualifizierten Schlüssel
    keymap.replaceKey("(28)", 236)      #Die Umwandlung (28) sei 236
    keymap.defineModifier(236, "User1") #Verwenden Sie die Transformation als U1-qualifizierten Schlüssel

    #Clip Clip-Verlauf aktiviert
    keymap.clipboard_history.enableHook(True)

    #Maximale Größe des Verlaufs
    keymap.clipboard_history.maxnum = 200
    keymap.clipboard_history.quota = 10*1024*1024

    #Strg aus der Geschichte+Symbol beim Einfügen eines Zitats mit Enter
    keymap.quote_mark = "> "

Ich mag die Schriftart HackGen.

Im Folgenden werden alle Anpassungsdetails in configure () geschrieben. Bitte schließen Sie die Augen, dass es keine Regeln für Variablennamen und Funktionsnamen gibt.

Bewegen Sie den Cursor

config.py


    #Schlüsselzuordnung, die immer gültig ist
    keymap_global = keymap.defineWindowKeymap()
    
    for modifier in ("", "S-", "C-", "A-", "C-S-", "C-A-", "S-A-", "C-A-S-"):
        #Rauf runter links rechts
        keymap_global[modifier + "U0-H"] = modifier + "Left"
        keymap_global[modifier + "U0-J"] = modifier + "Down"
        keymap_global[modifier + "U0-K"] = modifier + "Up"
        keymap_global[modifier + "U0-L"] = modifier + "Right"
        # Home / End
        keymap_global[modifier + "U0-A"] = modifier + "Home"
        keymap_global[modifier + "U0-E"] = modifier + "End"
        # Enter
        keymap_global[modifier + "U0-Space"] = modifier + "Enter"

        #Ignorieren Sie den Schlüssel "Katakana Hiragana Rome" gründlich
        keymap_global["D-" + modifier + "(240)"] = lambda: None
        keymap_global["U-" + modifier + "(240)"] = lambda: None
        keymap_global["D-" + modifier + "(241)"] = lambda: None
        keymap_global["U-" + modifier + "(241)"] = lambda: None
        keymap_global["D-" + modifier + "(242)"] = lambda: None
        keymap_global["U-" + modifier + "(242)"] = lambda: None


    # [B]ackSpace / [D]elete
    keymap_global["U0-D"] = "Delete"
    keymap_global["U0-B"] = "Back"
    keymap_global["C-U0-D"] = "C-Delete"
    keymap_global["C-U0-B"] = "C-Back"
    keymap_global["S-U0-B"] = "S-Home", "C-X" #Schnitt zum Anfang
    keymap_global["S-U0-D"] = "S-End", "C-X" #Bis zum Ende schneiden
    keymap_global["C-S-U0-B"] = "Home", "Back", "End" #Mit vorheriger Zeile verketten
    keymap_global["C-S-U0-D"] = "End", "Delete", "End" #Mit der nächsten Zeile verketten

Unter diese Site erfahren Sie, wie Sie die Cursorbewegung gemeinsam mit den Modifizierertasten definieren. In Autohotkey können Sie den Modifikatorschlüssel transparent machen, indem Sie "{blind}" hinzufügen.

IME-Steuerung

IME On / Off wird durch Konvertierung + J und keine Konvertierung + F gesteuert. Wenn ich an Japanisch und Ausländisch dachte, war es nützlich, weil der Schlüssel einen Vorsprung für die Ausgangsposition hatte.

config.py


    # [J]apanese / [F]oreign
    keymap_global["U1-J"] = lambda: keymap.getWindow().setImeStatus(1)
    keymap_global["U0-F"] = lambda: keymap.getWindow().setImeStatus(0)

Andere wichtige Neuzuordnung

config.py


    #1 Zeilenauswahl
    keymap_global["U1-A"] = "End", "S-Home"

    #Ursprüngliche Umstellung
    keymap_global["U0-R"] = "LWin-Slash"

    #Die, die ich auf Emacs gesehen habe
    keymap_global["LC-H"] = "Back"

    #Konzentrieren Sie sich auf die Taskleiste
    keymap_global["C-U0-W"] = "W-T"

    #Fügen Sie eine Zeile nach oben und unten ein
    keymap_global["U0-I"]   = "End", "Enter"
    keymap_global["S-U0-I"] = "Home", "Enter", "Up"

    # escape
    keymap_global["O-(235)"] = "Esc"
    keymap_global["U0-X"]    = "Esc"

    #Liste der geöffneten Fenster
    keymap_global["U0-W"] = "LCtrl-LAlt-Tab", "U-LAlt" #Erhöhen Sie Alt explizit, um ein Niederhalten zu vermeiden

    #Bestätigt durch alphanumerische Zeichen
    keymap_global["U1-N"]   = "F10", "(243)"
    keymap_global["S-U1-N"] = "F10", "Enter"

    #Kontextmenü
    keymap_global["U0-C"] = "S-F10"

    #umbenennen
    keymap_global["U0-N"] = "F2", "Right"
    keymap_global["S-U0-N"] = "F2", "C-Home"
    keymap_global["C-U0-N"] = "F2"

Hausgemachter Hotkey

Allgemeine Funktion

Erstellen Sie die folgenden Funktionen, um häufig verwendete Hotkey-Funktionen zu verwenden.

config.py


    def delay(sec = 0.05):
        time.sleep(sec)

    def get_clippedText():
        return (getClipboardText() or "")

    def paste_string(s):
        setClipboardText(s)
        delay()
        keymap.InputKeyCommand("C-V")()

    def copy_string(sec = 0.05):
        keymap.InputKeyCommand("C-C")()
        delay(sec)
        return get_clippedText()

    def send_input(ime_mode, keys, sleep = 0.01):
        if ime_mode is not None:
            if keymap.getWindow().getImeStatus() != ime_mode:
                keymap.InputKeyCommand("(243)")()
        for key in keys:
            delay(sleep)
            try:
                keymap.InputKeyCommand(key)()
            except:
                keymap.InputTextCommand(key)()

keyhac behandelt die Schlüsseleingabe "InputKeyCommand ()" und die Zeichenfolgeneingabe "InputTextCommand ()" separat. Ich habe die letzte Funktion "send_input ()" erstellt, um Eingabespezifikationen wie "Send, ABC {Enter}" in Autohotkey zu implementieren. IME kann auch angegeben werden ((243) ist ein Schlüssel mit halber Breite / voller Breite).

Zeicheneingabesystem

Verwenden Sie das obige "send_input ()", um den Aufwand für die Eingabe von Zeichen so gering wie möglich zu halten.

Klammern eingeben

config.py


    #Geben Sie Klammern ein und bewegen Sie den Cursor dazwischen
    def wrap_with_brackets(pair, after_ime_mode):
        keys = [pair, "Left"]
        if after_ime_mode == 1:
            keys.append("(243)")
        return lambda: send_input(0, keys, 0.05)
    brackets = [
        ("U0-2"            , '""'          , 0),
        ("U0-7"            , "''"          , 0),
        ("U0-8"            , "\u300E\u300F", 1), # WHITE CORNER BRACKET 『』
        ("U0-9"            , "\u3010\u3011", 1), # BLACK LENTICULAR BRACKET 【】
        ("U0-AtMark"       , "``"          , 0),
        ("U1-2"            , "\u201C\u201D", 1), # DOUBLE QUOTATION MARK “”
        ("U1-7"            , "\u3014\u3015", 1), # TORTOISE SHELL BRACKET 〔〕
        ("U1-8"            , "\uFF08\uFF09", 1), # FULLWIDTH PARENTHESIS ()
        ("U1-9"            , "()"          , 0),
        ("U0-OpenBracket"  , "\u300c\u300d", 1), # CORNER BRACKET 「」
        ("U1-OpenBracket"  , "\uFF3B\uFF3D", 1), # FULLWIDTH SQUARE BRACKET []
        ("U0-CloseBracket" , "[]"          , 0),
        ("U1-CloseBracket" , "{}"          , 0),
        ("C-U0-Comma"      , "<>"          , 0),
        ("C-U0-Period"     , "</>"         , 0),
        ("U0-Y"            , "\u3008\u3009", 1), # Angle Bracket 〈〉
        ("U1-Y"            , "\u300A\u300B", 1), # Double Angle Bracket 《》
    ]
    for brc in brackets:
        keymap_global[brc[0]] = wrap_with_brackets(brc[1], brc[2])

Das Angeben spezieller Klammern mit Unicode-Codepunkten ist eine Frage des Erscheinungsbilds im Editor. Es gibt kein Problem mit direktem "send_input (0, [" U0-8 "," "", "(243)"]) ".

Direkte Eingabe von Symbolen

Da es selten vorkommt, dass Satzzeichen, Lesepunkte, Doppelpunkte usw. mit Schlüsseln eingegeben und dann weiter konvertiert werden, können sie direkt eingegeben werden.

Der Mechanismus ist einfach. Wenn Sie sich den IME-Status zum Zeitpunkt der Eingabe ansehen und dieser aktiviert ist, drücken Sie zusätzlich zusätzlich Strg + M (Verknüpfung zur Bestätigung in den meisten IME). IME kann automatisch deaktiviert werden, nachdem Zeichen wie "@" eingegeben wurden, die auf Japanisch selten eingegeben werden.

Es gibt einen Grund, warum die Eingabetaste nicht bestätigt wird, und es ist ein Gerät, das verhindert, dass versehentlich die Eingabetaste gedrückt wird, wenn es sich bereits im direkten Eingabezustand befindet, z. B. ein Passworteingabeformular. Beachten Sie jedoch, dass einigen Browsern eine Funktion zugewiesen ist, die Strg + M zugewiesen ist (Stummschaltung der Funktion in Firefox). Bei Eingaben von Google Japan bestätigt das erneute Drücken der Taste für die halbe / volle Breite (243) den Eingabeinhalt zu diesem Zeitpunkt. Diese Methode wird jedoch unter Berücksichtigung der Vielseitigkeit angewendet.

config.py


    #Geben Sie direkt ein, unabhängig davon, ob IME aktiviert oder deaktiviert ist
    def direct_input(key, turnoff_ime_later = False):
        key_list = [key]
        if keymap.getWindow().getImeStatus() == 1:
            key_list.append("C-M")
            if turnoff_ime_later:
                key_list.append("(243)")
        send_input(None, key_list)

    for key in [
        ("AtMark"      , True),
        ("Caret"       , False),
        ("CloseBracket", False),
        ("Colon"       , False),
        ("Comma"       , False),
        ("LS-AtMark"   , True),
        ("LS-Caret"    , False),
        ("LS-Colon"    , False),
        ("LS-Comma"    , False),
        ("LS-Minus"    , False),
        ("LS-Period"   , False),
        ("LS-SemiColon", False),
        ("LS-Slash"    , False),
        ("LS-Yen"      , True),
        ("OpenBracket" , False),
        ("Period"      , False),
        ("SemiColon"   , False),
        ("Slash"       , False),
        ("Yen"         , True),
    ]:
        def _wrapper(k, i):
            return lambda: direct_input(k, i)
        keymap_global[key[0]] = _wrapper(key[0], key[1])

    #Linksverschiebung+Symbol mit Zifferntasten
    for n in "123456789":
        def _wrapper(k, i):
            return lambda: direct_input(k, i)
        key = "LS-" + n
        if n in ("2", "3", "4"):
            keymap_global[key] = _wrapper(key, True)
        else:
            keymap_global[key] = _wrapper(key, False)

    #Deaktivieren Sie nachfolgende IMEs, wenn Sie ein oberes Alphabet mit einer Linksverschiebung eingegeben haben
    for alphabet in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        def _wrapper(k):
            return lambda: direct_input(k, True)
        key = "LS-" + alphabet
        keymap_global[key] = _wrapper(key)

Ich habe gelernt, wie man "_wrapper ()" erstellt, wenn man einen Lambda-Ausdruck in einer Schleife unter [dieser Site] zuweist (http://www.freia.jp/taka/blog/737/index.html).

Wir werden es ermöglichen, andere Symbole direkt einzugeben (das Folgende ist ein Beispiel). Da der IME-Status mit dem ersten Argument von "send_input ()" oben angegeben werden kann, wird die Zeichenfolge direkt pseudo eingegeben, indem "IME off-> Zeicheneingabe-> Tastendruck mit halber Breite / voller Breite" ausgewählt wird. ..

config.py


    keymap_global["BackSlash"]      = lambda: direct_input("S-BackSlash", False)
    keymap_global["U0-Minus"]       = lambda: send_input(0, ["\u2015\u2015", "(243)"]) # HORIZONTAL BAR * 2
    keymap_global["U1-Minus"]       = lambda: send_input(0, ["Minus"])
    keymap_global["U0-U"]           = lambda: send_input(0, "_")
    keymap_global["U0-Colon"]       = lambda: send_input(0, ["Colon"])
    keymap_global["U0-Comma"]       = lambda: send_input(0, ["\uFF0C", "(243)"]) # FULLWIDTH COMMA ,
    keymap_global["U0-Period"]      = lambda: send_input(0, ["Period"])
    keymap_global["U0-Slash"]       = lambda: send_input(0, ["Slash"])

Datumseingabe

config.py


    def input_date(fmt):
        d = datetime.datetime.today()
        if fmt == "jp":
            date_str = "{}Jahr{}Mond{}Tag".format(d.year, d.month, d.day)
            send_input(0, [date_str, "(243)"])
        else:
            date_str = d.strftime(fmt)
            send_input(0, date_str, 0)
    keymap_global["U1-D"] = keymap.defineMultiStrokeKeymap("date format: 1=>YYYYMMDD, 2=>YYYY/MM/DD, 3=>YYYY.MM.DD, 4=>YYYY-MM-DD, 5=>JJJJ MM Monat TT Tag")
    keymap_global["U1-D"]["1"] = lambda: input_date(r"%Y%m%d")
    keymap_global["U1-D"]["2"] = lambda: input_date(r"%Y/%m/%d")
    keymap_global["U1-D"]["3"] = lambda: input_date(r"%Y.%m.%d")
    keymap_global["U1-D"]["4"] = lambda: input_date(r"%Y-%m-%d")
    keymap_global["U1-D"]["5"] = lambda: input_date("jp")

Effizienz verschiedener täglicher Arbeit

config.py


    #Als Klartext einfügen
    keymap_global["U0-V"] = lambda: paste_string(get_clippedText())

    #Entfernen Sie Leerzeichen und fügen Sie sie als einfachen Text ein
    keymap_global["U1-V"] = lambda: paste_string(re.sub(r"\s", "", get_clippedText()))

    #IME aus Mutter Wenn Sie tippen, wählen Sie das letzte Wort und IME ein
    keymap_global["U1-Space"] = lambda: send_input(1, ["C-S-Left"])

    #Öffnen Sie die ausgewählte URL
    def open_url():
        url = (copy_string()).strip()
        if url.startswith("http"):
            run_url = url
        elif url.startswith("file:///"):
            local_path = url.replace("file:///", "")
            local_path = urllib.parse.unquote(local_path)
            if not os.path.exists(local_path):
                return None
            run_url = local_path
        else:
            return None
        keymap.ShellExecuteCommand("open", run_url, None, None)()
    keymap_global["D-U0-O"] = open_url

    #Geben Sie die ausgewählte alphanumerische Halbwertsbreite bei aktiviertem IME erneut ein
    def re_input_as_kana():
        origin = get_clippedText()
        if origin:
            setClipboardText("")
        selection = copy_string(0.1)
        if selection:
            key_list = []
            noblank = re.sub(r"\s", "", selection)
            for k in noblank:
                if k == "-":
                    key_list.append("Minus")
                else:
                    key_list.append(k)
            send_input(1, key_list, 0)
        if origin:
            setClipboardText(origin)
    keymap_global["U1-I"] = re_input_as_kana

Web-Suchsystem

Wenn Sie die Taste nach keiner Konvertierung + S im ausgewählten Status drücken, wird sie von verschiedenen Suchmaschinen durchsucht (wenn sie nicht korrekt kopiert wird, wird sie von der Zeichenfolge durchsucht, die sich unmittelbar zuvor im Clip befand).

Halten Sie die Umschalttaste gedrückt, während Sie die zweite Taste drücken, um nach Schlüsselwörtern zu suchen, indem Sie jedes Wort in doppelte Anführungszeichen setzen. Halten Sie die Strg-Taste gedrückt, um nach Hiragana zu suchen.

Sofern Sie nicht mit Shift nach Schlüsselwörtern suchen, versuchen wir, Verträge wie Kommas in Leerzeichen umzuwandeln. Daher ist es in Ordnung, wenn die Auswahl der Zeichenfolgen ein wenig angemessen ist.

config.py


    def quote_each_word(s):
        ret = []
        for w in re.split(r"\s+", s):
            ret.append('"{}"'.format(w))
        return " ".join(ret)

    def punctuation_to_space(s):
        ret = re.sub(r"[\W_]+", " ", s)
        return ret.strip()

    def search_on_web(URLstr, mode = None):
        selection = copy_string(0.1)
        if len(selection) < 200:
            single_spaced = (re.sub(r"\s+", " ", selection)).strip()
            if mode == "strict":
                search_str = quote_each_word(single_spaced)
            else:
                search_str = punctuation_to_space(single_spaced)
                if mode == "without_hira":
                    search_str = re.sub(r"[Ah-Hmm]+", " ", search_str)
                    search_str = re.sub(r"\s+", " ", search_str)
                    search_str = search_str.strip()
            encoded = urllib.parse.quote(search_str)
            keymap.ShellExecuteCommand("open", URLstr + encoded, None, None)()

    engine_url = [
        ("A", r"https://www.amazon.co.jp/s?i=stripbooks&k="),
        ("C", r"https://ci.nii.ac.jp/books/search?q="),
        ("E", r"http://webcatplus.nii.ac.jp/pro/?q="),
        ("G", r"http://www.google.co.jp/search?q="),
        ("I", r"https://www.google.com/search?tbm=isch&q="),
        ("M", r"https://www.google.co.jp/maps/search/"),
        ("N", r"https://iss.ndl.go.jp/books?any="),
        ("O", r"https://map.goo.ne.jp/search/q/"),
        ("S", r"https://scholar.google.co.jp/scholar?q="),
        ("T", r"https://twitter.com/search?f=live&q="),
        ("Y", r"http://www.google.co.jp/search?tbs=li:1&q=site%3Ayuhikaku.co.jp%20intitle%3A"),
        ("W", r"https://www.worldcat.org/search?q="),
    ]
    mode_modifier = [
        (""  , None),
        ("S-", "strict"),
        ("C-", "without_hira"),
    ]

    keymap_global["U0-S"] = keymap.defineMultiStrokeKeymap('S-:quote-each, C-:without-hiragana')
    for e in engine_url:
        for m in mode_modifier:
            search_key = m[0] + e[0]
            engine_url = e[1]
            mode = m[1]
            def _wrapper(url, md):
                return lambda: search_on_web(url, md)
            keymap_global["U0-S"][search_key] = _wrapper(engine_url, mode)

Google-Suche von überall

Aktivieren Sie das Chrome-Fenster ohne Konvertierung + Q, wenn es geöffnet ist, und öffnen Sie eine neue Registerkarte. Andernfalls starten Sie Chrome.

```config.py`


    def find_window(arg_exe, arg_class):
        wnd = pyauto.Window.getDesktop().getFirstChild()
        last_found = None
        while wnd:
            if wnd.isVisible() and not wnd.getOwner():
                if wnd.getClassName() == arg_class and wnd.getProcessName() == arg_exe:
                    last_found = wnd
            wnd = wnd.getNext()
        return last_found

    def google_search():
        if keymap.getWindow().getProcessName() == "chrome.exe":
            send_input(1, ["C-T", "C-K"])
        else:
            wnd = find_window("chrome.exe", "Chrome_WidgetWin_1")
            if wnd:
                send_input(1, ["C-LWin-1", "C-T", "C-K"], 0.05)
            else:
                send_input(1, ["LWin-1"])
    keymap_global["U0-Q"] = google_search

Als ich versuchte, das Fenster mit dem bereitgestellten "ActivateWindowCommand ()" zu aktivieren, trat das Phänomen, dass "die Taskleiste nur blinkt und nicht in den Vordergrund tritt", mit einer Häufigkeit auf, die nicht ignoriert werden kann. Rufen Sie daher das in der Taskleiste registrierte Chrom mit der Win + -Nummer auf. Ich mache es. (Wenn das Fenster vom Programm gewaltsam und sicher nach vorne gebracht werden kann, kann es für böswillige Viren verwendet werden, sodass es aus Sicherheitsgründen unvermeidbar ist.)

Es gibt auch eine Methode namens "pyauto.Window.find ()", die das Fenster identifiziert, aber nur der Klassenname kann als Argument angegeben werden. Chromium-Apps wie Slack und Vscode mit der Fensterklasse "Chrome_WidgetWin_1" können nicht anhand von Chrome identifiziert werden. Daher habe ich versucht, das geöffnete Fenster zu durchlaufen und zu suchen.


Das Hinzufügen eines Kommentars zum Inhalt des Alltags hat es ziemlich lang gemacht ...

Darüber hinaus passe ich verschiedene Dinge an, z. B. das Verarbeiten und Einfügen der Zeichenfolge in der Zwischenablage, das Aktivieren eines bestimmten Fensters, das Ändern der Fenstergröße usw., aber wenn es eine Antwort gibt (und diese für immer anschwillt) Ich werde es in einem anderen Artikel zusammenfassen (wenn ich motiviert bin).

Recommended Posts

keyhac Zusammenfassung der persönlichen Einstellungen
Persönliche Ubuntu & WSL2 Setup-Zusammenfassung
[Linux] [Grundeinstellung] [Flattern] Zusammenfassung
Zusammenfassung der Proxy-Verbindungseinstellungen
Jupyter Notebook Magic Command Persönliche Zusammenfassung
Persönliche Zusammenfassung des Python Package Management Tools
Zusammenfassung der Einstellungen für statische Django-Dateien (statisch)