Seek -- by Phi
시작 메뉴를 항해하는 것은 난삽할 수 있습니다. 특히 시간이 지나면서 많은 프로그램을 설치했다면 더욱 난삽합니다. 'Seek'으로 대소문자를 구분하지 않고 키 단어/문구를 지정하면 시작 메뉴로부터 오직 부합하는 프로그램과 디렉토리만 여과합니다. 그래서 쉽게 목표 프로그램을 몇 개 안 되는 부합 엔트리 중 하나에서 열 수 있습니다. 이렇게 하면 시작 메뉴를 검색하고 순회하는 지겨운 작업을 하지 않아도 됩니다.
이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로
;***************************************************************** ; ; Program : Seek ; Coder : Phi ; Updated : Mon Jan 31 10:08:37 2005 ; ; 여러분, 무엇을 찾고 계십니까? ; ;***************************************************************** ; ; 필자는 재미있게 이 코딩을 즐겼습니다. 모쪼록 여러분도 ; 재미있게 사용하시기를 바랍니다. 주저하지 마시고 이메일을 ; 주십시오. 논평이든 피드백이든 환영합니다: phi1618 (*a.t*) gmail ; :D0T: com. ; ; 옵션: ; -cache 가능하면 캐쉬된 디렉토리 리스트를 사용한다 ; (아무 옵션도 지정하지 않으면 이것이 기본값이다) ; -scan 디렉토리를 스캔해 최근의 디렉토리 목록을 열람한다 ; -scex 스캔 & 종료 (잠재적으로 시간을 소모하는 디렉토리 스캔 작업을 배경 작업으로 설정할 경우 ; 유용하다) ; -help 이 도움말을 보여준다 ; ;***************************************************************** ; ; HOW TO 'SEEK': ; ; 1. 'Seek'은 오토핫키 스크립트입니다. ; Seek.ahk (원본 스크립트) 또는 Seek.exe (컴파일된 실행 파일) ; 로 실행할 수 있습니다. ; ; Seek.exe를 얻으려면, Seek.zip을 내려받으면 됩니다 ; (안에 소스 코드와 컴파일된 이진 파일이 모두 들어 있습니다) ; http://home.ripway.com/2004-10/188589/ ; 그렇지 않으면, 스스로 Seek.ahk를 컴파일해도 됩니다 ; 오토핫키의 Ahk2Exe.exe 컴파일러를 사용하거나, 아니면 ; 필자에게 이메일로 사본을 요청해도 됩니다. 파일 크기는 대략 ; 200 킬로바이트 정도록 작습니다. 다음 이메일로 연락 주십시오: phi1618 (*a.t*) ; gmail :D0T: com. ; ; Seek.ahk를 사용하려면, 먼저, 여러분의 컴퓨터에 ; AutoHotkey v1.0.25 이상을 설치해야 합니다. ; (http://www.autohotkey.com에서 내려 받으십시오). 다음 명령어를 실행합니다: ; ; X:\myTools\AutoHotkey\AutoHotkey.exe Y:\myAHK\Seek.ahk ; ; 잊지 말고 X:\myTools 그리고 Y:\myAHK를 ; 여러분의 컴퓨터에 맞는 적절한 디렉토리 이름으로 교체하십시오. ; ; 2. 실행 파일 Seek.exe는 어디든 마음래도 두셔도 됩니다. ; 설치가 필요 없습니다. 레지스트리에 전혀 쓰지도 않으며 ; 인터넷에도 전혀 접근하지 않습니다 ; 설치를 제거하려면, ; 그냥 Seek.exe를 삭제하면 끝입니다. ; ; 'Seek'이 생성하는 두 개의 2 파일만 ; TMP 디렉토리에 배치됩니다: ; ; a. _Seek.key (마지막 질의 문자열을 위한 캐쉬 파일) ; b. _Seek.list (디렉토리 리스트를 위한 캐쉬 파일) ; ; 여러분이 순수 주의자라면, 시스템에서 'Seek'을 제거하기로 ; 결정한 순간 손수 지워 버리면 됩니다. ; ; 3. 'Seek'을 실행하는 가장 편리한 방법은 단축키/핫키를 ; 이용하는 것입니다. 여러분의 컴퓨터에 ; 아직 핫키 관리 프로그램을 사용하고 있지 않다면, 필자는 ; AutoHotkey를 강력 추천합니다. 지금 당장은 ; 핫키 관리 프로그램을 설치하고 싶지 않다면 ; 윈도우즈의 단축키를 이용할 수 있습니다. 'Seek'를 기동할 ; 단축 키 (예, ALT-F1)를 묶으면 됩니다. 이것은 중요합니다. ; 언제든지 어디서든 'Seek'를 ; 실행할 수 있기 때문입니다.. ; ; 4. 처음 'Seek'를 실행할 때, 시작 메뉴를 스캔합니다 ; 그리고 디렉토리 리스트를 ; 캐쉬 파일에 저장합니다. ; ; 다음 디렉토리가 스캔 대상에 포함됩니다: ; - %A_StartMenu% ; - %A_StartMenuCommon% ; ; 기본값으로, 연이은 실행은 캐쉬 파일로부터 읽습니다 ; 그래서 적재 시간을 절약합니다. ; 옵션에 관한 더 자세한 정보는 'Seek.exe -help'를 실행하십시오. ; 시작 메뉴에 별로 프로그램이 없다면 ; 캐쉬 사용을 포기하고 언제나 디렉토리 스캔을 ; 사용하라고 'Seek'에게 알릴 수 있습니다 (옵션 -scan). ; 그런 식으로 언제나 최신 목록을 얻을 수 있습니다. ; ; 5. 'Seek'을 실행할 때, 창이 나타나서 ; 여러분이 키 단어/문구를 입력하기를 기다립니다. ; 질의 문자열을 입력한 후, 부합하는 레코드 목록을 ; 보여줍니다. 다음으로, 엔트리를 강조하고 ; <Enter>를 누르거나 'Open' 버튼을 클릭할 필요가 있습니다. ; 그래야 선택된 프로그램을 실행하거나 ; 택된 디렉토리를 열 수 있습니다. ; ;***************************************************************** ; ; 기술적 고지 사항: ; ; - 'Seek'는 크리스 멀릿(Chris Mallett)의 AutoHotkey v1.0.25 ; 이상을 요구합니다 (http://www.autohotkey.com). ; 크리스에게 위대한 작업을 해 주신 것에 대하여 감사드립니다:) ; ; - 다음 환경 변수는 항상 유효합니다: ; a. TMP ; ;***************************************************************** ; ; 알려진 문제: ; ; - 없음 ; ;***************************************************************** ; ; 구현 제안: ; ; - 기본으로 첫 번째 부합 레코드를 강조. ; 사용자가 그냥 <Enter>만 치면 실행되도록. ; (Suggested by Yih Yeong) ; ; - 검색 결과 목록을 더블 클릭하면 ; 프로그램을 실행하도록 개선. ; (Suggested by Yih Yeong & Jack) ; ; - 자동 실-시간 점진적 검색. ; (Suggested by Rajat) ; ; - 사용자가 스페이스로 구분하여, ; 여러 질의 문자열을 입력알 때 퍼지(Fuzzy) 검색. ; (Suggested by Rajat) ; ;***************************************************************** ; ; 특징 제안 (구현 미정): ; ; - 기동 이력 기록. 최근에 사용된 프로그램을 ; 검색 결과의 상단에 배치. ; (Suggested by Yih Yeong) ; ; - 리스트 박스 대신, 일련의 어플리케이션 아이콘을 ; 보여줌. 그러면 그 아이콘 위에 커서를 올리면 ; 프로그램 정보가 들어 있는 툴팁이 ; 나타난다 (경로, 등등). ; (Suggested by Yih Yeong) ; ; - 텍스트 중간에 부합하는 대신에, ; 질의 문자열로 시작하는 ; 프로그램/디렉토리에만 부합. ; (Suggested by Stefan) ; ; - 즐겨 찾기 관리 추가. 단 번에 ; 프로그램 그룹을 기동. ; (Suggested by Atomhrt) ; ; - Seek를 윈도우즈 태스크바/툴바에 통합. ; 언제나 가능하고 Seek를 기동하기 위해 ; 핫키를 묶을 필요가 없기 때문에. ; (Suggested by Deniz Akay) ; ; - 만능문자/정규 표현식으로 검색. ; (Suggested by Steve) ; ;***************************************************************** ; ; 변경 이력: ; ; * v1.1.0 ; - 최초 배포. ; ; * v1.1.1 ; - 창-최대화 옵션 제거. ; 잘 작동하지 않은 프로그램이 있기 때문에. ; - 'Open' 기능을 촉발시키기 위해 더블 클릭 탐지 추가. ; ; * v2.0.0 ; - 'Seek' 팝업 창을 출력 화면에 통합 ; 덕분에 사용자가 질의 문자열을 재입력할 수 있음 ; 뭔가를 검색하기 위해 종료했다가 다시 Seek을 실행할 필요가 없음. ; - 'Scan Start-Menu' 버튼 추가. ; - 실시간 점진 검색 추가. 타자하는 동안 ; 부합하는 레코드를 자동으로 여과한다, ; <Enter>를 누르기를 기다리지 않는다. ; - 검색 문자열을 추적할 내부 스위치 추가 (TrackKeyPhrase). ; - 툴팁을 이용하여 파일이름을 보여줄 ; 내부 스위치 추가 (ToolTipFilename) ; ; * v2.0.1 ; - 수평 스크롤바를 리스트박스에 추가. 이제 아주 긴 ; 레코드라도 중간에서 끊어지지 않는다. ; ; * v2.0.2 ; - 사용자가 자신의 맞춤 디렉토리 목록을 스캔 대상에 포함할 수 있도록 허용. ; 사용자는 그냥 텍스트 파일 'Seek.dir'을 Seek.exe 또는 Seek.ahk가 있는 ; 디렉토리에 만들어, 추가될 디렉토리의 전체 경로를 ; 한 줄에 하나씩 지정하기만 하면 된다. ; 경로는 홑따옴표 또는 겹따옴표로 둘러 싸지 마십시오. ; ; * v2.0.3 ; - 이름으로 정렬 /on 옵션을 DIR-명령어에 추가. ; - 사용자가 여러 질의 문자열을 스페이스로 분할해 입력할 때, ; 퍼지 검색. 예, "med pla". 문자열이 모두 ; ("med" & "pla") 발견되면 부합한다. ; 이것은 "Media Player", "Macromedia Flash Player", ; "Play Medieval King", "medpla", "plamed"에 부합한다. ; - 탭-이동 절차를 교정. 모든 버튼을 시작으로부터 오른쪽으로 추가하고, ; 실제로 사용할 수 있을 때까지 ; 불능으로 만들어서. ; - 툴팁=피드백을 교체하기 위해 상태 바를 추가. ; - 폐기된 내부 스위치를 제거 (ToolTipFilename). ; - "dir" 명령어의 사용을 오토핫키의 ; "Loop" 명령어로 교체해 디렉토리 내용을 스캔. ; "dir"은 확장 문자 세트를 처리할 수 없으므로 ; 비-영어 (예, 독일어) 디렉토리와 파일이름은 잘못 얻게 됨 ; (이 변경을 테스트해 주신 볼프강 부가티(Wolfgang Bujatti)와 ; 시에스 플리지(Sietse Fliege)에게 감사) ; - 내부 스위치 추가 (ScanMode) 파일이나 디렉토리가 ; 스캔 대상에 포함되었는지 확인. ; - 하드코드된 시작 메뉴 경로를 내장 변수 ; A_StartMenu, A_StartMenuCommon으로 교체. ; 이로서, Seek은 이제 시작 메뉴에서 ; 다른 이름짓기 관례를 가진 다른 로케일과도 작동. ; (이 새 변수를 사용하기 전에 또다른 방법을 테스트해 주신 ; 볼프강 부가티(Wolfgang Bujatti)와 ; 시에스 플리지(Sietse Fliege)에게 감사) ; - 마지막-실행 프로그램 레코드를 미리 선택 ; 신속하게-<ENTER>를 두 번 누르면 그것을 실행. ; ;***************************************************************** ;************************** ;<--- BEGIN OF PROGRAM ---> ;************************** ;==== 여기는 맞춤 설정 구역================================ ; 디렉토리를 열 때 사용할 프로그램을 지정합니다. ; 프로그램을 발견할 수 없거나 지정하지 않으면 ; (즉, 변수가 할당되지 않았거나 무효한 값이 할당되어 있으면), ; 기본 익스플로러가 사용됩니다. dirExplorer = E:\utl\xplorer2_lite\xplorer2.exe ; 스캔 대상에 포함될 사용자의 추가 맞춤 디렉토리 목록 ; 전체 경로는 홑따옴표 또는 겹따옴표로 둘러싸면 안 됩니다 ; 이 파일이 없으면 ; 기본 디렉토리만 스캔합니다. SeekMyDir = %A_ScriptDir%\Seek.dir ; 캐쉬 디렉토리/프로그램 목록을 저장할 ; 파일이름과 디렉토리 위치를 지정합니다 ; 원하지 않으면 이를 바꿀 필요가 없습니다. dirListing = %A_Temp%\_Seek.list ; 마지막 검색의 캐쉬된 키 단어/문구를 저장할 ; 파일이름과 디렉토리 위치를 지정합니다 ; 원하지 않으면 이를 바꿀 필요가 없습니다. keyPhrase = %A_Temp%\_Seek.key ; 검색 문자열 추적 (ON/OFF) ; ON이면, 다음에 Seek을 실행할 때 ; 마지막-사용된 질의 문자열을기본으로 재사용합니다. ; OFF이면, 마지막 사용된 질의 문자열을 추적하지 않습니다 ; 그리고 다음번 Seek를 실행할 때 ; 질의 문자열이 없습니다. TrackKeyPhrase = ON ; 스캔 대상에 포함될 것들을 지정합니다. ; 0: 디렉토리 배제 (파일만 포함). ; 1: 모든 파일과 디렉토리 포함. ; 2: 오직 디렉토리만 포함 (파일 제외). ScanMode = 1 ;........................................................... ; INIT ;#NoTrayIcon StringCaseSense, Off version = Seek v2.0.3 ; DISPLAY HELP INSTRUCTIONS If 1 in --help,-help,/h,-h,/?,-? { MsgBox,, %version%, 시작 메뉴를 항해하는 것은 난삽할 수 있습니다. 특히 시간이 지나면서 많은 프로그램을 설치했다면 더욱 난삽합니다. 'Seek'으로 대소문자를 구분하지 않고 키 단어/문구를 지정하면 시작 메뉴로부터 오직 부합하는 프로그램과 디렉토리만 여과합니다. 그래서 쉽게 목표 프로그램을 몇 개 안 되는 부합 엔트리 중 하나에서 열 수 있습니다. 이렇게 하면 시작 메뉴를 검색하고 순회하는 지겨운 작업을 하지 않아도 됩니다.`n`n; 필자는 재미있게 이 코딩을 즐겼습니다. 모쪼록 여러분도 재미있게 사용하시기를 바랍니다. 주저하지 마시고 이메일을 주십시오. 논평이든 피드백이든 환영합니다: phi1618 (*a.t*) gmail :D0T: com.`n`nOptions:`n -cache`t가능하면 캐쉬된 디렉토리 리스트를 사용한다 (아무 옵션도 지정하지 않으면 이것이 기본값이다)`n -scan`t디렉토리를 스캔해 최근의 디렉토리 목록을 열람한다`n -scex`tScan & 스캔 & 종료 (잠재적으로 시간을 소모하는 디렉토리 스캔 작업을 배경 작업으로 설정할 경우 유용하다)`n -help`t이 도움말을 보여준다 Goto QuitNoSave } ; 필수 환경 변수가 존재하는지 그리고 유효한지 점검합니다 ; *TMP* IfNotExist, %A_Temp% ; 경로가 존재하지 않습니다 { MsgBox 이 필수 환경 변수는 정의되지 않았거나 유효하지 않습니다:`n`n TMP = %A_Temp%`n`n먼저 수정한 후에 Seek을 실행하십시오. Goto QuitNoSave } ; SCAN-AND-EXIT이 아니면 IfNotEqual 1, -scex { ; 마지막으로 사용된 키-문구를 캐쉬 파일로부터 열람해 ; 기본 질의 문자열로 사용합니다 If TrackKeyPhrase = ON { FileReadLine, PrevKeyPhrase, %keyPhrase%, 1 FileReadLine, PrevOpenTarget, %keyPhrase%, 2 } NewKeyPhrase = %PrevKeyPhrase% NewOpenTarget = %PrevOpenTarget% ; 사용자가 질의 문자열을 입력할 텍스트 박스를 추가합니다. Gui, 1:Add, Edit, vFilename W600, %NewKeyPhrase% ; ADD MY FAV TAGLINE Gui, 1:Add, Text, X625 Y10, 무엇을 찾고 계십니까, 여러분? ; 사용자에게 피드백을 제공하기 위해 상태 바를 추가합니다 Gui, 1:Add, Text, vStatusBar X10 Y31 R1 W764 ; 검색 결과를 보여줄 선택 리스트박스를 추가합니다 Gui, 1:Add, ListBox, vOpenTarget gTargetSelection X10 Y53 R28 W764 HScroll Disabled, %List% ; 다음 버튼을 추가하지만, 지금은 불능으로 만들어 둡니다 Gui, 1:Add, Button, gButtonOPEN vButtonOPEN Default X10 Y446 Disabled, Open Gui, 1:Add, Button, gButtonOPENDIR vButtonOPENDIR X59 Y446 Disabled, Open Directory Gui, 1:Add, Button, gButtonSCANSTARTMENU vButtonSCANSTARTMENU X340 Y446 Disabled, Scan Start-Menu ; 종료 버튼 추가 Gui, 1:Add, Button, gButtonEXIT X743 Y446, Exit ; 질의 창을 팝업 Gui, 1:Show, Center, %version% } ; 마지막 디렉토리 목록을 다시 스캔 If 1 in -scan,-scex rescan = Y ; 디렉토리 캐쉬 파일이 이미 존재하는지 점검합니다. 없다면, 다시 스캔합니다. Else IfNotExist, %dirListing% rescan = Y If rescan = Y ; 다시 스캔합니다 { ; 사용자가 SCAN-AND-EXIT 옵션을 지정하지 않는 한, 상태를 보여줍니다. IfNotEqual 1, -scex GuiControl,, StatusBar, 디렉토리 목록 스캔 중... ; 시작 메뉴를 스캔해 디렉토리/프로그램 목록을 캐쉬 파일에 저장합니다 Gosub ScanStartMenu ; 사용자가 SCAN-AND-EXIT 옵션을 지정했다면 종료합니다 IfEqual 1, -scex, Goto, QuitNoSave } GuiControl,, StatusBar, 마지막 질의 결과를 열람 중... ; 마지막으로 사용된 키 문구에 대하여 부합하는 목록을 열람합니다 Gosub SilentFindMatches ; 상태 텍스트를 제거합니다 GuiControl,, StatusBar, ; 디렉토리 목록이 이제 적재되었습니다. 다른 버튼을 활성화합니다. ; 이 버튼들은 앞에서 불능화 시켜 두었습니다. 왜냐하면 이 스크립트에서 ; 이 부분에 도착하기 전까지 작동하면 안 되기 때문입니다. GuiControl, 1:Enable, ButtonOPEN GuiControl, 1:Enable, ButtonOPENDIR GuiControl, 1:Enable, ButtonSCANSTARTMENU ; 점진 검색을 켭니다 SetTimer, tIncrementalSearch, 500 ; 구이를 갱신합니다 Gosub EnterQuery Return ;*********************************************************** ; * ; END OF MAIN PROGRAM * ; * ;*********************************************************** ;=== BEGIN ButtonSCANSTARTMENU EVENT ======================= ButtonSCANSTARTMENU: Gui, 1:Submit, NoHide GuiControl,, StatusBar, 디렉토리 목록 스캔 중... ; 스캔 중인 동안 리스트박스를 불능으로 만듭니다 GuiControl, 1:Disable, OpenTarget GuiControl, 1:Disable, ButtonEXIT GuiControl, 1:Disable, ButtonOPEN GuiControl, 1:Disable, ButtonOPENDIR GuiControl, 1:Disable, ButtonSCANSTARTMENU ; 스캔합니다 Gosub ScanStartMenu ; 사용자에게 스캔이 완료되었다고 알립니다 If Filename = { ; 질의 문자열이 비어 있다면... GuiControl, 1:Enable, ButtonEXIT GuiControl, 1:Enable, ButtonOPEN GuiControl, 1:Enable, ButtonSCANSTARTMENU GuiControl,, StatusBar, Scan completed. Gosub EnterQuery } Else { ; 질의 문자열이 존재하면... ; 새 목록을 검색 문자열에 대하여 여과합니다. NewKeyPhrase = Gosub FindMatches } Return ;... END ButtonSCANSTARTMENU EVENT ......................... ;=== BEGIN ScanStartMenu SUBROUTINE ======================== ; 시작 메뉴를 스캔하고 캐시 파일에 ; 디렉토리/프로그램 목록을 저장합니다 ScanStartMenu: ; 열람할 디렉토리 경로를 정의합니다. ; 경로를 홑따옴표 또는 겹따옴표로 둘러싸면 안 됩니다. ; ; 영어 버전의 창에 대하여 scanPath = %A_StartMenu%|%A_StartMenuCommon% ; 사용자가 정의한 추가 경로를 스캔 대상에 포함합니다 IfExist, %SeekMyDir% { Loop, read, %SeekMyDir% { IfNotExist, %A_LoopReadLine% MsgBox, 8192, %version%, 맞춤 디렉토리 리스트를 처리중 ...`n`n"%A_LoopReadLine%"는 존재하지 않으며 스캔 대상에서 제외됩니다.`n업데이트 하십시오 [ %SeekMyDir% ]. Else scanPath = %scanPath%|%A_LoopReadLine% } } ; 새 버전을 만들기 전에 기존의 파일을 삭제합니다 FileDelete, %dirListing% ; 디렉토리 목록을 스캔합니다 (구분자 = |) ; 각 디렉토리마다 재귀해 들어가 그 내용을 열람합니다. ; 숨은 파일은 제외됩니다. Loop, parse, scanPath, | { Loop, %A_LoopField%\*, %ScanMode%, 1 { FileGetAttrib, fileAttrib, %A_LoopFileFullPath% IfNotInString, fileAttrib, H ; 숨은 파일을 제외합니다 FileAppend, %A_LoopFileFullPath%`n, %dirListing% } } Return ;... END ScanStartMenu SUBROUTINE .......................... ;=== BEGIN FindMatches SUBROUTINE ========================== ; 부합하는 모든 레코르를 검색해 리스트박스에 보여줍니다 FindMatches: Gui, 1:Submit, NoHide CurFilename = %Filename% GuiControl,, StatusBar, ; 빈 질의 문자열인지 점검합니다 If CurFilename = { MsgBox, 8192, %version%, 검색할 키 단어/문구를 입력하십시오. Goto EnterQuery } ; tIncrementalSearch는 인터럽트된 상태입니다. 종료시켜 버립니다. If NewKeyPhrase <> %CurFilename% { ; 사용자에게 참고 기다리라고 알립니다 GuiControl,, StatusBar, 찾는 중... ResumeFindMatches = TRUE Return } If List = | { ; 부합하는 레코드가 하나도 발견되지 않았습니다 ; 사용자에게 질의 문자열을 변경하고 다시 시도하도록 요구합니다. MsgBox, 8192, %version%, 질의 문자열 "%CurFilename%"는 부합하는 레코드가 없습니다. 다시 시도하십시오. GuiControl, 1:Disable, ButtonOPENDIR GuiControl, 1:Enable, ButtonSCANSTARTMENU Goto EnterQuery } Else { ; 다른 레코드가 선택되어 있지 않으면 첫 번째 레코드를 선택합니다 Gui, 1:Submit, NoHide GuiControl, 1:Enable, OpenTarget GuiControl, 1:Enable, ButtonOPEN GuiControl, 1:Enable, ButtonOPENDIR GuiControl, 1:Enable, ButtonSCANSTARTMENU GuiControl, Focus, OpenTarget If OpenTarget = GuiControl, 1:Choose, OpenTarget, |1 } ; REFRESH GUI Gui, 1:Show, Center, %version% Return ;... END FindMatches SUBROUTINE ............................ ;=== BEGIN SilentFindMatches SUBROUTINE ==================== SilentFindMatches: Gui, 1:Submit, NoHide sfmFilename = %Filename% ; 사용자의 질의 문자열에 기반하여 부합하는 레코드를 여과합니다 List = | If sfmFilename <> { Loop, read, %dirListing% { Gui, 1:Submit, NoHide tFilename = %Filename% If sfmFilename <> %tFilename% { ; 사용자가 검색 문자열을 변경했습니다. ; 예전 문자열을 사용하여 검색을 계속할 이유가 없습니다. 그래서 종료합니다. Return } Else { ; APPEND MATCHING RECORDS INTO THE LIST SplitPath, A_LoopReadLine, name, dir, ext, name_no_ext, drive MatchFound = Y Loop, parse, sfmFilename, %A_Space% { IfNotInString, name, %A_LoopField% { MatchFound = N Break } } IfEqual, MatchFound, Y { ; 레코드를 리스트에 추가합니다 List = %List%%A_LoopReadLine%| ; 다음이 마지막-실행 프로그램에 부합하면 미리 선택합니다 If (A_LoopReadLine = PrevOpenTarget && sfmFilename = PrevKeyPhrase) List = %List%| } } } } ; 검색 결과로 리스트를 갱신합니다 GuiControl, 1:, OpenTarget, %List% If List = | { ; 부합하는 레코드를 발견하지 못햇습니다 ; 리스트박스를 불능으로 만듭니다 GuiControl, 1:Disable, OpenTarget GuiControl, 1:Disable, ButtonOPENDIR } Else { ; 부합하는 레코드를 발견했습니다 ; 리스트박스를 활성화 합니다 GuiControl, 1:Enable, OpenTarget GuiControl, 1:Enable, ButtonOPENDIR } ; 구이를 갱신합니다 Gui, 1:Show, Center, %version% Return ;... END SilentFindMatches SUBROUTINE ...................... ;=== BEGIN EnterQuery SUBROUTINE =========================== ; 구이를 갱신하고 사용자가 검색 문자열을 입력하도록 허용합니다 EnterQuery: GuiControl, Focus, Filename GuiControl, 1:Enable, ButtonOPEN Gui, 1:Show, Center, %version% Return ;... END EnterQuery SUBROUTINE ............................. ;=== BEGIN TargetSelection EVENT =========================== TargetSelection: Gui, 1:Submit, NoHide ; 프로그램을 기동하기 위하여 더블 클릭을 탐지합니다 If A_GuiControlEvent = DoubleClick { Gosub ButtonOPEN } Else { ; 미래에 사용할 - 임시 구조물 If A_GuiControlEvent = Normal { ; 지금 당장은 아무 것도 하지 않습니다 } } Return ;... END TargetSelection EVENT ............................. ;=== BEGIN ButtonOPEN EVENT ================================ ; 사용자가 'OPEN' 버튼을 클릭하거나 <ENTER>를 눌렀습니다. ButtonOPEN: Gui, 1:Submit, NoHide ; 키보드 초점이 있는 곳을 알아냅니다. 초점이 텍스트 필드에 ; 있다면, 질의 문자열을 실행해 부합하는 것을 찾습니다. ; 분명히 리스트 박스 안에 있을 것입니다. GuiControlGet, focusControl, 1:Focus If focusControl = Edit1 { GuiControl, Focus, OpenTarget GuiControl, 1:Disable, OpenTarget GuiControl, 1:Disable, ButtonOPENDIR GuiControl, 1:Disable, ButtonSCANSTARTMENU Goto FindMatches } ; 리스트박스에 아무 레코드도 선택되어 있지 않습니다 If OpenTarget = { MsgBox, 8192, %version%, 선택을 먼저 한 후에 <Enter>를 누르십시오.`n종료하려면 <Esc>를 누르십시오. Goto EnterQuery } ; 선택된 레코드가 존재하지 않습니다 (파일이나 디렉토리를 발견하지 못함) IfNotExist, %OpenTarget% { MsgBox, 8192, %version%, %OpenTarget%이 존재하지 않습니다. 이것은 그 디렉토리 캐쉬가 유효기간이 지났다는 뜻입니다. 아래의 'Scan Start-Menu' 버튼을 클릭하면 이제 여러분의 최신 디렉토리 목록으로 디렉토리 캐쉬를 업데이트할 수 있습니다. Goto EnterQuery } ; 선택된 레코드가 파일인지 아니면 디렉토리인지 점검합니다 FileGetAttrib, fileAttrib, %OpenTarget% IfInString, fileAttrib, D ; IS DIRECTORY { Gosub sOpenDir } Else If fileAttrib <> ; IS FILE { Run, %OpenTarget% } Else { MsgBox %OpenTarget%는 디렉토리도 아니고 파일도 아닙니다. 이런 일은 일어날 수 없습니다. 더 이상 검색을 진행하지 못합니다. 종료 중... } Goto Quit ;... END ButtonOPEN EVENT .................................. ;=== BEGIN ButtonOPENDIR EVENT ============================= ; 사용자가 'OPEN DIRECTORY' 버튼을 클릭했습니다 ButtonOPENDIR: Gui, 1:Submit, NoHide ; 사용자가 레코드를 이미 선택했는지 점검합니다 If OpenTarget = { MsgBox, 8192, %version%, 먼저 선택하십시오. Goto EnterQuery } ; 디렉토리를 열기 위해 서브루틴을 실행합니다 Gosub sOpenDir Goto Quit ;... END ButtonOPENDIR EVENT ............................... ;=== BEGIN sOpenDir SUBROUTINE ============================= sOpenDir: ; 사용자가 디렉토리-레코드 대신에 파일-레코드를 선택했다면, ; 그 디렉토리 경로를 추출합니다. (필자는 FileGetAttrib 대신에 ; DriveGet을 사용합니다. OpenTarget은 유효하지 않지만 ; OpenTarget의 디렉토리 경로는 유요한 경우에 대처할 수 있기 때문입니다. DriveGet, status, status, %OpenTarget% If status <> Ready ; 디렉토리가 아님 { SplitPath, OpenTarget, name, dir, ext, name_no_ext, drive OpenTarget = %dir% } ; 디렉토리가 존재하는지 점검합니다 IfNotExist, %OpenTarget% { MsgBox, 8192, %version%, %OpenTarget%이 존재하지 않습니다. 이것은 디렉토리 캐쉬가 유효 기간이 지났다는 뜻입니다. 'Scan Start-Menu' 버튼을 아래에서 클릭하면 이제 최신 디렉토리 리스트로 디렉토리 캐쉬를 업데이트할 수 있습니다. Goto EnterQuery } ; 디렉토리를 엽니다 IfExist, %dirExplorer% { Run, "%dirExplorer%" "%OpenTarget%", , Max ; OPEN WITH CUSTOMISED FILE EXPLORER } Else { Run, %OpenTarget%, , Max ; 기본 창 파일 탐색기를 엽니다 } Return ;... END sOpenDir SUBROUTINE ............................... ;=== BEGIN tIncrementalSearch EVENT ======================== ; 자동으로 실시간 점진 검색을 수행하여 ; 부합하는 레코드를 찾습니다. ; 사용자가 <ENTER>를 누르기를 기다리지 않습니다. tIncrementalSearch: Loop ; 사용자가 질의 문자열 바꾸기를 멈출 때까지 검색을 반복합니다. { Gui, 1:Submit, NoHide CurFilename = %Filename% If NewKeyPhrase <> %CurFilename% { OpenTarget = Gosub SilentFindMatches NewKeyPhrase = %CurFilename% Sleep, 100 ; CPU 독점 금지! } Else { ; 질의 문자열이 더 이상 변하지 않습니다 Break } } ; 사용자가 <ENTER>를 눌러서 부합하는 레코드를 찾습니다. ; RUN FindMatches NOW. If ResumeFindMatches = TRUE { ResumeFindMatches = FALSE Gosub FindMatches } ; 계속 변화를 관제합니다 SetTimer, tIncrementalSearch, 500 Return ;... END tIncrementalSearch EVENT .......................... ;=== BEGIN Quit SUBROUTINE ================================= Quit: ButtonEXIT: GuiClose: GuiEscape: Gui, 1:Submit, NoHide ; 만약 변경되었다면 그 키 단어/문구를 다음 실행을 대비해 저장합니다. If TrackKeyPhrase = ON { If (PrevKeyPhrase <> Filename || PrevOpenTarget <> OpenTarget) { FileDelete, %keyPhrase% FileAppend, %Filename%`n, %keyPhrase% FileAppend, %OpenTarget%`n, %keyPhrase% } } QuitNoSave: ExitApp ; 이상 끝. 즐거운 하루 되시기를! ;... END Quit SUBROUTINE ................................... ;************************ ;<--- END OF PROGRAM ---> ;************************ ; /* vim: set noexpandtab shiftwidth=4: */