lexima.vimでpythonのf|r|b|u-stringの閉じシングルクォートを自動入力するルール
環境
- 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かどうかの厳密な判定はしていないので期待とは違う動作です(自動入力されてしまう).ただし,これはレアケースなので許容しています.