1. HOME
  2. »
  3. ソフトウェア
  4. »
  5. テキストエディタ
  6. »
  7. Vim
  8. »
  9. Vimで括弧とクォーテーションの最強補完機能を自作しよう!

Vimで括弧とクォーテーションの最強補完機能を自作しよう!

普段、テキストエディタとして、私はVimを使っています。
括弧の補完機能を便利にしたいと思い、今回はそれを自作してみようと思います。

目次
  1. 今回作成する補完機能について
  2. カーソル前後の文字列を取得する関数
  3. アルファベット、数字、全角文字かどうかを判定する関数
  4. カーソルの左右に括弧があるかどうかを取得する関数

今回作成する補完機能について

今回作る、括弧やクォーテーションの補完機能は、だいたい次のようなふうになります。

Vimでの括弧やクォーテーションの補完機能の作り方
  • 括弧を入力したとき、対応した閉じ括弧を自動的に入力する
  • 閉じ括弧が入力されたとき、カーソルの後ろに閉じ括弧があれば、入力せずにカーソルを右に移動する
  • クォーテーションが入力されたとき、場合に応じて、入力せずにカーソルを右にずらしたり、2つ入力したりする
  • 改行されたとき、カーソルの前後に括弧があったら、括弧の中心の行にカーソルを移動して、インデントをつける
  • スペースキーが押されたとき、カーソルの前後に括弧があったら、スペースを2つ入力する
  • 削除キーが押されたとき、カーソル前後のスペースや括弧を同時に削除
  • 文字列を選択して括弧を入力することで、その文字列を括弧で挟む
  • 文字列を選択してクォーテーションを入力することで、その文字列をクォーテーションで挟む

では、順番に作っていきましょう。
まず最初のこのページでは、この補完機能を作るための便利な関数を作っていきます。

※今回はJavaScriptのファイル(.js)で試しています。他の形式だと、動きが変わってしまったりします。

カーソル前後の文字列を取得する関数

補完機能を作るためには、カーソルの前後の文字がなにか、が重要になります。

そこで、カーソル前後の文字列を取得する関数を作っていきましょう。
まずは、カーソルの次の文字列を取得する関数です。

"カーソルの次の文字列を取得(引数は取得したい文字数)
function! GetNextString(length) abort
	let l:str = ""
	for i in range(0, a:length-1)
		let l:str = l:str.getline(".")[col(".")-1+i]
	endfor
	return l:str
endfunction

この関数の引数には、取得したい文字数を指定します。

また、カーソルの前の文字列を取得する関数も作っておきます。

"カーソルの前の文字列を取得(引数は取得したい文字数)
function! GetPrevString(length) abort
	let l:str = ""
	for i in range(0, a:length-1)
		let l:str = getline(".")[col(".")-2-i].l:str
	endfor
	return l:str
endfunction

さきほどのものと同様に、引数には、取得したい文字数を指定します。

アルファベット、数字、全角文字かどうかを判定する関数

補完機能を作る上で、もうひとつとても重要なものがあります。
それは、その文字が、アルファベットなのか、数字なのか、全角文字なのか、といった判定がです。

そういった判定は、正規表現を使います。

"アルファベットかどうかを取得
function! IsAlphabet(char) abort
	let l:charIsAlphabet = (a:char =~ "\a")
	return (l:charIsAlphabet)
endfunction

"全角かどうかを取得
function! IsFullWidth(char) abort
	let l:charIsFullWidth = (a:char =~ "[^\x01-\x7E]")
	return (l:charIsFullWidth)
endfunction

"数字かどうかを取得
function! IsNum(char) abort
	let l:charIsNum = (a:char >= "0" && a:char <= "9")
	return (l:charIsNum)
endfunction

どの関数も、引数には判定したい文字を指定します。
また、数字かどうかの判定では、数字の「文字」の判定をしたかったので、正規表現は使いませんでした。

カーソルの左右に括弧があるかどうかを取得する関数

つづいて、カーソルの左右に括弧があるかどうかを判定できる関数を作っていきます。

"括弧の中にいるかどうかを取得
function IsInsideParentheses(prevChar,nextChar) abort
	let l:cursorIsInsideParentheses1 = (a:prevChar == "{" && a:nextChar == "}")
	let l:cursorIsInsideParentheses2 = (a:prevChar == "[" && a:nextChar == "]")
	let l:cursorIsInsideParentheses3 = (a:prevChar == "(" && a:nextChar == ")")
	return (l:cursorIsInsideParentheses1 || l:cursorIsInsideParentheses2 || l:cursorIsInsideParentheses3)
endfunction

引数にはカーソルの前と後の文字をひとつずつ指定します。

ここまでで、括弧やクォーテーションの補完に必要な機能を作ることができました。
次のページから、ここまでで作った関数を使って、実際に補完機能を作っていきます。

スポンサードリンク

関連コンテンツ

オススメ記事

rufus

Rufusの使い方。ブータブルUSBを簡単に作成可能!

起動にとても時間がかかる@It_is_Rです。 Rufusは、起動可能なUSBドライブを作成するのに、とても便利なソフトです。今回はRufusの使い方ということで、CentOSのインストールU

UTMでM1 MacにUbuntuの仮想環境を構築してみよう!

Apple M1ではVirtualBoxなどの仮想化ソフトがうまく動かなかったりします。Parallels Desktop for MacがM1に対応しているとのことですが、できれば無料のものを使い

UTMでの仮想環境(Ubuntu)でWebサーバを立ち上げる方法

M1 MacではVirtualBoxがうまく動作せず、UTMを使っているのですが、UTMの情報がまだまだ少ない気がします。 さて、VPSなどで運用するサイトをお持ちの方でしたら、サーバなどの知

Windowsでパーティション管理。MiniTool Partition Wizardの使い方

パーティションは、複数作成することで、マシンやOSごとに領域を使い分けることができ便利なのですが、パーティションを管理するのは、すこし大変な面もあります。 パーティションを作成したいとき、削除

software

フリーテキストエディタ徹底比較。一番自分に合ったものを探そう!

こんにちは、@It_is_R です。 WEBページを作るときや、プログラミングをするとき、必須になるのがテキストエディタです。 よい機能を使うことで、プログラムのバグを防ぐことができます。

vagrant virtualbox

【 Mac 】 Vagrant と VirtualBox のインストール方法。

夢は大きければ大きいほど、叶わない。@It_is_Rです。 今回の記事は、Vagrant & VirtualBox のインストール方法です。 サイトからダウンロードしてインストール

Excel

Excelの使い方。初心者でもすぐ分かる!基本を実践で完全解説

パソコンのソフトって無駄に高いですよね。。。 それなのに、学校の授業などで Microfost Office は必要となってきます。 しかし、そんなあなたに朗報です。 Office Online を

DeepL翻訳を使ってみよう!Chrome拡張機能もあり!

英語などの外国語を日本語に翻訳したり、逆に日本語を外国語に翻訳したりするときに便利な翻訳ソフトですが、中でもDeepL翻訳は、自然で高精度な翻訳が可能です。 今回はDeepL翻訳について紹介し

franz

便利すぎ! Franz 5で普段使うチャットサービスを管理してみよう!

Franzは様々なチャットサービス等を、1つのアプリ上で管理できる便利なツールです。 このツールを初めて使ってみたのですが、一瞬で使いたいチャットサービス等を開くことができ、とても便利なので、今

【Vim使い方】Vimの画面を分割して使う方法。画像付きで分かり易く!

ブログの正式タイトルが、英語表記からカタカナ表記に変更になりました。 それに合わせてロゴも作っていこうと思っています。@It_is_Rです。 皆さんブログのタイトルに興味はないと思うので、本題に移ろ

コメントを残す(コメントは承認後に反映されます)

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