Выполнение сценария оболочки в .vimrc (и обработка вывода)

Я пытаюсь выполнить сценарий оболочки из .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

Таким образом для суммирования, как Вы получаете результат/вывод сценария, и почему оператор перехода не работает?

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

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

5
задан John Saunders 21 February 2010 в 01:10
поделиться

2 ответа

Действительно, фактический метод имеет приоритет над методом расширения. И просто дать понять - «порядок исполнения» предполагает, что оба могут называться; будет вызван только исходный метод. Возможно, выбрать другое имя/подпись; вы не можете использовать методы расширения для исправления обезьян, если это ваше намерение.

Если существует какой-либо базовый класс/интерфейс (который реализует тип), который не имеет этот метод, вы, возможно, могли бы поместить его туда...?

-121--2644555-

Я не удивлюсь, если есть почтовые клиенты, которые не смогут связать почту Blackberry с их потоками. Заголовок Thread-Index является расширением Microsoft.

Либо путь, Novell Evolution реализует это. Посмотрите на это краткое описание того, как они это делают, или на этот фрагмент кода , который находит родительский поток данного сообщения.

Я предполагаю, что, поскольку длины заголовков Thread-Index в вашем примере одинаковы, все эти сообщения были начальными? Странно, что они всего 22 байта, хотя я полагаю, что вы можете попробовать применить правило 5 байтов на сообщение к ним и посмотреть, работает ли оно для вас.

-121--2053901-
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, аргумент ключевого слова «normal» «выполняется так, как он набран», но, очевидно, это не так. Он работает нормально, когда я набираю его (в обычном командном режиме, без начала ':'), но не в сценарии ("E78: Unknown mark).

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

6
ответ дан 13 December 2019 в 05:34
поделиться

Я думаю, вы хотите использовать функцию 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|.

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

6
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: