Situation
When working with a tag-rich text in OmegaT where tags are really needed (for instance, with HTML files), you can either insert the source into translation input field (Ctrl+Shift+I or Ctrl+Shift+R) and then overwrite the original with your translation between the tags, or put them all into the input field without any original text (Ctrl+Shift+T) and write your translation between the appropriate tags. That’s if you wanna use the keyboard only. With the mouse you can select, copy and paste them one by one, screeching your teeth over each one of them and hating the waste of time.
Problem
What you want is a possibility to select one tag at a time, insert it, select the next one, and all that without the mouse.
Solution
On GNU/Linux you can use the following script:
#!/bin/bash
##########
# Tag Insert — Version 0.1, 20090517
# By Roberto Bechtlufft
# <<a class="linkification-ext" title="Linkification: http://www.bechtranslations.com.br" href="http://www.bechtranslations.com.br">http://www.bechtranslations.com.br</a>>
# Modified by Kos Ivantsov
# <<a class="linkification-ext" title="Linkification: https://libretraduko.wordpress.com" href="https://libretraduko.wordpress.com">https://libretraduko.wordpress.com</a>>
##########
# Requires:
# cat, sed, grep, tr, xte, xclip
# zenity (to locate OT installation dir),
# notify-send (to show selected tag)
#
# xte can be substituted with xmacro or xdotool
# xclip can be substituted with xsel or xclipboard
##########
##########
# create a file that contains OT installation directory
# it's used later on to find OT icon for notifications
# if there's no need for icons, this part can be deleted
if [ ! -f $HOME/.omegat/ompath ]; then
dirname `zenity --file-selection --title="Navigate to OT directory" \
--text="Select OmegaT.jar from the folder where OmegaT is installed"` \
> $HOME/.omegat/ompath
fi
OM_PATH=`cat $HOME/.omegat/ompath`
##########
##########
# shows currently selected tag with libnotify popup
function notify {
notify-send --icon="$OM_PATH/images/OmegaT.png" `cat $currenttag`
}
##########
##########
# checks if OT is running, used later on during invocation of the
# script either to execute, or to exit
function test_omegat () {
export OTPID=`ps ax|grep OmegaT.jar|grep java|cut -d " " -f 2`
if [ -z $OTPID ]; then
echo "NORUN"
else
echo "RUN"
fi
}
##########
##########
# set up some variables and files to store tags at different stages
#
source=$HOME/.omegat/script/source.txt
tagsdir=/tmp/ottags
tags=$tagsdir/tags
tagnumber=$tagsdir/tagnumber
currenttag=$tagsdir/currenttag
pidfile=$tagsdir/pidfile
##########
##########
# Create temp dir for temp files with tags
if [ ! -d $tagsdir ]; then
mkdir -p $tagsdir
fi
##########
##########
# If the script is run without parameters, it checks if another instance
# is already running, and if so, exits, otherwise proceeds
# and then loops in the background
if [ -z $1 ]; then
if [ -e $pidfile ]; then
rm $pidfile
fi
echo $$ > $pidfile
export PID=`cat $pidfile`
test `pgrep taginsert|grep -v $PID|wc -l` -ge 2 && rm $pidfile && exit 0
#
# then it watches (every 2 seconds) if OT's exported source segment
# has changed
# if changed, gather all the tags
# (one on each line with preceding number) into $tags
# set $tagnumber to "1" and set $currenttag to string #1 from $tags
# (without preceding digit(s))
#
old=`stat $source | grep Modify`
while [ i != 0 ]; do
sleep 2
[ "$(test_omegat)" = "NORUN" ] && rm -r $tagsdir && exit 0
new=`stat $source | grep Modify`
if [ "$old" != "$new" ]; then
rm -r $tagsdir/*
old="$new"
grep -o "<.[^>]*>" $source |grep -n "<" > $tags
echo "1" > $tagnumber
grep "^1:" $tags | cut -d ":" -f 2 > $currenttag
fi
done
fi
##########
##########
# if invoked with parameters, then select prev./next tag
# selection goes in loop, ie next to the last is the first,
# and previous to the first is the last
# Upon changing selection popup notification is brought up,
# showing OT's icon and currently selected tag
# Before inserting current tag, clipboard is stored into a variable,
# and upon inserting the tag, it gets restored.
case $1 in
previous)
[ "$(test_omegat)" = "NORUN" ] && rm -r $tagsdir && exit 0
export numberoftags=`cat $tags|wc -l`
if [ `cat $tagnumber` -ge 2 ]; then
expr `cat $tagnumber` - 1 > $tagnumber
else
echo $numberoftags > $tagnumber
fi
tagnumber=`cat $tagnumber`
grep "^$tagnumber:" $tags | cut -d ":" -f 2 > $currenttag
notify
;;
next)
[ "$(test_omegat)" = "NORUN" ] && rm -r $tagsdir && exit 0
export numberoftags=`cat $tags|wc -l`
if [ `cat $tagnumber` -lt ${numberoftags} ]; then
expr `cat $tagnumber` + 1 > $tagnumber
else
echo "1" > $tagnumber
fi
tagnumber=`cat $tagnumber`
grep "^$tagnumber:" $tags | cut -d ":" -f 2 > $currenttag
notify
;;
insert)
[ "$(test_omegat)" = "NORUN" ] && rm -r $tagsdir && exit 0
export PREVCLIP=`xclip -o -selection clipboard`
cat $currenttag | tr -d '\n' |xclip -i -selection clipboard
xte "keydown Control_L" "key v" "keyup Control_L"
sleep 2
echo "$PREVCLIP"| xclip -i -selection clipboard
;;
*)
exit 0
;;
esac
The script should be saved under any convenient filename (taginsert here) and made executable:
chmod +x taginsert.
Once OmegaT is running, ivnoke taginsert (or whatever name you’ve given it) without any parameters.
Then assign three key combinations (this is done by your Window Manager or by tools like xbindkeys):
- One for taginsert previous — it will select previous tag (in circle)
- One for taginsert next — it will select next tag (in circle)
- One for taginsert insert — it will insert the selected tag (and keep the selection)
Check the beginning comments in the script to see the requirements.
The idea was taken from Roberto Bechtlufft’s taginsert scripts. Any improvements, criticism, comments are welcome.
In case you’re a Windows user
Here’s an AutoIt script, shared by Kerry Swatridge and based on Samuel Murray’s original idea.
#Include
Global $prev_source
Global $j
HotKeySet("^.", "NextTag")
HotKeySet("^,", "PrevTag")
$j = 0
$prev_source = ""
while True
sleep(1000)
WEnd
; ================================
Func NextTag ()
Local $fileopen, $source, $tags, $numtags
If WinActive ("OmegaT", "") Then
$fileopen = FileOpen ("source.txt", 128)
$source = FileRead ("source.txt")
FileClose ("source.txt")
$tags = StringRegExp ($source, '(<[/]{0,1}[a-z]{0,3}[0-9]{0,5}[/]{0,1}>)', 3)
$numtags = UBound($tags)
if $numtags > 0 then
if $source <> $prev_source then
$j = 0
else
If $j = $numtags - 1 Then
$j = 0
Else
$j = $j + 1
EndIf
EndIf
$prev_source = $source
ClipPut ($tags[$j])
Send ("^v")
endif
EndIf
EndFunc
Func PrevTag ()
Local $fileopen, $source, $tags, $numtags
If WinActive ("OmegaT", "") Then
$fileopen = FileOpen ("source.txt", 128)
$source = FileRead ("source.txt")
FileClose ("source.txt")
$tags = StringRegExp ($source, '(<[/]{0,1}[a-z]{0,3}[0-9]{0,5}[/]{0,1}>)', 3)
$numtags = UBound($tags)
if $numtags > 0 Then
if $source <> $prev_source then
$j = 0
else
If $j = 0 Then
$j = $numtags - 1
Else
$j = $j - 1
EndIf
EndIf
$prev_source = $source
ClipPut ($tags[$j])
Send ("^v")
EndIf
EndIf
EndFunc
In lines 4 and 5 there are two hotkeys assigned to “insert previous tag” and “insert next tag” actions. You can change them to your likings.
If you’re a happy OmegaT 2.7 and above user
There’s almost no need in these scripts anymore because OmegaT, beginning with version 2.7 (which isn’t released as of this update on April 7, 2013), got smart enough to recognize which tags are already present in the input area. There is a menu item Edit → Insert Next Missing Tag which is sufficient in most cases. To add a shortcut to this action, you need to put a file MainMenuShortcuts.properties into your OmegaT config directory (it’s $HOME/.omegat by default on GNU/Linux). The file should contain a line editTagNextMissedMenuItem with the assigned shortcut. So, if you want to insert next missing tag with Ctrl+Shift+Down, your line will look like this:
editTagNextMissedMenuItem=ctrl shift DOWN (ALL CAPS are mandatory).
But as of now,
Good Luck!