본문 바로가기

소프트웨어 가이드/AutoHotKey

내가 쓰는 AHK

반응형

Autohotkey의 V1버전을 쓴지가 몇년 되었다.

 

V1버전에서 V2버전으로 변경된지도 꾀나 오래 되었는데, 지금까지 귀차니즘 때문에 미뤄두고 있었다.

 

기존 스크립트를 간간히 수정만 하면서 사용했었는데, 이제 슬슬 PC도 바꿔야되고 해서 주말에 시간나는김에 기존 코드를 V2로 변경했다.

 

다른데서도 종종 사용하는 코드니 참고용도이자 공유로 여기에 올려둔다.

 

코드는 쉬우니까, 기능은 코드 주석을 참고~

 

 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Import Files ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#Include "C:\Program Files\AutoHotkey\custom\Lib_V2.ahk"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Global Variable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;루트 드라이브 선택
global drive := "E:\"
global rootPath := "dropbox\"
global drivePath := drive . rootPath


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Timer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SetTimer CloseUnwantedWindow, 200




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shortcut ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;AHK 중지
^!s::ahkPause()

;AHK 리로드
^!r::ahkReload()

;계산기 열기
#c::calc()

;메모장 열기
^!m::Run 'notepad'

;노트패드++ 열기
^!e::notepad()

;노트패드++ 파일 열기
F1::openWithNotepad()

;경로 복사
^+c::copyPath()

;WinMerge 열기
^!c::WinMerge()



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Special Shortcut ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;창 항상 위에
#HotIf !WinActive("ahk_class PotPlayer32")
  !a::SetAlwaysOnTop()
;문서 편집을 위한 단축키
#HotIf WinActive("ahk_class Notepad") or WinActive("ahk_class Notepad++")
  ^d::deleteOneLine()
  !up::moveLineUp()
  !down::moveLineDown()
  ^!up::copyLineUp()
  ^!down::copyLineDown()
  
  ; SQL 형태로 만들기
  ^!j::concatLine()
  ^,::makeCommaLine()
  ^'::makeSingleQuoteLine()
  ^+"::makeDoubleQuoteLine()
#HotIf

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SpeQ 실행, 없는 경우 윈도우 계산기 실행
calc()
{
	if FileExist("C:\Program Files (x86)\SpeQ Mathematics\SpeQ Mathematics.exe")
	{
		If WinExist("ahk_class IBasicWndClass")
			WinActivate("ahk_class IBasicWndClass")
		else 
			Run("C:\Program Files (x86)\SpeQ Mathematics\SpeQ Mathematics.exe")
	}
	else if FileExist(drivePath . "\programs\SpeQ Mathematics\SpeQ Mathematics.exe")
	{
		If WinExist("ahk_class IBasicWndClass")
			WinActivate("ahk_class IBasicWndClass")
		else 
			Run(drivePath . "\programs\SpeQ Mathematics\SpeQ Mathematics.exe")
	}
	else
	{
		Run calc
	}

	return
}

;notepad++ 실행
notepad()
{
	If !WinExist("ahk_class Notepad++")
	{
		If FileExist(drivePath . "\programs\Notepad++\notepad++.exe"){
			Run(drivePath . "\programs\Notepad++\notepad++.exe")
		} else {
			Run("C:\Program Files (x86)\Notepad++\notepad++.exe")
		}
		WinWait("ahk_class Notepad++")
	}
	else
	{
		WinActivate("ahk_class Notepad++")
	}
	return
}

;notepad++로 파일 열기
openWithNotepad()
{
	ToReturn := copyClipBoard()
	
	if !FileExist(ToReturn)
		return
	  
	If FileExist(drivePath . "\programs\Notepad++\notepad++.exe"){
		Run(drivePath . "\programs\Notepad++\notepad++.exe " . "`"" . ToReturn . "`"")
	} else if FileExist("C:\Program Files (x86)\Notepad++\notepad++.exe") {
		Run "C:\Program Files (x86)\Notepad++\notepad++.exe " . "`"" . ToReturn . "`""
	} else {
		msgbox "프로그램이 존재하지 않습니다."
	}
}

;WinMerge 실행
WinMerge()
{
	If FileExist("C:\Program Files\WinMerge\WinMergeU.exe")
		Run("C:\Program Files\WinMerge\WinMergeU.exe")
	else
		Run(drivePath . "\Programs\WinMergePortable\WinMergeU.exe")
		
	WinWait	"ahk_class WinMergeWindowClassW"
		Send "^n"
}



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Common Util ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;AHK 제어
ahkPause()
{
	ShowSplashText("AHK Pause", 200)
	Pause
}
ahkReload()
{
	ShowSplashText("AHK Reload", 200)
	Reload
}

; 창 항상 위 설정
SetAlwaysOnTop(){
	title := WinGetTitle("A")
	ExStyle := WinGetExStyle("A")
	WinSetAlwaysOnTop -1, title
	if (ExStyle & 0x8)
	  ShowSplashText("항상위 해제", 500)
	else
	  ShowSplashText("항상위 설정", 500)
}

;경로 복사
copyPath()
{
	Send "^c"
	ClipWait(0.1)
	TMP := A_Clipboard
	A_Clipboard := TMP
}

;클립보드 내용 가져오기
copyClipBoard()
{
	ClipboardBackup := ""
	IsClipEmpty := (A_Clipboard = "") ? 1 : 0
	If !IsClipEmpty {
		ClipboardBackup := ClipboardAll()
		A_Clipboard := ""
	}

	Send "^c"
	ClipWait 0.1
	ClipContents := A_Clipboard
	A_Clipboard := ClipboardBackup
	return ClipContents
}

;SplashTextOn 유틸
ShowSplashText(text, duration := 1000) {
    ; GUI 창 생성
    splashGui := Gui("AlwaysOnTop")
    splashGui.AddText("Center", text)  ; 텍스트를 가운데 정렬
    
    ; 창 크기를 자동으로 조정하고 창을 표시
    splashGui.Show("AutoSize Center")

    ; 지정된 시간(duration) 후에 창을 닫음
    SetTimer(() => splashGui.Destroy(), -duration)
}

;원치 않는 창 닫기 리스트
CloseUnwantedWindow()
{
  Try WinClose "Microsoft Office 인증 마법사"
}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Document Edit Util ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;한줄 지우기
deleteOneLine()
{
	Send "{home 2}{shift down}{end}{right}{shift up}{backspace}"
}

;라인 한줄 올리기
moveLineUp()
{
	saveClipBoard()
	
	A_Clipboard := ""
	Send "{end}{shift down}{up}{home 2}{shift up}"
	Send "^c"
	ClipWait 0.1
	
	pasteLine := ""
	Loop Parse A_Clipboard, "`n", "`r"
	{
		; OutputDebug "==[1]==" . A_Index . " | " . A_LoopField
		if (A_Index = 1)
		  pasteLine := A_LoopField
		else
		  pasteLine := A_LoopField . "`n" . pasteLine . ""
	}
	
	A_Clipboard := pasteLine
	
	Send "^v"
	Send "{up}"
	
	restoreClipBoard()
}
;라인 한줄 내리기
moveLineDown()
{
	saveClipBoard()
	
	A_Clipboard := ""
	Send "{home 2}{shift down}{down}{end}{shift up}"
	Send "^c"
	ClipWait 0.1
	
	pasteLine := ""
	;OutputDebug "==[1]==" . A_Clipboard
	Loop Parse A_Clipboard, "`n", "`r"
	{
		if (A_Index = 1)
		  pasteLine := A_LoopField
		else
		  pasteLine := A_LoopField . "`n" . pasteLine
	}
	;OutputDebug "==[2]==" . pasteLine
	A_Clipboard := pasteLine
	;OutputDebug "==[3]==" . A_Clipboard
	Send "^v"
	
	restoreClipBoard()
}
;선택된 라인 위로 복사하기
copyLineUp()
{
	saveClipBoard()
	
	currentText := GetSelectText()
	currentArray := StrSplit(currentText, "`n")
	lineNum := currentArray.Length
	
	;선택한 라인이 여러개인지 확인
	if(lineNum > 1){
		Send "{shift down}{home}{shift up}"
		homeText := GetSelectText()
		Send "{shift down}{end}{shift up}"
		endText := GetSelectText()
		
		homeArray := StrSplit(homeText, "`n")
		endArray := StrSplit(endText, "`n")
		
		; 현재 커서 위치에 따른 선택
		if(Strlen(homeArray[1]) != Strlen(endArray[1])){
		  Send "{home}{shift down}{down " . (lineNum-1) . "}{end}{shift up}"
		  tmpText := GetSelectText()
		} else {
		  Send "{end}{shift down}{up " . (lineNum-1) . "}{home}{shift up}"
		  tmpText := GetSelectText()
		}
	} else {
		A_Clipboard := ""
		Send "{end 2}{shift down}{home}{shift up}"
		tmpText := GetSelectText()
	} 
	
	pasteLine := ""
	Loop Parse tmpText, "`n", "`r"
	{
		pasteLine .= A_LoopField . "`n"
	}
	pasteLine .= pasteLine
	pasteLine := RegExReplace(pasteLine, "[`r`n]+$", "")
	
	A_Clipboard := pasteLine
	
	Send "^v"
	Send "{up " . (lineNum*2+1) . "}"

	restoreClipBoard()
}
;선택된 라인 아래로 복사하기
copyLineDown()
{
	saveClipBoard()
	
	currentText := GetSelectText()
	currentArray := StrSplit(currentText, "`n")
	lineNum := currentArray.Length
	
	;선택한 라인이 여러개인지 확인
	if(lineNum > 1){
		Send "{shift down}{home}{shift up}"
		homeText := GetSelectText()
		Send "{shift down}{end}{shift up}"
		endText := GetSelectText()
		
		homeArray := StrSplit(homeText, "`n")
		endArray := StrSplit(endText, "`n")
		
		; 현재 커서 위치에 따른 선택
		if(Strlen(homeArray[1]) != Strlen(endArray[1])){
		  Send "{home}{shift down}{down " . (lineNum-1) . "}{end}{shift up}"
		  tmpText := GetSelectText()
		} else {
		  Send "{end}{shift down}{up " . (lineNum-1) . "}{home}{shift up}"
		  tmpText := GetSelectText()
		}
	} else {
		A_Clipboard := ""
		Send "{end 2}{shift down}{home}{shift up}"
		tmpText := GetSelectText()
	} 
	
	pasteLine := ""
	Loop Parse tmpText, "`n", "`r"
	{
		pasteLine .= A_LoopField . "`n"
	}
	pasteLine .= pasteLine
	pasteLine := RegExReplace(pasteLine, "[`r`n]+$", "")
	
	A_Clipboard := pasteLine
	
	Send "^v"

	restoreClipBoard()
}
; 여러줄을 한줄로 만들기
concatLine()
{
	saveClipBoard()
	
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	
	pasteLine := ""
	lineNum := 0
	Loop Parse A_Clipboard, "`n", "`r"
	{
		lineNum := A_Index
		pasteLine := pasteLine . A_LoopField
	}

	; 만약 한줄이라면 단어 사이 공백을 제거한다
	if(lineNum == 1){
		pasteLine := RegExReplace(pasteLine, "^[\s\t]+", "")
		pasteLine := RegExReplace(pasteLine, "[\s\t]+$", "")
		pasteLine := RegExReplace(pasteLine, "[\s\t]+", " ")
	}
	
	A_Clipboard := pasteLine
	
	repeat := TextLen(pasteLine)
	Send "^v"
	Send "{shift down}{left " . repeat . "}{shift up}"
	
	restoreClipBoard()
}
;SQL 형태로 만들기1
makeCommaLine()
{
	saveClipBoard()
	
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	
	pasteLine := RegExReplace(A_Clipboard, "(?m)`n(?=.+)", "`n, ")
	
	A_Clipboard := pasteLine
	Send "^v"
	
	restoreClipBoard()
}
;SQL 형태로 만들기2
makeSingleQuoteLine(){
	saveClipBoard()
	
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	
	pasteLine := RegExReplace(A_Clipboard, "(?m)^(.+)$", "'$1'")
	
	A_Clipboard := pasteLine
	Send "^v"
	
	restoreClipBoard()
}
;SQL 형태로 만들기3
makeDoubleQuoteLine(){
	saveClipBoard()
	
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	
	pasteLine := RegExReplace(A_Clipboard, "(?m)^(.+)$", "`"$1`"")
	
	A_Clipboard := pasteLine
	Send "^v"
	
	restoreClipBoard()
}

 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Import Files ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;saveClipboard
saveClipBoard()
{
	global saveClip := ClipboardAll()
}

restoreClipBoard(period:=50)
{
	Sleep period
	A_Clipboard := saveClip
}

TextLen(text)
{
	return StrLen(RegExReplace(text, "[\r\n]", ""))
}

GetSelectText()
{
	
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	return A_Clipboard
}
반응형

'소프트웨어 가이드 > AutoHotKey' 카테고리의 다른 글

AHK : 1...100 까지 메세지 출력  (0) 2019.08.17