2013-02-08 3 views
3

Я использую vim слишком много лет, чтобы рассчитывать, но я никогда не очень хорошо разбирался в vimscript. Я сейчас пытаюсь.Передайте переменную спать в vimscript

В любом случае, я хотел бы передать переменное количество времени функции сна. Я также хочу манипулировать этим значением, прежде чем передавать его. Вот простой пример.

function! wait(mil) 
    let timetowait = mil . "m" 
    sleep timetowait 
endfunction 

Даже если я пытаюсь предваряя timetowait с л: он говорит, "Недопустимый аргумент: л: timetowait".

Каков правильный способ передачи значения переменной для сна?

+0

Vim is asynch. Не уверен, сколько это будет для вас. – dman

ответ

5

Есть несколько проблем:

  • Вашего метод должен начинаться с заглавным именем
  • Вы должны получить доступ к аргументу с a:
  • Вы должны иметь пространство между временем спать и m
  • Вы должны выполнить сон косвенно используя execute

Вот пример того, как можно это сделать:

function! Wait(mil) 
    let timetowait = a:mil . " m" 
    exe 'sleep '.timetowait 
endfunction 
+0

Спасибо! Похоже, что он работает без пробела между числом и «м», но вызов выполнения - это именно то, что мне нужно. (Мой плохой пример пропустил имя 'a:' и заглавное имя, но у меня есть локально.) – devguydavid

+0

спасибо за класс =) –

3

ответ Даан является правильным; вот еще одна дополнительная информация:

Vimscript оценивается точно так же, как команды Ex, введенные в командной строке :. В ex переменных не было, поэтому их не указывать. При вводе команды в интерактивном режиме, вы, вероятно, использовать <C-R>= вставить содержимое переменной:

:sleep <C-R>=timetowait<CR>m<CR> 

... но в сценарии, :execute должен быть использован. Все литеральные части команды Ex должны быть указаны (одиночные или двойные кавычки), а затем объединены с переменными:

execute 'sleep' timetowait . 'm' 
+0

Это отличное объяснение. +1 – devguydavid