VIM: Показать функцию/класс PHP в командной строке?

Есть ли способ показать текущую функцию PHP или имя класса в командной строке VIM? Я нашел плагин для отображения имен функций C в строке состояния, но это не работает для PHP, и в любом случае я предпочитаю использовать командную строку для сохранения ценных вертикальных строк.

Спасибо.


person dotancohen    schedule 26.02.2012    source источник


Ответы (2)


ИЗМЕНИТЬ

При поиске чего-то совершенно не связанного с помощью TagList я только что нашел эти две функции:

Tlist_Get_Tagname_By_Line()
Tlist_Get_Tag_Prototype_By_Line()

Добавление этого в мою строку состояния прекрасно работает:

%{Tlist_Get_Tagname_By_Line()}

Кроме того, вы читали Vim Wiki? В нем есть куча из советов, пытающихся удовлетворить ту же потребность. Существует также этот (непроверенный) плагин.

ЗАВЕРШИТЬ ИЗМЕНЕНИЕ

Если вам не хватает вертикального пространства, возможно, вы не против использовать немного горизонтального пространства?

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

Тем не менее, я не особенно люблю постоянно отображать всевозможную информацию (список файлов, статус VCS, список тегов, список буферов/вкладок…): возможность прочитать название функции, которой вы занимаетесь. in полезен только когда вам действительно нужно это знать, иначе это беспорядок. Мне достаточно собственного [{ Vim, за которым следует <C-o>.

person romainl    schedule 26.02.2012
comment
Спасибо, я уже делаю [{ ^O в сочетании с scrolloff=3, чтобы увидеть контекст. Однако часто, когда я ищу большие файлы, мне нужно знать, где находится каждый результат поиска, и я не могу [{ ^O для каждого результата поиска, а номера строк не предоставляют достаточно информации. Мне действительно нужна доступная информация. Точно так же TagList и TagBar тоже не подходят для моего варианта использования, хотя в прошлом я пробовал TagList. - person dotancohen; 27.02.2012
comment
@dotancohen, ты нашел решение? Смотрите мой комментарий для других идей. - person romainl; 12.03.2012
comment
Спасибо, romainl, я играю с этим скриптом, который вы упомянули, пытаясь заставить его соответствовать моим потребностям. Оригинал (и мое улучшение) страдают от серьезной ошибки, и я убивал с ней часы. Я заставлю эту штуку работать, и, похоже, награда твоя! Спасибо. - person dotancohen; 16.03.2012
comment
Прохладный. Если вам удастся устранить эту ошибку, убедитесь, что ваш форк где-то доступен. - person romainl; 16.03.2012
comment
Да, конечно. Я только что разместил сообщение об ошибке здесь, на SO, поскольку даже сделал сокращенный тестовый пример сводит меня с ума. Но я уже вижу, что как только ошибка будет устранена, это правильный путь, поэтому я уже отмечаю вас наградой. Огромное спасибо! - person dotancohen; 16.03.2012

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

Мое предположение состоит в том, что функции PHP объявляются с использованием синтаксиса function MyFunction(){}, а классы объявляются с использованием class MyClass{} (возможно, им предшествует public). Следующая функция выполняет поиск в обратном направлении от позиции курсора, чтобы найти последний объявленный класс или функцию (и устанавливает startline). Затем мы ищем вперед первый { и находим соответствующий }, настройку endline. Если начальная строка курсора находится между startline и endline, мы возвращаем текст startline. В противном случае мы возвращаем пустую строку.

function! PHP_Cursor_Position()
    let pos = getpos(".")
    let curline = pos[1]
    let win = winsaveview()
    let decl = ""
    let startline = search('^\s*\(public\)\=\s*\(function\|class\)\s*\w\+','cbW')
    call search('{','cW')
    sil exe "normal %"
    let endline = line(".")
    if curline >= startline && curline <= endline
        let decl = getline(startline)
    endif
    call cursor(pos)
    call winrestview(win)
    return decl
endfunction

set statusline=%{PHP_Cursor_Position()}

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

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

person Prince Goulash    schedule 16.03.2012
comment
Спасибо, князь, сейчас тестирую! Я полагаю, что для C я могу добавить в условия поиска int, void и тому подобное. Просто чтобы вы знали, php-классы не могут начинаться с public, хотя функции могут. Я отчитаюсь через несколько минут. - person dotancohen; 17.03.2012
comment
Я обновил строку поиска следующим образом: ^\s*\(static\|public\|private\)\=\s*\(static\|public\|private\)\=\s*\(static\|public\|priva te\)\=\s*\(function\|class\)\s*&\=\w\+, чтобы разрешить ссылочные функции и ключевые слова static и private. Спасибо. Я уверен, что вы заметили, что я уже назначил награду, но я очень ценю, что вы показали мне этот подход. - person dotancohen; 17.03.2012
comment
Рад помочь - я точно не охотился за головами, я просто хотел продемонстрировать другой метод. Я не думаю, что моя функция будет хорошо работать для C, потому что начало строки с int, void и т. д. может соответствовать объявлениям переменных вместо функций. - person Prince Goulash; 19.03.2012
comment
Я полагаю, что можно #define static int, тогда коллегам будет интересно редактировать файл! И я знал, что ты не охотишься за головами, а искренне помогаешь. Я видел ваши сообщения по другим вопросам VIM, которые я просматриваю. Благодарю вас! - person dotancohen; 19.03.2012