Запуск сценария оболочки в .vimrc (и обработка вывода) - PullRequest
5 голосов
/ 20 февраля 2010

Я пытаюсь запустить скрипт оболочки из файла .vimrc (в скрипте отмечены три проблемы):

function! CheckMe(file)
    let shellcmd = 'checkme '.a:file

    " Start the command and return 0 on success.
    " XXX: How do you evaluate the return code?
    execute '!'.shellcmd
    if !result
        return 0
    endif

    " Ending up here, the command returned an error.
    " XXX: Where to you get the output?
    let pair = split(output, '\S')
    let line = pair[0]
    let char = pair[1]

    " Jump to the errenous column and line.
    " XXX: Why does this not work?
    normal '/\%'.line.'l\%'.char.'c'
    return 1
endfunction

Итак, подведем итог: как вы получаете результат / вывод скрипта и почему оператор jump не работает?

Дополнительные детали:

  • Сценарий оболочки возвращает 0 в случае успеха и 1 в случае ошибки. В случае сбоя скрипт выводит два числа (номер строки и столбца) в стандартный вывод, разделенные пробелом.
  • Согласно Vim docs , аргумент "нормального" ключевого слова "выполняется так, как он напечатан", но, очевидно, это не так. Он отлично работает, когда я его набираю (в обычном командном режиме, без начального ':'), но не в сценарии ("E78: Неизвестная отметка).

Ответы [ 2 ]

6 голосов
/ 21 февраля 2010

Я думаю, что вы хотите использовать system() функцию вместо команды оболочки !.

со связанной страницы:

The result is a String.  Example:
            :let files = system("ls " .  shellescape(expand('%:h')))

и

The resulting error code can be found in |v:shell_error|.

Таким образом, ваш output будет получен в результате системного вызова, а ваш result - из v:shell_error. Тогда ваш прыжок должен сработать.

6 голосов
/ 21 февраля 2010
function! CheckMe(file)
    let shellcmd = 'checkme '.a:file

    let output=system(shellcmd)
    if !v:shell_error
        return 0
    endif

    " Are you sure you want to split on non-blanks? This 
    " will result in list of blank strings.
    " My variant:
    let [line, char]=split(output)

    " Normal is not an execute: this is what it will do:
    " «'/» means «Go to mark /», produces an error E78 because /
    " is not a valid symbol for mark. Than normal stops after error occured.
    " If you need to use variables in nomal use «execute 'normal '.ncmd».
    " And you can not use «normal» to perform search
    execute '/\%'.line.'l\%'.char.'c'
    " or
    call setpos('.', [0, line, char, 0])
    return 1
endfunction

Согласно документам Vim, аргумент "нормального" ключевого слова "выполняется так, как он напечатан", но, очевидно, это не так. Он прекрасно работает, когда я его набираю (в обычном командном режиме, без начального ':'), но не в сценарии ("E78: Неизвестная отметка).

Просто введите «'/», чтобы получить эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...