6

Я пытаюсь исправить поведение Backspace в vim на одной из платформ, которые я использую. Я получил название этой платформы (назовите ее 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^@ , где ^@ - это, я думаю, символ NULL, а не буквально два символа, которые вы получаете, набрав shift-6 shift-2.

К сожалению, это представляет проблему. Я не могу изменить его на == "bad_platform^@" , потому что когда источник .vimrc получен, кажется, что ^@ интерпретируется как символ конца строки. Это означает, что добавление let platform_name = substitute(platform_name,"\^@","","") до if также не работает.

Как я могу справиться с этим? Заранее спасибо.

3 ответа3

7

Некоторые альтернативы:

  1. Удалите \n используя substitute(string, '\n$', '', '') См . :h NL-used-for-Nul для технического фона

  2. Удалить все контрольные символы: substitute(string, '[[:cntrl:]]', '', 'g')

  3. Сравните, используя операцию соответствия (=~) вместо равной (==)

  4. Удалите последний байт вывода из команды system ()

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

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'")
1

Vim представляет новые строки в строках как нулевой символ, поэтому происходит то, что ваша системная команда возвращает строку с завершающим символом новой строки (как и должно быть), а Vim преобразует ее в ноль. Вам просто нужно удалить эту новую строку (представлен как ноль) в конце:

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

(Обратите внимание, что если вы используете двойные кавычки вместо одинарных кавычек, вам придется добавить дополнительные обратные слеши перед существующими обратными слешами, чтобы избежать их.)

Обратите внимание, что причина использования \n в шаблоне - та же самая причина, которую я объяснил выше; Представление Vim новых строк в строках является нулевым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .