Как написать функцию vim для вставки текста шаблона в текущий файл? - PullRequest
1 голос
/ 02 апреля 2019

В последнее время я учусь иди.

И я обнаружил, что во многих случаях мне нужно будет набрать следующий текст:

package main

import "fmt"

func main () {
}

Так что я подумал, что, возможно, я смогу написать некоторые функции vim в моем .vimrc, которые могут записывать текст шаблона в текущий файл при использовании vim. Что может сэкономить мне много работы.

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

Ответы [ 4 ]

2 голосов
/ 02 апреля 2019

Вы можете создать шаблон следующим образом:

Сначала создайте файл (например, base.go), который будет вашим шаблоном внутри фрагмента, который вы ввели в свой вопрос (я храню мои шаблоны в $HOME/.vim/templates/<language>/, так что в вашем случае это будет $HOME/.vim/templates/go/base.go , но местоположение зависит от вас на самом деле),

Затем в вашем .vimrc добавьте следующее отображение:

nnoremap <space>t :-1read $HOME/.vim/templates/go/base.go<CR>/{<CR>o

Это отображение выполняет следующие действия при нажатии space-t в обычном режиме:

  • содержимое файла $HOME/.vim/templates/go/base.go вставляется туда, где находится ваш курсор,
  • курсор перемещается в отверстие {,
  • Вы находитесь в режиме вставки в скобках.

Поэтому, когда вы открываете новый файл go, нажмите space-t, и он вставит ваш шаблон и поместит вас туда, где вы должны быть, чтобы начать кодирование.

EDIT: -1 указывает положение, куда вставлять содержимое файла (:.read file вставляет его сразу после текущей строки (.). -1 вставляет его сразу после текущей строки -1. Таким образом, это эффективно чтобы вставить его туда, где находится ваш курсор, и переместиться вниз по линиям, включая ту, на которой вы находитесь. Для получения дополнительной информации вы можете прочитать :help range.

Переход выполняется с помощью детали /{<CR>o, которая ищет { (/{), переходит к ней (<CR>) и переходит в режим вставки сразу после (o).

1 голос
/ 03 апреля 2019

:help templates показывает, как читать шаблон скелета при открытии нового файла.

Несколько плагинов расширения шаблона основаны на этом примитивном механизме и поддерживают такие вещи, как автоматические оценки (например,текущая дата, переменные окружения, встроенные выражения Vimscript).

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


Тесно связанные (с хорошим перекрытием): фрагменты похожи на встроенные :abbreviate на стероидах, обычно с вставками параметров, зеркальным отображением и несколькими остановками внутри них.Одним из первых, очень известных (и до сих пор широко используемых) плагинов Vim является snipMate (по мотивам редактора TextMate );к сожалению, это больше не поддерживается;хотя есть вилка .Современная альтернатива (для которой требуется Python) - UltiSnips .Более подробные сведения см. в этом списке на вики-подсказках Vim и . Это сравнение выполнено Марком Вебером .

. Оценить нужно три вещи: во-первых,сам механизм фрагментов, во-вторых, качество и широта фрагментов, предоставленных автором или другими лицами;в-третьих, как легко добавлять новые фрагменты.

1 голос
/ 02 апреля 2019

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

У меня есть настроенное расширение для режима вставки (последней строкой здесь),поэтому я просто набираю copy# и нажимаю ввод, и появляется этот текст.(Вы заметите, что текст не содержит звездочек комментария в последующих строках, это потому, что они автоматически добавляются, пока Vim «печатает» это для меня. Возможно, есть способ изменить это поведение, но это былохорошо для меня.)

function! InsertCopyright()
    let l:year = strftime("%Y")
    return
        \  "/**\n"
        \. "Copyright My Great Company, " . l:year . ". All rights reserved.\n"
        \. "/"
endfunction

iabbrev <expr> copy# InsertCopyright()
0 голосов
/ 02 апреля 2019

Я создал мое собственное решение на основе плагина ultisnips и работы Ноа Фредерика .Файл с именем: "ultisnips_custom.vim" должен быть размещен по адресу: after/plugin/ultisnips_custom.vim

Затем для каждого типа файла, который вы хотите вызвать заголовок, должен быть создан фрагмент с именем _skel.

Еще один совет: в коде, связанном ниже, триггер ultisnips был изменен на <c-j>, чтобы вы могли изменить его в соответствии со своими потребностями.

Вот мой код:

"             File: ultisnips_custom.vim - Custom UltiSnips settings
"       Maintainer: Sergio Araújo
" Oririnal Creator: Noah Frederick
"      Last Change: abr 02 2019 17:40
"      Place it at: after/plugin/ultisnips_custom.vim

" We need python or python3 to run ultisnips
if !has("python") && !has("python3")
  finish
endif

" This function is called by the autocommand at the end of the file
function! TestAndLoadSkel() abort
  let filename = expand('%')
  " Abort on non-empty buffer or extant file
  if !(line('$') == 1 && getline('$') == '') || filereadable('%')
    return
  endif

  " Load UltiSnips in case it was deferred via vim-plug
  if !exists('g:did_plugin_ultisnips') && exists(':PlugStatus')
    call plug#load('ultisnips')
    doautocmd FileType
  endif

  " the function feedkys simulates the insert key sequence in order to call
  " the template (skel)
  execute 'call feedkeys("i_skel\<c-j>")'
endfunction

augroup ultisnips_custom
  autocmd!
  au Bufnewfile *.sh,*.zsh,*.html,*.css,*.py,*.tex,*.md :call TestAndLoadSkel()
  "autocmd BufEnter *.sh,*.zsh,*.html,*.py execute 'call feedkeys("i_skel\<c-j>")'
augroup END

" vim: fdm=marker:sw=2:sts=2:et
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...