vim変数のヌル文字を取り除きますか?


7

使用しているプラ​​ットフォームの1つでvimのBackspaceの動作を修正しようとしています。bad_platformシステムのget_platformコマンドからこのプラットフォームの名前を取得します(それを呼び出します)。のアドバイスに従って、:help fixdeleteシステムコマンドの実行方法に関する知識と組み合わせて、次を.vimrcに追加しました。

let platform_name = system("get_platform")
if platform_name == "bad_platform"
  set t_kb=^?
  fixdel
endif

これはうまくいきませんでした。理由を調べるために、Vimセッションを開いて、を実行しました:echom platform_name。それは結果を与えましたbad_platform^@、ここで^@、文字通り「shift-6 shift-2」を入力して得られる2文字ではなく、NULL文字を推測します。

残念ながら、これには問題があります。== "bad_platform^@".vimrcがソースされている場合、^@行末文字として解釈されるように見えるため、これをに変更することはできません。これは、let platform_name = substitute(platform_name,"\^@","","")前に追加することもif機能しないことを意味します。

どうすれば対処できますか?前もって感謝します。

回答:


8

いくつかの選択肢:

  1. 技術的背景については See を\n使用して削除しますsubstitute(string, '\n$', '', ''):h NL-used-for-Nul

  2. すべての制御文字を削除します。 substitute(string, '[[:cntrl:]]', '', 'g')

  3. =~等号(==)の代わりに一致()演算を使用して比較

  4. system()コマンドからの出力の最後のバイトを取り除きます

    :let a=system('foobar')[:-2]


1
これらすべてが機能していることを確認できます。ありがとう!
サム・ラビン

1

Vimは文字列内の改行をヌル文字として表します。そのため、システムコマンドは末尾の改行文字列を(必要に応じて)返し、Vimはそれをヌルに変換しています。最後にその改行(nullとして表される)を削除する必要があります。

let platform_name = substitute(system('get_platform'), '\n\+$', '', '')

(一重引用符の代わりに二重引用符を使用する場合は、既存のバックスラッシュの前にバックスラッシュを追加してエスケープする必要があることに注意してください。)

\nパターンで使用されている理由は、上記で説明した理由と同じです。Vimの文字列内の改行の表現はnullです。


これは私にはうまくいきませんでした。しかし、@ Christianの#1に示されている構文はそうでした。
サム・ラビン

あなたは正しい、\\は\\でエスケープする必要があるか、二重引用符は単一である必要があります。私の答えを修正しました。
ヘプタイト

1

他の人が言ったように、vimは改行をヌルとして表します。改行を削除する別の方法は、シェルコマンドで行うことです。次のいずれかが機能します。

let platform_name = system('echo -n "$(get_platform)"')
let platform_name = system('printf "%s" "$(get_platform)"')
let platform_name = system("get_platform | tr -d '\\n'")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.