#vim #scripting #macros #indentation
#vim #сценарии #макросы #отступ
Вопрос:
Я думаю, этот вопрос можно задать двумя способами…
-
(Общий) — есть ли способ указать настройки ‘local’ для функции (
setlocal
изменения, похоже, сохраняются после вызова функции)… -
(Специфично) — У меня есть функция, которая вызывается из
imap
сопоставления (которое принимает пользовательский ввод для передачи в функцию. Функция работает отлично, если я запускаюset paste
orset noai | set nosi
либо непосредственно перед запуском моего ярлыка, либо добавляю в саму функцию. Проблема в том, что каким бы способом я это ни делал, эти изменения настроек сохраняются после вызова моей функции.
По сути, мой рабочий процесс:
- В режиме вставки введите
////
, после чего мне будет предложено ввести текст, который я ввожу и нажимаю enter. -
Функция вызывается с моим вводом. Мне нужна функция, чтобы отключить отступ, вернуть мою строку, а затем повторно включить предыдущие настройки. Строка будет просто комментарием 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;
, но я не уверен насчет первой. Я просто всегда знал, что это получение значения из параметра.