본문 바로가기

소프트웨어 가이드/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()

;임시 매크로 용도
;F2::tmpJob()

;경로 복사
^+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()
  
	; 대소문자 변경
	^+U::convertCase()
  
	; SQL 형태로 만들기
	^!j::concatLine()
	^,::makeCommaLine()
	^"::makeDoubleQuoteLine()	;"
	^'::makeSingleQuoteLine()	;'
#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
}

;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++")
}

;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()
{
	ShowMsg("AHK Pause", 200)
	Pause
}
ahkReload()
{
	ShowMsg("AHK Reload", 200)
	Reload
}

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

;원치 않는 창 닫기 리스트
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()
  	
	Send "{home 2}{shift down}{down}{end}{shift up}"
	GetSelectText()
  
	pasteLine := ""
	;OutputDebug "==[1]==" . A_Clipboard
	Loop Parse A_Clipboard, "`n", "`r"
	{
		if (A_Index = 1)
			pasteLine := A_LoopField
		else
			pasteLine := A_LoopField . "`n" . pasteLine
	}
	A_Clipboard := pasteLine
	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()
}
; 대소문자 변경
convertCase(){
	SaveClipBoard()
	GetSelectText()
  
	if RegExMatch(A_Clipboard, "[A-Z]+")
		pasteLine := StrLower(A_Clipboard)
	else
		pasteLine := StrUpper(A_Clipboard)
  
	SetSelectText(pasteLine)
	RestoreClipBoard()
}
; 여러줄을 한줄로 만들기
concatLine()
{
	SaveClipBoard()
	GetSelectText()
  
	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]+", " ")
	}
  
	SetSelectText(pasteLine)	
	RestoreClipBoard()
}
;SQL 형태로 만들기1
makeCommaLine()
{
	SaveClipBoard()
	GetSelectText()
  
	pasteLine := RegExReplace(A_Clipboard, "(?m)`n(?=.+)", "`n, ")
  
	SetSelectText(pasteLine)	
	RestoreClipBoard()
}
;SQL 형태로 만들기2
makeSingleQuoteLine(){
	SaveClipBoard()
	GetSelectText()
  
	pasteLine := RegExReplace(A_Clipboard, "(?m)^(.+)$", "'$1'")
  
	SetSelectText(pasteLine)	
	RestoreClipBoard()
}
;SQL 형태로 만들기3
makeDoubleQuoteLine(){
	SaveClipBoard()
	GetSelectText()
  
	pasteLine := RegExReplace(A_Clipboard, "(?m)^(.+)$", "`"$1`"")
  
	SetSelectText(pasteLine)	
	RestoreClipBoard()
}

 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function List ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;경로 복사
copyPath()
{
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	
	TMP := A_Clipboard
	A_Clipboard := TMP
	showTip(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
}

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

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

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

; 텍스트 선택
setBlockText(text, direct:="left")
{
	len := TextLen(text)	
	Send "{shift down}{" . direct . " " . len . "}{shift up}"
}

GetSelectText()
{
	A_Clipboard := ""
	Send "^c"
	ClipWait 0.1
	return A_Clipboard
}
SetSelectText(pasteLines, direct:="left", isMark:=true)
{
	A_Clipboard := pasteLines
	Send "^v"
	
	if(isMark)
		setBlockText(pasteLines, direct)
}



;Tooltip 유틸
showTip(text, duration := 1000)
{
	ToolTip text
	SetTimer () => ToolTip(), -duration
}

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

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

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

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