Получить имя текущего файла в Vim

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

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

Ответ 1

Я пытаюсь найти имя файла, который я редактирую внутри vim.

Для текущего буфера это даст вам имя файла,

echo "You're editing " bufname("%")

(просто поместите его в файл file.vim и введите его ": so%". Но я не думаю, что это то, что вам нужно.

Поэтому я могу использовать его для сопоставления F5 для компиляции этого файла для целей тестирования. Было бы здорово, если бы я мог распознать формат файла и выбрать соответствующий компилятор, но на самом деле не нужен. Если я нахожу имя файла, я мог бы сделать это сам. Но я действительно не могу найти способ получить имя файла, который я редактирую.

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

nmap <f5> :!compilername %<cr>

в cpp.vim, fortran.vim, python.vim и т.д. % дает имя текущего файла, который вы редактируете. Это выполнит компилятор, как если бы вы вызвали compilername file.cpp в командной строке.

Конечно, compilername будет отличаться для каждого типа файла; вы не собираетесь компилировать fortran с компилятором cpp, тогда вы ставите fortrancompiler %.

Это один из вариантов. Вы также можете попробовать выполнить команды autocmd для набора расширений в своем .vimrc, чтобы он распознал тип файла в соответствии с расширением файла. Это все стандартное использование vim, ничего необычного. Теперь я не уверен, как вы хотите это сделать, поэтому я просто укажу вам на Vim Wiki, где вы можете найти все виды статей, которые охватывают это (а также несколько советов для некоторых компиляторов).

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

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

Ответ 2

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

:!javac %

для запуска javac в текущем файле.

Вы можете узнать больше с помощью

:help filename-modifiers

Ответ 3

Другие пункты очень полезны. Я бы добавил, что вы, вероятно, захотите использовать: p, чтобы гарантировать, что имя файла будет передано как полностью квалифицированный путь. Без него Vim может передать его как путь, который относится к текущему пути Vim, который может быть или не быть тем же путем, что и компилятор. Таким образом, одно из решений:

nnoremap <silent> <f5> :!javac %:p<cr>

Если вы хотите автоматически определить тип файла, вы можете использовать AutoCommand

autocmd FileType java       nnoremap <buffer> <silent> <f5> :!javac %:p<cr>
autocmd FileType cpp        nnoremap <buffer> <silent> <f5> :!gcc %:p<cr>

Ответ 4

Как уже упоминалось, % расширяется до текущего файла. Если вы хотите получить эту строку в vim script, используйте expand("%").

Но вы можете просто установить makeprg на что-то вроде "compiler-command\ %" и запустить :make - вы получите поддержку быстрого исправления. (открыть окно ошибок/предупреждений с помощью :copen)

Ответ 5

Ну, он % как код замены внутри таких вещей, как: w. Поэтому : w blah% записывает копию вашего файла с добавлением "бла". Или !! echo% заменяет текущую строку на нее. Dunno, если это касается ваших потребностей или нет.

Ответ 6

Используйте % в качестве замены для вашего имени файла. Но лично я действительно думаю, что вы можете нажать :make, чтобы сделать именно то, что вы хотите.

Я делал именно то, чего вы хотите избежать: просто взломайте двухстрочный Makefile для каждой отдельной папки, в которой я был. Мне очень понравилась поддержка :make быстрого исправления, что взбивание двухстрочного файла Makefile просто показалось небольшие накладные расходы в большой картине.

... С тех пор я узнал лучше. Вы можете использовать autocmd или ftplugin, чтобы установить параметр makeprg, настроив :make на использование выбранной вами команды на основе текущего типа файла. Само по себе это экономит вам немного работы.

Проблема начинается, когда мы работаем с инструментом, сообщения об ошибках которого не похожи на GCC. Чтобы обойти это, vim также предоставляет параметр errorformat. errorformat очень сложный. Если вы действительно хотите узнать об этом, начните с :h error-format. В долгосрочной перспективе изощренность действительно велика. Это означает, что, как только вы узнаете, как использовать его, вы можете анализировать практически любой вывод компилятора и форматировать его для просмотра с помощью quickfix (:cope или :cl).

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

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

Как быстрая демонстрация, вот несколько строк, которые я взломал для моего файла .vim/ftplugin/haskell.vim:

setl makeprg=ghc\ --make\ %
setl errorformat=%E%f:%l:%c:,%C\ %.%m,%Z,%f:%l:%c:%m

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

Если вы закончите использование :make, я также рекомендую настроить ваш параметр switchbuf. Мне было немного неприятно нажимать ctrl-O после сборки, если quickfix возбуждается и перескакивает в неправильный файл. Я использую:

set switchbuf=useopen,usetab,newtab