Заставить функцию VIM возвращать текст без отступа

#vim #scripting #macros #indentation

#vim #сценарии #макросы #отступ

Вопрос:

Я думаю, этот вопрос можно задать двумя способами…

  1. (Общий) — есть ли способ указать настройки ‘local’ для функции ( setlocal изменения, похоже, сохраняются после вызова функции)…

  2. (Специфично) — У меня есть функция, которая вызывается из imap сопоставления (которое принимает пользовательский ввод для передачи в функцию. Функция работает отлично, если я запускаю set paste or set noai | set nosi либо непосредственно перед запуском моего ярлыка, либо добавляю в саму функцию. Проблема в том, что каким бы способом я это ни делал, эти изменения настроек сохраняются после вызова моей функции.

По сути, мой рабочий процесс:

  1. В режиме вставки введите //// , после чего мне будет предложено ввести текст, который я ввожу и нажимаю enter.
  2. Функция вызывается с моим вводом. Мне нужна функция, чтобы отключить отступ, вернуть мою строку, а затем повторно включить предыдущие настройки. Строка будет просто комментарием PHP-блока, подобным этому:

     /**
     * Blah {INPUT TEXT}
     */
      

Приветствуются любые предложения. Мой скрипт в настоящее время выглядит следующим образом:

 function CommentInjector(txt)
  return "/**" ."<CR>"
      . " * foo " . a:txt . " bar " . "<CR>"
      . " */"
endfunction
imap <silent> //// <C-R>=CommentInjector(input("Enter some text:"))<CR>
  

Обновить

Удалось выяснить, по крайней мере, как вставить комментарий… Был бы признателен, если бы знал, как получить / восстановить настройки…

 function! CommentInjector(txt)
  set paste

  exe "normal! i/**<CR>"
            . " * fooo " . a:txt . " bar<CR>"
            . " */<Esc>"

  set nopaste
endfunction

map <C-C><C-C><C-C> :call CommentInjector(input("Enter some text:"))<CR>
  

Используя это, вы можете просто нажать Ctrl C 3 раза, ввести текст при запросе, и вы получите приятный комментарий. Предполагается, что вы отключили «установить вставку» перед запуском…

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

1. Итак, set nopaste в конце вашей функции у вас все еще есть set paste после запуска функции? Общий вопрос, который, я думаю, вы ищете let , см. :help let . Также вы пробовали snipMate или SnippetEmu? Они делают почти именно то, что вы хотите сделать, и даже больше.

2. Но что-либо после return не будет запущено, таким образом, оставляя его включенным. Есть ли какой-либо способ вернуть содержимое, не выходя из функции? Может быть normal ….?

3. Добавлено обновление для рабочего инжектора комментариев.

4. Я делаю подобные вещи с помощью iabbrev; я пишу весь блок комментариев (и предполагается, что автоматическое указание будет работать как обычно) и просто оставляю курсор на второй строке. (Последняя часть моей аббревиатуры — <C-O>k .)

Ответ №1:

Поскольку вы опубликовали обновление и на самом деле просто смотрите, как сохранить / восстановить настройки, я приведу общее решение.

  • При запуске вашей функции сохраните начальное значение параметра: let save_paste = amp;paste
  • Внесите любые изменения в paste , которые вы хотели бы внести
  • Восстановите его в конце: let amp;paste = save_paste

Пример этого можно найти в документации с :help use-cpo-save , где говорится о сохранении и восстановлении значения cpoptions .

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

1. Подразумевает ли амперсанд при вставке ссылку (а не по значению)?

2. Это ссылка на опцию Vim. Таким образом, вы можете использовать для сохранения и восстановления значений optios или просто изменять их

3. @lucapette правильно. Вторая часть задокументирована на :help let-amp; , но я не уверен насчет первой. Я просто всегда знал, что это получение значения из параметра.