myst вчера подсказал о существовании сабжа.
А пользовались ли вы?
Я второй день нахожусь в положении той лисицы, которая с виноградом. Дело в том, что при автозамене строк, содержащих латинские буквы, компьютер виснет окончательно и бесповоротно. Таким образом, не работают простейшие скрипты, как, например, элементарный пример из AutoHotkey и русский язык – дружба навеки (http://www.script-coding.info/AutoHotkey/AhkRussian_3b.html)
::btw::by the way. ; назначаем автозамену для английской раскладки
::иец::by the way. ; назначаем автозамену для русской раскладки
Замена "иец" работает, замена "btw" - нет.
OS Windows XP, язык по умолчанию - русский, версия AutoHotkey 1.0.48.05.
Any help appreciated. :) А то я в печали даже на Сером форуме (http://www.script-coding.info/) зарегистрировался.
Пользовался давно. Хотел сокращений навешать, типа тп → т. п., нэ → н. э., днэ → до н. э. и т. д., но потом забил. У меня сейчас другая затея — predictive text entry system. :)
Вспомнил, она с Уникодом вроде не дружила.
Цитата: Квас от сентября 8, 2010, 11:42
Замена "иец" работает, замена "btw" - нет.
У меня нормально работает этот пример. Программу взял с оффсайта. Правда, я комментарии удалил.
Видно, с Уникодом его подружить проще, чем с моим компом. :( Между делом ещё разок перегрузил и решил закончить с экспериментами.
Цитата: Квас от сентября 8, 2010, 12:46
идно, с Уникодом его подружить проще, чем с моим компом. :( Между делом ещё разок перегрузил и решил закончить с экспериментами.
А Вы для чего её хотели? Для тире и пр.? Я нашёл, что такие вещи эффективнее добавить в раскладку. Если использовать для развёртки аббревиатур, то русский язык с его падежными окончаниями всё портит. :(
А если строки переставить местами, ничего не меняется?
Цитата: myst от сентября 8, 2010, 13:39
А Вы для чего её хотели? Для тире и пр.? Я нашёл, что такие вещи эффективнее добавить в раскладку.
У меня давно в голове крутились какие-то мысли об организации ввода. Пришёл к выводу, что хорошо всё-таки фактически иметь много "раскладок": если на одну навешать слишком много всего, то для получения нужного симовла может требоваться слишком много нажатий, что для набора "в промышленном масштабе" существенный недостаток. Взял кавычки слово "раскладки", потому что добавлять настоящие раскладки не хочу из-за неудобности циклического переключения.
Оказывается, все эти задачи уже решены, и поставлены новые, и они тоже решены.
И AutoHotkey мне вообще понравился, хотя я и не особенно глубоко вник. Hotstring-ам можно было бы много применений сделать: куски ТеХ-овского кода, например, автоматически вставлять, да и вместо мёртвых клавиш их использовать.
Цитата: Квас от сентября 8, 2010, 14:00
Взял кавычки слово "раскладки", потому что добавлять настоящие раскладки не хочу из-за неудобности циклического переключения.
:o Ctrl+Shift+<цифра> же!
Цитата: myst от сентября 8, 2010, 14:07
Ctrl+Shift+<цифра> же!
Это понятно. Но, во-первых, если постоянно переключать две, то дешевле цикличиски. Во-вторых, супруга ругается, когда я "ерунду всякую добавляю". :green: Кроме прочего, у меня пока нет насущной необходимости набирать большие тексты на языках с экзотическими буквами.
Цитата: myst от сентября 8, 2010, 13:43
А если строки переставить местами, ничего не меняется?
Semper idem. В том числе если одну строчку оставить. Готов спорить, что моя винда виновата.
Цитата: Квас от сентября 8, 2010, 14:12
Это понятно. Но, во-первых, если постоянно переключать две, то дешевле цикличиски.
Если постоянно переключать две, самый эффективный метод — это повесить их на шифты или контролы. Переключать не правильно, правильно включать. :)
Цитата: Квас от сентября 8, 2010, 14:25
Semper idem. В том числе если одну строчку оставить. Готов спорить, что моя винда виновата.
Убейте все процессы, которые вешают хуки, и попробуйте ещё раз.
Цитата: myst от сентября 8, 2010, 15:11
Убейте все процессы, которые вешают хуки, и попробуйте ещё раз.
Вот так задача. Если уничтожить все процессы, запущенные от имени пользователя, то можно ли быть уверенным, что оставшиеся не вешают хуков?
Цитата: Квас от сентября 8, 2010, 16:26
Вот так задача. Если уничтожить все процессы, запущенные от имени пользователя, то можно ли быть уверенным, что оставшиеся не вешают их?
Под подозрение должны попадать процессы (включая службы) установленных программ, естественно. То есть всё, что в автозагрузке, и вручную запущено в текущем сеансе. Временно отключите всё, что есть в автозагрузке (с помощью msconfig, например), выйдите из системы (Log off) и снова войдите (Log on).
Цитата: myst от сентября 8, 2010, 16:32
Временно отключите всё, что есть в автозагрузке (с помощью msconfig, например), выйдите из системы (Log off) и снова войдите (Log on).
Надеюсь, я сделал то что надо, но всё равно напрасно.
Автозамену строк я себе в ПунтоСвичере сделал, там можно выбрать, во всех раскладках переключать или только в одной.
Но чё-т мне кажется, AutoHotkey вообще не для того нужон.
В Punto вроде тоже косяк с Уникодом.
Цитата: Квас от сентября 8, 2010, 16:26
Если уничтожить все процессы, запущенные от имени пользователя, то можно ли быть уверенным, что оставшиеся не вешают хуков?
Значит дело не в конфликте хуков.
Цитата: myst В Punto вроде тоже косяк с Уникодом.
Не знаю, пока не встречал. Гречица и m-dash вставляются без проблем.
Я не помню, но почему-то тоже перестал им пользоваться...
(http://www.kolobok.us/smiles/standart/dance3.gif)(http://www.kolobok.us/smiles/standart/dance3.gif)(http://www.kolobok.us/smiles/standart/dance3.gif)
Заработало!
:P
Оказывается, было виновата английская раскладка: у меня стояла значительно модифицированная MSKLC-ом. То есть видимо из-за неладов с Уникодом в конечном итоге. Интересно, что русская была тоже минимально модифицирована: подвесил тильду.
myst, а всё неюникодное вы отбрасываете из-за практических неудобств или из-за того, что "за Уникодом будущее, всё остальное обречено"?
AutoHotkey ĭllŭm sătĭs bĕnĕ Unicod ăccĭpĭt, ŭt ĕjŭs auxĭlĭō ŏmnēs ăccĕntūs ĕffĭcĕrĕ pŏssŭm, ĭdquĕ făcĭlĭŭs quăm ăntĕā ēvenit.
Короче, достаточно дружат AutoHotkey с Уникодом, чтобы я эту фигню набрал. Например, файлы .ahk можно сохранять в UTF-8.
Лень доки курить: как сделать, чтобы правый ктрл+вверх = pageup?
На моем новом ноуте та же проблема, что эти клавиши навешаны на стрелки при нажатии fn, которая находится только с другой стороны. Хочу решить вопрос таким способом.
Как мало надо для счастья:
RControl & Up::Send {PgUp}
RControl & Down::Send {PgDn}
RControl & Left::Send {Home}
RControl & Right::Send {End}
8-)
^Up::SendInput {PgUp}
^Down::SendInput {PgDn}
Цитата: Квас от сентября 8, 2010, 23:12
Короче, достаточно дружат AutoHotkey с Уникодом, чтобы я эту фигню набрал. Например, файлы .ahk можно сохранять в UTF-8.
Значит уже дружит. Это хорошо.
Цитата: myst от сентября 9, 2010, 11:29
^Up::SendInput {PgUp}
^Down::SendInput {PgDn}
Не гут, надо тока правый ктрл. Я уже сделал. А в чем разница между Send и SendInput?
Цитата: RawonaM от сентября 9, 2010, 12:34
А в чем разница между Send и SendInput?
Я так понял, SendInput работает через SendInput(), а Send — через механизм сообщений.
Цитата: myst от сентября 8, 2010, 15:11
Если постоянно переключать две, самый эффективный метод — это повесить их на шифты или контролы. Переключать не правильно, правильно включать. :)
Это я согласен. Уже сделал. :yes:
myst, за AHK огромное спасибо! ;up: У меня теперь тоже человеческое тире есть, а также «ёлочки»! Не считая скриптика для открытия электронных книг. :=
С уникодом он не сказать чтобы дружит. Вернее сказать общаются. А дружит его модификация AutoHotkey_L (http://www.autohotkey.net/~Lexikos/AutoHotkey_L/).
Цитата: Квас от сентября 11, 2010, 20:31
myst, за AHK огромное спасибо! ;up:
Пожалуйста. :)
Цитата: Квас от сентября 11, 2010, 20:31
У меня теперь тоже человеческое тире есть, а также «ёлочки»!
Это ить в раскладку можно добавить. Могу даже готовой поделиться.
Цитата: myst от сентября 11, 2010, 21:00
Это ить в раскладку можно добавить. Могу даже готовой поделиться.
Спасибо, не стоит. :) Я собирался как-то сам добавить, да так и не собрался. Зато у меня «ёлочки» — smart, а в раскладке без второй клавиши, наверно, не обойтись.
Кстати, апостроф и закрывающая кавычка - это не одно и то же?
Цитата: Квас от сентября 11, 2010, 21:10
Кстати, апостроф и закрывающая кавычка - это не одно и то же?
Нет вроде.
U+0027 APOSTROPHE vs. U+2019 RIGHT SINGLE QUOTATION MARK
Цитата: Bhudh от сентября 11, 2010, 23:41
U+0027 APOSTROPHE vs. U+2019 RIGHT SINGLE QUOTATION MARK
Это я видал. U+0027 — это, очевидно, в точности то, что должна производить клавиша «апостроф» английской раскладки. Но этот символ бывает не очень-то похож на запятую. В то же время определённо я видел книги, в которых апостроф и закрывающаяся кавычка имели одинаковую форму запятой.
У меня недоверие к Basic Latin. В конце концов, там в качестве кавычек указывается единственно двойная открывающая и она же закрывающая. В нормальных книгах так не делается.
В уникоде до фига разных кавычек. Одинарные, двойные, парные, непарные, угловые, жирные...
Цитата: Квас от сентября 11, 2010, 23:49
Это я видал. U+0027 — это, очевидно, в точности то, что должна производить клавиша «апостроф» английской раскладки. Но этот символ бывает не очень-то похож на запятую.
Цитата: http://en.wikipedia.org/wiki/Apostroph#Computing
There are several types of apostrophe character in Unicode:
( ' ) Vertical typewriter apostrophe (Unicode name apostrophe or apostrophe-quote), U+0027, inherited from ASCII.
( ' ) Punctuation apostrophe (or typographic apostrophe; right single quotation mark; single comma quotation mark), U+2019. Serves as both an apostrophe and closing single quotation mark. This is the preferred character to use for apostrophe according to the Unicode standard.[61]
( ʼ ) Letter apostrophe (or modifier letter apostrophe), U+02BC. This is preferred when the apostrophe is not considered punctuation that separates letters, but a letter in its own right. Examples occur in Breton cʼh, the Cyrillic Azerbaijani alphabet, or in some transliterations such as the transliterated Arabic glottal stop, hamza, or transliterated Cyrillic soft sign. As the letter apostrophe is seldom used in practice, the Unicode standard cautions that one should never assume text is coded thus. The letter apostrophe is rendered identically to the punctuation apostrophe in the Unicode code charts.[62]
( ʻ ) The Hawaiian glottal stop, the ʻokina, has its own Unicode character, U+02BB.
( ˮ ) Nenets languages Double letter apostrophe (Unicode name modifier letter double apostrophe), U+02EE.
( ՚ ) Armenian apostrophe, U+055A.
А ведь Вы правы. Действительно правая одиночная кавычка.
Цитата: Квас от сентября 11, 2010, 21:10
Кстати, апостроф и закрывающая кавычка - это не одно и то же?
Да. Дурь, но это так.
Цитата: Bhudh от сентября 12, 2010, 00:10
В уникоде до фига разных кавычек.
В уникоде недостаточное количество разных кавычек.
Цитата: Квас от сентября 11, 2010, 20:31
А дружит его модификация AutoHotkey_L.
А вот за "_L" вам спасибо, Квас!
Я ведь AHK не стал использовать именно из-за неуникодности.
Je vous en prie ! :UU:
Наконец, скачал, установил, запустил. Предложила создать пример скрипта. Отказался. Закрылась. Запустил снова, согласился, создала, закрылась. Запускаю — ругается, что, дескать, #z::Run www.autohotkey.com — негодный скрипт, и отказывается работать. Выясняется, что ей обязательно нужна английская раскладка по умолчанию. Бред какой-то, ей-богу!
Да, буквы в горячих клавишах — это самая неудобная вещь. Чтобы сделать независящие от раскладки сочетания, используются сканкоды или виртуальные коды. Не вдаваясь в то, чем они отличаются, я имею обыкновение пользоваться сканкодами, в чём помогает следующий немудрёный скрипт:
SetTitleMatchMode, 2
return
#IfWinActive, SciTE4AutoHotkey
^+sc01::SendInput, sc01
^+sc02::SendInput, sc02
^+sc03::SendInput, sc03
^+sc04::SendInput, sc04
^+sc05::SendInput, sc05
^+sc06::SendInput, sc06
^+sc07::SendInput, sc07
^+sc08::SendInput, sc08
^+sc09::SendInput, sc09
^+sc0A::SendInput, sc0A
^+sc0B::SendInput, sc0B
^+sc0C::SendInput, sc0C
^+sc0D::SendInput, sc0D
^+sc0E::SendInput, sc0E
^+sc0F::SendInput, sc0F
^+sc10::SendInput, sc10
^+sc11::SendInput, sc11
^+sc12::SendInput, sc12
^+sc13::SendInput, sc13
^+sc14::SendInput, sc14
^+sc15::SendInput, sc15
^+sc16::SendInput, sc16
^+sc17::SendInput, sc17
^+sc18::SendInput, sc18
^+sc19::SendInput, sc19
^+sc1A::SendInput, sc1A
^+sc1B::SendInput, sc1B
^+sc1C::SendInput, sc1C
^+sc1D::SendInput, sc1D
^+sc1E::SendInput, sc1E
^+sc1F::SendInput, sc1F
^+sc20::SendInput, sc20
^+sc21::SendInput, sc21
^+sc22::SendInput, sc22
^+sc23::SendInput, sc23
^+sc24::SendInput, sc24
^+sc25::SendInput, sc25
^+sc26::SendInput, sc26
^+sc27::SendInput, sc27
^+sc28::SendInput, sc28
^+sc29::SendInput, sc29
^+sc2A::SendInput, sc2A
^+sc2B::SendInput, sc2B
^+sc2C::SendInput, sc2C
^+sc2D::SendInput, sc2D
^+sc2E::SendInput, sc2E
^+sc2F::SendInput, sc2F
^+sc30::SendInput, sc30
^+sc31::SendInput, sc31
^+sc32::SendInput, sc32
^+sc33::SendInput, sc33
^+sc34::SendInput, sc34
^+sc35::SendInput, sc35
^+sc36::SendInput, sc36
^+sc37::SendInput, sc37
^+sc38::SendInput, sc38
^+sc39::SendInput, sc39
^+sc3A::SendInput, sc3A
^+sc3B::SendInput, sc3B
^+sc3C::SendInput, sc3C
^+sc3D::SendInput, sc3D
^+sc3E::SendInput, sc3E
^+sc3F::SendInput, sc3F
^+sc40::SendInput, sc40
^+sc41::SendInput, sc41
^+sc42::SendInput, sc42
^+sc43::SendInput, sc43
^+sc44::SendInput, sc44
^+sc45::SendInput, sc45
^+sc46::SendInput, sc46
^+sc47::SendInput, sc47
^+sc48::SendInput, sc48
^+sc49::SendInput, sc49
^+sc4A::SendInput, sc4A
^+sc4B::SendInput, sc4B
^+sc4C::SendInput, sc4C
^+sc4D::SendInput, sc4D
^+sc4E::SendInput, sc4E
^+sc4F::SendInput, sc4F
^+sc50::SendInput, sc50
^+sc51::SendInput, sc51
^+sc52::SendInput, sc52
^+sc53::SendInput, sc53
^+sc54::SendInput, sc54
^+sc55::SendInput, sc55
^+sc56::SendInput, sc56
^+sc57::SendInput, sc57
^+sc58::SendInput, sc58
^+sc59::SendInput, sc59
^+sc5A::SendInput, sc5A
^+sc5B::SendInput, sc5B
^+sc5C::SendInput, sc5C
^+sc5D::SendInput, sc5D
^+sc5E::SendInput, sc5E
^+sc5F::SendInput, sc5F
^+sc60::SendInput, sc60
^+sc61::SendInput, sc61
^+sc62::SendInput, sc62
^+sc63::SendInput, sc63
^+sc64::SendInput, sc64
^+sc65::SendInput, sc65
^+sc66::SendInput, sc66
^+sc67::SendInput, sc67
^+sc68::SendInput, sc68
^+sc69::SendInput, sc69
^+sc6A::SendInput, sc6A
^+sc6B::SendInput, sc6B
^+sc6C::SendInput, sc6C
^+sc6D::SendInput, sc6D
^+sc6E::SendInput, sc6E
^+sc6F::SendInput, sc6F
^+sc70::SendInput, sc70
^+sc71::SendInput, sc71
^+sc72::SendInput, sc72
^+sc73::SendInput, sc73
^+sc74::SendInput, sc74
^+sc75::SendInput, sc75
^+sc76::SendInput, sc76
^+sc77::SendInput, sc77
^+sc78::SendInput, sc78
^+sc79::SendInput, sc79
^+sc7A::SendInput, sc7A
^+sc7B::SendInput, sc7B
^+sc7C::SendInput, sc7C
^+sc7D::SendInput, sc7D
^+sc7E::SendInput, sc7E
^+sc7F::SendInput, sc7F
^+sc80::SendInput, sc80
^+sc81::SendInput, sc81
^+sc82::SendInput, sc82
^+sc83::SendInput, sc83
^+sc84::SendInput, sc84
^+sc85::SendInput, sc85
^+sc86::SendInput, sc86
^+sc87::SendInput, sc87
^+sc88::SendInput, sc88
^+sc89::SendInput, sc89
^+sc8A::SendInput, sc8A
^+sc8B::SendInput, sc8B
^+sc8C::SendInput, sc8C
^+sc8D::SendInput, sc8D
^+sc8E::SendInput, sc8E
^+sc8F::SendInput, sc8F
^+sc90::SendInput, sc90
^+sc91::SendInput, sc91
^+sc92::SendInput, sc92
^+sc93::SendInput, sc93
^+sc94::SendInput, sc94
^+sc95::SendInput, sc95
^+sc96::SendInput, sc96
^+sc97::SendInput, sc97
^+sc98::SendInput, sc98
^+sc99::SendInput, sc99
^+sc9A::SendInput, sc9A
^+sc9B::SendInput, sc9B
^+sc9C::SendInput, sc9C
^+sc9D::SendInput, sc9D
^+sc9E::SendInput, sc9E
^+sc9F::SendInput, sc9F
^+scA0::SendInput, scA0
^+scA1::SendInput, scA1
^+scA2::SendInput, scA2
^+scA3::SendInput, scA3
^+scA4::SendInput, scA4
^+scA5::SendInput, scA5
^+scA6::SendInput, scA6
В окне Scite4Autohotkey сочетание Ctrl + Shift + клавиша вводит сканкод.
Ваш скрипт должен выглядеть следующим образом:
#sc2C::Run, www.autohotkey.com ; Win + Z
В автозаменах и команде SendInput сканкоды не нужны за одним исключением: если SendInput отправляет сочетание клавиш (например, Ctrl + C, Ctrl + V), то должны стоять сканкоды в фигурных скобках (соответственно ^{sc2E}, ^{sc2F}).
Да можно было бы и без скан-кодов сделать две записи: на Z и на Я. Но почему так сделано, что оно вообще не запускается? :uzhos:
А если так, то зачем именно этот скрипт сделали примером по умолчанию? :wall:
Цитата: O от января 25, 2012, 11:44
Да можно было бы и без скан-кодов сделать две записи: на Z и на Я. Но почему так сделано, что оно вообще не запускается? :uzhos:
Определяется не раскладкой активного окна, а раскладкой (невидимого) окна самого скрипта. В принципе, у вас будет работать просто ^я, но понятно, что такие скрипты не будут переносимы на компьютеры, где по умолчанию английская раскладка.
А не работает потому, что горячие клавиши привязываются именно к клавишам, а не к символам. То есть в определении горячей клавиши должно фигурировать имя клавиши, и часто так и делается: F1, Esc и т. д. Просто имена буквоцифровых клавиш совпадают с соответствующей буквой/цифрой. При компиляции AHK ищет клавишу с именем z, не находит и ругается.
Второй скрипт-образец должен лишь активизировать Блокнот, если тот уже запущен. На самом деле, запускает всё новые и новые окна Блокнота.
^!n::
IfWinExist Untitled - Notepad
WinActivate
else
Run Notepad
return
Замена на IfWinExist Безымянный - Блокнот
не изменяет поведение скрипта.
В начале #IfWinExist решётка стоит. Потом идёт название окна, которое должно существовать (видимо, у вас должно быть по-русски).
Чтобы не указывать полное имя, в исполняемой части скрипта (в начале то есть) можно поставить
SetTitleMatchMode, 2
(я так обычно делаю). Исполняемая часть отделяется от горячих клавиш и т. п. строчкой
return.
::b::d работает, но ::b::в вставляет квадрат (replacement character) :D
Квас, большое спасибо за Ваши комментарии! Буду думать, на что бы мне смогла сгодиться эта бага фича. 8-)
Цитата: Квас от января 25, 2012, 12:28
В начале #IfWinExist решётка стоит.
Не-а. Оно само сгенерилось именно так, без решётки. Если её поставить, то ругается на то, что элс без иф.
Не за что. Мне кажется, я уже всему ЛФ голову забил этим AHK, так что теперь положение обязывает. :)
Горячая строка ваша должна нормально работать по идее. Файл в utf-8?
Прошу прощения, невнимательно прочитал. Вообще, решётками начинаются команды, устанавливающие опции для горячих строк и клавиш. Здесь просто управляющая команда, решётки действительно не нужны.
У меня заработало, когда поставил SetTitleMatchMode, 2 и в названии окна оставил только «Блокнот». Очевидно, потому что там не дефис, а тире: —. Тире я выловил с помощью Window Spy, который вызывается из контекстного меню к любому скрипту.
Цитата: Квас от января 25, 2012, 12:40
Горячая строка ваша должна нормально работать по идее. Файл в utf-8?
Да, в utf-8 заработало. Но пришлось менять кодировку в Блокноте, а то в том-редакторе-с-длинным-названием смена кодировки в окне редактирования не влияла на то, в каком формате он сохранял файл.
Цитата: Квас от января 25, 2012, 12:51
У меня заработало, когда поставил SetTitleMatchMode, 2 и в названии окна оставил только «Блокнот». Очевидно, потому что там не дефис, а тире: —. Тире я выловил с помощью Window Spy, который вызывается из контекстного меню к любому скрипту.
Спасибо. Но пока практических применений AHK для себя я не нахожу.
Цитата: O от января 25, 2012, 13:02
Но пока практических применений AHK для себя я не нахожу.
Точнее, практические цели есть, но пока я справляюсь так, что мне проще запомнить код символа и вводить его, чем разбираться с AHK. Короче, процесс обещает затянуться. :)
Цитата: O от января 25, 2012, 13:00
в том-редакторе-с-длинным-названием смена кодировки в окне редактирования не влияло на то, в каком формате он сохраняет файл.
Да, у Scite бывают какие-то глюки с кодировками.
В принципе, пользоваться можно любым текстовым редактором, а подсветкой синтаксиса часто люди озаботились уже до нас.
Цитата: O от января 25, 2012, 13:02
Но пока практических применений AHK для себя я не нахожу.
Можно просто полистать туториал и ждать, когда появятся задачи. Если приходится работать с документами, то самые обыкновенные автозамены могут оказаться очень полезными. А так — всякая мелкая и не очень автоматизация, при том что AHK умеет работать с окнами, запускать программы, общаться с Windows, позволяет легко программировать несложные окошки. Например, удобное переключение раскладок, большое число квазибуферов, ввод всяких разных символов. При необходимости скачать энное число файлов можно воспользоваться скриптом на несколько строк. Или, например, можно написать функцию, которая звёздочки заменяет на теги
, и применять её к содержимому буфера обмена... Короче говоря, со временем задачи обязательно появятся.
Чтобы не быть голословным, вот кусок кода из постоянно работающего у меня скрипта. Включение раскладок по Ctrl и ассоциирование с каждой клавишей «буфера» (запись в буфер по Ctrl+Insert, <клавиша>; вставка из буфера — Shift+Insert, <клавиша>.
; Включение раскладки по Ctrl:
~LControl::SetLayout("English") ; по левому - английская
~RControl::SetLayout("Russian_mash") ; по правому - русская
; Чтобы клавиши сохранили обычную функциональность, нужно хотя бы раз их использовать в качестве префиксов.
LControl & Ins::
Input, BufferLabel, L1
SendInput, ^{sc2E}
Buffer%BufferLabel% := Clipboard
Return
RControl & Ins::
Input, BufferLabel, L1
SendInput, ^{sc2E}
Buffer%BufferLabel% := Clipboard
Return
+Ins::
Input, BufferLabel, L1
Clipboard := Buffer%BufferLabel%
SendInput, ^{sc2F}
Return
GetActiveKeyboardLayout()
{
WinGet, WinID,, A
ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
Return, InputLocaleID
}
SetLayout(Layout)
; The function accepts hexadecimal layout code or one of specific strings as its argument.
{
ControlGetFocus, C, A
If (Layout = "English")
PostMessage, 0x50,, 0x4090409, %C%, A
Else If (Layout = "Russian")
PostMessage, 0x50,, 0x4190419, %C%, A
Else If (Layout = "Russian_mash")
PostMessage, 0x50,, 0xf0080419, %C%, A
Else
PostMessage, 0x50,, %Layout%, %C%, A
}
Цитата: O от января 25, 2012, 13:16
Цитата: O от января 25, 2012, 13:02Но пока практических применений AHK для себя я не нахожу.
Точнее, практические цели есть, но пока я справляюсь так, что мне проще запомнить код символа и вводить его, чем разбираться с AHK. Короче, процесс обещает затянуться. :)
Ну, фазу обучения никуда не денешь. :) Но по идее такие основные вещи как автозамены и горячие клавиши — это несложно. AHK создавался не для программистов.
Квасе, у меня к Вам вопрос. Посмотрел AutoHotkey. В принципе понравилось.
Вопрос такой. Хочу себе сымитировать Acme, но в Windows, для всей системы и с горячими клавишами вместо мыши. ☺ Хотя может я и мышь потом захочу, не знаю.
Можно ли так сделать:
1. При нажатии на горячую клавишу содержание буфера обмена рассматривается как команда: первое слово—название, остальное—как аргументы к ней; всё это запускается. Например, ls C:\dir запускает программу ls.exe (из системной папки) с аргументом C:\dir
2. Берётся текст из текущего выделения текущей программы (можна путём банальной посылки Ctrl-X, не обязательно 100% универсально), и этот текст передаётся запущенной программе в stdin; сам текст удаляется.
3. То, что команда пишет в stdout, выводится в программу (можно путём помещения в буфер и посылки в StdOut)
4. Если команда зависла, была бы неплоха возможность убиения её по какой-нибудь ещё горячей клавише.
???
В справке не нашёл ничего для работы с pipe'ами. Вижу такие варианты:
- Использовать DllCall и CreateProcess... Получаем все прелести WinAPI. :uzhos: Зато гибко...
- Записывать содержание «stdin»'а в файл (например, C:\temp\in.txt), а потом запускать cmd /c "нашаКоманда <C:\temp\in.txt >C:\temp\out.txt"[/tt] и вставлять в программу содержание файла out.txt :-\ (вместо cmd можно использовать собственную программу на C, если возникнут вопросы с парсингом аргументов).
В любом случае, хотелось бы сделать это относительно переносимым (только WinNT и уникод, 9x не надо): т.е. не забивать жёстко пути к C:\temp\in.txt, а брать системную временную папку.
Dmi3, вы форумом немножко не ошиблись? 8-)
Коллекция скриптов и идей » AutoHotkey (http://forum.script-coding.com/viewforum.php?id=2)
AutoHotkey Community. Scripts & Functions (http://www.autohotkey.com/forum/forum-2.html)
Цитата: Ο от января 29, 2012, 13:55
Dmi3, вы форумом немножко не ошиблись?
Возможно, Demetrius предположил, что Квас уже сталкивался с такой задачей, и ему несложно будет подсказать.
Цитата: mnashe от января 29, 2012, 14:24
Цитата: Ο от января 29, 2012, 13:55
Dmi3, вы форумом немножко не ошиблись?
Возможно, Demetrius предположил, что Квас уже сталкивался с такой задачей, и ему несложно будет подсказать.
Спасибо, Кэп!
Так и в чём тогда проблема?
По-моему, это нормально — спросить у товарищей, а уж если не знают — искать самому. Лама ло?
Цитата: Dmi3 от января 28, 2012, 20:13
1. При нажатии на горячую клавишу содержание буфера обмена рассматривается как команда: первое слово—название, остальное—как аргументы к ней; всё это запускается. Например, ls C:\dir запускает программу ls.exe (из системной папки) с аргументом C:\dir
Это в принципе легко. Если строка представляет собой такую команду, которую можно дать в командную строку, то достаточно просто
Run, %Clipboard%
В более сложном случае можно распарсить Clipboard как обычную строку. Я что-то не понял, в какой «системной папке» должна искаться программа, а то мог бы и код написать.
Остальные надо посоображать.
Цитата: Dmi3 от января 28, 2012, 20:13
т.е. не забивать жёстко пути к C:\temp\in.txt, а брать системную временную папку.
В AHK много стандартных переменных, для доступа к временной папке можно использовать A_Temp.
Кстати, буржуйский форум об AHK я иногда читаю, а наш почему-то никогда. Так что лично я очень доволен, что такие интересные обсуждения можно вести не уходя с ЛФ. :)
Цитата: Dmi3 от января 28, 2012, 20:13
2. Берётся текст из текущего выделения текущей программы (можна путём банальной посылки Ctrl-X, не обязательно 100% универсально), и этот текст передаётся запущенной программе в stdin; сам текст удаляется.
3. То, что команда пишет в stdout, выводится в программу (можно путём помещения в буфер и посылки в StdOut)
4. Если команда зависла, была бы неплоха возможность убиения её по какой-нибудь ещё горячей клавише.
Видимо, действительно самый простой метод — работать с файлами. (Если что, может оказаться полезной команда FileRead). Вот ещё какая-то штука нашлась:
http://www.autohotkey.com/forum/topic8606.html
Но я это уже плохо понимаю.
Для убиения можно пользоваться командами WinKill и Process.
Цитата: mnashe от января 29, 2012, 15:03
Так и в чём тогда проблема?
У вас проблема? Вы хотите об этом поговорить? ;)
有几个问题1) Почему-то скрипт не хочет заменять y2 на ý (без комбайнов), хотя без проблем заменяет Y2 на Ý. Пришлось поставить комбайн: ý — так работает.
2) ::T//::Þ и ::t//::þ ни в какую не хотят работать. Результат — как будто я ничего не набирал.
3) Хотел настроить ударение в русском языке (гласная + два → гласная + ударение комбайном), но в этом случае комбайн не набирается (из скрипта пока убрал).
!sc1F::Suspend ; Alt+S suspend hotkeys
!sc10::ExitApp ; Alt+Q exit
#Hotstring ?*C
::````::ˈ
::~~::ˌ
::::::ː
::''::ʼ
::'/::'
::""::"
::"/::"
::;;::«
::;/::»
::->::→
::<-::←
::<>::↔
::--::—
::=/::≠
::=~::≈
::\2::''
::\3::'''
::O=::Ő
::o=::ő
::U=::Ű
::u=::ű
::A//::Æ
::a//::æ
::D//::Đ
::d//::đ
::H//::Ħ
::h//::ħ
::T//::Þ
::t//::þ
::L//::Ł
::l//::ł
::N//::Ŋ
::n//::ŋ
::O//::Ø
::o//::ø
::I//::İ
::i//::ı
::A()::Å
::a()::å
::U()::Ů
::u()::ů
::A~::Ã
::a~::ã
::E~::Ẽ
::e~::ẽ
::I~::Ĩ
::i~::ĩ
::O~::Õ
::o~::õ
::U~::Ũ
::u~::ũ
::Y~::Ỹ
::y~::ỹ
::N~::Ñ
::n~::ñ
::A1::Ā
::a1::ā
::E1::Ē
::e1::ē
::I1::Ī
::i1::ī
::O1::Ō
::o1::ō
::U1::Ū
::u1::ū
::V1::Ǖ
::v1::ǖ
::Y1::Ȳ
::y1::ȳ
::A2::Á
::a2::á
::E2::É
::e2::é
::I2::Í
::i2::í
::O2::Ó
::o2::ó
::U2::Ú
::u2::ú
::V2::Ǘ
::v2::ǘ
::Y2::Ý
::y2::ý
::C2::Ć
::c2::ć
::N2::Ń
::n2::ń
::S2::Ś
::s2::ś
::Z2::Ź
::z2::ź
::A3::Ǎ
::a3::ǎ
::E3::Ě
::e3::ě
::I3::Ǐ
::i3::ǐ
::O3::Ǒ
::o3::ǒ
::U3::Ǔ
::u3::ǔ
::V3::ǚ
::v3::ǚ
::C3::Č
::c3::č
::D3::Ď
::d3::ď
::G3::Ǧ
::g3::ǧ
::N3::Ň
::n3::ň
::R3::Ř
::r3::ř
::S3::Š
::s3::š
::T3::Ť
::t3::ť
::Z3::Ž
::z3::ž
::K3::Ǩ
::k3::ǩ
::L3::Ľ
::l3::ľ
::A4::À
::a4::à
::E4::È
::e4::è
::I4::Ì
::i4::ì
::O4::Ò
::o4::ò
::U4::Ù
::u4::ù
::V4::Ǜ
::v4::ǜ
::Y4::Ỳ
::y4::ỳ
::A5::Ä
::a5::ä
::E5::Ë
::e5::ë
::I5::Ï
::i5::ï
::O5::Ö
::o5::ö
::U5::Ü
::u5::ü
::V5::Ü
::v5::ü
::Y5::Ÿ
::y5::ÿ
::A6::Â
::a6::â
::E6::Ê
::e6::ê
::I6::Î
::i6::î
::O6::Ô
::o6::ô
::U6::Û
::u6::û
::Y6::Ŷ
::y6::ŷ
::W6::Ŵ
::w6::ŵ
::C6::Ĉ
::c6::ĉ
::G6::Ĝ
::g6::ĝ
::H6::Ĥ
::h6::ĥ
::J6::Ĵ
::j6::ĵ
::S6::Ŝ
::s6::ŝ
::A7::Ą
::a7::ą
::E7::Ę
::e7::ę
::I7::Į
::i7::į
::O7::Ǫ
::o7::ǫ
::U7::Ų
::u7::ų
::C7::Ç
::c7::ç
::D7::Ḑ
::d7::ḑ
::G7::Ģ
::g7::ģ
::K7::Ķ
::k7::ķ
::L7::Ļ
::l7::ļ
::N7::Ņ
::n7::ņ
::R7::Ŗ
::r7::ŗ
::S7::Ş
::s7::ş
::T7::Ţ
::t7::ţ
::a{::ɑ
::a}::ɐ
::A{::ʌ
::o{::ɔ
::o}::ɒ
::O{::ɶ
::e{::ɛ
::e}::ə
::E{::ɜ
::E}::ɚ
::y{::ʏ
::y}::ɤ
::i{::ɪ
::i}::ɨ
::I{::ɿ
::I}::ʅ
::u{::ʊ
::u}::ɯ
::U{::ʉ
::b}::ɓ
::d{::ð
::d}::ɗ
::g{::ɣ
::g}::ɠ
::G{::ɢ
::t{::θ
::f{::ɸ
::v{::ʋ
::w{::ɥ
::w}::ʍ
::n{::ɲ
::n}::ɴ
::s{::ʃ
::s}::ʂ
::z{::ʒ
::z}::ʐ
::Z{::ʣ
::j{::ʤ
::j}::ʥ
::J{::ɟ
::J}::ʄ
::c{::ʧ
::c}::ʨ
::C{::ʦ
::x{::ɕ
::x}::ʑ
::l{::ɬ
::l}::ɮ
::L{::ɫ
::L}::λ
::r{::ɾ
::r}::ɹ
::R{::ʀ
::R}::ʁ
::h{::χ
::h}::ɦ
::H{::ɧ
::H}::ʜ
::|5::˥
::|4::˦
::|3::˧
::|2::˨
::|1::˩
::|0::̥
::|~::̃
::|(::͡
::|)::͜
::aLL::ʔ
::aYY::ʕ
::h~::ʰ
::H~::ʱ
::j~::ʲ
:C1?0:спс::спасибо
:C1?0:ятл::я тебя люблю
:C1?0:спн::спокойной ночи
:?0:мБ::мегабайт
:?0:кБ::килобайт
:C1?0:кг::килограмм
:C1?0:гб::гигабайт
:C1:гигов::гигабайт
:C1:итд::и т.д.
:C1:итп::и т.п.
:?0:мб::может быть
:C1:предлоеж::предложе
:C1:предлоеже::предложе
:C1?0:бп::без проблем
:C1?0:ща ::сейчас{Space}
:C1?0:ща.::сейчас.
:C1?0:ща!::сейчас{!}
:C1?0:ща?::сейчас?
:C1?0:ща)::сейчас)
:C1?0:щас::сейчас
:C1?0:хз::без понятия
:C1?0:нзчт::не за что
:C1:я2::язык
:C1:лгв2::лингвистик
:C1:универ::университет
:C1:иерог::иероглиф
:C1:ноут::ноутбук
:C1?0:норм ::нормально
:C1?0:прив::привет
:C1?0:б\::без
:C1?0:сесе::谢谢
Нужно больше информации. :??? У меня всё работает (в том числе я заменил ý с комбайном на комбинированный).
Что касается последних автозамен, то они, наверно, работают не совсем так. Например, не получается набрать «привет» с большой буквы. Я бы просто отключил перед ними все включенные ранее опции путём #Hotstring C0?0... На самом деле стандартное ::<бла>::<бла> вполне естественно функционирует.
Цитата: Квас от июля 7, 2012, 12:14
Нужно больше информации. :??? У меня всё работает (в том числе я заменил ý с комбайном на комбинированный).
гм...
а что еще сообщить?
Цитата: Квас от июля 7, 2012, 12:14
Например, не получается набрать «привет» с большой буквы.
мне и не надо :) дело в том, что при переписке я вообще не ставлю большие буквы, а, например, в ворде автоматический вводу заглавных букв в начале предложения у меня включен.
Цитата: Квас от июля 7, 2012, 12:14
На самом деле стандартное ::<бла>::<бла> вполне естественно функционирует.
Не всегда так, как нужно.
Может, интерференция с другими скриптами?
Цитата: Квас от июля 7, 2012, 12:24
Может, интерференция с другими скриптами?
У меня других нет.
А торн не хотел набираться даже тогда, когда он был просто вставлен в мою раскладку клавиатуры.
Может в редакторе дело? А если просто скопипастить из таблицы символов?
Цитата: Квас от июля 7, 2012, 12:39
А если просто скопипастить из таблицы символов?
Ну дык я так и делал.
И везде такой эффект? В разных редакторах, в браузере?
Цитата: Квас от июля 7, 2012, 12:42
И везде такой эффект?
сейчас проверил — вроде только в ворде. В опере торн вводится нормально Þþ, ý тоже без проблем. А вот кириллицу пока не проверю, нужно ее загонять туда.
Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?
Цитата: Juuurgen от июля 10, 2012, 19:25
Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?
Если речь о том, чтобы горячие клавиши/горячие строки не работали, то этого можно достичь с помощью #If:
#If <условие>
Все нижеследующие горячие клавиши и строки будут работать только при выполнении условия. Это распространяется на всё, что под данной строкой вплоть до нового #If/#IfWinActive/...
В данном случае можно воспользоваться функцией
GetActiveKeyboardLayout()
{
WinGet, WinID,, A
ThreadID := DllCall("GetWindowThreadProcessId", UInt, WinID, UInt, 0)
InputLocaleID:=DllCall("GetKeyboardLayout", UInt, ThreadID, UInt)
return, InputLocaleID
}
Она возвращает код активной раскладки. Функцию можно описать в любом месте скрипта, обычно их описывают в начале. Тогда условие будет иметь вид
#If GetActiveKeyboardLayout() = <код китайской раскладки>
А чтобы узнать код китайской раскладки, можно воспользоваться той же функцией:
F12::
SetFormat, Integer, h
MsgBox % GetActiveKeyboardLayout()
return
Кстати говоря, с помощью AHK очень удобно переключать раскладки. Я для этого пользуюсь такой функцией:
SetLayout(Layout)
; The function accepts hexadecimal layout code
; or one of specific strings as its argument.
{
ControlGetFocus, C, A
If (Layout = "English")
{
PostMessage, 0x50,, 0x4090409, %C%, A
}
Else If (Layout = "Russian")
PostMessage, 0x50,, 0x4190419, %C%, A
Else If (Layout = "Russian_mash")
PostMessage, 0x50,, 0xf0080419, %C%, A
Else
PostMessage, 0x50,, %Layout%, %C%, A
}
То есть для включения английской раскладки я пишу в скриптах SetLayout("English"). По образу и подобию туда можно и других строчек насовать:
Else If (Layout = "Chinese")
PostMessage, 0x50,, <код китайской>, %C%, A
Цитата: Juuurgen от июля 10, 2012, 19:25
Можно ли сделать так, чтобы при смене раскалдки на китайскую, скрипт автоматически становился на паузу, а при смене с китайской на любую другую снова запускался?
1. Можно переключать на китайскую самим AHK, тогда параллельно переключению раскладки ставить на паузу автозамены.
2. Можно ставить на паузу по тому же сочетанию клавиш, которым переключаешь.
3. Можно периодически опрашивать, но это нерационально.
Нужные функции можно выдрать из моего скрипта:
;Switch the active window's keyboard layout/language:
LangSwitch(layout)
{
ControlGetFocus,ctl,A
SendMessage, 0x50, 0, layout, %ctl%, A ;WM_INPUTLANGCHANGEREQUEST
}
GetInputLocaleId()
{
SetFormat, Integer, H
WinGet, WinId,, A
ThreadId:=DllCall("GetWindowThreadProcessId", UInt, WinId, UInt, 0)
Return DllCall("GetKeyboardLayout", UInt, ThreadId, UInt)
}
#1::LangSwitch(0x04090409) ; to English
#2::
LangSwitch(0xF0C00419) ; to Russian
sleep 100
LangSwitch(0xF0C00419)
return
#3::
LangSwitch(0xF0C20419) ; to Russian
sleep 100
LangSwitch(0xF0C20419)
return
#4::LangSwitch(0xF0C1040D) ; to Hebrew
^+`::
InputLocaleId:=GetInputLocaleId()
MsgBox, %InputLocaleId%
^CapsLock::
If (GetInputLocaleId()==0x04090409)
{
LangSwitch(0xF0C00419)
sleep 100
LangSwitch(0xF0C00419)
return
}
LangSwitch(0x04090409)
return
Цитата: Квас от июля 10, 2012, 19:48
Если речь о том, чтобы горячие клавиши/горячие строки не работали
да :)
Цитата: Квас от июля 10, 2012, 19:48
Она возвращает код активной раскладки. Функцию можно описать в любом месте скрипта, обычно их описывают в начале. Тогда условие будет иметь вид
#If GetActiveKeyboardLayout() = <код китайской раскладки>
т.е. мне нужно указать те раскладки, в которых должен работать скрипт?
Цитата: Квас от июля 10, 2012, 19:48
А чтобы узнать код китайской раскладки, можно воспользоваться той же функцией:
так, вроде все получилось, настроил, чтоб скрипт работал только в английской и русской
Цитата: Квас от июля 10, 2012, 19:48
Кстати говоря, с помощью AHK очень удобно переключать раскладки. Я для этого пользуюсь такой функцией:
стоп, но ведь если у меня скрипт будет отключаться в китайской раскладке, я не смогу ее переключить на другую с помощью AHK?
Цитата: Квас от июля 10, 2012, 19:48
Else
PostMessage, 0x50,, %Layout%, %C%, A
зачем тут эта строчка?
Цитата: Квас от июля 10, 2012, 19:48
If (Layout = "English")
{
PostMessage, 0x50,, 0x4090409, %C%, A
}
Else If (Layout = "Russian")
{
PostMessage, 0x50,, 0x4190419, %C%, A
}
тут не нужны фигурные скобки?
Цитата: Juuurgen от июля 10, 2012, 20:08
т.е. мне нужно указать те раскладки, в которых должен работать скрипт?
Пардон, имелось в виду Get...() <> код раскладки.
Цитата: Juuurgen от июля 10, 2012, 20:08
стоп, но ведь если у меня скрипт будет отключаться в китайской раскладке, я не смогу ее переключить на другую с помощью AHK?
Ну, это просто офтоп был. В любом случае, #If действует только на то, что под ним. То есть переключалки можно сделать выше.
Цитата: Juuurgen от июля 10, 2012, 20:11
тут не нужны фигурные скобки?
Фигурные скобки можно не ставить, если после If идёт одна строчка.
Цитата: Juuurgen от июля 10, 2012, 20:11
ЦитироватьElse
PostMessage, 0x50,, %Layout%, %C%, A
зачем тут эта строчка?
Строки "English", "Russian" usw. — это просто для своего удобства. А так всегда можно засунуть аргументом стандартный код раскладки типа 0x... — сработает как раз эта строчка функции.
Цитата: Квас от июля 10, 2012, 20:18
Пардон, имелось в виду Get...() <> код раскладки.
ща уже ниче не понял
#If GetActiveKeyboardLayout() =
обозначает раскладку, в которой работает скрипт?
как их написать несколько (в частности русский и английский)? если я пишу две такие строчки, то скрипт работает только в последней
Цитата: Juuurgen от июля 10, 2012, 20:26
если я пишу две такие строчки, то скрипт работает только в последней
хотя стоп, у меня ж не пересекаются они, одно может работать только в русской (там русские символы), другое - только в английской. Так что скопирую одно под одну строчку, другое под другую
GetActiveKeyboardLayout() — это код раскладки активного окна. Для сравнения можно использовать операторы = (равно) и <> (не равно). То есть можно написать, например,
#If (GetActiveKeyboardLayout() = 0x...) and (GetActiveKeyboardLayout() = 0x...)
или
#If GetActiveKeyboardLayout() <> 0x...
Цитата: Квас от июля 10, 2012, 20:30
GetActiveKeyboardLayout() — это код раскладки активного окна. Для сравнения можно использовать операторы = (равно) и <> (не равно).
А, сейчас понял, спасибо.
Но мне проще написать те, в которых должно работать, потому что их только две, а те, в которых не должно — 8 :)
Спасибо большое!
Не за что. :)
вот это я уже задал
SetLayout(Layout)
; The function accepts hexadecimal layout code
; or one of specific strings as its argument.
{
ControlGetFocus, C, A
If (Layout = "English")
{
PostMessage, 0x50,, 0x4090409, %C%, A
}
Else If (Layout = "Russian")
PostMessage, 0x50,, 0x4190419, %C%, A
Else If (Layout = "Belarussian")
PostMessage, 0x50,, 0x4230423, %C%, A
Else If (Layout = "Hebrew")
PostMessage, 0x50,, 0x40d040d, %C%, A
Else If (Layout = "Japanese")
PostMessage, 0x50,, 0x4110411, %C%, A
Else If (Layout = "Syriac")
PostMessage, 0x50,, 0xf00e045a, %C%, A
Else If (Layout = "Chinese")
PostMessage, 0x50,, 0x8040804, %C%, A
Else If (Layout = "Arabic")
PostMessage, 0x50,, 0x4010c01, %C%, A
Else If (Layout = "Korean")
PostMessage, 0x50,, 0x4120412, %C%, A
Else
PostMessage, 0x50,, %Layout%, %C%, A
}
а что мне нужно написать, чтобы при нажатии, допустим, Ctrl+Shift+1 раскладка менялась на английскую
у меня просто стандартные виндовские смены слетают после каждой перезагрузки, а так я бы их в AHK запихнул, а его в автозагрузку и все было бы оккэ :)
Цитата: Juuurgen от июля 10, 2012, 20:42
а что мне нужно написать, чтобы при нажатии, допустим, Ctrl+Shift+1 раскладка менялась на английскую
^!1::SetLayout("English")
Если вдруг будет глючить с единицей (мало ли какие экзотичные раскладки), можно универсально — сканкодом:
^!sc02::SetLayout("English")
Список сканкодов можно посмотреть, например, здесь:
http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
(Для раскладконезависимости горячих клавиш люди пользуются или сканкодами или виртуальными кодами. Я так и не понял, что из этого идеологически более оправданно, и по инерции пользуюсь сканкодами.)
Цитата: Квас от июля 10, 2012, 20:57
^!
:o
это типа Ctrl+Shift
Цитата: Квас от июля 10, 2012, 20:57
sc02
прикольно :)
Цитата: Квас от июля 10, 2012, 20:57
Если вдруг будет глючить с единицей (мало ли какие экзотичные раскладки), можно универсально — сканкодом:
^!sc02::SetLayout("English")
Список сканкодов можно посмотреть, например, здесь:
а вообще, не работает не ^!1 ни ^!sc02
Опять обманываю. :( ! — это альт, а шифт — +. То есть ^+1.
Вот моя самопальщина! ;D
SendMode Input
hotstringsEnabled := true
>!\::
hotstringsEnabled := not hotstringsEnabled
if hotstringsEnabled {
SoundPlay, *64
} else {
SoundPlay, *-1
}
return
#Hotstring * ? c z
#If hotstringsEnabled
; всякие символы-пунктуация
::\bullet ::•
::\(c) ::©
::\(r) ::®
::\(tm) ::™
::\tribullet ::‣
::\<< ::«
::\>> ::»
::\0 ::°
::\-- ::—
::\S ::§
::\' ::′
::\'' ::″
::\''' ::‴
::\% ::‰
::\%% ::‱
::\asterism ::⁂
::\space ::␣
::\9< ::,,
::\6> ::"
::\!! ::‼
::\?! ::⁈
::\!? ::⁉
::\.. ::‥
::\... ::...
::\6 ::'
::\9 ::'
::\66 ::"
::\99 ::"
::\big66 ::❝
::\big99 ::❞
::\interrobang ::‽
::\! ::¡
::\? ::¿
::\< ::‹
::\> ::›
::\!! ::‼
::\?? ::⁇
::\c... ::⋯
::\times ::×
::\c. ::⋅
::\[[ ::⟦
::\]] ::⟧
::\le ::⩽
::\ge ::⩾
::\le' ::≤
::\ge' ::≥
::\<- ::←
::\-> ::→
::\upar ::↑
::\dnar ::↓
::\<-> ::↔
::\<= ::⇐
::\=> ::⇒
::\uparr ::⇑
::\dnarr ::⇓
::\<=> ::⇔
::\langle ::⟨
::\rangle ::⟩
::\neg ::¬
::\and ::∧
::\or ::∨
::\circ ::∘
::\lceil ::⌈
::\rceil ::⌉
::\lfloor ::⌊
::\rfloor ::⌋
::\QED ::◼
::\nothing ::∅
::\partial ::∂
::\Nabla ::∇
::\forall ::∀
::\exists ::∃
::\in ::∈
::\notin ::∉
::\in' ::∋
::\minus ::−
::\* ::∗
::\sqrt ::√
::\infty ::∞
::\int ::∫
::\iint ::∬
::\cap ::∩
::\cup ::∪
::\pm ::±
::\mapsto ::↦
::\approx ::≈
::\congruent ::≅
::\!= ::≠
::\=== ::≡
::\parallel ::∥
::\!parallel ::∦
::\perpend ::⊥
::\oplus ::⊕
::\otimes ::⊗
::\subset ::⊂
::\supset ::⊃
::\subset= ::⊆
::\supset= ::⊇
::\subset!= ::⊊
::\!subset= ::⊈
::\sqrt3 ::∛
::\|= ::⊧
::\|- ::⊦
::\venus ::♀
::\mars ::♂
; буквы
::\I ::İ
::\i ::ı
::\Mho ::℧
::\S, ::Ş
::\s, ::ş
::\Z, ::Ȥ
::\z, ::ȥ
::\AE ::Æ
::\ae ::æ
::\O/ ::Ø
::\o/ ::ø
; комбинирующееся
; á
::\acu ::́
; a̋
::\acc ::̋
; â
::\cir ::̂
; ǎ
::\car ::̌
; ā
::\mac ::̄
; ã
::\til ::̃
; ă
::\bre ::̆
; ȧ
::\doo ::̇
; ạ
::\do' ::̣
; ä
::\ddo ::̈
; a̤
::\dd' ::̤
; å
::\rin ::̊
; ḁ
::\ri' ::̥
; a̲
::\und ::̲
; a̶ (зачёркивание)
::\str ::̶
; à
::\gra ::̀
; ȃ
::\ibr ::̑
; a̗
::\ac' ::̗
; a̖
::\gr' ::̖
; a̭
::\ci' ::̭
; a̬
::\ca' ::̬
; a̰
::\ti' ::̰
; a̱
::\ma' ::̱
; a̮
::\br' ::̮
; a̯
::\ib' ::̯
; ą
::\ogo ::̨
; a̽
::\cro ::̽
; a͓
::\cr' ::͓
; буквы
::\И ::І
::\и ::і
::\Йи ::Ї
::\йи ::ї
::\Й ::Ј
::\й ::ј
::\Ль ::Љ
::\ль ::љ
::\Нь ::Њ
::\нь ::њ
::\Е ::Є
::\е ::є
::\У ::Ў
::\у ::ў
; гречица
::\Alpha ::Α
::\Beta ::Β
::\Gamma ::Γ
::\Delta ::Δ
::\Epsilon ::Ε
::\Zeta ::Ζ
::\Eta ::Η
::\Theta ::Θ
::\Iota ::Ι
::\Kappa ::Κ
::\Lambda ::Λ
::\Mu ::Μ
::\Nu ::Ν
::\Xi ::Ξ
::\Omicron ::Ο
::\Pi ::Π
::\Rho ::Ρ
::\Sigma ::Σ
::\Tau ::Τ
::\Ypsilon ::Υ
::\Phi ::Φ
::\Chi ::Χ
::\Psi ::Ψ
::\Omega ::Ω
::\alpha ::α
::\beta ::β
::\gamma ::γ
::\delta ::δ
::\epsilon ::ε
::\zeta ::ζ
::\eta ::η
::\theta ::θ
::\iota ::ι
::\kappa ::κ
::\lambda ::λ
::\mu ::μ
::\nu ::ν
::\xi ::ξ
::\omicron ::ο
::\pi ::π
::\rho ::ρ
::\sigma ::σ
::\tau ::τ
::\ypsilon ::υ
::\phi ::ϕ
::\chi ::χ
::\psi ::ψ
::\omega ::ω
::\varbeta ::ϐ
::\varpi ::ϖ
::\varrho ::ϱ
::\varsigma ::ς
::\vartheta ::ϑ
::\varphi ::φ
::\varkappa ::ϰ
::\aleph ::ℵ
::\^0 ::⁰
::\^1 ::¹
::\^2 ::²
::\^3 ::³
::\^4 ::⁴
::\^5 ::⁵
::\^6 ::⁶
::\^7 ::⁷
::\^8 ::⁸
::\^9 ::⁹
::\^+ ::⁺
::\^- ::⁻
::\^( ::⁽
::\^) ::⁾
::\_0 ::₀
::\_1 ::₁
::\_2 ::₂
::\_3 ::₃
::\_4 ::₄
::\_5 ::₅
::\_6 ::₆
::\_7 ::₇
::\_8 ::₈
::\_9 ::₉
::\_+ ::₊
::\_- ::₋
::\_( ::₍
::\_) ::₎
#If
Цитата: Квас от июля 10, 2012, 21:49
Опять обманываю. :( ! — это альт, а шифт — +. То есть ^+1.
感谢!
:)
теперь все работает
Цитата: arseniiv от июля 10, 2012, 22:52
::\' ::′
::\'' ::″
::\''' ::‴
Вот поэтому постфикс лучше префикса.
У меня на один символ (пробел) короче:
::'~::′
::'~ ::″
::'''~::‴
Нажатий, впрочем, столько же, поскольку '~' со Shift'ом. Но можно и без Shift'а постфикс использовать.
Цитата: mnashe от июля 11, 2012, 09:01
Цитировать::\' ::′
::\'' ::″
::\''' ::‴
Вот поэтому постфикс лучше префикса.
дык такое ж работать не будет, нэ?
Цитата: Juuurgen от июля 11, 2012, 12:18
дык такое ж работать не будет, нэ?
а не, там пробел.
Будет-будет. Там есть разные режимы обработчика, к тому же. Он может и в 1111 для 11 три раза срабатывать, и прочее. ;D
у меня просто так расписано:
:C1?0:ща ::сейчас{Space}
:C1?0:ща.::сейчас.
:C1?0:ща!::сейчас{!}
:C1?0:ща?::сейчас?
:C1?0:ща)::сейчас)
:C1?0:щас::сейчас
Есть режим воспринимать разделители как конец заменяемой строчки. Только какие именно разделители — не помню. Хотя ваши, вероятно, подойдут все (general punctuation же).
Я так и не понял, замена работает только в том случае, если последовательность символов стоит между двумя пробелами. :(
Странно.
Цитата: Toivo от сентября 26, 2012, 19:57
Я так и не понял, замена работает только в том случае, если последовательность символов стоит между двумя пробелами. :(
Это смотря какие параметры указывать
Цитата: Juuurgen от сентября 26, 2012, 21:51
Это смотря какие параметры указывать
:???
В смысле?
Цитата: Toivo от сентября 26, 2012, 22:24
В смысле?
Можно указать, чтоб в середине слова тоже работала, можно указать, чтобы заменялось по последнему символу, а не по пробелу, можно указать (не)зависимость от заглавных букв (может еще че можно, но я не знаю). Можно как для отдельных строк указывать, так и для всего файла сразу
Цитата: Juuurgen от сентября 26, 2012, 22:37
Цитата: Toivo от сентября 26, 2012, 22:24
В смысле?
Можно указать, чтоб в середине слова тоже работала, можно указать, чтобы заменялось по последнему символу, а не по пробелу, можно указать (не)зависимость от заглавных букв (может еще че можно, но я не знаю). Можно как для отдельных строк указывать, так и для всего файла сразу
Всё, дошло, просто строку следовало начинать не с
Цитировать::
, а с
Цитировать:*?:
:)
вот например, та, что мне Квас делал. Там в начале указано
#Hotstring ?*C
? — сработает внутри другого слова
* — не нужен пробел
C — чувствительность к регистру
это для всего скрипта
тоже самое можно писать между первыми двумя двоеточиями, например:
::a^::â — сработает только в начале слова при нажатии «а 6 пробел»
:*:a^::â — сработает только в начале слова при нажатии «а 6»
:C0:a^::â — A + 6 + пробел даст такой же результат, как и «a 6 пробел»
:?:a^::â — например, sta + 6 + пробел будет заменяться на stâ
:?*:a^::â — например, sta + 6 замениться на stâ
и т.п.
Вот кстати, тут можно чего посмотреть
http://www.script-coding.com/AutoHotkeyTranslation.html
Цитата: Juuurgen от сентября 26, 2012, 22:44
C — чувствительность к регистру
Спасибо, это как раз то, чего мне не хватало! :UU:
Цитата: Juuurgen от сентября 26, 2012, 22:47
Вот кстати, тут можно чего посмотреть
http://www.script-coding.com/AutoHotkeyTranslation.html
AHK, често говоря, мне понадобился только потому, что наодело копипастить латинские буквы с макронами и бреве, так что всё это богатство возможностей пока что лишнее... :)
Цитата: Toivo от сентября 26, 2012, 22:55
AHK, често говоря, мне понадобился только потому, что наодело копипастить латинские буквы с макронами и бреве, так что всё это богатство возможностей пока что лишнее...
Ну, во всяком случае тут, подробно расписано, про то, что может понадобиться
http://www.script-coding.com/AutoHotkey/Hotstrings.html
Мой файл автозамен в качестве примера.
Пояснения:
#IfWinNotActive Multi-Edit ;отсюда и до следующего #IfWinNotActive — не работает в окне с заголовком Multi-Edit
<...>
#Hotstring * ? C ;отсюда и до следующего #Hotstring по умолчанию работают опции * ? C
<...>
#Hotstring * ? C0 ;отсюда и до следующего #Hotstring по умолчанию работают опции * ? C0
<...>
#IfWinNotActive ;конец действия предыдущей #IfWinNotActive.
* (asterisk): An ending character (e.g. space, period, or enter) is not required to trigger the hotstring. For example:
:*:j@::jsmith@somedomain.com
The example above would send its replacement the moment you type the @ character. When using the #Hotstring directive, use *0 to turn this option back off.
? (question mark): The hotstring will be triggered even when it is inside another word; that is, when the character typed immediately before it is alphanumeric. For example, if :?:al::airline is a hotstring, typing "practical " would produce "practicairline ". Use ?0 to turn this option back off.
B0 (B followed by a zero): Automatic backspacing is not done to erase the abbreviation you type. Use a plain B to turn backspacing back on after it was previously turned off. A script may also do its own backspacing via {bs 5}, which sends 5 backspaces. Similarly, it may send left-arrow keystrokes via {left 5}. For example, the following hotstring produces <em></em> and moves the caret 5 places to the left (so that it's between the tags):
:*b0:<em>::</em>{left 5}
C: Case sensitive: When you type an abbreviation, it must exactly match the case defined in the script. Use C0 to turn case sensitivity back off.
C1: Do not conform to typed case. Use this option to make auto-replace hotstrings case insensitive and prevent them from conforming to the case of the characters you actually type. Case-conforming hotstrings (which are the default) produce their replacement text in all caps if you type the abbreviation in all caps. If you type only the first letter in caps, the first letter of the replacement will also be capitalized (if it is a letter). If you type the case in any other way, the replacement is sent exactly as defined. When using the #Hotstring directive, C0 can be used to turn this option back off, which makes hotstrings conform again.
Kn: Key-delay: This rarely-used option sets the delay between keystrokes produced by auto-backspacing or auto-replacement. Specify the new delay for n; for example, specify k10 to have a 10ms delay and k-1 to have no delay. The exact behavior of this option depends on which sending mode is in effect:
SI (SendInput): Key-delay is ignored because a delay is not possible in this mode. The exception to this is when SendInput is unavailable, in which case hotstrings revert to SendPlay mode below (which does obey key-delay).
SP (SendPlay): A delay of length zero is the default, which for SendPlay is the same as -1 (no delay). In this mode, the delay is actually a PressDuration rather than a delay between keystrokes.
SE (SendEvent): A delay of length zero is the default. Zero is recommended for most purposes since it is fast but still cooperates well with other processes (due to internally doing a Sleep 0). Specify k-1 to have no delay at all, which is useful to make auto-replacements faster if your CPU is frequently under heavy load. When set to -1, a script's process-priority becomes an important factor in how fast it can send keystrokes. To raise a script's priority, use Process, Priority,, High.
O: Omit the ending character of auto-replace hotstrings when the replacement is produced. This is useful when you want a hotstring to be kept unambiguous by still requiring an ending character, but don't actually want the ending character to be shown on the screen. For example, if
:o:ar::aristocrat is a hotstring, typing "ar" followed by the spacebar will produce "aristocrat" with no trailing space, which allows you to make the word plural or possessive without having to backspace. Use O0 (the letter O followed by a zero) to turn this option back off.
Pn: The priority of the hotstring (e.g. P1). This rarely-used option has no effect on auto-replace hotstrings.
R: Send the replacement text raw; that is, exactly as it appears rather than translating {Enter} to an ENTER keystroke, ^c to Control-C, etc. This option is put into effect automatically for hotstrings that have a continuation section. Use R0 to turn this option back off.
SI or
SP or
SE [v1.0.43+]: Sets the method by which auto-replace hotstrings send their keystrokes. These options are mutually exclusive: only one can be in effect at a time. The following describes each option:
SI stands for SendInput, which became the default in v1.0.43+ because of its superior speed and reliability. Another benefit is that like SendPlay below, SendInput postpones anything you type during a hotstring's auto-replacement text. This prevents your keystrokes from being interspersed with those of the replacement. When SendInput is unavailable, hotstrings automatically use SendPlay instead.
SP stands for SendPlay, which may allow hotstrings to work in a broader variety of games.
SE stands for SendEvent, which is the default in versions older than 1.0.43.
Z: This rarely-used option resets the hotstring recognizer after each triggering of the hotstring. In other words, the script will begin waiting for an entirely new hotstring, eliminating from consideration anything you previously typed. This can prevent unwanted triggerings of hotstrings. To illustrate, consider the following hotstring:
:b0*?:11::
SendInput xx
return
Since the above lacks the Z option, typing 111 (three consecutive 1's) would trigger the hotstring twice because the middle 1 is the last character of the first triggering but also the first character of the second triggering. By adding the letter Z in front of b0, you would have to type four 1's instead of three to trigger the hotstring twice. Use Z0 to turn this option back off.
Цитата: Toivo от сентября 26, 2012, 22:55
AHK, често говоря, мне понадобился только потому, что наодело копипастить латинские буквы с макронами и бреве, так что всё это богатство возможностей пока что лишнее...
Можно и в готовом виде мой скрипт взять.
Макрон вводится так: ^-
Бреве вводится так: ^u
Причём если существует готовый комбинированный символ, скрипт подставляет его, а если нет — набирает комбинируемую диакритику. Удобно!
Цитата: mnashe от сентября 26, 2012, 23:22
Можно и в готовом виде мой скрипт взять.
Макрон вводится так: ^-
Бреве вводится так: ^u
Спасибо за помощь, mnashe!
Впрочем, у меня уже и так всё работает:
#Hotstring c * ?
::am~::ā
::Am~::Ā
::em~::ē
::Em~ ::Ē
::im~::ī
::Im~::Ī
::om~::ō
::Om~::Ō
::um~::ū
::Um~::Ū
::ab~::ă
::Ab~::Ă
::eb~::ĕ
::Eb~::Ĕ
::ib~::ĭ
::Ib~::Ĭ
::ob~::ŏ
::Ob~::Ŏ
::ub~::ŭ
::Ub~::Ŭ
::ed~::ë
::Ed~::Ë
::ae~::æ
::Ae~::Æ
::oe~::œ
::Oe~::Œ
:-[ :dayatakoy:
Какой коротенький! :)
В моём скрипте обнаружилось 3 дубликата; исправил и заменил приложенный файл.
Кстати: может, кто-нибудь знает, как сделать автозамену, заканчивающуюся двоеточием?
Я не нашёл. Приходится умлауты назначать на точку с запятой вместо логичного двоеточия (u^; → ü).
У меня спокойно работает замена двух двоеточий на ː
Выглядит как
::::::ː
Эзотерично...
Подскажите.
Как сделать так, чтобы строковые автозамены работали не только с символоми, введёнными непосредственно, но и с символами, введёнными через горячие клавиши?
Например, я делаю горячую клавишу для ввода навесного акута:
>#'::SendInput {U+0301} ; combining acute accent
А теперь я хочу, чтобы буква 'a' в комбинации с навесным акутом заменялась на прекомбинированную 'á'.
Если написать
:*?:á::á ; преобразовать навесную диакритику в прекомбинированную
то работать не будет из-за того, что навесной акут набирается горячей клавишей. (Когда я набираю навесной акут из раскладки — замена работает.)
Можно ли сделать так, чтобы для строковой автозамены было неважно, каким способом набран символ?
Нашёл в документации, что так нельзя:
ЦитироватьHotstrings can never be triggered by keystrokes produced by any AutoHotkey script. This avoids the possibility of an infinite loop where hotstrings trigger each other over and over.
На форуме AHK уже много лет подряд появляются предложения сделать возможность включения такого режима. Разработчик отвечал, что сделает, вот только до сих пор, вроде как, не сделал.
Жаль, я хотел оставить раскладку стандартной, и все выкрутасы сделать на AHK, чтобы всё было в одном месте.
Придётся оставить диакритику в раскладке
(http://lingvowiki.info/wiki/images/0/07/Sm_sad.svg)
Цитата: Тайльнемер от августа 20, 2013, 06:01
Например, я делаю горячую клавишу для ввода навесного акута:
>#'::SendInput {U+0301} ; combining acute accent
А теперь я хочу, чтобы буква 'a' в комбинации с навесным акутом заменялась на прекомбинированную 'á'.
Если написать
:*?:á::á ; преобразовать навесную диакритику в прекомбинированную
то работать не будет из-за того, что навесной акут набирается горячей клавишей. (Когда я набираю навесной акут из раскладки — замена работает.)
Можно ли сделать так, чтобы для строковой автозамены было неважно, каким способом набран символ?
Нельзя.
Но добиться описанной цели (если я понял её правильно) можно вполне.
Для этого нужно просто расположить автозамены в правильном порядке: сначала все прекомбинированные сочетания, а потому уже навесные. Тогда, к примеру,
^' будет давать навесной акут, а
a^' — прекомбинированную á,
o^' → ó и т.д.
Так оно сделано у меня. Мне не приходится волноваться, каким образом я ввожу диакритику — последовательность всегда одна и та же, а результат зависит от наличия соответствующих прекомбинаций (
ы^' даёт два символа, а
u^' — один).
Цитата: Тайльнемер от августа 20, 2013, 07:46
Придётся оставить диакритику в раскладке :(
Не придётся, если сделать как я описал.
Да, и SendInput не нужен, достаточно обычных автозамен (но нужна уникодная версия, конечно).
Мнаше, это понятно, Но дело в том, что я не хочу использовать обычные символы ASCII как инициаторы автозамены. По трём причинам:
1) В коде на различных языках программирования встречаются всякие разные сочетания ASCII-символов. Автозамена будет мешать писать их.
2) Для других членов семьи клавиатура должна вести себякак можно более стандартно.
3) Я хотел минимизировать количество вводимых символов — вместо трёх (буква, диакритический знак, инициатор замены) вводить два (буква, диакритический знак являющийся инициатором замены).
Сейчас я могу сделать раскладку, в которой на AltGr+клавиша висят все нужные навесные диакритики, а в AHK прописать замену навесных на прекомбинированные (скрипт генерируется на основе списка канонических декомпозиций с официального сайта Уникода).
Но очень ограничивает то, что все символы надо пихать в раскладку, а использовать горячие клавиши AHK нельзя.
Так что моя идея, похоже, нереализуема в полную силу — раскладки поддерживают только один дополнительный регистр — AltGr, а я хотел несколько.
Скорей всего не пользуюсь хоткеями. Потому что не знаю что это. И влом курить доки.
Цитата: mnashe, скрипт его
::1/0::∞
Цитата: Тайльнемер от августа 20, 2013, 10:06
Цитата: mnashe, скрипт его
::1/0::∞

У меня бесконечность даёт 8 и «инициатор замены». А ноль так же даёт ∅.
Цитата: Тайльнемер от августа 20, 2013, 09:38
1) В коде на различных языках программирования встречаются всякие разные сочетания ASCII-символов. Автозамена будет мешать писать их.
2) Для других членов семьи клавиатура должна вести себякак можно более стандартно.
Можно сделать переключаемый режим типа такого (у меня):
hotstringsEnabled := true
>!\::
hotstringsEnabled := not hotstringsEnabled
if hotstringsEnabled {
SoundPlay, *64
} else {
SoundPlay, *-1
}
return
#If hotstringsEnabled
...замены...
#If
Цитата: arseniiv от августа 26, 2013, 21:36
Можно сделать переключаемый режим типа такого (у меня)
Нихачу.
Буду мучить раскладки.
MSKLC может вместо того, чтобы билдить dll, выдать сишный исходник этой dll (у утилиты $MSKLC$\bin\i386\kbdutool.exe ключ -s). Правя эти исходники, можно получить больше клавиш-модификаторов, чем позволяет MSKLC, и ещё всякие другие вещи.
Строго говоря, редактор MSKLC позволяет не все, что может его транслятор. Например, если отредактировать вручную исходники (.klc), а затем их скомпилировать, можно добавить в раскладку последовательности из нескольких мертвых клавиш, что непосредственно в редакторе раскладок сделать невозможно.
Да :yes:
Rwseg тут ещё баг транслятора нашёл, который тоже обходится правкой klc-файла вручную.
(Если в одной раскладке присутствуют символы верхних плоскостей уникода и последовательности из нескольких символов («лигатуры»), то раскладка косячится. Выход — переписать в klc-файле символы верхних плоскостей в виде лигатур из utf-16-суррогатов (как, собственно, и делает сам транслятор, когда в раскладке нет других лигатур))