1 Востаннє редагувалося Teg Miles (19.06.2024 14:40:59)

Тема: Налаштування Vim як IDE для С++

Готові налаштування, які треба зберегти до файлу .vimrc(_vimrc для Windows),
для встановлення плагінів використовується Vim plug:

" Встановлення місця розташування плагінів.
call plug#begin(has('nvim') ? stdpath('data') . '/plugged' : '~/.vim/plugged')

" Оголошення переліку плагінів.

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " Плагін fzf, що дозволяє пошук файлів комадною Files
Plug 'junegunn/fzf.vim'
Plug 'dense-analysis/ale' " Плагін для підключення лінтерів, автодоповнення і так далі
Plug 'vim-airline/vim-airline' " Лінія внизу екрана з різноманітною інформацією
Plug 'preservim/nerdtree' " Файловий менеджер
Plug 'preservim/tagbar' " Вивід дерева наявних функції, структур і т.д. присутніх у файлі, потрібно встановлення ctags
Plug 'preservim/vim-indent-guides' " Вказівник відступів у рядках файлу
Plug 'dracula/vim', { 'as': 'dracula' } " Кольорова тема оформлення
Plug 'bfrg/vim-cpp-modern' "Підтримка сучасного синтаксису С++20/23
" Кінець переліку плагінів. Vim побачить їх після наступної команди.
call plug#end()

" Встановлення поточної кольрової схеми
colorscheme dracula

" Ввімкнення синтаксису та відступів
syntax enable
filetype plugin indent on

" Автодоповнення при друку
set completeopt=menu,menuone,preview,noselect,noinsert
let g:ale_completion_enabled = 1

" CDC = директорія поточного файлу стає поточною директорією
command CDC cd %:p:h

" Налаштування NERDTree

" Автозапуск NERDTree та переміщення курсору до вікна поруч.
"autocmd VimEnter * NERDTree | wincmd p

" Вихід з Vim, якщо NERDTree єдине вікно єдиної вкладки.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif

"Налаштування лінтерів ALE для С++
let g:ale_linters = {
\  'cpp': ['cc', 'gcc', 'clang', 'ccls', 'clangcheck', 'clangd', 'clangtidy', 'clazy', 'cppcheck', 'cpplint', 'cquery', 'cspell', 'flawfinder'],
\}

" Налаштування ALE С++
" Прив'язка файлів .h для C++, а не C
let g:ale_pattern_options_enabled = 1
let g:ale_pattern_options = { '\.h$': { 'ale_linters': { 'cpp' : ['cc', 'gcc', 'clang'] } } }
" Встановлення прапорців для gcc/clang
let opts = '-std=c++17 -Wall -Wextra'
let g:ale_cpp_cc_options    = opts
let g:ale_cpp_gcc_options   = opts
let g:ale_cpp_clang_options = opts
let g:ale_c_build_dir_names = ['build', 'bin', 'build/Debug', 'build/Release'] "Директорії, де ALE шукає compile_commands.json

" Показувати відступи за умовчанням
let g:indent_guides_enable_on_vim_startup = 1
" Розмір лінії відступів
let g:indent_guides_guide_size = 1

" Встановлення повноекранного розміру вікна при старті програми
if has("gui_running")
  " GUI is running or is about to start.
  " Maximize gvim window (for an alternative on Windows, see simalt below).
  set lines=38 columns=172
else
  " This is console Vim.
  if exists("+lines")
    set lines=38
  endif
  if exists("+columns")
    set columns=172
  endif
endif

" Встановлення стандартного штрифту
set guifont=Monospace\ 15

" Встановлення нумерації рядків
set number

" Встановлення вертикальної лінії-обмежувача на 80 символів максимум
set colorcolumn=80

" Дозвіл використовувати мишку
set mouse=a

" Використання курсора-лінії при режимі вставки та курсора-прямокутника в інших випадках.
"
" Reference chart of values:
"   Ps = 0  -> blinking block.
"   Ps = 1  -> blinking block (default).
"   Ps = 2  -> steady block.
"   Ps = 3  -> blinking underline.
"   Ps = 4  -> steady underline.
"   Ps = 5  -> blinking bar (xterm).
"   Ps = 6  -> steady bar (xterm).
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" Збереження останньої сесії та автоматичне відкриття її при запуску.
"autocmd VimLeave * nested if (!isdirectory($HOME . "/.vim")) |
"    \ call mkdir($HOME . "/.vim") |
"    \ endif |
"    \ execute "mksession! " . $HOME . "/.vim/Session.vim"

"autocmd VimEnter * nested if argc() == 0 && filereadable($HOME . "/.vim/Session.vim") |
"    \ execute "source " . $HOME . "/.vim/Session.vim"

" Автоматичне встановлення поточної директорії до поточного файлу
autocmd BufEnter * silent! lcd %:p:h

" Налаштування автодоповнення лапок і дужок
inoremap [ []<Left>
inoremap { {}<Left>
inoremap ( ()<Left>
inoremap ' ''<Left>
inoremap " ""<Left>

" Налаштування клавіш
" Збереження при натисканні F2
nmap <F2> :w<CR>
imap <F2> <Esc>:w<CR>i

" Перемикання між файлами .cpp та .h для С++ клавішею F4
map <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>

" Збирання проєкту С++ за допомогою makeprg версія Debug клавішею <F6>
map <F6> :!cmake -Bbuild/Debug -DCMAKE_BUILD_TYPE=Debug && cd build/Debug && make<CR>

" Показ / приховування NerdTree
nmap <F7> :NERDTreeToggle<CR>

" Відкрити перелік функцій tagbar
nmap <F8> :TagbarToggle<CR>

При роботі з CMake проєктами обов'язково додайте set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
до вашого CMakeLists.txt. Це автоматично створюватиме файл з командами compile_commands.json
в директорії побудови проєкту. Якщо не зробити цього, то ALE не бачитиме ваших хедерів.
Якщо не використовуєте CMake, такий файл можна згенерувати за допомогою інших плагінів.
Якщо потрібно, щоб програма виконувалася одразу після збирання
додайте наступне до вашого CMakeLists:

add_custom_command(
    TARGET назва вашого проєкту
    POST_BUILD
    COMMAND назва вашого проєкту
)
Подякували: FakiNyan, leofun012

2

Re: Налаштування Vim як IDE для С++

Ось оновлений файл моїх налаштувань для Vim, додав багато зручних дрібничок:

" Встановлення місця розташування плагінів.
call plug#begin(has('nvim') ? stdpath('data') . '/plugged' : '~/.vim/plugged')

" Оголошення переліку плагінів.

Plug 'rust-lang/rust.vim' " Основний плагін для Rust
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " Плагін fzf, що дозволяє пошук файлів комадною Files
Plug 'junegunn/fzf.vim'
Plug 'dense-analysis/ale' " Плагін для підключення rust analyzer і схожих додатків
Plug 'vim-airline/vim-airline' " Лінія внизу екрана з різномантіною інформацією
Plug 'preservim/nerdtree' " Файловий менеджер
Plug 'preservim/tagbar' " Вивід дерева наявних функції, структур і т.д. присутніх у файлі, потрібно встановлення ctags
Plug 'preservim/vim-indent-guides' " Вказівник відступів у рядках файлу
Plug 'dracula/vim', { 'as': 'dracula' } " Кольорова тема оформлення
Plug 'bfrg/vim-cpp-modern' " Підтримка сучасного синтаксису С++20/23


" Кінець переліку плагінів. Vim побачить їх після наступної команди.
call plug#end()

" Встановлення поточної кольрової схеми
colorscheme dracula

" Ввімкнення синтаксису та відступів
syntax enable
filetype plugin indent on

" Показати наявну табуляцію розміром в 4 пробіли
set tabstop=4
" При переносі з '>', використати ширину в 4 пробіли
set shiftwidth=4
" При натисканні кнопки tab вставляти 4 пробіли
set expandtab

" Додавання відступу після натискання вводу біля фігурних дужок
inoremap <expr> <cr> getline(".")[col(".")-2:col(".")-1]=="{}" ? "<cr><esc>O" : "<cr>"

" Автодоповнення при друку
set completeopt=menu,menuone,preview,noselect,noinsert
let g:ale_completion_enabled = 1

" Виведення інформації в спливному віконці при наведенні курсору
let g:ale_set_balloons = 1

" CDC = директорія поточного файлу стає поточною директорією
command CDC cd %:p:h

" Налаштування NERDTree

" Автозапуск NERDTree та переміщення курсору до вікна поруч.
"autocmd VimEnter * NERDTree | wincmd p

" Вихід з Vim, якщо NERDTree єдине вікно єдиної вкладки.
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif

"Налаштування лінтерів ALE для Rust і С++
let g:ale_linters = {
\  'cpp': ['cc', 'gcc', 'clang', 'clangcheck', 'clangd', 'clangtidy', 'clazy', 'cppcheck', 'cpplint', 'cquery', 'cspell', 'flawfinder',],
\}

" Налаштування фіксерів для C++, CMake
let g:ale_fixers = {
\  'cpp': ['clang-format'],
\  'cmake': ['cmakeformat'],
\}

" Застосування фіксера при збереженні
let g:ale_fix_on_save = 1

" Заборона автоматичного додавання include для С++
let g:ale_cpp_clangd_options = '-header-insertion=never'


" Налаштування ALE С++
" Прив'язка файлів .h для C++, а не C
let g:ale_pattern_options_enabled = 1
let g:ale_pattern_options = { '\.h$': { 'ale_linters': { 'cpp' : ['cc', 'gcc', 'clang', 'clangd'] } } }
" Встановлення прапорців для gcc/clang
let opts = '-std=c++20 -Wall -Wextra -Wpedantic -fsanitize=address,undefined -D_GLIBCXX_DEBUG -g -O0'
let g:ale_cpp_cc_options    = opts
let g:ale_cpp_gcc_options   = opts
let g:ale_cpp_clang_options = opts
let g:ale_c_build_dir_names = ['build', 'bin', 'build/Debug', 'build/Release'] "Директорії, де ALE шукає compile_commands.json


" Показувати відступи за умовчанням
let g:indent_guides_enable_on_vim_startup = 1
" Розмір лінії відступів
let g:indent_guides_guide_size = 1

" Встановлення повноекранного розміру вікна при старті програми
if has("gui_running")
  " GUI is running or is about to start.
  " Maximize gvim window (for an alternative on Windows, see simalt below).
  set lines=38 columns=172
else
  " This is console Vim.
  if exists("+lines")
    set lines=38
  endif
  if exists("+columns")
    set columns=172
  endif
endif

" Встановлення стандартного шрифту
set guifont=Monospace\ 15

" Встановлення нумерації рядків
set number

" Встановлення вертикальної лінії-обмежувача на 80 символів максимум
set colorcolumn=80

" Дозвіл використовувати мишку
set mouse=a

" Використання курсора-лінії при режимі вставки та курсора-прямокутника в інших випадках.
"
" Reference chart of values:
"   Ps = 0  -> blinking block.
"   Ps = 1  -> blinking block (default).
"   Ps = 2  -> steady block.
"   Ps = 3  -> blinking underline.
"   Ps = 4  -> steady underline.
"   Ps = 5  -> blinking bar (xterm).
"   Ps = 6  -> steady bar (xterm).
let &t_SI = "\e[6 q"
let &t_EI = "\e[2 q"

" Вимикання блимання курсору для gVim
set guicursor+=a:blinkon0

" Збереження останньої сесії та автоматичне відкриття її при запуску.
"autocmd VimLeave * nested if (!isdirectory($HOME . "/.vim")) |
 "   \ call mkdir($HOME . "/.vim") |
  "  \ endif |
   " \ execute "mksession! " . $HOME . "/.vim/Session.vim"

"autocmd VimEnter * nested if argc() == 0 && filereadable($HOME . "/.vim/Session.vim") |
 "   \ execute "source " . $HOME . "/.vim/Session.vim"

" Автоматичне встановлення поточної директорії до поточного файлу
autocmd BufEnter * silent! lcd %:p:h

" Налаштування автодоповнення лапок і дужок
inoremap [ []<Left>
inoremap { {}<Left>
inoremap ( ()<Left>
inoremap ' ''<Left>
inoremap " ""<Left>

" Налаштування клавіш

" Збереження при натисканні F2
nmap <F2> :w<CR>
imap <F2> <Esc>:w<CR>i

" Перемикання між файлами .cpp та .h для С++ клавішею F4
map <F4> :e %:p:s,.h$,.X123X,:s,.cpp$,.h,:s,.X123X$,.cpp,<CR>

" Збирання проєкту С++ за допомогою makeprg версія Debug клавішею <F6>
nmap <F6> :!cmake -Bbuild/Debug -DCMAKE_BUILD_TYPE=Debug && cd build/Debug && make<CR>
imap <F6> <Esc>:!cmake -Bbuild/Debug -DCMAKE_BUILD_TYPE=Debug && cd build/Debug && make<CR>

" Показ / приховування NerdTree
nmap <F7> :NERDTreeToggle<CR>
imap <F7> <Esc>:NERDTreeToggle<CR>i

" Відкрити перелік функцій tagbar
nmap <F8> :TagbarToggle<CR>
imap <F8> <Esc>:TagbarToggle<CR>i
Подякували: leofun011

3

Re: Налаштування Vim як IDE для С++

Порада щодо переміщення курсору в режимі вставки (insert mode):
Уникайте використання стрілок,
краще використовуйте Ctrl+h — для видалення символу ліворуч від курсору,
Ctrl+w — для видалення слова,
Ctrl+c — для виходу з режиму вставки і переміщення за допомогою h,j,k,l.
Використання стрілок уповільнює процес редагування,
окрім того вони є не на кожній клавіатурі.

4 Востаннє редагувалося Teg Miles (01.09.2024 16:08:59)

Re: Налаштування Vim як IDE для С++

Порада щодо перегляду доступних тем оформлення.
Наберіть наступну команду без квадратних дужок:

:colorscheme[пробіл][Ctrl+d]

Отримаєте перелік наявних тем оформлення і запрошення обрати якусь(:colorscheme [назва обраної теми]).
Аби щоразу не набирати все наново можна зробити ось таку прив'язку до клавіші клавіатури:
nmap <F9> :colorscheme <c-D>
imap <F9> <Esc> :colorscheme <c-D>