Как использовать '^ @' в скриптах Vim? - PullRequest
3 голосов
/ 15 ноября 2010

Я пытаюсь обойти проблему с использованием символов ^ @ (т.е. <ctrl-@>) в скриптах Vim. Я могу вставить их в сценарий, но при запуске сценария кажется, что строка обрезана в точке, где находится ^ @.

Мое хитрое решение заключается в том, чтобы сохранить ^ @ в переменной, а затем ссылаться на переменную в скрипте всякий раз, когда я цитировал бы литерал ^ @. Может кто-нибудь сказать мне, что здесь происходит? Есть ли лучший способ обойти эту проблему?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2010

Это одна из причин, почему я никогда не использую необработанные значения специальных символов в скриптах. Хотя ^@ не работает, строка <C-@> в отображениях работает как положено, поэтому вы можете использовать один из

nnoremap <C-@> {rhs}
nnoremap <Nul> {rhs}

Странно, но вы не можете использовать <Char-0x0> здесь. Некоторые примечания о нулевом байте в строках:

  1. Вставка нулевого байта в строку усекает его: vim использует старые стриги в стиле C, заканчивающиеся нулевым байтом, поэтому он не может появляться в строках. Эти строки очень неэффективны, поэтому, если вы хотите сгенерировать очень большой текст, попробуйте собрать его в список строк (использование setline очень быстро, поскольку буфер представлен в виде списка строк).
  2. Большинство функций, которые возвращают список строк (например, readfile, getline(start, end)) или принимают список строк (например, writefile, setline, append), обрабатывают \n (NL) как ноль. Это также внутреннее представление строк буфера, см. :h NL-used-for-Nul.
  3. Если вы попытаетесь вставить символ \n в командную строку, вы увидите Null (но это действительно перевод строки). Если вы хотите отредактировать файл с \n в имени файла (это возможно в * nix), вам нужно будет добавить новую строку с обратной косой чертой.
2 голосов
/ 15 ноября 2010

Байт ctrl-@ также известен как '\0'.Многие языки, программы и т. Д. Используют его как маркер «конца строки», поэтому неудивительно, что vim запутывается там.Если вы должны использовать этот байт в середине строки скрипта, похоже, что ваш обходной путь - достойный.

...