 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
Guest
|
Posted: Sat Jan 23, 2010 9:39 am Post subject: |
|
|
Yes, I got it now the ahk file. I don't know but when I tested it, the arrow feature it didn't expand the word.
Example I type in dan, menu pops up and I choose item 3, it expanded to dancing. Now I type the dan, this time I use the arrow to go to 3, enter, dan remains dan. It doesn't expand to danced.
If you can enlighten me please. |
|
| Back to top |
|
 |
Guest
|
Posted: Sat Jan 23, 2010 9:41 am Post subject: |
|
|
EDIT PLEASE........THANKS....
Yes, I got it now the ahk file. I don't know but when I tested it, the arrow feature it didn't expand the word.
Example I type in dan, menu pops up and I choose item 3, it expanded to danced. Now I type the dan, this time I use the arrow to go to 3, enter, dan remains dan. It doesn't expand to danced.
If you can enlighten me please. |
|
| Back to top |
|
 |
SoLong&Thx4AllTheFish
Joined: 27 May 2007 Posts: 4999
|
Posted: Sat Jan 23, 2010 12:00 pm Post subject: |
|
|
Perhaps reading the intro will solve your problem | Quote: | | In addition to being able to use the number keys to select a word, you can select words from the drop-down via the Up/Down arrows. Hitting Up on the first item will bring you to the last and hitting Down on the last item will bring you to the first. Hitting Page Up will bring you up 10 items, or to the first item. Hitting Page Down will bring you down 10 items, or to the last item. You can hit Tab, Ctrl-Space, or Ctrl-Enter to autocomplete the selected word. This feature can be disabled or have some of its behavior modified via the Preferences file. |
_________________ AHK Wiki FAQ
TF : Text files & strings lib, TF Forum |
|
| Back to top |
|
 |
Guest
|
Posted: Sat Jan 23, 2010 12:43 pm Post subject: |
|
|
| Yes. It's working now with triggers Tab, Ctrl-Space, or Ctrl-Enter. I would like to customize mine as Enter instead of Enter. Where do I change this in the code? Thanks. |
|
| Back to top |
|
 |
maniac
Joined: 28 Aug 2009 Posts: 267
|
Posted: Sat Jan 23, 2010 4:34 pm Post subject: |
|
|
| Anonymous wrote: | | Yes. It's working now with triggers Tab, Ctrl-Space, or Ctrl-Enter. I would like to customize mine as Enter instead of Enter. Where do I change this in the code? Thanks. |
I wouldn't recommend it - for example say you want to visit a website like
www.google.com
when you hit enter after typing "com", you will autocomplete the word "coma" (if using that 100,000 word list) and you will not be able to type "com" without hitting esc first.
If you still feel it's a good idea, just replace all instances of "^Enter" with "Enter". |
|
| Back to top |
|
 |
Guest
|
Posted: Sun Jan 24, 2010 3:44 pm Post subject: |
|
|
| Thanks again for the arrow feature, maniac and hugo. |
|
| Back to top |
|
 |
theleo33 Guest
|
Posted: Thu Mar 11, 2010 8:44 am Post subject: |
|
|
looks great,
Is there a final, more compiled version of this around? |
|
| Back to top |
|
 |
SoLong&Thx4AllTheFish
Joined: 27 May 2007 Posts: 4999
|
|
| Back to top |
|
 |
Newguest Guest
|
Posted: Sat Jun 26, 2010 2:56 am Post subject: |
|
|
I need to type words including number characters. How can I disable (or enable) the number key's functionality?
TIA.  |
|
| Back to top |
|
 |
maniac
Joined: 28 Aug 2009 Posts: 267
|
Posted: Sat Jun 26, 2010 4:30 am Post subject: |
|
|
| Newguest wrote: |
I need to type words including number characters. How can I disable (or enable) the number key's functionality?
TIA.  |
Please use the new thread for these questions as this thread has been superseded. You can disable the number keys via the preferences file, this will allow words with numbers to be learned. There are some slight issues with this ATM (ie, words made up entirely of numbers will be learned right now), but I have a fixed version of this ready. I may release it soon, I was hoping to get the config gui done but I haven't had time. |
|
| Back to top |
|
 |
Newguest Guest
|
Posted: Sat Jun 26, 2010 6:25 am Post subject: |
|
|
Thanks you so much for your quick response. Waiting for latest version.
Have a nice day!
Newguest |
|
| Back to top |
|
 |
Artiprinted
Joined: 08 Feb 2011 Posts: 4
|
Posted: Tue Feb 08, 2011 8:08 pm Post subject: This script is so cool. |
|
|
Hello,
I want to ask if you can keep the most updated version on the first post so that one does not have to read through many posts to find the newest version. Also please put a version number on it 1.1 or 1.2 and 1.3 as you release so i can figure out what version i have and need to update to.
Thanks, |
|
| Back to top |
|
 |
Artiprinted
Joined: 08 Feb 2011 Posts: 4
|
Posted: Tue Feb 08, 2011 8:23 pm Post subject: issue with latest version |
|
|
It seems as though anything after this version has performance issues. When i use notepad it is ok but if i use IM or other programs it misses the first character when typing it in. example: test return anthing that starts with "est" instead of "test"
| maniac wrote: | | kakarukeys wrote: | | 2. The script can't read from wordlist.txt in Vista 64bit !? |
Works for me on Win 7 64 bit... but I have UAC disabled... maybe that's why?
OK, new version. I've done 1, 2, 5, and 6 (5 is handled via the ini file) from this post, added in 2 key presses, and fixed the ini format.
Next up is 3, 4, 7, 8, hugov's up/down feature, and parameterizing the Learning capability.
| Code: | ; TypingAid
; Press 1 to 0 keys to autocomplete the word upon suggestion
; (0 will match suggestion 10)
; Credits:
; -Jordi S
; -Maniac
; -hugov
; -kakarukeys
; -Asaptrad
;___________________________________________
; Press 1 to 0 keys to autocomplete the word upon suggestion
; (0 will match suggestion 10)
;_______________________________________
; CONFIGURATIONS
#NoEnv
SetBatchLines, 20ms
ListLines Off
OnExit, SaveScript
;read in the preferences file
ReadPreferences()
;setup code
clearword=1
CoordMode, ToolTip, Relative
AutoTrim, Off
SetTimer, Winchanged, 100
;mark the wordlist as not done
WordListDone = 0
;reads list of words from file
FileRead, ParseWords, %A_ScriptDir%\Wordlist.txt
Loop, Parse, ParseWords, `n, `r
{
AddWordToList(A_LoopField)
}
ParseWords =
;reverse the numbers of the word counts in memory
GoSub, ReverseWordNums
;mark the wordlist as completed
WordlistDone = 1
Loop
{
;Editor window check
WinGetActiveTitle, ATitle
WinGet, A_id, ID, %ATitle%
IfNotInString, ATitle, %ETitle%
{
ToolTip
Word=
WinWaitActive, %ETitle%
Continue
}
;Get one key at a time
Input, chr, L1 V, %TerminatingCharacters%
EndKey = %errorlevel%
; If active window has different window ID from before the input, blank word
; (well, assign the number pressed to the word)
WinGetActiveTitle, ATitle
WinGet, A_id2, ID, %ATitle%
IfNotEqual, A_id, %A_id2%
{
Gosub,clearallvars
Word = %chr%
Continue
}
ifequal, OldCaretY,
OldCaretY = %A_CaretY%
ifnotequal, OldCaretY, %A_CaretY%
{
; add the word if switching lines
AddWordToList(Word)
Gosub,clearallvars
Word = %chr%
Continue
}
OldCaretY=%A_CaretY%
;Backspace clears last letter
ifequal, EndKey, Endkey:BackSpace
{
StringLen, len, Word
IfNotEqual, len, 0
{
ifequal, len, 1
{
Gosub,clearallvars
} else {
StringTrimRight, Word, Word, 1
}
}
} else ifequal, EndKey, Max
{
if chr in %ForceNewWordCharacters%
{
AddWordToList(Word)
Gosub, clearallvars
Word = %chr%
Continue
} else {
Word .= chr
}
} else {
AddWordToList(Word)
Gosub, clearallvars
}
;Wait till minimum letters
IF ( StrLen(Word) < wlen )
{
ToolTip,
Continue
}
;Match part-word with command
Num =
Match =
singlematch = 0
number = 0
StringLeft, baseword, Word, %wlen%
baseword := ConvertWordToAscii(baseword,1)
Loop
{
IfEqual, zword%baseword%%a_index%,, Break
IfEqual, number, 10
Break
if ( SubStr(zword%baseword%%a_index%, 1, StrLen(Word)) = Word )
{
number ++
singlematch := zword%baseword%%a_index%
match .= Mod(number,10) . ". " . singlematch . "`n"
singlematch%number% = %singlematch%
Continue
}
}
;If no match then clear Tip
IfEqual, Match,
{
clearword=0
Gosub,clearallvars
Continue
}
;Show matched command
StringTrimRight, match, match, 1 ; Get rid of the last linefeed
WinGetActiveTitle, ATitle
WinGetPos, , PosY, , SizeY, %ATitle%
ToolTipSizeY := (number * 12)
ToolTipPosY := A_CaretY+14
if ((ToolTipSizeY + ToolTipPosY) > (PosY + SizeY))
ToolTipPosY := (A_CaretY - 14 - ToolTipSizeY)
IfNotEqual, Word,,ToolTip, %match%, %A_CaretX%, %ToolTipPosY%
; +14 Move tooltip down a little so as not to hide the caret.
}
; Timed function to detect change of focus (and remove tooltip when changing active window)
Winchanged:
WinGetActiveTitle, ATitle
WinGet, A_id3, ID, %ATitle%
IfNotEqual, A_id, %A_id3%
{
ToolTip ,
} else {
; If we are in the correct window, and OldCaretY is set, clear the tooltip if not in the same line
IfInString, ATitle, %ETitle%
{
IfNotEqual, OldCaretY,
{
IfNotEqual, OldCaretY, %A_CaretY%
{
ToolTip,
}
}
}
}
Return
; Key definitions for autocomplete (0 to 9)
#MaxThreadsPerHotkey 1
$1::
$2::
$3::
$4::
$5::
$6::
$7::
$8::
$9::
$0::
CheckWord(A_ThisHotkey)
Return
; If hotkey was pressed, check wether there's a match going on and send it, otherwise send the number(s) typed
CheckWord(Key)
{
global
Local ATitle
Local A_id2
Local WordIndex
Local KeyAgain
StringRight, Key, Key, 1 ;Grab just the number pushed, trim off the "$"
IfEqual, Key, 0
{
WordIndex = 10
} else {
WordIndex = %Key%
}
clearword=1
IfEqual, NumPresses, 2
Suspend, On
; If active window has different window ID from before the input, blank word
; (well, assign the number pressed to the word)
WinGetActiveTitle, ATitle
WinGet, A_id2, ID, %ATitle%
IfNotEqual, A_id, %A_id2%
{
SendInput,%key%
Gosub,clearallvars
IfEqual, NumPresses, 2
Suspend, Off
Return
}
IfNotEqual, OldCaretY, %A_CaretY% ;Make sure we are still on the same line
{
SendInput,%key%
Gosub,clearallvars
IfEqual, NumPresses, 2
Suspend, Off
Return
}
ifequal, Word, ; only continue if word is not empty
{
SendInput,%key%
Word = %key%
clearword=0
Gosub,clearallvars
IfEqual, NumPresses, 2
Suspend, Off
Return
}
ifequal, singlematch%WordIndex%, ; only continue singlematch is not empty
{
SendInput,%key%
Word .= key
clearword=0
Gosub,clearallvars
IfEqual, NumPresses, 2
Suspend, Off
Return
}
IfEqual, NumPresses, 2
{
Input, keyagain, L1 I T0.5, 1234567890
; If there is a timeout, abort replacement, send key and return
IfEqual, ErrorLevel, Timeout
{
SendInput, %key%
Word .= key
clearword=0
Gosub,clearallvars
Suspend, off
Return
}
; Make sure it's an EndKey, otherwise abort replacement, send key and return
IfNotInString, ErrorLevel, EndKey:
{
SendInput, %key%%keyagain%
Word .= key . keyagain
clearword=0
Gosub, clearallvars
Suspend, off
Return
}
; ListVars
; Pause
; If the 2nd key is NOT the same 1st trigger key, abort replacement and send keys
IfNotInString, ErrorLevel, %key%
{
StringTrimLeft, keyagain, ErrorLevel, 7
SendInput, %key%%keyagain%
Word .= key . keyagain
clearword=0
Gosub, clearallvars
Suspend, Off
Return
}
}
Local sending
Local len
Local ClipboardSave
; SEND THE WORD!
sending := singlematch%WordIndex%
StringLen, len, Word
; Update Typed Count
UpdateWordCount(sending)
SendPlay, {BS %len%}{Raw}%sending% ; First do the backspaces, Then send word (Raw because we want the string exactly as in wordlist.txt)
; below works but uses clipboard
;ClipboardSave:=ClipboardAll
;Clipboard = %sending%
;SendPlay, {BS %len%}^v ; First do the backspaces, Then send word (Raw because we want the string exactly as in wordlist.txt)
;Clipboard = %ClipboardSave%
Gosub,clearallvars
IfEqual, NumPresses, 2
Suspend, Off
Return
}
; This is to blank all vars related to matches, tooltip and (optionally) word
clearallvars:
Ifequal,clearword,1
{
word =
OldCaretY=
}
ToolTip
; Clear all singlematches
Loop, 10
{
singlematch%a_index% =
}
sending =
key=
match=
clearword=1
Return
AddWordToList(AddWord)
{
global
Local CharTerminateList
Local Base
Local AddWordInList
Local CountWord
Local pos
Ifequal, Addword, ;If we have no word to add, skip out.
Return
if ( Substr(addword,1,1) = ";" ) ;If first char is ";", clear word and skip out.
{
IfEqual, wordlistdone, 0 ;If we are still reading the wordlist file and we come across ;LEARNEDWORDS; set the LearnedWordsCount flag
{
IfEqual, AddWord, `;LEARNEDWORDS`;
LearnedWordsCount=0
}
addword =
Return
}
ifequal, wordlistdone, 1
{
if addword contains 1,2,3,4,5,6,7,8,9,0,%ForceNewWordCharacters%
Return
}
IF ( StrLen(addword) <= wlen ) ; don't add the word if it's not longer than the minimum length
{
addword =
Return
}
Base := ConvertWordToAscii(SubStr(addword,1,wlen),1)
IfEqual, WordListDone, 0 ;if this is read from the wordlist
{
IfNotEqual,LearnedWordsCount, ;if this is a stored learned word
{
CountWord := ConvertWordToAscii(addword,0)
IfEqual, LearnedWords, ;if we haven't learned any words yet, set the LearnedWords list to the new word
{
LearnedWords = %addword%
} else { ;otherwise append the learned word to the list
LearnedWords .= "," . addword
}
zCount%CountWord% := LearnedWordsCount++ ;increment the count and store the Weight of the LearnedWord in reverse order (will be inverted later)
}
IncrementCounterAndAddWord(Base,AddWord)
} else { ; If this is an on-the-fly learned word
AddWordInList =
Loop ;Check to see if the word is already in the list, case sensitive
{
IfEqual, zword%base%%a_index%,, Break
if ( zword%base%%a_index% == AddWord )
{
AddWordInList = 1
Break
}
Continue
}
IfEqual, AddWordInList, ; if the word is not in the list
{
CountWord := ConvertWordToAscii(addWord,0)
zCount%CountWord% = 1 ;set the count to one as it's the first time we typed it
IfEqual, LearnedWords, ;if we haven't learned any words yet, set the LearnedWords list to the new word
{
LearnedWords = %addword%
} else { ;otherwise append the learned word to the list
LearnedWords .= "," . addword
}
IncrementCounterAndAddWord(Base,AddWord)
} else {
UpdateWordCount(addword) ;Increment the word count if it's already in the list
}
}
Return
}
IncrementCounterAndAddWord(Base,AddWord)
{
global
local pos
; Increment the counter for each hash
zbasenum%Base%++
pos := zbasenum%Base%
; Set the hashed value to the word
zword%Base%%pos% = %addword%
}
; This sub will reverse the read numbers since now we know the total number of words
ReverseWordNums:
LearnedWordsCount+=4
Loop,parse,LearnedWords, `,
{
AsciiWord := ConvertWordToAscii(A_LoopField,0)
zCount%AsciiWord% := LearnedWordsCount - zCount%AsciiWord%
}
AsciiWord =
LearnedWordsCount =
Return
UpdateWordCount(word)
{
; If the Count for the word already exists - ie if it's a learned word, increment it, else don't.
local CountWord := ConvertWordToAscii(word,0)
IfNotEqual, zCount%CountWord%,
{
zCount%CountWord%++
local WordBase
StringLeft, WordBase, word, %wlen% ;find the pseudohash for the word
WordBase := ConvertWordToAscii(WordBase,1)
Local ConvertWord =
Local LowIndex =
Local WordList =
Loop
{
ifequal, zword%WordBase%%A_Index%, ;Break the loop if no more words to read for the hash
Break
CountWord := zword%WordBase%%A_Index% ;Set CountWord to the current Word position
ConvertWord := ConvertWordToAscii(CountWord,0) ; Find the Ascii equivalent of the word
IfNotEqual, zCount%ConvertWord%, ;If there's no count for this word do nothing
{
IfEqual, LowIndex,
LowIndex = %A_Index% ;If this is the first word we've found with a count set this as our starting position
WordList .= "," . zCount%ConvertWord% . "z" . CountWord ;prefix all words with (zCount"z")
}
}
ifnotequal, Wordlist, ;If we have no words to process, don't
{
StringTrimLeft, WordList, WordList, 1
Sort, WordList, N R D, ;Sort the wordlist by order of
LowIndex-- ;A_Index starts at 1 so this value needs to be decremented
Local IndexPos =
Loop, Parse, WordList, `,
{
IndexPos := LowIndex + A_Index ;Set the current word we are processing to the starting pos plus word position
StringTrimLeft, CountWord, A_LoopField, InStr(A_LoopField,"z") ;Strip (Number,"z") from beginning
zword%WordBase%%IndexPos% = %CountWord% ; update the word in the list
}
}
}
Return
}
ConvertWordToAscii(Base,Caps)
{
; Return the word in Ascii numbers padded to length 3 per character
; Capitalize the string if NoCaps is not set
IfEqual, Caps, 1
StringUpper, Base, Base
Loop, Parse, Base
{
New .= SubStr("00" . Asc(A_LoopField),-2)
}
Return New
}
ReadPreferences()
{
global ETitle
global TerminatingCharacters
global ForceNewWordCharacters
global Wlen
global NumPresses
Prefs = %A_ScriptDir%\Preferences.ini
DftTerminatingCharacters = {enter}{space}{bs}{esc}{tab}{Home}{End}{PgUp}{PgDn}{Up}{Down}{Left}{Right}.;`,:¿?¡!'"()]{}{}}{{}
If FileExist(Prefs)
{
IniRead, ETitle, %Prefs%, Settings, Title, %A_Space%
IniRead, TerminatingCharacters, %Prefs%, Settings, TerminatingCharacters, %DftTerminatingCharacters%
IniRead, ForceNewWordCharacters, %Prefs%, Settings, ForceNewWordCharacters, %A_Space%
IniRead, Wlen, %Prefs%, Settings, Length, 3
IniRead, NumPresses, %Prefs%, Settings, NumPresses, 1
} else {
INI=
(
;Title is a string of text to find in the title of the window you want TypingAid enabled for. If you leave
;it blank it will work in all windows.
[Settings]
Title=
;
;TerminatingCharacters is a list of EndKey characters which will signal the script that you are done typing a word.
;A list of keys may be found here:
; http://www.autohotkey.com/docs/KeyList.htm
;Certain characters (such as `% or , ) require an escape character in front, see here:
; http://www.autohotkey.com/docs/commands/_EscapeChar.htm
;For more detail on how to format the list of characters please see the EndKeys section (paragraphs 2,3,4) of:
; http://www.autohotkey.com/docs/commands/Input.htm
TerminatingCharacters={enter}{space}{bs}{esc}{tab}{Home}{End}{PgUp}{PgDn}{Up}{Down}{Left}{Right}.;`,:¿?¡!'"()]{}{}}{{}
;
;ForceNewWordCharacters is a comma separated list of characters which force the script to start a new word whenever
;one of those characters is typed. Any words which begin with one of these characters will never be learned (even
;if learning is enabled). If you were typing a word when you hit one of these characters that word will be learned
;if learning is enabled.
ForceNewWordCharacters=
;
;Length is the minimum number of characters required to show the list of words. The higher this number the better performance will be.
Length=3
;
;NumPresses is the number of times the hotkey must be pushed for the word to be selected, either 1 or 2.
NumPresses=1
)
FileAppend, %INI%, %A_ScriptDir%\Preferences.ini
}
IfEqual, Wlen,
Wlen = 3
IfEqual, TerminatingCharacters,
TerminatingCharacters = DftTerminatingCharacters
IfEqual, NumPresses,
NumPresses = 1
Return
}
SaveScript:
; Close the tooltip if it's open
ToolTip,
; Add all the standard words to the tempwordlist
FileRead, ParseWords, %A_ScriptDir%\Wordlist.txt
LearnedwordsPos := InStr(ParseWords, "`;LEARNEDWORDS`;",true,1) ;Check for Learned Words
IfNotEqual, LearnedwordsPos, 0
{
TempWordList := SubStr(ParseWords, 1, LearnedwordsPos - 1) ;Grab all non-learned words out of list
} else {
TempWordList := ParseWords
}
ParseWords =
; Parse the learned words and store them in a new list by count if their total count is greater than 5.
; Prefix the word with the count and "z" for sorting
Loop, Parse, LearnedWords, `,
{
SortWord := ConvertWordToAscii(A_LoopField,0)
IfGreaterOrEqual, zCount%SortWord%, 5
{
SortWordList .= "," . zCount%SortWord% . "z" . A_LoopField
}
}
StringTrimLeft, SortWordList, SortWordList, 1 ;remove extra starting comma
Sort, SortWordList, N R D, ; Sort numerically, comma delimiter
IfNotEqual, SortWordList, ; If SortWordList exists write to the file, otherwise don't.
{
TempWordList .= "`;LEARNEDWORDS`;`r`n"
Loop, Parse, SortWordList, `,
{
StringTrimLeft, AppendWord, A_LoopField, InStr(A_LoopField,"z") ;Strip (Number,"z") from beginning
TempWordList .= AppendWord . "`r`n"
}
StringTrimRight, TempWordList, TempWordList, 2
FileDelete, %A_ScriptDir%\Temp_Wordlist.txt
FileAppend, %TempWordList%, %A_ScriptDir%\Temp_Wordlist.txt ;Only update the file if we have learned words
FileCopy, %A_ScriptDir%\Temp_Wordlist.txt, %A_ScriptDir%\Wordlist.txt, 1
FileDelete, %A_ScriptDir%\Temp_Wordlist.txt
}
ExitApp |
|
|
|
| Back to top |
|
 |
maniac
Joined: 28 Aug 2009 Posts: 267
|
Posted: Tue Feb 08, 2011 8:44 pm Post subject: Re: This script is so cool. |
|
|
| Artiprinted wrote: | Hello,
I want to ask if you can keep the most updated version on the first post so that one does not have to read through many posts to find the newest version. Also please put a version number on it 1.1 or 1.2 and 1.3 as you release so i can figure out what version i have and need to update to.
Thanks, |
This is an outdated thread. As it says several times near the end of this thread (and in the first post), please see this thread for the newest version:
http://www.autohotkey.com/forum/viewtopic.php?t=53630
If you are still having issues with that version, let me know in that thread and we can look into them. Thanks! |
|
| Back to top |
|
 |
jordis
Joined: 30 Jul 2004 Posts: 81
|
Posted: Tue Feb 08, 2011 8:54 pm Post subject: |
|
|
| I added a "Please read first" note directing to maniac's TypingAid |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|