๐ ๋ค์ด๊ฐ๋ฉฐ
Vim์ ์ฒ์ ์ฌ์ฉํด๋ณธ ์ฌ๋์ด๋ผ๋ฉด ๋ชจ๋ ํ๋ฒ์ฏค์, ์ต๊ด์ ์ผ๋ก Ctrl+Z๋ก ์ทจ์๋ฅผ ํ๋ ค๋ค ํ๋ก์ธ์ค๊ฐ ์ผ์์ ์ง๋์ด Vim์ด ๊บผ์ ธ๋ฒ๋ ค ๋นํฉํ ๊ธฐ์ต์ด ์์ ๊ฒ์ด๋ค.๐คฆ ๋๋ง ํด๋ ๊ต์๋์ด ๋น๋ถ์ ๋น๋ถ๋ฅผ ๊ฑฐ๋ญํ์
จ์์๋ ์ํ์ ๋ณด๋ค ์ต๊ด์ ์ผ๋ก Ctrl+Z๋ฅผ ๋๋ฅด๊ณ ... ์์ ๋ฌ๋ฌ ๋จ๋ฉฐ ๊ธฐ์ต์ ๋๋ฌ์ด fg๋ก ๋ณต๊ตฌํ ๊ฒฝํ์ด ์๋ค ๐ต
์ด๋ ๊ฒ ์๋์ฐ์ ๋ฆฌ๋ ์ค ๋ฐ Vim์ ๋จ์ถํค๊ฐ ๋ค๋ฅธ ๊ฒ ์ ๋ง ๋ถํธํ ์์ ์ค ํ๋์ธ๋ฐ, Neovim์์ ํค ๋งคํ์ ํตํด ์ด ๊ฐ๊ทน์ ์ค์ผ ์ ์๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ๋ ํญ์! VSCode์ ๊ฐ์ฅ ์ ์ฌํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋๋ ๊ฒ์ด๋ฏ๋ก ์ต๋ํ ์๋์ฐ ๋ฐ VSCode์ ์ด์ง๊ฐ์ด ์๊ฒ ์ปค์คํ ์ ํด ๋ณด์.
๐ฏ ํ์ผ ์์ฑ ๋ฐ ์ ์ฉ
๋จผ์ lua/core/keymaps.lua ํ์ผ์ ์์ฑํ๋ค. ์ด์ ํฌ์คํธ์ฒ๋ผ ํ์ผ ํธ๋ฆฌ์์ aํค๋ก ์์ฑํ๊ฑฐ๋ ํฐ๋ฏธ๋์์ touch ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ ํ init.lua ํ์ผ์ ์์ฑํ keymaps.lua ํ์ผ์ importํ๋ค.
require 'core.keymaps'โจ๏ธ ํค๋งต ์ต์ ์ค์
๋จผ์ ํค๋งต ์ค์ ์ ์์ฃผ ์ฌ์ฉํ ์ต์ ๋ค์ ๋ณ์๋ก ์ ์ํด๋๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๋ค.
local keyset = vim.keymap.set
local remap_opt = { remap = true }
local remap_silent_opt = { remap = true, silent = true }
local noremap_opt = { noremap = true }
local noremap_silent_opt = { noremap = true, silent = true }keyset:vim.keymap.set์ ์ถ์ฝํ์ผ๋ก ํ์ดํ์ ์ค์ฌ์ค๋ค.noremap: ์ฌ๊ท์ ๋งคํ์ ๋ฐฉ์งํ๋ค. ํค๋งต์ด ๋ค๋ฅธ ํค๋งต์ ๋ค์ ํธ์ถํ์ง ์๋๋ก ํ๋ค.silent: ๋ช ๋ น์ด ์คํ ์ ํ๋จ์ ๋ฉ์์ง๋ฅผ ํ์ํ์ง ์๋๋ค.remap: ํ๋ฌ๊ทธ์ธ์ ํค๋งต์ ์ฌ์ฌ์ฉํ ๋ ํ์ํ๋ค.
๐ Leader ํค ์ค์
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
keyset({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true })Leader ํค๋ ๋ณต์กํ ๋ช ๋ น์ด ์กฐํฉ์ ์์์ ์ด ๋๋ ํค๋ค. ์๋์ฐ๊ฐ ๋ณดํต Ctrlํค์ ๊ธ์ ํค๋ฅผ ์กฐํฉํด ๋จ์ถ์ด๋ฅผ ์ง์ ํ๋ ๊ฒ์ฒ๋ผ, Neovim์์๋ ๋ฆฌ๋ ํค์ ๋ค๋ฅธ ์ผ๋ฐ ํค๋ฅผ ์กฐํฉํ๋ค.
๋ณดํต Space๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, ์๊ฐ๋ฝ์ด ๋ฟ๊ธฐ ๊ฐ์ฅ ํธํ ์์น๋ผ ์์ฃผ ์ฐ๋ ๋ช
๋ น์ด๋ค์ ์กฐํฉํ๊ธฐ ์ข๋ค. <Nop>๋ก ์ค์ ํ ์ด์ ๋ Space์ ๊ธฐ๋ณธ ๋์(์ปค์ ์ค๋ฅธ์ชฝ ์ด๋)์ ๋นํ์ฑํํ์ฌ Leader ํค๋ก๋ง ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค.
์ฌ์ฌ ์ง๊ฒจ์ธ ์๋ ์์ง๋ง ๐ ์ฐ๋ฆฌ๋ VSCode๋ฅผ ์งํฅํ๋๊น.. ๋ฆฌ๋ ํค๋ ๋์ค์ ์ํด ์ผ๋จ ์ค์ ๋ง ํด ๋์๊ณ ์ค์ ๋ก ๋จ์ถ์ด๋ฅผ ์ค์ ํด ๋์ง๋ ์์๋ค.
๋ณ์ ์์๋ '๋ชจ๋', '์ค์ ํ ํค๋งต', '์คํํ ๋ช ๋ น', '์ต์ ' ์์ด๋ค.
๐ ์ ์ญ ํจ์
Neo-tree ํ ๊ธ ํจ์
function _G.toggle_neotree()
local manager = require("neo-tree.sources.manager")
local state = manager.get_state("filesystem")
if state.winid and vim.api.nvim_win_is_valid(state.winid) then
require('neo-tree.command').execute({ action = "close" })
else
require('neo-tree.command').execute({ action = "focus", source = "filesystem" })
end
endNeo-tree๊ฐ ์ด๋ ค์์ผ๋ฉด ๋ซ๊ณ , ๋ซํ์์ผ๋ฉด ์ด๋๋ก ํ๋ ํ ๊ธ ํจ์๋ค. Ctrl+B๋ก VSCode์ ์ฌ์ด๋๋ฐ ํ ๊ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
๐น๏ธ Normal ๋ชจ๋ - ํธ์ง ๋ฐ ํ์ผ ๊ด๋ฆฌ
์ ์ฉํ Normal ๋ชจ๋ ํค๋งต
keyset('n', 'dd', '"_dd', noremap_opt) -- ์ค ์ญ์ (๋ ์ง์คํฐ์ ์ ์ฅ ์ ํจ)
keyset('n', 'dt', '<CMD>lua vim.diagnostic.config({virtual_text = not vim.diagnostic.config().virtual_text})<CR>', noremap_opt) -- LSP ์ง๋จ ๋ฉ์์ง ํ ๊ธdd๋ฅผ ์ฌ์ ์ํด์ ์ญ์ ํ ๋ด์ฉ์ด ํด๋ฆฝ๋ณด๋๋ฅผ ์ค์ผ์ํค์ง ์๋๋ก ํ๋ค. Vim์์๋ ์ญ์ ๋ ๋ณต์ฌ์ฒ๋ผ ๋ ์ง์คํฐ์ ์ ์ฅ๋๋๋ฐ, ์ด๊ฒ ์๊ทผ ๋ถํธํ ๋๊ฐ ๋ง๋ค.
๋ํ diagnostic์ด ๋๋ฌด ๋ง์ด ํ์๋์ด ์์ผ๋ฉด ์ฝ๋์ ๊ตฌ๋ณ๋์ง ์์ ๋๊ฐ ์์ด, ์ด๋ฅผ ํ ๊ธํ ์ ์๋ dt ๋จ์ถํค๋ฅผ ์ถ๊ฐํ๋ค.
VSCode ์คํ์ผ ๋จ์ถํค
keyset('n', '<C-Q>', '<CMD>qa<CR>', noremap_opt) -- ๋ชจ๋ ์ฐฝ ๋ซ๊ธฐ
keyset('n', '<C-W>', '<CMD>q<CR>', noremap_opt) -- ํ์ฌ ์ฐฝ ๋ซ๊ธฐ
keyset('n', '<C-A>', 'gg<S-V>G', noremap_opt) -- ์ ์ฒด ์ ํ
keyset('n', '<C-S>', '<CMD>noautocmd w<CR>', noremap_opt) -- ์ ์ฅ (ํฌ๋งทํ
์์ด)
keyset('n', '<C-Z>', 'u', noremap_opt) -- Undo
keyset('n', '<C-S-Z>', '<C-R>', noremap_opt) -- Redo
keyset('n', '<C-X>', 'dd', noremap_opt) -- ํ์ฌ ์ค ์๋ผ๋ด๊ธฐ
keyset('n', '<C-C>', 'yy', noremap_opt) -- ํ์ฌ ์ค ๋ณต์ฌ
keyset('n', '<C-V>', 'p', noremap_opt) -- ๋ถ์ฌ๋ฃ๊ธฐ
keyset('n', '<C-B>', '<CMD>lua toggle_neotree()<CR>', noremap_opt) -- ํ์ผ ํธ๋ฆฌ ํ ๊ธ
keyset('n', '<C-_>', 'gcc', remap_opt) -- ์ฃผ์ ํ ๊ธ (Ctrl+/)VSCode์์ ๋์ด์จ ์ฌ๋๋ค์ด ๊ฐ์ฅ ํท๊ฐ๋ คํ๋ ๋ถ๋ถ์ ํด๊ฒฐํ๋ค. ํนํ Ctrl+S ์ ์ฅ์ด ๋จนํ์ง ์์ผ๋ฉด ์์ฒญ ๋ต๋ตํ๋ฐ, ์ด์ ์ต์ํ ๋จ์ถํค๋ก ํธํ๊ฒ ์์
ํ ์ ์๋ค.
<C-_>๊ฐ Ctrl+/์ธ ์ด์ ๋ ํฐ๋ฏธ๋์์ Ctrl+/๊ฐ Ctrl+_๋ก ์ธ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ฃผ์ ํ ๊ธ ๊ธฐ๋ฅ์ Comment ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ฉด ํ์ฉํ ์ ์๋ค.
Leader ํค ์กฐํฉ - Telescope & Git (TBD)
keyset('n', 'ff', '<CMD>Telescope find_files<CR>', noremap_opt) -- ํ์ผ ๊ฒ์
keyset('n', 'fg', '<CMD>Telescope live_grep<CR>', noremap_opt) -- ํ
์คํธ ๊ฒ์
keyset('n', 'fh', '<CMD>Telescope help_tags<CR>', noremap_opt) -- ๋์๋ง ๊ฒ์
keyset('n', 'fb', '<CMD>Telescope buffers<CR>', noremap_opt) -- ๋ฒํผ ๋ชฉ๋ก
keyset('n', 'fs', '<CMD>Gitsigns diffthis<CR>', noremap_opt) -- Git diff ๋ณด๊ธฐ
keyset('n', 'fd', '<CMD>Gitsigns preview_hunk<CR>', noremap_opt) -- Git hunk ๋ฏธ๋ฆฌ๋ณด๊ธฐTelescope๋ ํ์ผ ์ฐพ๊ธฐ, ํ
์คํธ ๊ฒ์ ๋ฑ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ํผ์ง ํ์ธ๋๋ค. Space + ff๋ง ๋๋ฅด๋ฉด ํ๋ก์ ํธ ์ ์ฒด์์ ํ์ผ๋ช
์ผ๋ก ๊ฒ์์ด ๊ฐ๋ฅํ๊ณ , Space + fg๋ก ๋ด์ฉ๊น์ง ๊ฒ์ํ ์ ์๋ค.
Git ๊ด๋ จ ๊ธฐ๋ฅ๋ Space + f ์กฐํฉ์ผ๋ก ํต์ผํด์ ์ธ์ฐ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์๋ค.
(TBD)
โ๏ธ Insert ๋ชจ๋ - ํธ์ง ์ค ๋จ์ถํค
keyset('i', '<C-A>', '<ESC><ESC>gg<S-V>G', noremap_opt) -- ์ ์ฒด ์ ํ
keyset('i', '<C-S>', '<ESC><ESC>:w<CR>', noremap_opt) -- ์ ์ฅ
keyset('i', '<C-Z>', '<ESC><ESC>ua', noremap_opt) -- Undo
keyset('i', '<C-S-Z>', '<ESC><ESC><C-R>a', noremap_opt) -- Redo
keyset('i', '<C-X>', '<ESC><ESC>dda', noremap_opt) -- ํ์ฌ ์ค ์๋ผ๋ด๊ธฐ
keyset('i', '<C-C>', '<ESC><ESC>yya', noremap_opt) -- ํ์ฌ ์ค ๋ณต์ฌ
keyset('i', '<C-V>', '<ESC><ESC>pi', noremap_opt) -- ๋ถ์ฌ๋ฃ๊ธฐ
keyset('i', '<C-B>', '<CMD>lua toggle_neotree()<CR>', noremap_opt) -- ํ์ผ ํธ๋ฆฌ
keyset('i', '<C-_>', '<ESC><ESC>gcca', remap_opt) -- ์ฃผ์ ํ ๊ธ
keyset('i', '<S-TAB>', '<C-V><TAB>', noremap_opt) -- ์ค์ ํญ ๋ฌธ์ ์
๋ ฅInsert ๋ชจ๋์์๋ VSCode์ฒ๋ผ ์ ์ฅํ๊ณ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ ์ ์๋ค. <ESC><ESC>๋ฅผ ๋ ๋ฒ ๋ฃ์ ์ด์ ๋ ๊ฐ๋ ํ ๋ฒ์ผ๋ก๋ ๋ชจ๋ ์ ํ์ด ์ ๋๋ก ์ ๋ ๋๊ฐ ์์ด์๋ค.
๋ช
๋ น ์คํ ํ ๋ค์ Insert ๋ชจ๋๋ก ๋์๊ฐ๋๋ก ๋์ a ๋๋ i๋ฅผ ๋ถ์๋ค.
Shift+Tab์ expandtab ์ต์
๋๋ฌธ์ ์คํ์ด์ค๋ก ๋ณํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ค์ ํญ ๋ฌธ์๋ฅผ ์
๋ ฅํ ๋ ์ฌ์ฉํ๋ค.
๐๏ธ Visual ๋ชจ๋ - ๋ธ๋ก ์ ํ ๋ฐ ํธ์ง
๊ธฐ๋ณธ ๋จ์ถํค ์์
keyset('v', 'd', '"_d', noremap_opt) -- ์ญ์ (๋ ์ง์คํฐ ์ ์ฅ ์ ํจ)
keyset('v', 'c', '"_c', noremap_opt) -- ๋ณ๊ฒฝ (๋ ์ง์คํฐ ์ ์ฅ ์ ํจ)Visual ๋ชจ๋์์ d์ c๋ฅผ ์ฌ์ ์ํด์ ๋ถํ์ํ ๋ ์ง์คํฐ ์ค์ผ์ ๋ฐฉ์งํ๋ค. ์ค์ ๋ก ์๋ผ๋ด๊ธฐ๋ฅผ ํ๊ณ ์ถ์ ๋๋ Ctrl+X๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
keyset('v', '<BS>', 'd<ESC><ESC>i', noremap_opt) -- ๋ฐฑ์คํ์ด์ค๋ก ์ญ์ ํ Insert
keyset('v', '<C-A>', '<ESC><ESC>gg<S-V>G', noremap_opt)
keyset('v', '<C-S>', '<ESC><ESC>:w<CR>', noremap_opt)
keyset('v', '<C-Z>', '<ESC><ESC>u', noremap_opt)
keyset('v', '<C-S-Z>', '<ESC><ESC><C-R>', noremap_opt)
keyset('v', '<C-X>', 'd', noremap_opt) -- ์๋ผ๋ด๊ธฐ
keyset('v', '<C-C>', 'y', noremap_opt) -- ๋ณต์ฌ
keyset('v', '<C-V>', 'p', noremap_opt) -- ๋ถ์ฌ๋ฃ๊ธฐ
keyset('v', '<C-B>', '<CMD>lua toggle_neotree()<CR>', noremap_opt)
keyset('v', '<C-_>', 'gc', remap_opt) -- ์ฃผ์ ํ ๊ธCtrl ํค ์กฐํฉ์ ์ด์ ๊ณผ ์ ์ฌํ๋ค.
๐ ๋ฒํผ ๊ด๋ฆฌ - Function ํค ํ์ฉ
keyset('n', '<F1>', '<CMD>BufferGoto1<CR>', noremap_silent_opt)
keyset('n', '<F2>', '<CMD>BufferGoto2<CR>', noremap_silent_opt)
keyset('n', '<F3>', '<CMD>BufferGoto3<CR>', noremap_silent_opt)
keyset('n', '<F4>', '<CMD>BufferGoto4<CR>', noremap_silent_opt)
keyset('n', '<F5>', '<CMD>BufferGoto5<CR>', noremap_silent_opt)
keyset('n', '<F6>', '<CMD>BufferGoto6<CR>', noremap_silent_opt)
keyset('n', '<F7>', '<CMD>BufferGoto7<CR>', noremap_silent_opt)
keyset('n', '<F8>', '<CMD>BufferGoto8<CR>', noremap_silent_opt)
keyset('n', '<F9>', '<CMD>BufferGoto9<CR>', noremap_silent_opt)
keyset('n', '<F10>', '<CMD>BufferLast<CR>', noremap_silent_opt)Barbar ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์๋จ์ VSCode์ฒ๋ผ ํญ์ด ํ์๋๋ค. Function ํค๋ก ๋ฒํผ๋ฅผ ๋ฒํธ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์์ด์ ์ฌ๋ฌ ํ์ผ์ ์ค๊ฐ ๋ ์์ฒญ ํธํ๋ค.
F10์ ๋ง์ง๋ง ๋ฒํผ๋ก ์ด๋ํ๋๋ก ์ค์ ํ๋ค.
๐ ๊ธฐํ ๊ณ ๊ธ ๊ธฐ๋ฅ (TBD)
Vim ๋ช ๋ น์ด ์ถ์ฝ (Command Abbreviation)
vim.cmd([[
ca ff Telescope find_files
ca fg Telescope live_grep
ca fh Telescope help_tags
ca fb Telescope buffers
ca fk Telescope keymaps
ca fc Telescope commands
ca fch Telescope command_history
ca fsh Telescope search_history
ca fhl Telescope highlights
ca ww SudaWrite
]])Command ๋ชจ๋(: ์
๋ ฅ)์์ ff๋ง ์ณ๋ Telescope find_files๊ฐ ์๋ ์์ฑ๋๋ค. ๊ธด ๋ช
๋ น์ด๋ฅผ ์งง๊ฒ ์ค์ฌ์ ์ฌ์ฉํ ์ ์์ด ํธ๋ฆฌํ๋ค.
ww๋ Suda ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ด๋ฆฌ์ ๊ถํ์ด ํ์ํ ํ์ผ์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ค.
ํ ์คํธ ๊ฒ์ ๋ฐ ์นํ
vim.cmd([[
vnoremap <F2> y/<C-R>=escape(@",'/\')<CR><CR>N:%s/<C-R>=escape(@",'/\')<CR>/<C-R>=escape(@",'/\')<CR>/g<Left><Left>
vnoremap <F3> y/<C-R>=escape(@",'/\')<CR><CR>N
]])Visual ๋ชจ๋์์:
F2: ์ ํํ ํ ์คํธ๋ฅผ ์ ์ฒด ํ์ผ์์ ์ผ๊ด ์นํํ ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์๋์ผ๋ก ์์ฑF3: ์ ํํ ํ ์คํธ๋ฅผ ๊ฒ์
VSCode์ Ctrl+H (์ฐพ๊ธฐ ๋ฐ ๋ฐ๊พธ๊ธฐ) ๊ธฐ๋ฅ๊ณผ ๋น์ทํ๊ฒ ๋ง๋ ํค๋งต์ด๋ค.
Telescope ์ปค์ ๋ชจ๋ ๊ฒ์
vim.cmd([[
nnoremap <F12> :lua require("telescope.builtin").grep_string({layout_strategy='cursor',layout_config={width=0.5, height=0.45}})<CR>
inoremap <F12> <ESC><ESC>:lua require('telescope.builtin').grep_string({layout_strategy='cursor',layout_config={width=0.5, height=0.45}})<CR>
]])F12๋ฅผ ๋๋ฅด๋ฉด ์ปค์ ์๋ ๋จ์ด๋ฅผ ํ๋ก์ ํธ ์ ์ฒด์์ ๊ฒ์ํ๋ค. ํจ์ ์ ์๋ฅผ ์ฐพ๊ฑฐ๋ ๋ณ์ ์ฌ์ฉ์ฒ๋ฅผ ์ถ์ ํ ๋ ์ ์ฉํ๋ค.
โจ ๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ์ ๋ก๋ํ๋ ํฌ์คํธ ์ค์์ ๊ฐ์ฅ ๋ค๋ฌ์ด์ง์ง ์์๋ค๋ ๋๋์ด ๋ค์ ๋ ๋ค. ์์ง Neovim์ ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ์ตํ์ง ๋ชปํ๊ธฐ๋ ํ๊ณ , ํ๋ฌ๊ทธ์ธ์ ์ ๋ฆฌํด๊ฐ๋ฉด์ ํค๋งต์ ๊ณ์ ์ ๋ฐ์ดํธํด์ผํ๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ๋ค.
ํนํ ์์ง ํฌ์คํ ํ์ง ์์ LSP์ Telescope ์ค์ ์ด ์๋ฃ๋์ง ์์์ ์์ฑ๋ ํค๋งต ํ์ผ์ ๋ด๋๊ธฐ๋ ์กฐ๊ธ ๋ฌด๋ฆฌ๊ฐ ์๋ค. ํฌ์คํ ์ ์ด์ด๊ฐ๋ฉด์ ๋๋ง์ ์ค์ ์ ๊ณ์ ์ ๋ฆฌํ๊ณ , ํค๋งต ํฌ์คํ ๋ ์์ ํด ๋๊ฐ์ผ๊ฒ ๋ค.