neovim: Nvim-Rとvim-stataのコマンドをスペースキーに割り振る

統計解析にはRとStataを利用している山本です。neovimでプログラムを編集して、RとStataにコマンドを送って、解析をしています。RにもStataにもスペースでコマンドを送る設定にしていたのですが、macOS MojaveからCatalinaに乗り換えた途端、うまく機能しなくなってしまいました。ファイルタイプごとにneovimの設定ファイルを作成するのがいいみたいです。

neovimからRにコマンドを送る

neovimからRにコマンドを送って実行するNvim-Rパッケージでは、カーソルが存在する行のコマンドを実行するショートカットのデフォルトは、¥L(¥に続いてLを入力する)ですが、コマンドを実行するたびに¥Lを入力するのは面倒です。

そこで、~/.config/nvim/init.vimにおいて、¥Lに相当する機能をスペースキーに割り当てていました。

nmap RDSendLine

neovimからstataにコマンドを送る

neovimからStataにコマンドを送って実行するvim-stataパッケージでは、選択された行のコマンドを実行するショートカットのデフォルトはF9です。したがって、カーソルが存在する行のコマンドを実行するためには、シフト+Vで実行する行を選択してから、F9を入力しないといけません。

そこで、~/.config/nvim/init.vimにおいて、シフト+スペースにシフト+VとF9を割り当てることで、シフト+スペースでカーソルの存在する行をstataに送る設定にしていました。

nmap <Space> <S-v><F9>

Rでもstataでも、スペースキーでコマンドを送る

Rにはスペースでコマンドを送り、stataではスペース+シフトでコマンドを送っていましたが、どうせならどちらもスペースでコマンドを送りたくなりました。そこで、~/.config/nvim/init.vimに下記を記載して、ファイルの拡張子に応じて、スペースに割り当てる機能を自動的に選択することにしました。

augroup MyGroup
    autocmd!
    autocmd BufRead,BufNewFile *.R  nmap <Space> <Plug>RDSendLine
    autocmd BufRead,BufNewFile *.do nmap <Space> <S-v><F9>
augroup END

macOS 10.14 Mojave時代は上記でうまくいっていたのですが、先日Catalinaに乗り換えたところ、RにもStataにもスペースでコマンドを送れなくなってしまいました。

いろいろ調べてみると、環境によってはinit.vimで設定したファイルタイプ別autocmdはうまく機能しないそうです。.config/nvim/ftplugin/にファイルタイプ別の設定ファイルを作成すれば、環境に依存しない安定した設定を行うことができます。

File Type dependent key mapping

ファイルタイプを確認する

RとStataのプログラムファイル(.Rと.do)のファイルタイプを確認してみましょう。nvimでプログラムファイルを開き、:set filetype?を実行すれば、ファイルタイプを確認できます。

nvim *.R
:set filetype?
filetype=r

nvim *.do
:set filetype?
filetype=stata

.Rファイルと.doファイルは、ファイルタイプr、stataとして認識されています。

RおよびStataの設定ファイルを作成する

R用の設定は、.config/nvim/ftplugin/r.vimに記載します。

mkdir ~/.config/nvim/ftplugin
nvim .config/nvim/ftplugin/r.vim

下記を記載して保存します。

nmap <Space> <Plug>RDSendLinezz

Stata用の設定は、.config/nvim/ftplugin/r.vimに記載します。

nvim .config/nvim/ftplugin/stata.vim

下記を記載して保存します。

nmap <Space> <S-v><F9>

.Rファイルを読み込んだときはr.vimの設定が読み込まれ、.doファイルが読み込んだ時はstata.vimの設定が読み込まれるようになりました。

これで、RでもStataでもカーソルが存在する行のコマンドを、スペースのみで実行できるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください