プログラミング

iTerm2でvimに複数行ペーストすると途中で途切れてしまう。bracket pasteをオフにして解消したけれども...

2023年5月11日

Terminal EmulationのTerminal may enable paste bracketingをオフにして解消した。

結構前からたまにペーストすると途中で途切れてて、実行したらエラーになるみたいなことがあって、イラッとしながらも途切れた箇所からコピペしてやり過ごしてたんだけど、今日も遭遇してさすがにこれはわけわからんすぎるやろということで調べたらこれでした、これをみずからONにした記憶がないのでバージョンアップでこうなったっぽい。

flyerhzm/rails_best_practices: a code metric tool for rails projects https://github.com/flyerhzm/rails_best_practices#custom-configuration

AddModelVirtualAttributeCheck: { }
AlwaysAddDbIndexCheck: { }
#CheckSaveReturnValueCheck: { }
#CheckDestroyReturnValueCheck: { }
DefaultScopeIsEvilCheck: { }
DryBundlerInCapistranoCheck: { }
#HashSyntaxCheck: { }
IsolateSeedDataCheck: { }
KeepFindersOnTheirOwnModelCheck: { }
LawOfDemeterCheck: { }
#LongLineCheck: { max_line_length: 80 }
MoveCodeIntoControllerCheck: { }
MoveCodeIntoHelperCheck: { array_count: 3 }
MoveCodeIntoModelCheck: { use_count: 2 }
MoveFinderToNamedScopeCheck: { }
MoveModelLogicIntoModelCheck: { use_count: 4 }
NeedlessDeepNestingCheck: { nested_count: 2 }
NotRescueExceptionCheck: { }
NotUseDefaultRouteCheck: { }
NotUseTimeAgoInWordsCheck: { }
OveruseRouteCustomizationsCheck: { customize_count: 3 }
ProtectMassAssignmentCheck: { }
RemoveEmptyHelpersCheck: { }
#RemoveTabCheck: { }
RemoveTrailingWhitespaceCheck: { }
RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
ReplaceInstanceVariableWithLocalVariableCheck: { }
RestrictAutoGeneratedRoutesCheck: { }
SimplifyRenderInControllersCheck: { }
SimplifyRenderInViewsCheck: { }
#UseBeforeFilterCheck: { customize_count: 2 }
UseModelAssociationCheck: { }
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
UseObserverCheck: { }
#UseParenthesesInMethodDefCheck: { }
UseQueryAttributeCheck: { }
UseSayWithTimeInMigrationsCheck: { }
UseScopeAccessCheck: { }
UseTurboSprocketsRails3Check: { }

rails_best_practices.ymlをvimにコピペするときに起きたんですが、こういったデフォルトの設定ファイルをvimにまるごとコピペしてカスタマイズするみたいなシーンってそこそこありますよね。rubocopとかnginx.confとかmy.cnfとかなんでもそうなんですけど、30行くらいあったらtypoするかもしれないし、手打ちは時間がかかるし、諦めて素直にコピペしますよね。

iTermのドキュメントを見ると

Terminal Profile Preferences - Documentation - iTerm2 - macOS Terminal Replacement https://iterm2.com/documentation-preferences-profiles-terminal.html

貼り付け操作の前後に制御シーケンスを送信するらしい、Vimにペーストしたときに自動インデントが無効になる場合があるため便利、でも予期しない動作が発生することがありますとのこと。

まさしく、その予期しない動作になっててつらい、なんで副作用のある設定がデフォルトでオンになるの...。

:set pasteしてgg=Gやフォーマッターに任せればいいから個人的にはいらない。

iTerm以外のターミナルに移行したら問題ないのかな、ということでGithub漁ってみた。

terminal · GitHub Topics https://github.com/topics/terminal

terminalのハッシュタグをみてみると以下の順で人気らしい。

microsoft/terminal: The new Windows Terminal and the original Windows console host, all in the same place!https://github.com/microsoft/terminal

Eugeny/tabby: A terminal for a more modern age https://github.com/Eugeny/tabby

alacritty/alacritty: A cross-platform, OpenGL terminal emulator. https://github.com/alacritty/alacritty

vercel/hyper: A terminal built on web technologies https://github.com/vercel/hyper

この中からTabbyを入れてみた。

Tabbyもブラケットペーストがオンになっていたので、最近のターミナルはデフォルトでオンにしているのかも。

もしかしたら普段仕事で使ってるWindows Terminalもそうなのかも。

こうなってくると安易にオフにしてしまっていいのか…。という気持ちになってくる。

いままでどおり途切れたところからコピペし直すか、クリップボードツールを使うか、面倒だけど一時的にbracket pasteをオフにするか、cURLでHTMLを取得して手作業で整形するなどにしたほうがいいかもしれない。

vimにはペーストできるけど、zshはできないみたいな制御ができると一番いいんだけど。

あとはiTerm2のEdit > Paste Special > Warn Before Multi-Line Pasteをオンにしても手元の環境では警告ダイアログがでなくなってて、これが出るようになれば多少マシになりそうなんだけど。

と思ってみてたら、Edit > Paste Special > Limit Multi-line Paste Warning to Shell Promptがオンになっていて、ペーストしたときにシェルかどうかを判断してくれていてシェルのときだけ警告ダイアログがでるようになっていた、シェルで複数行ペーストしたら警告ダイアログがでたので問題なさそう。

-プログラミング