vim нулевой символ, влияющий на строку ^@

#python-3.x #vim

Вопрос:

Я использую следующую функцию, чтобы получить выбранный тест

 let s:drawscript = "somerandom.py"

func! GetSelectedText()
  normal gv"xy
  let result = getreg("x")
  normal gv
  return result
endfunc

vnoremap <tab><tab> :<c-u>call Box(GetSelectedText())<CR>
func! Box(text)
    let s:b = '"' . a:text . '"'
    echom s:b
    " exec boxcmd
    "echom 'hi'
    let c = ["python3", s:drawscript, s:b]
    execute ":.!".join(c, " ")
endfunc
 

Я пытаюсь передать выбранный текст в свой файл python, это работает, когда я выбираю только 1 строку, но когда я выбираю несколько строк, в выбранном тексте есть символы»^@», которые вызвали автоматическое выполнение, что приводит к ошибке. Я просто хочу передать выбранный мной текст в файл .py.

текст

ошибка

Комментарии:

1. Вам нужно будет заменить любой нежелательный символ чем-то более удобным. Видеть :help substitute() . Также обратите внимание, что :.! работает на всей текущей линии. Похоже, вы подходите к своей проблеме с неправильной точки зрения.

Ответ №1:

Это вопрос экранирования специальных символов для оболочки. Хотя вы правильно подумали о цитировании текста, вы пропустили, чтобы избежать разделителя строк. Есть функция shellescape() , которая заботится об этом и многом другом, так что вы можете заменить

     let s:b = '"' . a:text . '"'
 

Автор:

     let s:b = shellescape(a:text, 1)