Скрипт для начинающих: ^ @ появляется в конце текста - PullRequest
3 голосов
/ 24 февраля 2011

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

function! CreateShebang()
    call inputsave()
    let program = input('Enter the program name: ')
    call inputrestore()
    let path = system('which ' . program)
    call append(0, '#!' . path)
endfunction

Кстати, я только начинаю с vim scrips, поэтому, если вы заметили какие-то неправильные функции и концепции или знаете лучший способ достижения результата, пожалуйста, сообщите мне. Любая помощь очень ценится.

Большая проблема заключается в том, что после запуска сценарии запрашивают имя программы правильно, а затем добавляют в файл нечто подобное:

#!/usr/bin/perl^@

Что это ^@ делает там?

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

Ответы [ 2 ]

4 голосов
/ 24 февраля 2011

^@ в конце команды - это новая строка, переведенная в NULL функцией append(), см. :h NL-used-for-Nul (это причина, по которой ваш substitute(...\%d000...) работал, пока в вашей строке нет NULL).Поскольку команда which всегда выводит символ новой строки в конце строки, я предлагаю вам немного изменить код, добавив [:-2] в конец вызова system().Эта конструкция удалит только последний байт вывода функции:

let path = system('which ' . program)[:-2]

Если вы используете замену, используйте

let path=substitute(path, '\n', '', 'g')

, не путайте себя с \% d000, что семантически неверно.

1 голос
/ 24 февраля 2011

Возможно, вывод команды which содержит символ NULL.

Функция system() заменяет разрывы строк на <NL> с. (от :help system()). Поэтому вы могли бы сделать:

let path = substitute(system('which ' . program), '\%x00', '', 'g')

В противном случае вы можете сделать следующее:

function! CreateShebang()
    call inputsave()
    0 put = '#!/usr/bin/env ' . input('Enter the program name: ')
    call inputrestore()
endfunction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...