ryotatake blog

Webエンジニア

Vim Scriptで初めてのコマンド作成

初めてVim Scriptの文法について少し学習したので、とりあえず動くものを作ってみよう、ということで.vimrcに実行可能な関数を書いてみました。

今回やったことは、コマンドを打ったらカレントバッファに指定された文字列が入力されるようにすることです。最近勉強しているC++のファイルを効率よく書けるように、テンプレートを入力してくれる関数とそれを呼び出すコマンドを作成しました。

コードに改善の余地はたくさんあると思いますが、今回学んだ文法についても説明させていただきます。

cppファイル用のテンプレート入力コマンド

作ったもの

:CplusTemplateと入力すると、

#include <iostream>

using namespace std;

int main() {

  return 0;
}

を入力してくれます。

f:id:ryotatake:20190303122643g:plain
cppファイル用テンプレート

コードの説明

以下を.vimrcに書きました。

function! CplusTemplate()
  return setline('.', ['#include <iostream>', '', 'using namespace std;', '', 'int main() {', '', '  return 0;', '}'])
endfunction
command CplusTemplate :call CplusTemplate()
  • function Funcname()...endfunctionで囲うことで関数を定義できます。function!とすることで、関数の再定義ができます。

  • setline( {ターゲット行}, '{文字列}' )で、カレントバッファの指定した行を文字列で置き換えることができます。

    • ターゲット行として'.'を使うと、現在カーソルがある行が指定されます。
    • 第二引数に文字列の配列を渡すと、それぞれの文字列が改行されて出力されます。
  • command {Command} :call Funcname()で関数を呼び出すコマンドを指定できます。
    • :Commandで関数を実行できるようになります。

ヘッダーファイル用のテンプレート入力コマンド

作ったもの

:CplusTemplateHeaderと入力すると、

#ifndef _{FILENAME}_H_
#define _{FILENAME}_H_

#endif // _{FILENAME}_H_

を入力してくれます。

f:id:ryotatake:20190303121926g:plain
ヘッダーファイル用テンプレート

コードの説明

以下を.vimrcに書きました。

function! CplusTemplateHeader()
  let filename = expand("%:r")
  let filenameConst = '_' . toupper(filename) . '_H_'
  return setline('.', ['#ifndef '. filenameConst, '#define ' . filenameConst, '', '#endif //' . filenameConst])
endfunction
command CplusTemplateHeader :call CplusTemplateHeader()

上の方で既出のものは省略します。

  • let {variable} は値を代入するときに使います。一度let x = 1としていても、その後でletを省略してx =2とはできません。代入時には必ずletが必要です。
  • expand("%:r")は現在のファイル名の拡張子を除いたものを返します。%:rの部分を変えることでいろいろな形でファイル名を取得できます。
  • let filenameConst = '_' . toupper(filename) . '_H_'.は、文字列の結合を表します。
    • toupper()は引数の文字列を大文字に返してくれる組み込みの関数です。

おわりに

この一年ほどよく理解せずにおすすめの.vimrcの設定等をコピペして使っていましたが、実際に自分で書いてみて理解が深まりました。

最後にVim Scriptについて調べるのに使ったサイトをまとめておきます。

Vim script と vimrc の正しい書き方@nagoya.vim #1

Vimスクリプトリファレンス — 名無しのvim使い

usr_41 - Vim日本語ドキュメント