ottijp blog

lexima.vimでpythonのf|r|b|u-stringの閉じシングルクォートを自動入力するルール

  • 2025-08-23

環境

  • macOS: 15.5 (Sequoia)
  • vim: 9.1
  • lexima.vim: ab621e4756465c9d354fce88cff2bd1aa7887065

モチベーション

最近Pythonを使っていて,lexima.vimがpythonのf-string(r,b,uも)の閉じシングルクオートをデフォルトでは自動入力してくれないことに気づいたので,カスタムルールを追加しました.

修正前

Before           Input            After
---------------------------------------------------
print(f|         '                print(f'|
---------------------------------------------------
print(f|         "                print(f"|"
---------------------------------------------------

ダブルクォートの場合はデフォルトで期待通りに動いてくれます. シングルクォートは通常の英文でstaff's codeみたいにシングルクォート単発で使うことがあるので,アルファベット直後では閉じシングルクォートを自動入力しないようになっているのでしょうか?(たぶん)

ルール

次のように,f-stringの開始シングルクォートが入力されると,自動で閉じシングルクォートをカーソルの次に入力するルールを定義しました.

call lexima#add_rule({
      \ 'filetype': 'python',
      \ 'char': "'",
      \ 'at': '\(^\|[^a-zA-Z]\)\(f\|r\|b\|u\)\%#',
      \ 'input_after': "'",
      \})

leximaのルール定義だけで厳密にf-stringなのかどうかを判定するのは難しいので,f|r|b|uのアルファベット1文字の後でシングルクォートが入力された場合に自動入力するようにしています.

修正後

Before           Input            After
---------------------------------------------------
print(f|         '                print(f'|'
---------------------------------------------------
print(f|         "                print(f"|"
---------------------------------------------------
print("staff|    '                printf("staff'|
---------------------------------------------------
print("f         '                printf("f'|'
---------------------------------------------------

3つ目は一般的な英文中のシングルクォートで自動入力されないことの例です. 4つ目もそうなのですが,f-stringかどうかの厳密な判定はしていないので期待とは違う動作です(自動入力されてしまう).ただし,これはレアケースなので許容しています.


© 2025, ottijp