Humanity

Edit the world by your favorite way

制御文字を含んだ文字をVimの:mapに渡すような文字列に変えられるか?

結論:できた

いくつかの例外を除いて

  1. :map*1で何らかのlhsに制御文字を含んだ文字列を:executeで渡す
  2. maparg()で取得

だけでできる。コード見た方が早いかも。


簡単に説明すると、多くのプログラミング言語で「foo\nbar」は「foo<改行>bar」として扱われるけど、エスケープシーケンスを含んだ文字列から実際の文字列への変換ではなくて、その逆、実際の文字列からエスケープシーケンスを含んだ文字列への復号化。


ちなみに逆、つまり:mapの引数のような文字列から制御文字への変換は簡単。
実装例はarpeggioのs:unescape_lhs()とかeskkのeskk#util#eval_key()とか見ると分かる。
arpeggioのが短くてわかりやすいと思う。Vim正規表現に慣れてれば。*2
eskkも余裕があったらarpeggioのやり方にするつもり。


まぁこれができたからってどういう場合に使うのかよくわからないけど...

*1:nmapでもnnoremapでもなんでもいい

*2:まさか正規表現でそれぞれのキーに分けられるとは思わなかった。ネストしなければ正規表現ってやっぱ万能だな