Найти в Дзене
Сделай игру

NVIM для разработчика (3)

Продолжение. Предыдущая статья - тут. Мы остановились на поиске по файлам Надо сказать, для меня это очень актуальная возможность, в смысле выполнять поиск по файлам внутри проекта. Иногда по фрагменту требуется найти файл, в котором этот фрагмент находится - вот тут этот самый поиск по файлам более чем актуален. Но, разумеется, такой функциональности из коробки NVIM не предоставляет. Воспользуемся сторонним плагином: ctrlsf. Чтобы его поставить требуется добавить в конфигурационный файл, в секцию добавления плагинов, следующий текст: Plug 'dyng/ctrlsf.vim' И выполнить команду :PlugInstall Плагин выполнится и... с очень высокой вероятностью ничего не заработает: требуется, чтобы было предустановлено какое-то из следующих приложений: ack, ag, pt или rg. Я выбрал ag - тут обещали более быстрый поиск. Вот тут https://github.com/ggreer/the_silver_searcher - инструкция по установке. Сразу после установки всё заработало. Ура! :ctrlSF шаблон-поиска - и открывается окошко с найденными совпаден
Оглавление

Продолжение. Предыдущая статья - тут.

Мы остановились на поиске по файлам

Надо сказать, для меня это очень актуальная возможность, в смысле выполнять поиск по файлам внутри проекта. Иногда по фрагменту требуется найти файл, в котором этот фрагмент находится - вот тут этот самый поиск по файлам более чем актуален. Но, разумеется, такой функциональности из коробки 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 покажет справку по плагину.

Вызов панели FZF
Вызов панели FZF

Но нам тут надо будет запомнить всего несколько сочетаний кнопок:

  • выбор + Enter - открыть в текущем окне нужный файл
  • ctrl+x - разделить окно пополам, открыть файл в половинке
  • ctrl+q - закрыть окно поиска

Поиск объявленных функций и переменных

Это довольно важный в моей работе функционал. Для этого воспользуемся функциональностью ярлыков. Для этого установим tagbar. Добавим в блок плагинов текст:

Plug 'majutsushi/tagbar'

А затем сохраним (:w) и выполним команды

  • :source %, активное окно - файл конфигурации - это обновит конфигурацию
  • :PlugInstall - установка плагина

Теперь, если зайти в файл (в моём случае файл на Perl) и набрать команду :Tagbar - откроется окно с переменными и функциями файла:

Tagbar в действии
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()

Окончание первой части - тут.