Продолжение. Предыдущая статья - тут.
Мы остановились на поиске по файлам
Надо сказать, для меня это очень актуальная возможность, в смысле выполнять поиск по файлам внутри проекта. Иногда по фрагменту требуется найти файл, в котором этот фрагмент находится - вот тут этот самый поиск по файлам более чем актуален. Но, разумеется, такой функциональности из коробки NVIM не предоставляет. Воспользуемся сторонним плагином: ctrlsf. Чтобы его поставить требуется добавить в конфигурационный файл, в секцию добавления плагинов, следующий текст:
Plug 'dyng/ctrlsf.vim'
И выполнить команду :PlugInstall
Плагин выполнится и... с очень высокой вероятностью ничего не заработает: требуется, чтобы было предустановлено какое-то из следующих приложений: ack, ag, pt или rg. Я выбрал ag - тут обещали более быстрый поиск. Вот тут https://github.com/ggreer/the_silver_searcher - инструкция по установке. Сразу после установки всё заработало. Ура!
:ctrlSF шаблон-поиска - и открывается окошко с найденными совпадениями. Если набрать :pwd - можно определить, в какой папке происходит поиск. При необходимости, можно перейти в нужную командой :cd folderName, однако может этого и не потребоваться.
Кстати, пока я устанавливал этот шаблон - выяснилось, что со старыми версиями (у меня была установлена 0.2.2) - есть проблемы. Дабы не решать их - обновился до последней доступной. Все настройки сохранились.
Итак, чтобы искать нужно (подробней):
- :ctrlSF шаблон_поиска - найти все вхождения
- :ctrlSF шаблон_поиска /путь_поиска - найти все вхождения по указанному пути
- :ctrlSF -R шаблон_поиска - найти все вхождения, но искать по регулярным выражениям
- :h ctrlSF - для справки по плагину
Вообще, настроек у плагина довольно много. А я не то, чтобы так часто пользуюсь данной функцией, так что остальные пока пропущу. А если что-то потребуется что-то необычное - найду.
Переход по номеру строки
Это важно. Очень часто находишь сообщение об ошибке, мол, в такой-то строке. И надо бы к этой строке перейти. Тут это оказалось очень просто: для того, чтобы перейти, скажем, к строке 30 надо набрать команду :30. И всё.
Поиск файла по нечёткому имени
Тут нам поможет плагин fzf. Ссылка, что я привёл, указывает не только на плагин, но и на саму утилиту. Описание установки плагина - тут.
Добавляем плагин (в секцию плагинов):
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
После этого может потребоваться несколько раз запустить :PlugInstall (у меня, по крайней мере, с первого раза не сработало ничего).
После этого можно запустить командой :FZF. Я упрощу себе задачу и привяжу её к сочетанию кнопок ctrl+alt+p (изначально я хотел ctrl+shift+p, но мой терминал уже использует эту комбинацию). Для этого добавим строку повыше секции плагинов:
nnoremap <C-A-p> :FZF<CR>
Традиционно, команда :h FZF покажет справку по плагину.
Но нам тут надо будет запомнить всего несколько сочетаний кнопок:
- выбор + Enter - открыть в текущем окне нужный файл
- ctrl+x - разделить окно пополам, открыть файл в половинке
- ctrl+q - закрыть окно поиска
Поиск объявленных функций и переменных
Это довольно важный в моей работе функционал. Для этого воспользуемся функциональностью ярлыков. Для этого установим tagbar. Добавим в блок плагинов текст:
Plug 'majutsushi/tagbar'
А затем сохраним (:w) и выполним команды
- :source %, активное окно - файл конфигурации - это обновит конфигурацию
- :PlugInstall - установка плагина
Теперь, если зайти в файл (в моём случае файл на Perl) и набрать команду :Tagbar - откроется окно с переменными и функциями файла:
Также добавлю "горячую" кнопку, чтобы удобней было бы переключать панель ярлыков:
nnoremap <F8> :Tagbar<CR>
Это позволит легче находить нужные файлы.
ctrl+p / ctrl+n в панели ярлыков позволит переключаться между найденными ярлыками. Enter - перенесёт к нужному месту в файле. F1 откроет справку с командами. Всё довольно просто.
Всё хорошо, но одно меня смущает: отсутствует нечёткий поиск по ярлыкам: хочется упростить поиск. Для этого используем ещё один плагин - ctrlp. Установка - добавить строку в область плагинов:
Plug 'majutsushi/tagbar'
Затем :w, :source %, :PlugInstall. За справкой, традиционно, :h CtrlP. Это позволит сразу установить плагин. Для улучшения удобства работы - добавлю комбинацию ctrl+g для открытия панели нечёткого поиска по ярлыкам (ctrl+g):
nnoremap <C-g> :CtrlPBufTag<CR>
Примечательно, что этот плагин заменил мне сразу два других: tagbar и fzf. Их я, пока что, удалять не стану, понаблюдаю.
Единственно, что он немного портит - это комбинация ctrl+p, которая открывает панель поиска по файлам по-умолчанию. Данная комбинация используется много где, так что это может создать некоторую трудность.
На всякий случай приложу свой конфигурационный файл целиком (много в нём было сделано изменений с самого начала):
" При поиске текста большие буквы равны маленьким буквам
set ignorecase
" Возможность удаления спецсимволов
set backspace=indent,eol,start
" автоотсутп
set autoindent
" длина истории команд
set history=50
" на нажатию кнопки tab при вводе команды - будет предлагаться набор подходящих команд
set showcmd
" подсвечивать подходящий шаблон в тексте по мере его ввода
set incsearch
" кодировка для ввода, например, при поиске текста
set encoding=utf-8
" кодировка при работе с файлами
set fileencoding=utf-8
" отображать номера строк (1..N)
set number
" Разрешить импорт файлов настройки
filetype plugin on
" Управление деревом:
nnoremap <leader>n :NERDTreeFocus<CR>
"nnoremap <C-n> :NERDTree<CR>
nnoremap <C-t> :NERDTreeToggle<CR>
nnoremap <A-f> :NERDTreeFind<CR>
"открывать дерево при входе
autocmd VimEnter * NERDTree | wincmd p
" посмотреть, какие доступные буферы есть
nnoremap <C-A-b> :buffers<CR>
"открыть панель поиска по файлам
nnoremap <C-A-p> :FZF<CR>
" Работа с ярлыками файлов
nnoremap <F8> :Tagbar<CR>
" открытие по ctrl+g панели поиска по ярлыкам
nnoremap <C-g> :CtrlPBufTag<CR>
call plug#begin('~/.local/shared/nvim/plugged')
" Дерево файлов
Plug 'preservim/nerdtree', {'on': 'NERDTreeToggle'}
" поиск по всем файлам папки
Plug 'dyng/ctrlsf.vim'
" нечёткий поиск
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
" поиск по тэгам файла
Plug 'majutsushi/tagbar'
" поиск по тэгам, файлам - всё в одном
Plug 'ctrlpvim/ctrlp.vim'
call plug#end()
Окончание первой части - тут.