자주 가는 폴더에 쉽게 접근하는 법 -- by Savage

어떠 유형이 창이 활성화되어 있는 동안에 마우스 가운데 버튼을 클릭하면, 이 스크립트는 자주 가는 폴더의 메뉴를 보여줍니다. 자주 가는 폴더를 선택하는 순간 그 활성 창 안의 폴더로 순간 이동합니다. 다음 유형의 창을 지원합니다: 1) 표준 파일 열기 또는 저장 대화상자; 2) 탐색 창; 3) 콘솔 (명령어 프롬프트) 창. 메뉴는 또 선택적으로 지원되는 않는 유형의 창에 대해서도 보여줄 수 있습니다. 이 경우 선택된 폴더는 새 탐색 창에 열립니다.

이 스크립트 내려받기  |  다른 샘플 스크립트  |  Home

; 주의: 탐색 창에서, "View > Toolbars > Address Bar"가 활성화되어 있지 않을 때
; 아래의 핫키에 틸드가 있는 경우 그 메뉴는 보여지지 않습니다. 
; 틸드가 있어도 메뉴는 보일 수도 있지만
; 자주 가는 폴더는 새 탐색 창에 열립니다.
; 활성화되어 있는 창이 그 폴더로 전환되지 않습니다.

; CONFIG: 핫키를 고르십시오.
; 마우스에 3 버튼 이상이 있으면, MButton 대신에
; XButton1 (the 4th) 또는 XButton2 (the 5th)을 시도해 볼 수 있습니다.
; 또한 변형 마우스 버튼 (예, ^MButton) 또는 키보드 핫키를 사용할 수도 있습니다
; MButton의 경우, 틸드 (~) 접두 심볼을 사용하면
; 예를 들어 웹 브라우저 같은 다른 유형의 창을 클릭할 때,
; MButton버튼의 정상 기능이 소실되지 않습니다
; 틸드가 있으면 스크립트는 지원되지 않는 창 유형에는
; 메뉴를 보여주지 않습니다. 다른 말로, 틸드가 없다면,
; 핫키는 언제나 메뉴를 보여줍니다; 지원되지 않는 창 유형이
; 활성화되어 있는 동안 자주 가는 폴더를 선택하면
; 새 탐색 창이 열리고 그 폴더의 내용을
; 보여줍니다.
f_Hotkey = ~MButton

; CONFIG: 즐겨 찾기를 고르십시오
; 아래에 특별히 주석 처리한 부분을 업데이트 하면
; 자주 가는 폴더를 나열할 수 있습니다. 메뉴 항목의 이름을 먼저 지정하고
; 다음에 쌍반점, 그 다음에 실제 경로를 지정하십시오.
; 빈 줄을 사용하면 가름 줄을 만들 수 있습니다.

/*
ITEMS IN FAVORITES MENU <-- 이 문자열은 바꾸지 마십시오.
Desktop      ; %A_Desktop%
Favorites    ; %A_Desktop%\..\Favorites
My Documents ; %A_MyDocuments%

Program Files; %A_ProgramFiles%
*/


; END OF CONFIGURATION SECTION
; 이 시점 부터는 변경하지 마십시오.
; 단, 스크립트의 기본 기능을 바꾸고 싶다면 예외입니다.

#SingleInstance  ; 핫키가 동적으로 생성되므로 필수입니다.

Hotkey, %f_Hotkey%, f_DisplayMenu
StringLeft, f_HotkeyFirstChar, f_Hotkey, 1
if f_HotkeyFirstChar = ~  ; 특정 유형의 창에 대해서만 메뉴를 보여줍니다.
    f_AlwaysShowMenu = n
else
    f_AlwaysShowMenu = y

; 스크립트가 컴파일 되어 있는지 알아내는 데 사용됩니다:
SplitPath, A_ScriptName,,, f_FileExt
if f_FileExt = Exe  ; 외부 파일로부터 메뉴 항목들을 읽습니다.
    f_FavoritesFile = %A_ScriptDir%\Favorites.ini
else  ; 이 스크립트 파일로부터 직접 메뉴 항목들을 읽습니다.
    f_FavoritesFile = %A_ScriptFullPath%

;----환경 구성 파일을 읽습니다.
f_AtStartingPos = n
f_MenuItemCount = 0
Loop, Read, %f_FavoritesFile%
{
    if f_FileExt <> Exe
    {
        ; 메뉴 항목들은 이 스크립트로부터 직접 읽고 있기 때문에,
        ; 시작 줄에 도착할 때까지
        ; 모든 줄을 건너 뜁니다.
        if f_AtStartingPos = n
        {
            IfInString, A_LoopReadLine, ITEMS IN FAVORITES MENU
                f_AtStartingPos = y
            continue  ; 새 회돌이 반복을 시작합니다.
        }
        ; 그렇지 않으면, 주석 닫기 심볼이 리스트의 끝을 표식합니다.
        if A_LoopReadLine = */
            break  ; 회돌이를 끝냅니다
    }
    ; A_ThisMenuItemPos와의 호환을 위해
    ; 메뉴 가름 줄들도 세어야 합니다: 
    f_MenuItemCount++
    if A_LoopReadLine =  ; 빈 줄은 가름 줄을 뜻합니다.
        Menu, Favorites, Add
    else
    {
        StringSplit, f_line, A_LoopReadLine, `;
        f_line1 = %f_line1%  ; 선두 후미의 스페이스를 제거합니다.
        f_line2 = %f_line2%  ; 선두 후미의 스페이스를 제거합니다.
        ; 필드 안에 변수 참조를 모두 결정합니다. 그리고
        ; 자주 가는 폴더의 경로를 담은 새 배열 원소를 생성합니다:
        Transform, f_path%f_MenuItemCount%, deref, %f_line2%
        Transform, f_line1, deref, %f_line1%
        Menu, Favorites, Add, %f_line1%, f_OpenFavorite
    }
}
return  ;----자동 실행 섹션의 끝.


;----선택된 폴더를 엽니다
f_OpenFavorite:
; 선택된 메뉴 항목에 상응하는 배열 원소를 가져 옵니다:
StringTrimLeft, f_path, f_path%A_ThisMenuItemPos%, 0
if f_path =
    return
if f_class = #32770    ; 대화상자입니다.
{
    if f_Edit1Pos <>   ; 그리고 Edit1 콘트롤이 있습니다.
    {
        ; 창을 활성화 합니다. 그러면 사용자가 대화상자 밖에서
        ; 가운데 버튼을 클릭하면, 잇다르는 클릭들도 작동합니다:
        WinActivate ahk_id %f_window_id%
        ; 이미 필드에 존재하더라도 파일이름을 모두 열람합니다.
        ; 그래야 새 폴더로 전환한 후에 다시 복구할 수 있습니다:
        ControlGetText, f_text, Edit1, ahk_id %f_window_id%
        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
        ControlSend, Edit1, {Enter}, ahk_id %f_window_id%
        Sleep, 100  ; 어떤 경우 어떤 대화상자에는 추가로 시간이 필요합니다.
        ControlSetText, Edit1, %f_text%, ahk_id %f_window_id%
        return
    }
    ; 그렇지 않으면 서브루틴의 아래로 가 표준 조치를 취합니다.
}
else if f_class in ExploreWClass,CabinetWClass  ; 탐색 창이므로, 폴더를 전환합니다.
{
    if f_Edit1Pos <>   ; 그리고 Edit1 콘트롤이 있습니다.
    {
        ControlSetText, Edit1, %f_path%, ahk_id %f_window_id%
        ; Tekl의 보고에 의하면: "만약 폴더 L:\folder로 바꾸고 싶다면
        ; 주소바는 http://www.L:\folder.com를 보여준다. 이를 해결하기 위해,
        ; 나는 {Enter} 앞에 {right}를 추가했다":
        ControlSend, Edit1, {Right}{Enter}, ahk_id %f_window_id%
        return
    }
    ; 그렇지 않으면 서브루틴의 아래로 가서 표준 행위를 취합니다.
}
else if f_class = ConsoleWindowClass ; 콘솔 창이므로, 그 디렉토리로 CD 합니다
{
    WinActivate, ahk_id %f_window_id% ; 종조 mclick 때문에 비활성화 되는 경우가 있으므로,
    SetKeyDelay, 0  ; 이것은 이 쓰레드가 존재하는 동안에만 효과가 있습니다.
    IfInString, f_path, :  ; 드라이브 기호가 포함되어 있습니다
    {
        StringLeft, f_path_drive, f_path, 1
        Send %f_path_drive%:{enter}
    }
    Send, cd %f_path%{Enter}
    return
}
; 위에서 반환되지 않았다면, 다음 중 하나가 참입니다:
; 1) 지원하지 않는 창 유형이지만 f_AlwaysShowMenu가 y (yes)입니다.
; 2) 지원하는 유형이지만 Edit1 콘트롤이 없어서 맞춤 조치에 이용하지 못합니다.
;     그래서 대신 아래의 기본 행위를 합니다.
Run, Explorer %f_path%  ; 겹따옴표가 없으면 더 많은 시스템에 작동할 가능성이 높습니다.
return


;----메뉴를 보여줍니다
f_DisplayMenu:
; 다음 첫 몇 변수들은 여기에서 설정하고 f_OpenFavorite가 사용합니다:
WinGet, f_window_id, ID, A
WinGetClass, f_class, ahk_id %f_window_id%
if f_class in #32770,ExploreWClass,CabinetWClass  ; 대화상자 또는 탐색기.
    ControlGetPos, f_Edit1Pos,,,, Edit1, ahk_id %f_window_id%
if f_AlwaysShowMenu = n  ; 메뉴는 선택적으로만 보여주어야 합니다.
{
    if f_class in #32770,ExploreWClass,CabinetWClass  ; 대화상자 또는 탐색기.
    {
        if f_Edit1Pos =  ; 콘트롤이 존재하지 않습니다. 그래서 메뉴를 보여주지 않습니다
            return
    }
    else if f_class <> ConsoleWindowClass
        return ; 다른 유형의 창이기 때문에, 메뉴를 보여주지 않습니다.
}
; 그렇지 않으면, 메뉴를 이 유형의 창에 보여 주어야 합니다:
Menu, Favorites, show
return