MS-Wordでのカーソル操作をEmacsキーバインドで幸せに行う方法

# 本記事の概要

Emacsを使って文章を書いていた人が、MS-Wordで文章を書こうとした時、Emacsのキーバインドでカーソルを操作できずストレスを感じることが多々あるのではないかと思います。

そのような方に向けて、MS-WordでもEmacsのキーバインドでカーソル操作ができるようにすることで快適に文章を作成できるようにする方法をお伝えします。

# 実施内容

実施することは以下の２点です。

- Visual Basic for Application(VBA)を利用しカーソル移動する各種のマクロを作成する
- Word上で、マクロにショートカットキーを割り当てる

MS-Wordを始めとするMS-Office製品は、Visual BasicのOffice向け版である「Visual Basic for Application(VBA)」でマクロを使用することができます。マクロを作成することで、たとえば、定形処理を簡単に繰り返し実行できるようにすることができます。

今回、VBAマクロを利用して、カーソル移動を行う各種マクロを作成し、Emacsのキー操作で各種マクロを実行できるようにWord上でショートカット登録することで、MS-WordでもEmacsキーバインドでカーソル操作をできるようにします。

ここでは端的に説明するため、「Control+n」時にカーソルを次の行に移動（下に移動）するようにWordの設定を行う方法をご説明します。

## カーソル移動するマクロの作成

まず、カーソルを次の行に移動するVBAマクロを作成します。

作成はWordに付属しているエディタ「Visual Basic Editor」を使用します。
Visual Basic Editorを起動するには、Word上で、メニュー「Tools」→「Macro」→「Visual Basic Editor」をクリックします。

<img width="798" alt="Screenshot 2019-12-26 21.10.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/8bf670e8-ed2b-02ca-9240-7d4e11b547ca.png">

Visual Basic Editorが起動します。
<img width="798" alt="Screenshot 2019-12-26 21.15.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/80f0dfef-3f88-760d-f044-164dbe29fa11.png">

左ペインの「Normal」を右クリックし、「Insert」→「Module」をクリックします。
「Module1」のようにモジュールが作成されます。
「Normal」にマクロを登録すると、全てのWordドキュメントにも適用されます。もし、特定のWordファイルに対して適用したい場合には、個々のドキュメントのProjectにマクロを保持するModuleを新規作成します。

<img width="798" alt="Screenshot 2019-12-26 21.17.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/912ec594-01b8-62a7-9f1b-b6133470b141.png">

右側のコードエディター上に、今回の「カーソルを次の行に移動する関数(Sub)」を記述します。
VBAでは以下のように記述します。なお、関数名は、NextLine()としています

```
Sub NextLine()
'
' NextLine Macro
    Selection.MoveDown Unit:=wdLine, Count:=1
End Sub
```

この時点で、Word上で上記マクロNextLine()を実行すると、カーソルが次の行に移動するようになります。

## マクロのショートカット登録

続いて、「Control + N」を押した時、作成したVBAマクロNextLine()を起動するように設定します。通常、Wordで「Control + N」を押すと、デフォルトでは、新しいドキュメントが起動するかと思います。Wordのショートカットの登録内容を変更し、マクロを起動するようにします。

やり方は以下のとおりです。

Wordのメニュー「Tools」→「Customize Keyboard」をクリックします。
<img width="798" alt="Screenshot 2019-12-26 21.31.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/8d3540bf-f705-403d-d2f6-64bb0bfac418.png">

キーの動作内容を設定するウィンドウが起動します。
<img width="477" alt="Screenshot 2019-12-26 21.32.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/55417235-a066-484f-0272-978416590bfc.png">


「Category」フィールドにて、「Macros」を選択します
<img width="477" alt="Screenshot 2019-12-26 21.35.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/6b7931e0-1aa6-535d-f5e7-cc59fc4703af.png">

「Macros」を選択すると、「Commands」フィールド上に先程作成したマクロ NextLine が表示されます。今回のショートカット設定対象となる「NextLine」をクリックして選択します。

次に、どのようなショートカットキーを割り当てるかを設定します。
「Press new keyboard shortcut」フィールドの「テキストボックス」をクリックします。下図のようにテキストボックスが選択されカーソルが表示された状態になります。
<img width="477" alt="Screenshot 2019-12-26 21.37.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/02dd2b97-8413-0ecb-c1a8-a24b9510091a.png">

次に、ショートカットキーを割り当てします。
今回割り当てるショートカットキーは「Control + n」ですので、「Control」キーと「n」キーを同時に押します。

<img width="477" alt="Screenshot 2019-12-26 21.44.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/49eda209-153f-3d9b-826c-4c656f6730c0.png">

すると、テキストボックスの下に、現在割当られているショートカットが表示されます。
通常は、「FileNewDefault」が割り当てられていますので、テキストボックスの右にある「Assign」ボタンをクリックして変更します。
この設定により、以後、「Control + N」キーを押すと、新たなドキュメントが作成されなくなり、カーソルが次の行に移動するようになります。

本記事では、「Control + N」のみですが、同じようにして、他のキーも設定することで、Emacsキーバインドでカーソル移動操作が実現できます。

Control + N以外のカーソル移動を行うVBAマクロについては以下を参考になさっていただければと思います。

```
Sub NextLine()
'
' NextLine Macro
    Selection.MoveDown Unit:=wdLine, Count:=1
End Sub

Sub PreviousLine()
'
' PreviousLine Macro
    Selection.MoveUp Unit:=wdLine, Count:=1
End Sub

Sub ForwardChar()
'
' ForwardChar Macro
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub

Sub BackwardChar()
'
' BackwardChar Macro
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
End Sub

Sub HeadLine()
'
' HeadLine Macro
    Selection.HomeKey Unit:=wdLine
End Sub

Sub EndLine()
'
' EndLine Macro
    Selection.EndKey Unit:=wdLine
End Sub

Sub NextPage()
'
' NextPage Macro
    Selection.MoveDown Unit:=wdScreen, Count:=1
End Sub

Sub PreviousPage()
'
' PreviousPage Macro
    Selection.MoveUp Unit:=wdScreen, Count:=1
End Sub

Sub Backspace()
'
' Backspace Macro
    Selection.TypeBackspace
End Sub

Sub Delete()
'
' Delete Macro
    Selection.Delete Unit:=wdCharacter, Count:=1
End Sub

Sub KillLine()
'
' Kill Line Macro
    Selection.EndKey Unit:=wdLine, Extend:=wdExtend
    Selection.Delete Unit:=wdCharacter, Count:=1
End Sub
```

本記事でご紹介する方法は、WindowsでもMacでも適用できます。
ご覧いただいた方の文章作成がより効率化されたら幸いです！

清田学