Program touch-tone instructions for my fingers The keypad on my office phone has the following layout:
[1]  [2]  [3]
/.@  ABC  DEF

[4]  [5]  [6]
GHI  JKL  MNO

[7]  [8]  [9]
PQRS TUV WXYZ

[*]  [0]  [#]
 +    _

Task:
Write a program that, given an input string, returns a list of instructions that my fingers need to follow in order the type/dial the message/number.
Rules:

3 fingers (1,2 &amp; 3) start on keys [4], [5] and [6]. This starting position is 0.
The only instruction a finger receives is its new relative location.
Once a key has been pressed, that is the finger's new starting position. Fingers do not return to their 'home row'.
Moving a finger up the keypad's column is -1, -2 or -3, depending on where it was last used.
Moving a finger down the keypad's column is 1, 2 or 3, depending on where it was last used.
Keeping a finger on the same key means there is no movement (0). It is not included.
Words which require a double letter (like 'OO' in 'BOOK' or 'DE' in CODE) will need a pause (P) between letters.
When using Pause, the finger is not specified.
A finger can only press the keys in its own column (1,4,7,*) (2,5,8,0) (3,6,9,#)
Typing certain letters requires multiple keypresses. To type 'F', 3 needs to be pressed 3 times.
Input is not case sensitive.
Input characters not available on the keypad should be ignored. (Hyphens and parenthesis of a phone number, for example)
Input will either be alpha or numeric - not a mixture - so no need to switch between input methods mid-stream.
When entering numbers, Pauses aren't necessary.
This is code-golf so shortest code in bytes wins.

Update
To slightly simplify matters, [*] and [#] can be ignored. These will not feature in the input. But I'll buy you a beer if you do include them and get lowest byte count! (If you're in London ;-))
Output:
A list of instructions, in the following format:
[direction] [finger_number] [new_relative_location], ...

Whitespace between instructions is optional.
Test cases:
(123)-957 -&gt; -11, -21, -31, 32, 21, 12
555-9273 -&gt; 2,2,2,31,-21,11,-32
CODE GOLF -&gt; -21,2,2, 3,3,3, -31, P, 3,3, 23, 1, 31,3,3, -22,2,2, -31,3,3
Code Golf -&gt; -21,2,2, 3,3,3, -31, P, 3,3, 23, 1, 31,3,3, -22,2,2, -31,3,3
Python 2, 423 bytes (no */# support)

k='/.@~ABC~DEF~GHI~JKL~MNO~PQRSTUV~WXYZ+~~~ '
d='123456789~0'
g={c:(i/12,i%12/4,i%4)for i,c in enumerate(k)}
g.update(((c,(i/3,i%3,0))for i,c in enumerate(d)))
del g['~']
def f(s):
 s,a=[c for c in s[::-1].upper() if c in g],[]
 q=[1,1,1]
 while s:
  y,x,r=g[s.pop()]
  n,m,_=(9,9,9)if not s else g[s[-1]]
  v=y-q[x]
  q[x]=y
  a+=[(v&lt;0)*'-'+`x+1`+(v!=0)*`abs(v)`]+r*[`x+1`]+(c in k and(y,x)==(n,m))*['P']
 print','.join(a)