Вопрос: Как добавить строку в начало нового созданного файла автоматически в VIM?


Чтобы уточнить, что я хочу сделать, это:

  • если я создаю xxx.php,#!/usr/bin/env php будет первой строкой файла
  • если я создаю xxx.py,#!/usr/bin/env python будет добавлено первым.

Как я могу подойти к этому? Спасибо!


4
2018-06-25 03:10


Источник




Ответы:


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

Шаблоны творчества pythontmp.txt а также phptmp.txt в некотором направлении (пример:~/.vim/templates/), как показано ниже

#!/usr/bin/env python(php)

Добавьте следующую настройку: .vimrc

autocmd bufnewfile *.py :0r ~/.vim/templates/pythontmp.txt
autocmd bufnewfile *.php :0r ~/.vim/templates/phptmp.txt

9
2018-06-25 07:47



+1 Ответы на собственные вопросы полезны для SU (это также правильный способ сделать это). - msw


Не уверен, что вы можете настроить vim, чтобы сделать это без помощи. Вы могли бы создать вспомогательный скрипт, чтобы сделать это для вас.

Предполагая среду linux ... Этот скрипт проверяет расширение файла и при необходимости создает файл с заголовком перед вызовом vim.

#/bin/bash

type=`expr "\$1" : ".*\.\(.*\)"`   # Check the file extension

case "$type" in
    py) 
    interpreter=python;
    ;;
    php)
    interpreter=php;
    ;;
esac

if test ${interpreter+defined}; then echo "#!/usr/bin/env $interpreter" > $1 && /usr/bin/vim $1;
else /usr/bin/vim $1;
fi

Затем вы могли бы использовать этот скрипт вместо vim.

alias vim='/path/to/script.sh'

1
2018-06-25 07:02



Вы также можете исследовать плагины / скрипты vim - Tim Kane
Да, я сейчас нахожусь. ${interpreter+defined} Я должен удалить +defined и заставить его работать. - SpawnST
Это механизм (с использованием расширения параметров), чтобы проверить, определена ли переменная $ интерпретатора. Вы можете так же легко написать $ {interpreter + blah}, чтобы иметь тот же эффект. $ {var + word} #, если var определен, используйте «word»; в противном случае ничего - Tim Kane
о, я получил тебя, спасибо :) - SpawnST


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


1
2018-06-25 09:25



+1 да, много плагинов, которые упрощают встроенную функцию «autocmd». все это работает под условиями «шаблонов» и «скелетов». - akira


Мне действительно нравится подход к определению функции vim для работы, таким образом, становится намного проще выполнять более сложные вещи. Например, если вставленный текст зависит от имени файла, как это обычно делается с C / C ++. Мой C / C ++ выглядит так:

autocmd BufNewFile *.{h,hpp} call <SID>insert_c_gates() 

...

function! s:insert_c_gates()
   let gatename = <SID>get_gate_name()
   execute "normal i#ifndef " . gatename
   execute "normal o#define " . gatename
   execute "normal Go#endif /* " . gatename . " */"
   normal kk
endfunction

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


1
2018-06-25 14:05



Я чувствую, что ваше решение более мощное, хотя и не совсем понятное. - SpawnST
Собственно, играя с :exe+:normal (/:put) довольно громоздко поддерживать сравнение с решениями, такими как mu-шаблон (см. code.google.com/p/lh-vim/source/browse/mu-template/trunk/after/...). Извлечение функции генерации заголовка довольно просто до тех пор, пока поддержка плагинов расширений шаблонов вызывает «внешние» функции viml. - Luc Hermitte
Да, дело не в исполняемых и нормальных комбинациях (я писал эти много лет назад и не менял их с тех пор) ... но только в том, что, поставив там вызов функции, у вас есть доступ ко всем возможностям сценария vim вместо того, чтобы просто вставить шаблон. Плагины определенно обеспечивают некоторую легкость в использовании, но если вы хотите иметь собственное решение без плагина, функциональный подход является хорошей отправной точкой для всех решений. - Neg_EV
Что происходит в моей функции, так это то, что у меня есть func get_gate_name, что в зависимости от пути файла я определяю его имя (я держу свои проекты организованными в папке проектов таким образом, чтобы это позволяло мне это делать). Затем, когда у меня есть имя, я вставляю ворота (очень примитивным образом), используя обычные команды execute. Еще одна причина, по которой я это делаю, это то, что я написал функцию UpdateGates, которая дала файл с существующими воротами, я могу обновить их до того, что мне хотелось бы (например, если бы я переименовал файл). Это позволяет мне повторно использовать функции, в которых решение шаблона / плагина может быть не так просто сделать то же самое. - Neg_EV