UWSC Debuggerのキーワード補完

あったらいいなーってほら、みんな思うでしょ
思うよねぇ、思え

UWSCDebuggerHelper

スクリプトを実行するとUWSC Debuggerが動いている限り常駐します
1文字以上打ち込んでからCtrl+Spaceを押すと前方一致するキーワードをpopupで表示します
popupからキーワードを選択するとUWSC Debuggerに入力してくれるよ!

仕組み

sethotkeyを使いまくってます
アルファベットか _ が入力されたら、その文字を記憶していきます
Ctrl+Spaceが押された時点で記憶してる文字列をキーワード一覧から前方一致で探します
backspaceを押すと記憶してる文字列も一文字減らします
スペース、Enter、tabキーが押されたら記憶してる文字列をクリアします
popupで選んだ文字列と既にキー入力している文字列の差分をクリップボードに入れてCtrl+Vで貼り付けています
一応直前のクリップボード内容(文字列だけですが)は復元するので保管入力後にペーストもOK

ここがひどい!

力不足感が否めないけどうまい方法が思いつきませんでした

  • popupがspaceキーやEnterキーで選択出来ない
    Shift+EnterかCtrl+Enterで選んでくだたい!
    一応kbdでそのまま打ち込んでるはずなんですけどpopup上だとうまくいきませんでした
    どうにか出来んものかと骨折ってみましたが解決策が見つかりませんでしたよ…?
  • popupの表示位置がなんか変
    キャレット座標取って、y座標はさらに+20ピクセル(決め打ち)です
    フォントの高さも取得するべきだったんですが方法を調べるのがめんどくさかった
  • 補完入力がクリップボード経由
    ださいですね!
  • 問答無用の小文字で補完入力
    関数名は大文字派の人ごめんなさい!
    かく言う僕も定数は大文字で書きたいです
  • 他のアプリケーションを使うときに邪魔になる
    Debugger使う時だけ使って下さい!
  • どうやって終了するのこれ?
    Debuggerを閉じれば止まります
    あとはタスクバーとかからUWSCを止めればこいつも止まります
  • なんでModuleなの?
    なんかそのほうがいいような気がして書き始めたら
    そんなことは、あまり、なかった

あ、あとキーワードを全部網羅出来てないんじゃないかと思います
どうにかしたいんですけどね、めんどくさい

UWSCDebuggerHelper.uws

helper.WaitTillDebuggerEnds()

module helper
    dim id, typed, re

    procedure helper
        id = getid("UWSC Debugger","TFOya.UnicodeClass")
        if id < 0 then
            msgbox("UWSC Debuggerを起動して下さい")
            exitexit
        endif
        sethotkey(VK_SPACE, MOD_CONTROL, "KeywordPopUp")
        for i = VK_A to VK_Z
            sethotkey(i, 0, "keyTyped")
            sethotkey(i, MOD_SHIFT, "keyTyped")
        next
        sethotkey(VK_OEM_102, MOD_SHIFT, "keyTyped") // "_"

        sethotkey(VK_BACK      , 0, "BackSpase")  // "backspace"

        sethotkey(VK_SPACE     , 0, "ClearTyped") // "space"
        sethotkey(VK_TAB       , 0, "ClearTyped") // "tab"
        sethotkey(VK_RETURN    , 0, "ClearTyped") // "enter"
        sethotkey(VK_OEM_PERIOD, 0, "ClearTyped") // "."

        re = createoleobj("VBScript.RegExp")
        re.global = TRUE
        re.ignoreCase = TRUE
    fend

    procedure WaitTillDebuggerEnds(showFukidasi = FALSE)
        while status(id, ST_VISIBLE)
            if showFukidasi then fukidasi("you have typed: " + typed)
            sleep(0.1)
        wend
        fukidasi()
    fend

    //入力履歴に追加
    procedure keyTyped()
        if HOTKEY_MOD = MOD_SHIFT then kbd(VK_SHIFT, DOWN)
        kbd(HOTKEY_VK)
        if HOTKEY_MOD = MOD_SHIFT then kbd(VK_SHIFT, UP)
        
        if status(id, ST_ACTIVE) then
            if HOTKEY_VK = VK_OEM_2 then
                typed = typed + "_"
            else
                typed = typed + chr(HOTKEY_VK)
            endif
        endif
    fend
    
    procedure KeywordPopUp()
        if status(id, st_active) then
            hashtbl menu
            if ! length(typed) then exit
            re.pattern = "\s(" + typed + "[a-zA-Z0-9_]*)"
            keywords_matches = re.Execute(keywords)
            constant_matches = re.Execute(constant)

            if (keywords_matches.count + constant_matches.count) = 0 then
                typed = ""
                exit
            endif

            for i = 0 to keywords_matches.count - 1
                match = keywords_matches.item[i].submatches.item[0]
                menu[match] = match
            next
            for i = 0 to constant_matches.count - 1
                match = constant_matches.item[i].submatches.item[0]
                menu[match] = match
            next

            CustomPopup(menu)
        endif
    fend
    
    //入力履歴をクリア
    procedure ClearTyped()
        kbd(HOTKEY_VK, CLICK)
        if status(id, ST_ACTIVE) then
            typed = ""
        endif
    fend

    procedure BackSpase()
        kbd(HOTKEY_VK)
        if status(id, ST_ACTIVE) then
            typed = copy(typed, 1, length(typed) - 1)
        endif
    fend

    procedure CustomPopup(menu[])
        dim x, y
        GetCaretPosition(x, y)
        i = popupmenu(menu, x, y)
        if i > -1 then
            s = copy(menu[i, HASH_VAL], length(typed) + 1)
            clipboard = getstr(0)
            sendstr(0, s)
            sckey(id, VK_CTRL, VK_V)
            sendstr(0, clipboard)
            ctrlwin(id, ACTIVATE)
        endif
        typed = ""
    fend
    
    procedure GetCaretPosition(var x, var y)
        hwnd = idtohnd(id)
        ctid = GetCurrentThreadId()
        tid = GetWindowThreadProcessId(hwnd, null)
        AttachThreadInput(tid, ctid, TRUE)
        GetCaretPos(x, y)
        ClientToScreen(getctlhnd(id, "TTntRichEdit.UnicodeClass"), x, y)
        AttachThreadInput(tid, ctid, FALSE)
        y = y + 20
    fend

    DEF_DLL GetCurrentThreadId():long:kernel32
    DEF_DLL GetWindowThreadProcessId(long,hwnd):long:user32
    DEF_DLL AttachThreadInput(long,long,long):long:user32
    DEF_DLL GetCaretPos({long,long}):bool:user32
    DEF_DLL ClientToScreen(hwnd,{long,long}):long:user32

    dim keywords = " abs acw and arccos arcsin arctan asc ascb betweenstr break btn bytetype calcarray call case ceil chgmoj chkbtn chkimg chknum chksnd chr chrb class clkitem com_err_ign com_err_ret const continue copy copyb cos cpuuserate createform createoleobj ctrlwin decode def_dll default deleteini dictate dim doscmd dropfile else elseif emptyparam encode endclass endif endmodule endtextblock endtry endwith eval except exec exit exitexit exp fclose fdelline fend fget finally fopen for format fput fukidasi function getactiveoleobj getallwin getctlhnd getdir getformdata getid getitem getkeystate getoleitem getslctlst getslider getstr gettime global hashtbl hndtoid idtohnd iegetdata iegetsrc ielink iesetdata iesetsrc if ifb input isunicode join kbd kindofos length lengthb ln lockhard logn logprint mmv mod module monitor mouseorg msgbox muscur next oleevent option or peekcolor poff popupmenu pos posacc posb power powershell print procedure public qsort random readini recostate repeat replace resize result round saveimg sckey select selend sendstr setclear setformdata sethotkey setslider shiftarray sin slctbox sleep slice sound speak split sqrt status step stopform strconv tan textblock then this thread to token trim try until val var vartype wend while with writeini xlactivate xlclose xlgetdata xlopen xlsetdata xlsheet xor zcut"
    dim constant = " acc_acc acc_api acc_description acc_name acc_role acc_state acc_value activate all_item_list all_ole_item all_win_id beep btn_abort btn_cancel btn_ignore btn_no btn_ok btn_retry btn_yes calc_add calc_avr calc_max calc_min click clk_acc clk_back clk_btn clk_dblclk clk_fromlast clk_leftclk clk_list clk_lstvew clk_menu clk_musmove clk_rightclk clk_short clk_tab clk_toolbar clk_treevew close close2 code_bytearray code_url code_utf8 com_err_flg cur_appstarting cur_arrow cur_cross cur_hand cur_help cur_ibeam cur_no cur_sizeall cur_sizenesw cur_sizens cur_sizenwse cur_sizewe cur_uparrow cur_wait down empty err_value event_prm ex_hide ex_icon f_alltext f_exists f_insert f_linecount f_read f_tab f_write f_write1 f_write16 f_write8 f_write8b false fom_browser fom_minimize fom_nohide fom_noicon fom_noluna fom_noresize fom_nosubmit g_img_x g_img_y g_mouse_x g_mouse_y g_screen_c g_screen_h g_screen_w g_time_dd g_time_dd2 g_time_hh g_time_hh2 g_time_mm g_time_mm2 g_time_nn g_time_nn2 g_time_ss g_time_ss2 g_time_ww g_time_yy g_time_yy2 g_time_yy4 g_time_zz g_time_zz2 get_active_win get_appdata_dir get_cur_dir get_form_win get_frompoint_obj get_frompoint_win get_fukidasi_win get_logprint_win get_menu_hnd get_slider get_sys_dir get_sysmenu_hnd get_thisuwsc_win get_uwsc_dir get_uwsc_name get_uwsc_ver get_win_dir getdir_files hash_casecare hash_exists hash_key hash_remove hash_removeall hash_sort hash_val hide hotkey_mod hotkey_vk itm_accclk itm_acctxt itm_back itm_btn itm_edit itm_list itm_lstvew itm_menu itm_static itm_statusbar itm_tab itm_toolbar itm_treevew left max middle min mod_alt mod_control mod_shift mod_win normal nothing notopmost null p_force p_logoff p_monipower p_monipower2 p_monipower3 p_poweroff p_reboot p_screensave p_shutdown p_suspend p_suspend2 p_uwsc_reexec param_str right sc_fullwidth sc_halfwidth sc_hiragana sc_katakana sc_lowercase sc_uppercase show slct_1 slct_10 slct_11 slct_12 slct_13 slct_14 slct_15 slct_16 slct_17 slct_18 slct_19 slct_2 slct_20 slct_21 slct_22 slct_23 slct_24 slct_25 slct_26 slct_27 slct_28 slct_29 slct_3 slct_30 slct_4 slct_5 slct_6 slct_7 slct_8 slct_9 slct_btn slct_chk slct_cmb slct_lst slct_num slct_rdo slct_str st_active st_busy st_class st_clheight st_clwidth st_clx st_cly st_height st_icon st_parent st_path st_process st_title st_visible st_width st_x st_y str_acc_edit str_acc_static str_edit str_static str_status tgl_capslock tgl_ime tgl_kanalock tgl_numlock tgl_scrolllock topmost true try_errline try_errmsg up vk_0 vk_1 vk_2 vk_3 vk_4 vk_5 vk_6 vk_7 vk_8 vk_9 vk_a vk_accept vk_add vk_alt vk_apps vk_b vk_back vk_browser_back vk_browser_favorites vk_browser_forward vk_browser_home vk_browser_refresh vk_browser_search vk_browser_stop vk_c vk_capital vk_clear vk_control vk_convert vk_ctrl vk_d vk_decimal vk_delete vk_divide vk_down vk_e vk_end vk_esc vk_escape vk_execute vk_f vk_f1 vk_f10 vk_f11 vk_f12 vk_f2 vk_f3 vk_f4 vk_f5 vk_f6 vk_f7 vk_f8 vk_f9 vk_final vk_g vk_h vk_help vk_home vk_i vk_insert vk_j vk_k vk_kana vk_kanji vk_l vk_launch_app1 vk_launch_app2 vk_launch_mail vk_launch_media_select vk_lbutton vk_left vk_m vk_mbutton vk_media_next_track vk_media_play_pause vk_media_prev_track vk_media_stop vk_menu vk_modechange vk_multiply vk_n vk_next vk_nonconvert vk_numlock vk_numpad0 vk_numpad1 vk_numpad2 vk_numpad3 vk_numpad4 vk_numpad5 vk_numpad6 vk_numpad7 vk_numpad8 vk_numpad9 vk_o vk_oem_1 vk_oem_2 vk_oem_3 vk_oem_4 vk_oem_5 vk_oem_6 vk_oem_7 vk_oem_8 vk_oem_comma vk_oem_jump vk_oem_minus vk_oem_pa1 vk_oem_pa2 vk_oem_pa3 vk_oem_period vk_oem_plus vk_oem_reset vk_p vk_pause vk_print vk_prior vk_q vk_r vk_rbutton vk_rctrl vk_return vk_right vk_rshift vk_s vk_scroll vk_select vk_separator vk_shift vk_sleep vk_snapshot vk_space vk_start vk_subtract vk_t vk_tab vk_u vk_up vk_v vk_volume_down vk_volume_mute vk_volume_up vk_w vk_win vk_x vk_y vk_z wheel mon_x mon_y mon_width mon_height explicit samestr optfinally optpublic specialchar shortcircuit defaultfont position logpath loglines logfile dlgtitle st_win64 f_exclusive f_alltext acc_location st_maximized st_monitor itm_accclk2"
endmodule

今後自分で使ってみて改善していくかも
しないかも

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中