1

Тема: AHK: Сохранение и открытие скрипта в редакторе

К сожалению, автор сценария не отдал отклика, поэтому, спрошу здесь. В сценарии QuickSaveThisScript.ahk подразумевается возможность ввода названия для сохраняемого файла, но если ввести название из нескольких слов, то сохраняется и открывается файл некорректно, а именно, каждое слово в новой вкладке редактора SciTE4AHK. Помогите с решением данной проблемы, пожалуйста. Спасибо!

/* QuickSaveThisScript.ahk
Version: 0.1
Last time modified: 2015.09.14 20:42

Description: a script to quickly save selected text to an *.ahk file and open it in the editor.

Script author: Drugoy a.k.a. Drugmix
Contacts: idrugoy@gmail.com, drug0y@ya.ru
https://github.com/Drugoy/Autohotkey-scripts-.ahk/tree/master/QuickSaveThisScript/QuickSaveThisScript.ahk
*/
SendMode, Input  ; Recommended for new scripts due to its superior speed and reliability.
#SingleInstance, Force
SetKeyDelay, 50

;{ Settings
saveToFolder := ""	; Where to save scripts. If blank - the scripts will get saved next to this script.
;}

RegRead, editor, HKCR, AutoHotkeyScript\Shell\Edit\Command	; Get user's editor assigned for AutoHotkey scripts.
editor := StrReplace(editor, "%SystemDrive%", SystemDrive)
Return

^!vk43 Up::	; "Ctrl+Alt+c"	< this will also open a prompt for file name.
!vk43 Up::	; "Alt+c".
	;{ Make sure all the hotkey's keys got unpressed.
	If (A_ThisHotkey = "^!vk43 Up")
		While (GetKeyState("Ctrl", "P"))
			Sleep, 10
	While (GetKeyState("Alt", "P"))
		Sleep, 10
	;}
	savedClipboard := ClipboardAll	; Backup data from clipboard.
	Clipboard := ""
	While !Clipboard	; Try to copy selected (it may fail, and then we have to retry).
	{
		Send, {Ctrl Down}c{Ctrl Up}
		Sleep, 25
	}
	textToSave := Clipboard
	Clipboard := savedClipboard
	If (A_ThisHotkey = "^!vk43 Up")
	{
		InputBox, filename, Enter the name for the script's file:,,, 300, 100
		If ErrorLevel	; Flush the variable's contents in case user canceled or closed the input box.
			filename := ""
	}
	saveTofile := (saveToFolder ? saveToFolder : A_ScriptDir) "\" (filename ? filename : A_Now) ".ahk"
	FileAppend, %textToSave%, %saveTofile%, UTF-8	 ; Save selected into a file next to this script.
	Run, % (editor ? StrReplace(editor, "%1", """" saveTofile """") : notepad.exe  """" saveTofile """") 
	textToSave := filename := savedClipboard := saveTofile := ""	; Restore clipboard from backup and clean temporary variables.
Return

2

Re: AHK: Сохранение и открытие скрипта в редакторе

Путь к новому файлу не был заключен в кавычки. Строки 34-38 лучше заменить простым копированием и ожиданием наполнения буфера - эта идея с посылкой множественных нажатий может обернуться тем, что буква "c" будет посылаться в окно до бесконечности.


/* QuickSaveThisScript.ahk
Version: 0.1
Last time modified: 2015.09.14 20:42

Description: a script to quickly save selected text to an *.ahk file and open it in the editor.

Script author: Drugoy a.k.a. Drugmix
Contacts: idrugoy@gmail.com, drug0y@ya.ru
https://github.com/Drugoy/Autohotkey-scripts-.ahk/tree/master/QuickSaveThisScript/QuickSaveThisScript.ahk
*/
SendMode, Input  ; Recommended for new scripts due to its superior speed and reliability.
#SingleInstance, Force
SetKeyDelay, 50

;{ Settings
saveToFolder := ""	; Where to save scripts. If blank - the scripts will get saved next to this script.
;}

RegRead, editor, HKCR, AutoHotkeyScript\Shell\Edit\Command	; Get user's editor assigned for AutoHotkey scripts.
editor := StrReplace(editor, "%SystemDrive%", SystemDrive)
Return

^!vk43 Up::	; "Ctrl+Alt+c"	< this will also open a prompt for file name.
!vk43 Up::	; "Alt+c".
	;{ Make sure all the hotkey's keys got unpressed.
	If (A_ThisHotkey = "^!vk43 Up")
		While (GetKeyState("Ctrl", "P"))
			Sleep, 10
	While (GetKeyState("Alt", "P"))
		Sleep, 10
	;}
	savedClipboard := ClipboardAll	; Backup data from clipboard.
	Clipboard := ""
	While !Clipboard	; Try to copy selected (it may fail, and then we have to retry).
	{
		Send, {Ctrl Down}c{Ctrl Up}
		Sleep, 25
	}
	textToSave := Clipboard
	Clipboard := savedClipboard
	If (A_ThisHotkey = "^!vk43 Up")
	{
		InputBox, filename, Enter the name for the script's file:,,, 300, 100
		If ErrorLevel	; Flush the variable's contents in case user canceled or closed the input box.
			filename := ""
	}
	saveTofile := (saveToFolder ? saveToFolder : A_ScriptDir) "\" (filename ? filename : A_Now) ".ahk"
	FileAppend, %textToSave%, %saveTofile%, UTF-8	 ; Save selected into a file next to this script.
	Run, % (editor ? StrReplace(editor, """%1""", """" saveTofile """") : notepad.exe  """" saveTofile """") 
	textToSave := filename := savedClipboard := saveTofile := ""	; Restore clipboard from backup and clean temporary variables.
Return

3 (изменено: becauseim, 2017-03-23 22:45:04)

Re: AHK: Сохранение и открытие скрипта в редакторе

Krot66, Спасибо! Я немного переделал для себя данный сценарий, а именно, оставил только одну горячую клавишу. Если окно для ввода названия оставить пустым, то название приводится по заданному шаблону. Также в начало добавляются установки: #SingleInstance Force и SetTitleMatchMode 2. По умолчанию, InputBox заполняется заголовком активного окна. хотелось бы, чтобы скрипт умел определять, что текущее окно - это страница данного форума и автоматически исключать из его заголовка все, кроме названия темы. Помогите реализовать, пожалуйста.

^!vk43 Up::	; Quick Save Script (Ctrl+Alt+C)
If (A_ThisHotkey = "^!vk43 Up")
		While (GetKeyState("Ctrl", "P"))
			Sleep, 10
	While (GetKeyState("Alt", "P"))
			Sleep, 10
	WinGetTitle, Title, A
	RegRead, editor, HKCR, AutoHotkeyScript\Shell\Edit\Command
	editor := StrReplace(editor, "%SystemDrive%", SystemDrive)
	saveToFolder := ""
	savedClipboard := ClipboardAll
	Clipboard := ""
	SendInput ^{vk43}
	ClipWait
	textToSave := "#SingleInstance Force`rSetTitleMatchMode 2`r`r"Clipboard
	Clipboard := savedClipboard
	InputBox, filename, Enter the name for the script's file:,,, 300, 100,,,,, %Title%
		if errorlevel
		{
			return
		}
	saveTofile := (saveToFolder ? saveToFolder : A_ScriptDir) "\" (filename ? filename : "_test_" A_Now) ".ahk"
	FileAppend, %textToSave%, %saveTofile%, UTF-8
	Run, % (editor ? StrReplace(editor, """%1""", """" saveTofile """") : notepad.exe  """" saveTofile """") 
	textToSave := filename := savedClipboard := saveTofile := ""
Return

4

Re: AHK: Сохранение и открытие скрипта в редакторе

Можно удалить имя приложения чем-нибудь вроде


RegExReplace(t," - [^-]+$")

Еще понадобится функция для удаления некорректных символов (того же двоеточия в этом заголовке), не поддерживаемых операционной системой


ValidName(n,r="") ; r - замена пробелов, например подчеркиванием
{
	n:=RegExReplace(n,"(:|;|,|\.|\*|\?|\\|/|<|>|"")"," ")
	n:=RegExReplace(n,"\s+"," ")
	StringReplace n, n, |, -, All
	If r
		StringReplace n, n, % " ", % r, All
	return Trim(n)
}

5 (изменено: becauseim, 2017-03-24 18:26:21)

Re: AHK: Сохранение и открытие скрипта в редакторе

Krot66, спасибо! Не понял, к сожалению, как использовать ValidName, т.к. у меня в результате использования данной функции, от заголовка ничего не остается.

6

Re: AHK: Сохранение и открытие скрипта в редакторе

После WinGetTitle


Title:=ValidName(Title)

Саму функцию, естественно, дописать в конце скрипта!

7

Re: AHK: Сохранение и открытие скрипта в редакторе

Более универсальный вариант того же самого:
http://forum.script-coding.com/viewtopi … 23#p114223

8

Re: AHK: Сохранение и открытие скрипта в редакторе

Krot66, спасибо! Но мне, например, удобнее использовать одну горячую клавишу. Даже если добавить периодическое обращение к сценариям на ином языке, я бы все равно оставил одну горячую клавишу, но расширил опциональность посредством чекбоксов, например.

9 (изменено: Krot66, 2017-03-26 20:08:37)

Re: AHK: Сохранение и открытие скрипта в редакторе

Эту штуку я делал под себя и довольно давно. Для меня ее смысл как раз в том, чтобы поменьше думать, поскольку для простых текстовых файлов я пользуюсь ей много. Можно, конечно, слепить меню, но ошибок от этого станет только больше. Тип сохранения выводится в заголовке окна - можно отменить и пересохранить, если не то.
Если будут вопросы, пишите в теме скрипта.

10

Re: AHK: Сохранение и открытие скрипта в редакторе

Помогите, пожалуйста, добавить условие на случай, если скрипт с выбранным названием уже существует. Например, добавлять в конец названия индексовое значение. Т.к. если сохранять несколько скриптов с одной и той же страницы, все сохраняется в один файл.

^!vk43 Up::	; Quick Save Script
saveToFolder := ""	; Where to save scripts.
If (A_ThisHotkey = "^!vk43 Up")
		While (GetKeyState("Ctrl", "P"))
			Sleep, 10
	While (GetKeyState("Alt", "P"))
			Sleep, 10
	WinGetTitle, Title, A
	If InStr(Title, "Серый форум"){
		Title := RegExReplace(Title, "i)(AHK:\s*)?(.*) \(Страница \d+\) — .*", "$2")
	}
	Title := ValidName(Title)
	RegRead, editor, HKCR, AutoHotkeyScript\Shell\Edit\Command
	editor := StrReplace(editor, "%SystemDrive%", SystemDrive)
	saveToFolder := ""
	savedClipboard := ClipboardAll
	Clipboard := ""
	SendInput ^{vk43}
	ClipWait, 0.5
	textToSave := "#SingleInstance Force`rSetTitleMatchMode 2`r`r"Clipboard
	Clipboard := savedClipboard
	InputBox, filename, Enter the name for the script's file:,,, 300, 100,,,,, %Title%
		if errorlevel
		{
			return
		}
	saveTofile := (saveToFolder ? saveToFolder : A_ScriptDir) "\" (filename ? filename : "_test_" A_Now) ".ahk"
	FileAppend, %textToSave%, %saveTofile%, UTF-8
	Run, % (editor ? StrReplace(editor, """%1""", """" saveTofile """") : notepad.exe  """" saveTofile """") 
	textToSave := filename := savedClipboard := saveTofile := ""
Return

11 (изменено: Krot66, 2017-03-27 21:22:02)

Re: AHK: Сохранение и открытие скрипта в редакторе

Вот функциия для такого автопереименовани (tab - число цифр с ведущими нолями).


RenIfExist(f_path,tab=1)
{
	If !FileExist(f_path)
		return f_path
	SplitPath f_path, , dir, ext, file
	Loop % dir "\" file "*." ext
	{
		n:=0
		RegExMatch(A_LoopFileName,"(?<=_)\d+?(?=\.[a-zA-Z0-9]{2,4}$)",n)
		If !n
			n_max:=0
		If (n>n_max)
			n_max:=n
	}
	SetFormat float, % "0" tab
	return dir "\" file "_" n_max+1.0 "." ext
}

12

Re: AHK: Сохранение и открытие скрипта в редакторе

Krot66, Спасибо! Но мне бы что-то попроще. Что-то вроде:

		If FileExist("saveTofile")
		{
			saveTofile := %saveTofile%_%A_Index%
		}

Только в правильном синтаксисе и в нужном месте.