Linux для пользователей и разработчиков, первые настройки
Table of Contents
Настроим свежую машину с Fedora38 для комфортной работы разработчика.
Быстрый старт #
Кому не интересно читать всю заметку, вот список пакетов необходимых для работы. Для остальных же — устанавливаем все пакеты и идем разбираться ниже, что для чего и как это настраивать.
Обновляем репозитории и ставим пакеты #
Включаем все репозитории, в том числе и с проприетарным ПО, таким как драйверы видеокарт Nvidia, если это не было сделано при установке:
Идем в Software, далее следуем скриншотам:
Включаем Flatpak, отсюда мы будем ставить львиную долю ПО, которая ищется на flathub.org:
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
Обновляем репозитории:
sudo dnf update -y
Ставим нужные пакеты:
sudo dnf install -y git tmux tree zsh ranger screen neovim duf bat make htop
Docker, docker-compose #
Ставим docker и docker-compose:
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager \
--add-repo \
https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Установка кодеков #
sudo dnf install gstreamer1-plugins-{bad-\*,good-\*,base} gstreamer1-plugin-openh264 gstreamer1-libav --exclude=gstreamer1-plugins-bad-free-devel
sudo dnf install lame\* --exclude=lame-devel
sudo dnf group upgrade --with-optional Multimedia
Твикаем Gnome-4* #
Установим gnome-tweak и подкрутим некоторые штуки:
sudo dnf install gnome-tweaks
И включаем для Legacy окон принудительно нашу тему:
Устанавливаем менеджер расширений и сами расширения:
flatpak install flathub com.mattjakeman.ExtensionManager
Мой список расширений:
Сами расширения можно поискать тут.
.net core и ruby для разработчиков #
Всё, что ниже — опционально, потому что это все можно запускать в Docker, не засоряя вашу машину, но мне иногда больше нравится играться с CLI ruby или что-то быстренько пробовать с .net вне докер-образа.
Ставим .NET (.net core 7)
sudo dnf install dotnet-sdk-7.0
Ставим Ruby:
sudo dnf install ruby
sudo dnf install rubygem-{tk{,-doc},rake,irb,test-unit}
Терминал — общаемся с машиной текстом #
Часто нужно сделать что-то простое, вроде создания новой папки или файла, а GUI для того зачастую
ужасно неудобные, например, в Windows, в их Explorer, нужно ткнуть в свободно место правой кнопкой
мыши, выбрать Create new folder
, ввести название файла и тд. Пример высосан из пальца, но
смотрите, как быстро я сделаю это в терминале:
mkdir <new_dir_name>
Или, если нам понадобилось добавить много вложенных папок, мы можем использовать ключ -p:
mkdir -p <dir_1>/<dir_2>/<dir_n>
Или, вот уже более полезный пример, мне часто нужно конвертировать .png изображения в .webp, но я не хочу их конвертировать по одному или как-то еще, я просто хочу сказать компьютеру о своих намерениях и всё, например, сконвертируй все файлы с расширением .png в .webp, которые ты найдешь в этой папке, но… я забыл эту команду, там было что-то с .png… Не беда, терминал дружелюбен:
history | grep .png
Нашли нужную, выполним:
for f in *.png; do cwebp -q 100 -mt $f -o ${f%.*}.webp; done
Столько воды для того, что бы убедить вас, что терминал — ваш друг. Не надо бояться и искать красивые GUI, чтобы клацать по ним манипулятором типа мышь © Диджитализируй
Oh-my-ZSH #
Стандартно у вас установлен Bash. Мы же поставим ZSH и твикнем его надстройкой Oh-my-zsh.
Установим Oh-my-ZSH:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Oh-my-ZSH предложит выбрать по умолчанию ZSH-шелл. Выбираем. Закрываем терминал и все, все круто.
Если вдруг открывается опять Bash, назначаем руками шеллом по умолчанию для вашего юзера ZSH:
chsh -s $(which zsh)
Проверяем, установился ли по умолчанию у нашего юзера нужный шелл:
grep $USER /etc/passwd
Должны получить это:
<username>❌1000:1000:Armstrong:/home/<username>:/usr/bin/zsh
Настройки Oh-my-ZSH #
Файл настроек Oh-my-ZSH лежит в директории ~/.zshrc
, можете отредактировать его любым текстовым
редактором и перечитать (команда source <dir>/<file_name>
), чтобы применить настройки.ш
Для примера прокинем какой-нибудь удобный alias для терминала:
echo "alias glog=\"git log --pretty=oneline\"" >> ~/.zshrc \
source ~/.zshrc
Всякие повседневные удобности #
duf — показывает, сколько рыбоф еще поместится на hdd/ssd #
Иногда нужно посмотреть, сколько осталось свободного места, а вызывать тот же nautilus
и клацать мышью по
примонтированным устройствам не очень удобно.
Для просмотра свободного и занятого дискового пространства обычно предустановлен df
, используется просто:
df -h
Вывод будет примерно таким
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 7.7G 4.7M 7.7G 1% /dev/shm
tmpfs 3.1G 2.0M 3.1G 1% /run
/dev/nvme0n1p8 180G 75G 102G 43% /
tmpfs 7.7G 2.9M 7.7G 1% /tmp
/dev/nvme0n1p6 511M 18M 494M 4% /boot/efi
tmpfs 1.6G 156K 1.6G 1% /run/user/1000
/dev/sr0 5.2M 5.2M 0 100% /run/media/<username>/<device_title>
Не очень наглядно и тяжело ориентироваться (я отсюда еще половину всяких /loop0n
убрал, чтобы меньше путаницы было).
Если красивая альтернатива duf. Делает все тоже самое, только аккуратнее и понятнее:
duf
╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 9 local devices │
├────────────────────────────────────┬────────┬────────┬────────┬───────────────────────────────┬──────────┬────────────────┤
│ MOUNTED ON │ SIZE │ USED │ AVAIL │ USE% │ TYPE │ FILESYSTEM │
├────────────────────────────────────┼────────┼────────┼────────┼───────────────────────────────┼──────────┼────────────────┤
│ / │ 179.4G │ 74.5G │ 101.7G │ [########............] 41.5% │ btrfs │ /dev/nvme0n1p8 │
│ /boot/efi │ 511.0M │ 17.4M │ 493.6M │ [....................] 3.4% │ vfat │ /dev/nvme0n1p6 │
│ /run/media/<username>/<device> │ 5.2M │ 5.2M │ 0B │ [####################] 100.0% │ iso9660 │ /dev/sr0 │
╰────────────────────────────────────┴────────┴────────┴────────┴───────────────────────────────┴──────────┴────────────────╯
╭────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 5 special devices │
├────────────────┬──────┬────────┬───────┬───────────────────────────────┬──────────┬────────────┤
│ MOUNTED ON │ SIZE │ USED │ AVAIL │ USE% │ TYPE │ FILESYSTEM │
├────────────────┼──────┼────────┼───────┼───────────────────────────────┼──────────┼────────────┤
│ /dev │ 4.0M │ 0B │ 4.0M │ │ devtmpfs │ devtmpfs │
│ /dev/shm │ 7.7G │ 4.6M │ 7.6G │ [....................] 0.1% │ tmpfs │ tmpfs │
│ /run │ 3.1G │ 2.0M │ 3.1G │ [....................] 0.1% │ tmpfs │ tmpfs │
│ /run/user/1000 │ 1.5G │ 152.0K │ 1.5G │ [....................] 0.0% │ tmpfs │ tmpfs │
│ /tmp │ 7.7G │ 2.9M │ 7.6G │ [....................] 0.0% │ tmpfs │ tmpfs │
╰────────────────┴──────┴────────┴───────┴───────────────────────────────┴──────────┴────────────╯
Уже куда красивее и понятнее!
Всю справку можно получить по duf -h
, либо же почитать README.md в репозитории автора.
bat — красиво вывести текстовый очень файл #
Для того, чтобы посмотреть содержимое текстового файла, можно сделать так:
cat ~/.bashrc
Вывод будет читаемый, но не очень удобный и без навигации. less
тоже не слишком удобный будет для этих целей, хотя и тот и тот инструменты
очень шустрые и 100% выполняют свои задачи. Всему этому есть очень прикольная альтернатива с vim-подобным управлением, которая называется
bat.
Ну что, попробуем:
Ommm, So pretty good! Навигация jk
работает, и всякие комбинации Shift + g
, g
, поиск по /<word>
и тд, которые работают в vim
для навигации также работают. Если будучи в bat
назать h
, то вы попадете в справку по навигации в bat
. Не поленитесь почитать ее,
либо посмотреть в репозитории автора.
htop — отобразить нагрузку и процессы #
Есть такая утилита, как top
, она предустановлена во всех системах и показывает нагрузку на систему и запущенные процессы. Отображает,
как это водится, не в очень удобном формате.
Инструмент мощный, и всё в нем есть в целом, но… Мы будем пользоваться htop.
Не вижу смысла особо подробно останавливаться на этой утилите, вот вам 2 картинки, как оно смотрится и погнали дальше.
Git, расскажем о себе #
Git должен уметь использовать любой разработчик. Но не все озадачиваются чуть-чуть его поднастроить.
Расскажем git наше имя и нашу почту, чтобы условный gitlab или github матчил наш аккаунт с нашими коммитами, а то бывает, что коммитят будто бы два разных человека.
git config --global user.name "<Your> <Name>"
git config --global user.email "<your_email>"
Чтобы посмотреть настройку, просто добавляем --get
:
git config --global --get user.name
NeoVim — переосмысление VI и VIM #
Тут еще одна шутка о том, что кто-то опять не смог выйти из VIM.
Безусловно можно исопльзовать любой редактор кода, хоть тот же VScode. Все это легко устанавливается на Fedora. Но я хочу привести несколько аргументов в пользу “неудобного” на первый взгляд любого VIM-подобного редактора:
- Однообразие рабочего пространства. Нам, как разработчикам, приходится работать как на сервере, так и на своей рабочей машине. VIM есть на любой linux-машине. Научившись 1 раз работать с ним, мы никогда не сядем в лужу, когда нам срочно понадобится твикнуть какой-то конфиг руками прям на сервере.
- Скорость. VIM крайне шустрый. Дурацкий пример, но все же: попробуйте загрузить JSON-файл на 20-30 тысяч строк в VScode или какой-то другой редактор, а потом еще и поиском попробуйте воспользоваться.
- VIM очень гибкий. На него, как и на VScode, можно навесить очень много разных плагинов, очень точно настроить сам view-port редактора или вовсе переназначить хоткеи. С появлением LSP надобность в IDE с их IntelliSence вообще отпадает.
- Существует много программ с VIM-подобным управлением, например Ranger. Так что знание VIM никогда не будет чем-то бесполезным.
Теперь перейдем к настройке. Мы не будем использовать ванильный Vi или VIM, а поставили форк от VIM который называется NeoVim.
Предварительные манипуляции #
Создадим файл настроек NeoVim:
touch ~/.config/nvim/init.vim
Предварительно поставим PlugInstall, через него мы будим устанавливать плагины для NeoVim:
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
И шрифт, который нужен для плагина devicons:
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts && curl -fLo "Droid Sans Mono for Powerline Nerd Font Complete.otf" https://github.com/ryanoasis/nerd-fonts/raw/2.1.0/patched-fonts/DroidSansMono/complete/Droid%20Sans%20Mono%20Nerd%20Font%20Complete.otf
Сами шрифты лежал тут.
Я буду писать в основном на Ruby и мне нужно будет использовать
Solargraph для LSP сервера, так что я
дополнительно прокину путь в $PATH
переменную, добавив эту строку в ~/.zshrc
куда-нибудь в конец:
export PATH=$PATH:"/home/owlpaw/bin"
Не забываем перечитать файл:
source ~/.zshrc
Установим сам Solargraph:
gem install solargraph
И поставим ripgrep для поиска по содержимому через Telescope:
sudo dnf install -y ripgrep
Далее предлагаю вставить мой конфиг:
Откроем наш файл конфигурации:
nvim ~/.config/nvim/init.vim
Для Ruby вставляем такой конфиг (включает LSP и Telescope):
" Plugins
call plug#begin()
Plug 'morhetz/gruvbox' "https://github.com/morhetz/gruvbox
Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons'
Plug 'neovim/nvim-lspconfig'
Plug 'hrsh7th/nvim-compe'
Plug 'hrsh7th/vim-vsnip'
Plug 'nvim-lua/popup.nvim'
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim'
Plug 'thoughtbot/vim-rspec'
Plug 'tpope/vim-rails'
Plug 'tpope/vim-endwise'
call plug#end()
" Enable Ruler
set ru
" Show the line number
set number
" Enable Syntax Highlighting
syntax enable
" Enable using the mouse to click or select some peace of code
set mouse=a
" Set the Tab to 2 spaces
set tabstop=2
set shiftwidth=2
set termguicolors
set background=dark
colorscheme gruvbox
set colorcolumn=120
:map <C-n> :NERDTreeToggle<CR>
:map <C-p> :Telescope live_grep<CR>
:map <C-f> :Telescope find_files<CR>
" Lua scripts
lua << EOF
require'lspconfig'.solargraph.setup{}
local nvim_lsp = require('lspconfig')
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
--Enable completion triggered by <c-x><c-o>
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings.
local opts = { noremap=true, silent=true }
-- See `:help vim.lsp.*` for documentation on any of the below functions
buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts)
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)
buf_set_keymap("n", "<space>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
end
-- Use a loop to conveniently call 'setup' on multiple servers and
-- map buffer local keybindings when the language server attaches
local servers = { "solargraph" }
for _, lsp in ipairs(servers) do
nvim_lsp[lsp].setup {
on_attach = on_attach,
flags = {
debounce_text_changes = 150,
}
}
end
EOF
lua << EOF
vim.o.completeopt = "menuone,noselect"
require'compe'.setup {
enabled = true;
autocomplete = true;
debug = false;
min_length = 1;
preselect = 'enable';
throttle_time = 80;
source_timeout = 200;
incomplete_delay = 400;
max_abbr_width = 100;
max_kind_width = 100;
max_menu_width = 100;
documentation = false;
source = {
path = true;
buffer = true;
calc = true;
vsnip = true;
nvim_lsp = true;
nvim_lua = true;
spell = true;
tags = true;
snippets_nvim = true;
treesitter = true;
};
}
local t = function(str)
return vim.api.nvim_replace_termcodes(str, true, true, true)
end
local check_back_space = function()
local col = vim.fn.col('.') - 1
if col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then
return true
else
return false
end
end
-- Use (s-)tab to:
--- move to prev/next item in completion menuone
--- jump to prev/next snippet's placeholder
_G.tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-n>"
elseif vim.fn.call("vsnip#available", {1}) == 1 then
return t "<Plug>(vsnip-expand-or-jump)"
elseif check_back_space() then
return t "<Tab>"
else
return vim.fn['compe#complete']()
end
end
_G.s_tab_complete = function()
if vim.fn.pumvisible() == 1 then
return t "<C-p>"
elseif vim.fn.call("vsnip#jumpable", {-1}) == 1 then
return t "<Plug>(vsnip-jump-prev)"
else
-- If <S-Tab> is not working in your terminal, change it to <C-h>
return t "<S-Tab>"
end
end
vim.api.nvim_set_keymap("i", "<Tab>", "v:lua.tab_complete()", {expr = true})
vim.api.nvim_set_keymap("s", "<Tab>", "v:lua.tab_complete()", {expr = true})
vim.api.nvim_set_keymap("i", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})
vim.api.nvim_set_keymap("s", "<S-Tab>", "v:lua.s_tab_complete()", {expr = true})
EOF
Для C# вставляем это:
" We start by installing Vim plugin manager to manage plugins.
" A Lot of customizations doen here.
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree' " Left file-tree pannel
Plug 'ryanoasis/vim-devicons' " Language icon for file
Plug 'vim-airline/vim-airline' " Bottom info pannel
Plug 'flazz/vim-colorschemes'
Plug 'vim-airline/vim-airline-themes'
Plug 'ervandew/supertab'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
Plug 'prettier/vim-prettier', { 'do': 'npm install' , 'branch' : 'release/1.x' }
Plug 'dense-analysis/ale'
" LSP servers
Plug 'OmniSharp/omnisharp-vim' " LSP server form .net
"Fuzzy Search
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'valloric/MatchTagAlways'
Plug 'jiangmiao/auto-pairs'
call plug#end()
:map <C-n> :NERDTreeToggle<CR>
:map <C-p> :GFiles<CR>
:map <C-f> :Files<CR>
"collapse json files by themselves.
:map <C-j> :set filetype=json \| :syntax on \| :set foldmethod=syntax
"zo for open
"zc for close
" Auto indent your file.
map <F7> gg=G<C-o><C-o>
" Navigate Tabs
map <C-t><up> :tabr<cr>
map <C-t><down> :tabl<cr>
map <C-t><left> :tabp<cr>
map <C-t><right> :tabn<cr>
" Supprot for different goto definitions for different file types.
autocmd FileType cs nmap <silent> gd :OmniSharpGotoDefinition<CR>
autocmd FileType cs nnoremap <buffer> <Leader>fu :OmniSharpFindUsages<CR>
autocmd FileType cs nnoremap <buffer> <Leader>fi :OmniSharpFindImplementations<CR>
autocmd FileType cs nnoremap <Leader><Space> :OmniSharpGetCodeActions<CR>
autocmd FileType ts nmap <silent> gd :call CocActionAsync('jumpDefinition')<CR>
autocmd FileType html nmap <silent> gd :call CocActionAsync('jumpDefinition')<CR>
" The following commands are contextual, based on the cursor position.
" autocmd FileType cs nnoremap <buffer>
" autocmd FileType cs nnoremap <buffer> <Leader>fs :OmniSharpFindSymbol<CR>
let g:vimspector_enable_mappings = 'HUMAN'
let g:airline_powerline_fonts=1
let g:tmuxline_powerline_separators = 0
" colorscheme Monokai
colorscheme minimalist
let g:airline_theme='minimalist'
set colorcolumn=120
set number
" set relativenumber
" Toggle relative line number
nmap <C-L><C-L> :set norelativenumber<CR>
map <C-R><C-L> :set relativenumber<CR>
set encoding=utf-8
scriptencoding utf-8
let g:airline#extensions#tmuxline#enabled = 0
" How tab behaves while picking auto complete.
let g:SuperTabMappingForward = '<S-Tab>'
let g:SuperTabMappingBackward = '<Tab>'
:set tabstop=4
:set shiftwidth=4
:set expandtab
set clipboard+=unnamedplus
" Move Swap Directory to something temporary.
set directory^=$HOME/tempswap//
" This directory should exist.
" Always enable preview window on the right with 60% width
let g:fzf_preview_window = 'right:60%'
" vim wiki settings.
set nocompatible
filetype plugin on
syntax on
let g:vimwiki_list = [{'path': '~/vimwiki/',
\ 'syntax': 'markdown', 'ext': '.md'}]
if executable('ag')
" Use Ag over Grep
set grepprg=ag\ --nogroup\ --nocolor
" Use ag in CtrlP for listing files. Lightning fast and respects .gitignore
" let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
endif
" ctrl+p when you move to a file this highlights it.
let g:nerdtree_sync_cursorline = 1
" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" Read gitignore and dont show relevant files in ctrlp.
" let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
let g:prettier#config#parser = 'babylon'
" hi Normal ctermbg=none
"
" For Coc Action Menu to work.
" Remap for do codeAction of selected region
function! s:cocActionsOpenFromSelected(type) abort
execute 'CocCommand actions.open ' . a:type
endfunction
xmap <silent> <leader>a :<C-u>execute 'CocCommand actions.open ' . visualmode()<CR>
nmap <silent> <leader>a :<C-u>set operatorfunc=<SID>cocActionsOpenFromSelected<CR>g@
let g:ale_linters_ignore = {
\ 'typescript': ['tslint'],
\}
let g:ale_linters = {
\ 'cs': ['OmniSharp']
\}
let g:OmniSharp_server_use_net6 = 1
Сохраняем и перечитываем файл, для этого используем команды vim. Чтобы ввести команду, нужно нажать
:
и далее ввести шорткод. В нашем случае вводим w
от write
, нажимаем enter
, затем вводим
команду so %
, чтобы перечитать файл. На все ошибки пока не обращаем внимание, нажимаем enter
,
пока они не пропадут.
Установим все плагины, которые мы указали в конфигуракции: :PlugInstall
.
Установим LSP-сервер для netcore: :OmniSharpInstall
Все, вам VIM готов. Хорошо бы почитать все шорткоды для установленных плагинов, например для
NerdTree открыть / закрыть панель будет CTRL + n
и тд.
Ranger — VIM-подобный файловый менеджер #
Ranger очень удобный файловый менеджер, который управляется примерно также, как и VIM. Он удобен тем, что его, как и VIM, очень легко настроить под свои нужны, например мы хотим включить предпросмотр .pdf файлов, картинок и тд.
Включаем предпросмотр изображений и .pdf на Wayland #
А не включите вы его, если у вас Wayland по умолчанию, вот issues, который был закрыт со
словами, что imv
был принят,как просмотрщик по умолчанию в 2019 году еще, что сейчас там поменялось или нет, я не совсем в курсе, так что
никаких превью картинок.
Вы можете попробовать какой-нибудь из методов, приведенных тут, мне было ооочень лень этим заниматься, я сделал себе просмотр через mpv и все, предпросмотр докручивать не стал.
Docker — исправление проблем #
Docker по умолчанию не запущен при старте системы. Исправляем это:
Добавляем вашего пользователя в группу Docker:
usermod -a -G docker $USER
Добавляем Docker в автозагрузку:
sudo systemctl enable docker
Благодарности серому волшебнику #
Если текст был полезен и ты не можешь усмирить желание быть благодарным, то можешь купить мне чашечку кофе:
Воспользоваться моей реферальной ссылкой на DigitalOcean:
Или же закинуть монету в мой кошелёк (USDT и TRX кошельки одинаковые, да, это не ошибка):
Tether (TRC-20, USDT):
TYvFYUV3h5HwqfyTxskGQK7nDbUHTcwPn2
Tron (TRX):
TYvFYUV3h5HwqfyTxskGQK7nDbUHTcwPn2
Monero (XMR):
4AbxbT9vrNQTUDCQEPwVLYZq2zTEYzNr9ZzTLaq9YcwVfdxwkWjZ6FsewuXVDXPk7x2rE6FZACmLePPgJEcY4rm1GSHkwTZ