Можете ли вы сказать Vim открыть файл, отличный от файла, переданного в командной строке, или: e? - PullRequest
3 голосов
/ 24 июня 2011

Я хочу научить Vim, как открывать модули Perl 5 с именами вроде File::Find. У меня уже есть скрипт-обертка, написанный на Perl 5, который обрабатывает командную строку (см. Ниже), но я хотел бы иметь возможность сказать что-то вроде :tabe File::Find и действительно выполнить его :tabe /home/cowens/apps/perlbrew/perls/perl-5.14.0/lib/5.14.0/File/Find.pm.

Мой текущий план - каким-то образом использовать autocmd BufNewFile и / или autocmd BufPreRead, но я не могу понять, как поменять имя файла.

#!/usr/bin/perl

use strict;
use warnings;

my @files = @ARGV;
for my $file (@files) {
    next if -f $file; #skip files that really exist

    #convert from module name to module file
    (my $module = $file) =~ s{::}{/}g;
    $module .= ".pm";

    #look for module in the include paths
    for my $dir (@INC) {
        my $candidate = "$dir/$module";
        if (-f $candidate) {
            $file = $candidate;
            last;
        }
    }
}

#replace this script with vim
exec "vim", "-p", @files;

Ответы [ 6 ]

4 голосов
/ 24 июня 2011

Doing

:verbose au BufReadCmd

Расскажет, как это делают другие типы плагинов (например, zip, netrw, fugitive).Пример вывода, который должен дать вам множество идей:

zip  BufReadCmd
    zipfile:* call zip#Read(expand("<amatch>"), 1)
    Last set from C:\Program Files\Vim\vim73\plugin\zipPlugin.vim
    *.zip     call zip#Browse(expand("<amatch>"))
    Last set from C:\Program Files\Vim\vim73\plugin\zipPlugin.vim

Network  BufReadCmd
    ftp://*   exe "silent doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(expand("<amatch>"))
    Last set from C:\Program Files\Vim\vim73\plugin\netrwPlugin.vim
    http://*  exe "silent doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(expand("<amatch>"))
    Last set from C:\Program Files\Vim\vim73\plugin\netrwPlugin.vim

fugitive_files  BufReadCmd
    *.git/index
              exe s:BufReadIndex()
    Last set from C:\Program Files\Vim\vimfiles\plugin\fugitive.vim
    *.git/*index*.lock
              exe s:BufReadIndex()
    Last set from C:\Program Files\Vim\vimfiles\plugin\fugitive.vim
    fugitive://**//[0-3]/**
              exe s:BufReadIndexFile()
    Last set from C:\Program Files\Vim\vimfiles\plugin\fugitive.vim
    fugitive://**//[0-9a-f][0-9a-f]*
              exe s:BufReadObject()
    Last set from C:\Program Files\Vim\vimfiles\plugin\fugitive.vim
3 голосов
/ 24 июня 2011

Рассмотрите возможность использования ctags.Если вы можете запустить процесс ctags над своим исходным кодом, вы должны быть в состоянии достичь точки, в которой вы просто делаете:

vim -t File::Find

У Vim есть информация об этом (:help vim) Я думаю, ctags , вероятно, выходит далеко за рамки того, что вы пытаетесь сделать, позволяя вам перейти от середины одного исходного файла к исходному определению функции в другом.

2 голосов
/ 24 июня 2011

Для открытия этих файлов вручную я бы рекомендовал использовать :find и :tabfind команды вместо :edit и :tabedit соответственно. Разница между этими двумя парами команд заключается в том, что первые выглядят для файла не только в текущем пути, но и в каталогах, перечисленных в Опция path (см. :help 'path'). Если вы добавите ваши Perl @INC каталоги Vim path, вы можете быстро найти файл модуля, используя :find или :tabfind команд. Например, чтобы открыть новую вкладку и редактировать File::Find файл модуля вы можете набрать

:tabfind File/Find.pm

(Вам не нужно вводить весь подпуть вручную, поскольку :find и :tabfind завершение учитывает текущее значение path.)

Для автоматического поиска этих файлов по имени модуля с помощью gf, ^Wf, ^Wgf, вам нужно дополнительно изменить (либо с помощью плагина типа файла, либо автокоманда) следующие параметры для файлов Perl.

:set isfname+=:
:set suffixesadd+=.pm
:set includeexpr=substitute(v:fname,'::','/','g')

После этих опций (а также опции path, содержащей Perl @INC каталоги), вы можете легко открывать файлы модуля, используя gf команды на соответствующие имена модулей.

0 голосов
/ 31 июля 2011

Вот рабочий пример , показывающий, как использовать BufReadCmd autocmd для редактирования файла, отличного от указанного (в этом случае редактирование соответствующего файла .scss при открытии файла .css).

0 голосов
/ 24 июня 2011

Это может быть возможно с помощью команды vim gf (перейти к файлу).

Если в вашем коде вы видите строку типа File :: Find, наведите на нее курсор и в обычном режиме введите gf.Для меня это сразу приводит меня к пакету File :: Find.

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

0 голосов
/ 24 июня 2011

Ленивое решение, основанное на ответе Сехе ниже.Текущие проблемы:

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

КогдаУ меня больше простоев, я надеюсь исправить все вышеперечисленное и превратить его в плагин.

в .vimrc

autocmd BufReadCmd * r!cat_perl %

в cat_perl

#!/usr/bin/perl

use strict;
use warnings;

sub cat {
    my $file = shift;
    open my $fh, "<", $file
        or die "could not open $file: $!";
    print while <$fh>;
    exit;
}

my $file = shift;

cat $file if -f $file;

#convert from module name to module file
(my $module = $file) =~ s{::}{/}g;
$module .= ".pm";

#look for module in the include paths
for my $dir (@INC) {
    my $candidate = "$dir/$module";
    cat $candidate if -f $candidate;
}
print "";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...