Скрипт Autohotkey для SumatraPDF
Помимо добавления удобств в аскетичный интерфейс программы, скрипт позволяет использовать ее для разгребания книжных завалов: возможно перемещение по горячим клавишам внутри папки, быстрое переименование на основании выделенного текста, копирование открытых документов в буфер и в заданную папку, а так же их удаление.
Возможности:
У левого края экрана:
Левый клик (или Alt+Up) - боковая панель закладок
Правый (или Alt+Down) - боковая панель избранного
Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)
У верхнего края экрана:
Правый клик - свойства файла
Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.
У правого края экрана:
Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
Средний клик (или Ctrl+Enter) - полноэкранный режим
Shift+средний клик - презентация
Колесико - поэкранная прокрутка
На плавающем окне страниц:
Левый клик - назавние и размер файла
Правый - окно выбора страницы
Браузерное:
Переключение вкладок колесиком с зажатой правой кнопкой мыши
Щелчок левой кнопкой мыши с зажатой правой - переход назад
Шелчок правой кнопкой мыши с зажатой левой - переход вперед
F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу
ВАЖНО:
1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.
2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.
3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.
[more=Скрипт]
Код:
#NoEnv
#NoTrayIcon
#SingleInstance, force
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode, 2
SetTitleMatchMode, Slow
;~ SetKeyDelay 50, 50
goto start
/*
Возможности:
У левого края экрана:
Левый клик (или Alt+Up) - боковая панель закладок
Правый (или Alt+Down) - боковая панель избранного
Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)
У верхнего края экрана:
Правый клик - свойства файла
Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.
У правого края экрана:
Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
Средний клик (или Ctrl+Enter) - полноэкранный режим
Shift+средний клик - презентация
Колесико - поэкранная прокрутка
На плавающем окне страниц:
Левый клик - назавние и размер файла
Правый - окно выбора страницы
Браузерное:
Переключение вкладок колесиком с зажатой правой кнопкой мыши
Щелчок левой кнопкой мыши с зажатой правой - переход назад
Шелчок правой кнопкой мыши с зажатой левой - переход вперед
F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу
ВАЖНО:
1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.
2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.
3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.
*/
/*
Как создать скомпилированную версию скрипта, включающую в себя SumatraPDF и не требующую установки Autohotkey (этот вариант Суматры полностью функционален, т.е. подхватывает настройки, открывет ассоциированные файлы и автоматически выгружается из памяти при закрытии окна программы).
1. Настраиваем под себя скрипт и помещаем его в каталог с Суматрой. Скрипт может называться как угодно, но не SumatraPDF.ahk! Сюда же помещаем файл help.txt с предполагаемой справкой, взятой из начала скрипта.
2. Идем в Программы - Autohotkey и запускаем "Convert .ahk to .exe".
3. Открываем в нем скрипт и подходящую иконку, например извлеченную из самой Суматры программой типа Greenfish Icon Editor Pro.
4. Компилируем, выбрав в выпадающем меню соответствующую версию Autohotkey (юникодную и той же разрядности, что и Суматра)
5. Удаляем старый файл Суматры и переименовываем полученный файл в SumatraPDF.exe
*/
start:
font:=14 ; размер шрифта панели страниц (0 - не показывать вообще)
file_show:=3000 ; время показа имени файла в панели страниц (0 - не показывать вообще)
color:="4E8D8F" ; ее цвет
conf:=1 ; подтверждать удаление файлов
;-----------------------------------------
FileInstall SumatraPDF.exe, _SPDF.exe
FileInstall help.txt, _help.txt
SplitPath A_ScriptDir, , , , , script_drive
working_file:="SumatraPDF.exe"
If A_IsCompiled
{
file:=""
If %1%
file="%1%"
Run _SPDF.exe %file%, %A_ScriptDir%
WinWait ahk_class SUMATRA_PDF_FRAME
WinActivate
FileRead help, _help.txt
working_file:="_SPDF.exe"
}
else
{
FileRead help,% A_ScriptName
RegExMatch(help,"s)/\*\K.+?(?=\*/)",help)
Menu, Tray, Icon
Menu, Tray, Icon, shell32.dll, 14
}
SysGet, M, MonitorWorkArea
Loop
{
WinGetTitle st, ahk_class SUMATRA_PDF_FRAME
RegExMatch(st,"^[a-zA-Z]:\\.+?\.\w{2,4}(?= - )",sf)
If WinActive("ahk_exe " working_file) && sf
{
If (sf!=sf_old)
{
show:=1, sf_old:=sf
SetTimer Show, % file_show
}
SplitPath sf, sfn, sd, sfext
WinGetText stxt, ahk_class SUMATRA_PDF_FRAME
RegExMatch(stxt,"m)^[0-9XIVLC]+$",pg)
RegExMatch(stxt,"m)/ \K\d+$",all_pg)
If !all_pg
RegExMatch(stxt,"/ ?\K\d+(?=\))",all_pg)
pp:=pg " / " all_pg
If show && file_show
{
FileGetSize sz, % sf, K
pp.=" | " sfn " (" sz " KB)"
}
If (WinState("ahk_class SUMATRA_PDF_FRAME")=2 && !show)
{
FormatTime time, , HH:mm
pp.=" | " time
}
ControlGetText pp_old, Static1, pages_window
l:=StrLen(pp), l_old:=StrLen(pp_old)
WinGetPos x, y, w, h, ahk_class SUMATRA_PDF_FRAME
If (!WinExist("pages_window") || (l!=l_old)) && font
{
Gui Destroy
Gui -Caption +ToolWindow -DPIScale +AlwaysOnTop +LastFound
Gui Color, % color
Gui Font, s%font% cffffff w700, Licida Console
Gui Margin, 6, 2
Gui Add, Text, g$^Space, % pp
Gui Show, x10 y10 NA, pages_window
WinGetPos, , , , hp
}
GuiControl Text, Static1, % pp
WinMove, pages_window, ,x+12, y+h-hp-12
}
else
Gui Destroy
Process Exist, _SPDF.exe
If !Errorlevel && A_IsCompiled
{
Sleep 1000
WinClose Help ahk_class AutoHotkeyGUI
FileDelete _SPDF.exe
FileDelete _help.txt
ExitApp
}
Sleep 100
}
#If WinActive("ahk_class SUMATRA_PDF_FRAME")
!Up::Send {F12}
!Down::PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME
!F3::PostMessage 0x111, 500, , , ahk_class SUMATRA_PDF_FRAME
!F4::PostMessage 0x111, 501, , , ahk_class SUMATRA_PDF_FRAME
^NumpadEnter::
^Enter::Send {F11}
F1::
SysGet, M, MonitorWorkArea
hw:=MRIght*0.9, hh:=MBottom*0.9
Gui 99:Destroy
Gui 99:-DPIScale
Gui 99:font, s16, Arial
Gui 99:Margin, 0, 0
Gui 99:Add, Edit, w%hw% h%hh%
Gui 99:Show, Center, Help
GuiControl 99:,Edit1, % help
return
!vk43::
FileToClipboard(sf)
ToolTip Файл в буфере!, MRight//2-100, MBottom//2
Sleep 1000
ToolTip
return
$^Space::
KeyWait Ctrl, T1
show:=1
SetTimer Show, % file_show
return
Show:
SetTimer Show, Off
show:=0
return
+Tab::
Send ^{vk4F}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
ControlSetText Edit1, % sf
ControlSend Button1, {Enter}
return
^vk4F::
KeyWait Ctrl, T1
KeyWait vk4F, T1
Send ^{vk4F}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
Sleep 100
WinMove ahk_class #32770, , MRight//5, MBottom//20, MRight*0.6, MBottom*0.9
ControlSetText Edit1, % sd #32770
ControlSend Button1, {Enter}
Sleep 100
ControlFocus DirectUIHWND2, ahk_class #32770
SendInput ^+6
Sleep 100
SendInput % sfn
return
+F2::
KeyWait Shift, T1
Clipboard:=""
Send ^{vk43}
ClipWait 1
e:=Errorlevel
ren:=ValidName(Trim(Clipboard))
Clipboard:=FirstUppercase(RegExReplace(ren,"[.,]+$"))
Send {F2}
WinWaitActive ahk_class #32770
If e
{
ToolTip Ничего не скопировано!, MRight//2-100, MBottom//2
Sleep 1500
ToolTip
return
}
Send {Del}^{vk56}
ControlSend Edit1, {End}
return
^Del::
^NumpadDel::
KeyWait Ctrl, T0.8
e:=Errorlevel
If !sf_old
return
If conf
{
MsgBox, 262179, , % "Удалить файл`n" sf_old " ?"
IfMsgBox Yes
goto !Home
return
}
!Home::
!End::
!PGUP::
!PGDN::
!WheelUp::
!WheelDown::
^!PGUP::
^!PGDN::
^!WheelUp::
^!WheelDown::
start:=sf_old
SplitPath start, , dir
mask:="*.cb7z;*.cbr;*.cbt;*.cbz;*.chm;*.djv*;*.epub;*.*fb2;*.mobi;*.pdb;*.pdf;*.xps"
n:=0, curr:=next:=prev:=end:=""
Loop Parse, mask, `;
{
Loop Files, % dir "\" A_LoopField
{
n+=1
If (n=1)
home:=A_LoopFileFullPath
If (A_LoopFileFullPath=start)
curr:=n, prev:=end
If (n=curr+1)
next:=A_LoopFileFullPath
end:=A_LoopFileFullPath
}
}
open:=next, text:="Последний файл папки!"
If A_ThisHotkey in !PGUP,^!PGUP,!WheelUp,^!WheelUp
open:=prev, text:="Первый файл папки!"
If (A_ThisHotkey="!Home")
open:=home, text:="Открыто!"
If (A_ThisHotkey="!End")
open:=end, text:="Открыто!"
If A_ThisHotkey~="Del"
{
WinGetActiveTitle cl_tab
Send ^{vk57}
WinWaitNotActive % cl_tab, , 2
Sleep 100
FileRecycle % start
If !e
return
}
If (!open || open=start)
{
ToolTip % text, MRight//2-100, MBottom//2
Sleep 1000
ToolTip
return
}
If A_ThisHotkey not contains Del,^!
{
WinGetActiveTitle cl_tab
Send ^{vk57}
WinWaitNotActive % cl_tab, , 2
}
WinGet sumatra, ProcessPath, A
Run "%sumatra%" "%open%"
return
^+vk53::SaveCopy(script_drive "\_Read")
SaveCopy(path)
{
global
KeyWait Ctrl, T1
KeyWait Shift, T1
KeyWait Alt, T1
FileCreateDir % path
Send ^{vk53}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
Clipboard:=RegExReplace(path,"\\$") "\" sfn
Send {Del}^{vk56}
Sleep 100
Send {Enter}
return
}
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && HoverControl()="Static1"
RButton::
KeyWait RButton, T1
WinHide pages_window
PostMessage 0x111, 434, , , ahk_class SUMATRA_PDF_FRAME
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(1) && WinState()
LButton::Send {F12}
RButton::
KeyWait RButton, T1
PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME
return
MButton::
KeyWait MButton, T1
Clipboard:=""
Send ^{vk43}
ClipWait 1
fav:=RegExReplace(Clipboard,"\s"," ")
PostMessage 0x111, 560, , , ahk_class SUMATRA_PDF_FRAME
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
If fav
ControlSetText Edit1, % fav, ahk_class #32770
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,1) && WinState()
MButton::F11
RButton::goto $^Space
WheelUp::
WheelDown::
ControlGet c1, Visible, , SysTreeView321, A
ControlGet c2, Visible, , SysTreeView322, A
If c1 || c2
Send {%A_Thishotkey%}
else
{
If (A_ThisHotkey="WheelUp")
Send {PGUP}
else
Send {PGDN}
}
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,0,1) && WinState()
RButton::^vk44
MButton::goto ^vk4F
+RButton::PostMessage 0x111, 419, , , ahk_class SUMATRA_PDF_FRAME
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && !IsBorder(1,1,1,1)
~RButton & ~WheelDown::Send {Rbutton up}^{Tab}
~RButton & ~WheelUp::Send {Rbutton up}^+{Tab}
~RButton & ~LButton::Send {Rbutton up}!{Left}
~LButton & ~RButton::Send {LButton up}!{Right}
#If WinActive("ahk_class #32770 ahk_exe " working_file)
MButton::!Up
#IfWinActive
;--------------------------------------------------
FileToClipboard(PathToCopy,Method="copy")
{
FileCount:=0
PathLength:=0
; Count files and total string length
Loop,Parse,PathToCopy,`n,`r
{
FileCount++
PathLength+=StrLen(A_LoopField)
}
pid:=DllCall("GetCurrentProcessId","uint")
hwnd:=WinExist("ahk_pid " . pid)
; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
hPath := DllCall("GlobalAlloc","uint",0x42,"uint",20 + (PathLength + FileCount + 1) * 2,"UPtr")
pPath := DllCall("GlobalLock","UPtr",hPath)
NumPut(20,pPath+0),pPath += 16 ; DROPFILES.pFiles = offset of file list
NumPut(1,pPath+0),pPath += 4 ; fWide = 0 -->ANSI,fWide = 1 -->Unicode
Offset:=0
Loop,Parse,PathToCopy,`n,`r ; Rows are delimited by linefeeds (`r`n).
offset += StrPut(A_LoopField,pPath+offset,StrLen(A_LoopField)+1,"UTF-16") * 2
DllCall("GlobalUnlock","UPtr",hPath)
DllCall("OpenClipboard","UPtr",hwnd)
DllCall("EmptyClipboard")
DllCall("SetClipboardData","uint",0xF,"UPtr",hPath) ; 0xF = CF_HDROP
; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations
; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
mem := DllCall("GlobalAlloc","uint",0x42,"uint",4,"UPtr")
str := DllCall("GlobalLock","UPtr",mem)
if (Method="copy")
DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x05)
else if (Method="cut")
DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x02)
else
{
DllCall("CloseClipboard")
return
}
DllCall("GlobalUnlock","UPtr",mem)
cfFormat := DllCall("RegisterClipboardFormat","Str","Preferred DropEffect")
DllCall("SetClipboardData","uint",cfFormat,"UPtr",mem)
DllCall("CloseClipboard")
return
}
FirstUppercase(t)
{
StringLeft n, t, 1
StringTrimLeft k, t, 1
StringUpper n, n
return n . k
}
HoverControl()
{
MouseGetPos, , , , control
return control
}
IsBorder(left:="",right="",top="",bottom:="",m=6)
{
SysGet, M, Monitor
SysGet, W, MonitorWorkArea
CoordMode Mouse
MouseGetPos mx, my
return If (((left && mx<m) && (my>50) && (my<WBottom)) || (right && mx>MRight-m) || (top && my<m) || (bottom && my>MBottom-m))
}
ValidName(n,r="")
{
n:=RegExReplace(n,"(:|;|,|\.|\*|\?|\\|/|<|>|"")"," ")
n:=RegExReplace(n,"\s+"," ")
StringReplace n, n, |, -, All
If r
StringReplace n, n, % " ", % r, All
return Trim(n)
}
WinState(t="A")
{
If !WinExist(t) || (t="A" && WinActive("Program Manager"))
return
SysGet, M, Monitor
WinGetPos , , , w, h, % t
WinGet st, MinMax, % t
If (w=MRight && h=MBottom)
st:=2
return st
}
Помимо добавления удобств в аскетичный интерфейс программы, скрипт позволяет использовать ее для разгребания книжных завалов: возможно перемещение по горячим клавишам внутри папки, быстрое переименование на основании выделенного текста, копирование открытых документов в буфер и в заданную папку, а так же их удаление.
Возможности:
У левого края экрана:
Левый клик (или Alt+Up) - боковая панель закладок
Правый (или Alt+Down) - боковая панель избранного
Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)
У верхнего края экрана:
Правый клик - свойства файла
Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.
У правого края экрана:
Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
Средний клик (или Ctrl+Enter) - полноэкранный режим
Shift+средний клик - презентация
Колесико - поэкранная прокрутка
На плавающем окне страниц:
Левый клик - назавние и размер файла
Правый - окно выбора страницы
Браузерное:
Переключение вкладок колесиком с зажатой правой кнопкой мыши
Щелчок левой кнопкой мыши с зажатой правой - переход назад
Шелчок правой кнопкой мыши с зажатой левой - переход вперед
F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу
ВАЖНО:
1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.
2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.
3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.
[more=Скрипт]
Код:
#NoEnv
#NoTrayIcon
#SingleInstance, force
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode, 2
SetTitleMatchMode, Slow
;~ SetKeyDelay 50, 50
goto start
/*
Возможности:
У левого края экрана:
Левый клик (или Alt+Up) - боковая панель закладок
Правый (или Alt+Down) - боковая панель избранного
Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)
У верхнего края экрана:
Правый клик - свойства файла
Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.
У правого края экрана:
Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
Средний клик (или Ctrl+Enter) - полноэкранный режим
Shift+средний клик - презентация
Колесико - поэкранная прокрутка
На плавающем окне страниц:
Левый клик - назавние и размер файла
Правый - окно выбора страницы
Браузерное:
Переключение вкладок колесиком с зажатой правой кнопкой мыши
Щелчок левой кнопкой мыши с зажатой правой - переход назад
Шелчок правой кнопкой мыши с зажатой левой - переход вперед
F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу
ВАЖНО:
1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.
2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.
3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.
*/
/*
Как создать скомпилированную версию скрипта, включающую в себя SumatraPDF и не требующую установки Autohotkey (этот вариант Суматры полностью функционален, т.е. подхватывает настройки, открывет ассоциированные файлы и автоматически выгружается из памяти при закрытии окна программы).
1. Настраиваем под себя скрипт и помещаем его в каталог с Суматрой. Скрипт может называться как угодно, но не SumatraPDF.ahk! Сюда же помещаем файл help.txt с предполагаемой справкой, взятой из начала скрипта.
2. Идем в Программы - Autohotkey и запускаем "Convert .ahk to .exe".
3. Открываем в нем скрипт и подходящую иконку, например извлеченную из самой Суматры программой типа Greenfish Icon Editor Pro.
4. Компилируем, выбрав в выпадающем меню соответствующую версию Autohotkey (юникодную и той же разрядности, что и Суматра)
5. Удаляем старый файл Суматры и переименовываем полученный файл в SumatraPDF.exe
*/
start:
font:=14 ; размер шрифта панели страниц (0 - не показывать вообще)
file_show:=3000 ; время показа имени файла в панели страниц (0 - не показывать вообще)
color:="4E8D8F" ; ее цвет
conf:=1 ; подтверждать удаление файлов
;-----------------------------------------
FileInstall SumatraPDF.exe, _SPDF.exe
FileInstall help.txt, _help.txt
SplitPath A_ScriptDir, , , , , script_drive
working_file:="SumatraPDF.exe"
If A_IsCompiled
{
file:=""
If %1%
file="%1%"
Run _SPDF.exe %file%, %A_ScriptDir%
WinWait ahk_class SUMATRA_PDF_FRAME
WinActivate
FileRead help, _help.txt
working_file:="_SPDF.exe"
}
else
{
FileRead help,% A_ScriptName
RegExMatch(help,"s)/\*\K.+?(?=\*/)",help)
Menu, Tray, Icon
Menu, Tray, Icon, shell32.dll, 14
}
SysGet, M, MonitorWorkArea
Loop
{
WinGetTitle st, ahk_class SUMATRA_PDF_FRAME
RegExMatch(st,"^[a-zA-Z]:\\.+?\.\w{2,4}(?= - )",sf)
If WinActive("ahk_exe " working_file) && sf
{
If (sf!=sf_old)
{
show:=1, sf_old:=sf
SetTimer Show, % file_show
}
SplitPath sf, sfn, sd, sfext
WinGetText stxt, ahk_class SUMATRA_PDF_FRAME
RegExMatch(stxt,"m)^[0-9XIVLC]+$",pg)
RegExMatch(stxt,"m)/ \K\d+$",all_pg)
If !all_pg
RegExMatch(stxt,"/ ?\K\d+(?=\))",all_pg)
pp:=pg " / " all_pg
If show && file_show
{
FileGetSize sz, % sf, K
pp.=" | " sfn " (" sz " KB)"
}
If (WinState("ahk_class SUMATRA_PDF_FRAME")=2 && !show)
{
FormatTime time, , HH:mm
pp.=" | " time
}
ControlGetText pp_old, Static1, pages_window
l:=StrLen(pp), l_old:=StrLen(pp_old)
WinGetPos x, y, w, h, ahk_class SUMATRA_PDF_FRAME
If (!WinExist("pages_window") || (l!=l_old)) && font
{
Gui Destroy
Gui -Caption +ToolWindow -DPIScale +AlwaysOnTop +LastFound
Gui Color, % color
Gui Font, s%font% cffffff w700, Licida Console
Gui Margin, 6, 2
Gui Add, Text, g$^Space, % pp
Gui Show, x10 y10 NA, pages_window
WinGetPos, , , , hp
}
GuiControl Text, Static1, % pp
WinMove, pages_window, ,x+12, y+h-hp-12
}
else
Gui Destroy
Process Exist, _SPDF.exe
If !Errorlevel && A_IsCompiled
{
Sleep 1000
WinClose Help ahk_class AutoHotkeyGUI
FileDelete _SPDF.exe
FileDelete _help.txt
ExitApp
}
Sleep 100
}
#If WinActive("ahk_class SUMATRA_PDF_FRAME")
!Up::Send {F12}
!Down::PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME
!F3::PostMessage 0x111, 500, , , ahk_class SUMATRA_PDF_FRAME
!F4::PostMessage 0x111, 501, , , ahk_class SUMATRA_PDF_FRAME
^NumpadEnter::
^Enter::Send {F11}
F1::
SysGet, M, MonitorWorkArea
hw:=MRIght*0.9, hh:=MBottom*0.9
Gui 99:Destroy
Gui 99:-DPIScale
Gui 99:font, s16, Arial
Gui 99:Margin, 0, 0
Gui 99:Add, Edit, w%hw% h%hh%
Gui 99:Show, Center, Help
GuiControl 99:,Edit1, % help
return
!vk43::
FileToClipboard(sf)
ToolTip Файл в буфере!, MRight//2-100, MBottom//2
Sleep 1000
ToolTip
return
$^Space::
KeyWait Ctrl, T1
show:=1
SetTimer Show, % file_show
return
Show:
SetTimer Show, Off
show:=0
return
+Tab::
Send ^{vk4F}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
ControlSetText Edit1, % sf
ControlSend Button1, {Enter}
return
^vk4F::
KeyWait Ctrl, T1
KeyWait vk4F, T1
Send ^{vk4F}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
Sleep 100
WinMove ahk_class #32770, , MRight//5, MBottom//20, MRight*0.6, MBottom*0.9
ControlSetText Edit1, % sd #32770
ControlSend Button1, {Enter}
Sleep 100
ControlFocus DirectUIHWND2, ahk_class #32770
SendInput ^+6
Sleep 100
SendInput % sfn
return
+F2::
KeyWait Shift, T1
Clipboard:=""
Send ^{vk43}
ClipWait 1
e:=Errorlevel
ren:=ValidName(Trim(Clipboard))
Clipboard:=FirstUppercase(RegExReplace(ren,"[.,]+$"))
Send {F2}
WinWaitActive ahk_class #32770
If e
{
ToolTip Ничего не скопировано!, MRight//2-100, MBottom//2
Sleep 1500
ToolTip
return
}
Send {Del}^{vk56}
ControlSend Edit1, {End}
return
^Del::
^NumpadDel::
KeyWait Ctrl, T0.8
e:=Errorlevel
If !sf_old
return
If conf
{
MsgBox, 262179, , % "Удалить файл`n" sf_old " ?"
IfMsgBox Yes
goto !Home
return
}
!Home::
!End::
!PGUP::
!PGDN::
!WheelUp::
!WheelDown::
^!PGUP::
^!PGDN::
^!WheelUp::
^!WheelDown::
start:=sf_old
SplitPath start, , dir
mask:="*.cb7z;*.cbr;*.cbt;*.cbz;*.chm;*.djv*;*.epub;*.*fb2;*.mobi;*.pdb;*.pdf;*.xps"
n:=0, curr:=next:=prev:=end:=""
Loop Parse, mask, `;
{
Loop Files, % dir "\" A_LoopField
{
n+=1
If (n=1)
home:=A_LoopFileFullPath
If (A_LoopFileFullPath=start)
curr:=n, prev:=end
If (n=curr+1)
next:=A_LoopFileFullPath
end:=A_LoopFileFullPath
}
}
open:=next, text:="Последний файл папки!"
If A_ThisHotkey in !PGUP,^!PGUP,!WheelUp,^!WheelUp
open:=prev, text:="Первый файл папки!"
If (A_ThisHotkey="!Home")
open:=home, text:="Открыто!"
If (A_ThisHotkey="!End")
open:=end, text:="Открыто!"
If A_ThisHotkey~="Del"
{
WinGetActiveTitle cl_tab
Send ^{vk57}
WinWaitNotActive % cl_tab, , 2
Sleep 100
FileRecycle % start
If !e
return
}
If (!open || open=start)
{
ToolTip % text, MRight//2-100, MBottom//2
Sleep 1000
ToolTip
return
}
If A_ThisHotkey not contains Del,^!
{
WinGetActiveTitle cl_tab
Send ^{vk57}
WinWaitNotActive % cl_tab, , 2
}
WinGet sumatra, ProcessPath, A
Run "%sumatra%" "%open%"
return
^+vk53::SaveCopy(script_drive "\_Read")
SaveCopy(path)
{
global
KeyWait Ctrl, T1
KeyWait Shift, T1
KeyWait Alt, T1
FileCreateDir % path
Send ^{vk53}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
Clipboard:=RegExReplace(path,"\\$") "\" sfn
Send {Del}^{vk56}
Sleep 100
Send {Enter}
return
}
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && HoverControl()="Static1"
RButton::
KeyWait RButton, T1
WinHide pages_window
PostMessage 0x111, 434, , , ahk_class SUMATRA_PDF_FRAME
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(1) && WinState()
LButton::Send {F12}
RButton::
KeyWait RButton, T1
PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME
return
MButton::
KeyWait MButton, T1
Clipboard:=""
Send ^{vk43}
ClipWait 1
fav:=RegExReplace(Clipboard,"\s"," ")
PostMessage 0x111, 560, , , ahk_class SUMATRA_PDF_FRAME
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
If fav
ControlSetText Edit1, % fav, ahk_class #32770
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,1) && WinState()
MButton::F11
RButton::goto $^Space
WheelUp::
WheelDown::
ControlGet c1, Visible, , SysTreeView321, A
ControlGet c2, Visible, , SysTreeView322, A
If c1 || c2
Send {%A_Thishotkey%}
else
{
If (A_ThisHotkey="WheelUp")
Send {PGUP}
else
Send {PGDN}
}
return
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,0,1) && WinState()
RButton::^vk44
MButton::goto ^vk4F
+RButton::PostMessage 0x111, 419, , , ahk_class SUMATRA_PDF_FRAME
#If WinActive("ahk_class SUMATRA_PDF_FRAME") && !IsBorder(1,1,1,1)
~RButton & ~WheelDown::Send {Rbutton up}^{Tab}
~RButton & ~WheelUp::Send {Rbutton up}^+{Tab}
~RButton & ~LButton::Send {Rbutton up}!{Left}
~LButton & ~RButton::Send {LButton up}!{Right}
#If WinActive("ahk_class #32770 ahk_exe " working_file)
MButton::!Up
#IfWinActive
;--------------------------------------------------
FileToClipboard(PathToCopy,Method="copy")
{
FileCount:=0
PathLength:=0
; Count files and total string length
Loop,Parse,PathToCopy,`n,`r
{
FileCount++
PathLength+=StrLen(A_LoopField)
}
pid:=DllCall("GetCurrentProcessId","uint")
hwnd:=WinExist("ahk_pid " . pid)
; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
hPath := DllCall("GlobalAlloc","uint",0x42,"uint",20 + (PathLength + FileCount + 1) * 2,"UPtr")
pPath := DllCall("GlobalLock","UPtr",hPath)
NumPut(20,pPath+0),pPath += 16 ; DROPFILES.pFiles = offset of file list
NumPut(1,pPath+0),pPath += 4 ; fWide = 0 -->ANSI,fWide = 1 -->Unicode
Offset:=0
Loop,Parse,PathToCopy,`n,`r ; Rows are delimited by linefeeds (`r`n).
offset += StrPut(A_LoopField,pPath+offset,StrLen(A_LoopField)+1,"UTF-16") * 2
DllCall("GlobalUnlock","UPtr",hPath)
DllCall("OpenClipboard","UPtr",hwnd)
DllCall("EmptyClipboard")
DllCall("SetClipboardData","uint",0xF,"UPtr",hPath) ; 0xF = CF_HDROP
; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations
; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40)
mem := DllCall("GlobalAlloc","uint",0x42,"uint",4,"UPtr")
str := DllCall("GlobalLock","UPtr",mem)
if (Method="copy")
DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x05)
else if (Method="cut")
DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x02)
else
{
DllCall("CloseClipboard")
return
}
DllCall("GlobalUnlock","UPtr",mem)
cfFormat := DllCall("RegisterClipboardFormat","Str","Preferred DropEffect")
DllCall("SetClipboardData","uint",cfFormat,"UPtr",mem)
DllCall("CloseClipboard")
return
}
FirstUppercase(t)
{
StringLeft n, t, 1
StringTrimLeft k, t, 1
StringUpper n, n
return n . k
}
HoverControl()
{
MouseGetPos, , , , control
return control
}
IsBorder(left:="",right="",top="",bottom:="",m=6)
{
SysGet, M, Monitor
SysGet, W, MonitorWorkArea
CoordMode Mouse
MouseGetPos mx, my
return If (((left && mx<m) && (my>50) && (my<WBottom)) || (right && mx>MRight-m) || (top && my<m) || (bottom && my>MBottom-m))
}
ValidName(n,r="")
{
n:=RegExReplace(n,"(:|;|,|\.|\*|\?|\\|/|<|>|"")"," ")
n:=RegExReplace(n,"\s+"," ")
StringReplace n, n, |, -, All
If r
StringReplace n, n, % " ", % r, All
return Trim(n)
}
WinState(t="A")
{
If !WinExist(t) || (t="A" && WinActive("Program Manager"))
return
SysGet, M, Monitor
WinGetPos , , , w, h, % t
WinGet st, MinMax, % t
If (w=MRight && h=MBottom)
st:=2
return st
}