C.W.K.
Stream
Lesson 02 of 04 · published

Treesitter 와 Telescope — 구조 + 찾기

~15 min · neovim, treesitter, telescope

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Treesitter — regex 가 아니라 트리로서의 코드

Vim 의 클래식 syntax 하이라이팅이 regex 기반: 토큰 타입 패턴 매치 후 컬러. 작동하지만 코드를 이해 못 해. Treesitter 가 코드를 진짜 Abstract Syntax Tree (AST) 로 파싱하고 그걸 하이라이팅, 들여쓰기, 구조적 text object 에 사용. 더 빠르고, 더 정확하고, regex 가 꿈도 못 꿀 기능 잠금해제.

Treesitter 가 실용적으로 주는 것

  • 더 나은 하이라이팅 — string interpolation, JSX 중첩, Markdown 코드 블록 다 옳게 색칠.
  • 스마트 들여쓰기 — 컨텍스트가 중요한 언어 (Python, Lua, JSX).
  • 증분 선택Ctrl-Space 누르면 선택이 한 AST 노드씩 확장. 단어 → 표현식 → statement → 함수. visual 선택에 거의 마법.
  • 구조적 text object 짝 plugin nvim-treesitter-textobjects 와: af (a 함수), if (inner 함수), ac (a 클래스), ic (inner 클래스). Operator 와 결합: daf 가 함수 통째로 삭제, cif 가 함수 본문 change.
  • Syntax 로 fold — regex 근사가 아니라 진짜 코드 인식 fold.

Telescope — 뭐든 fuzzy 찾기

telescope.nvim 이 fuzzy finder. 파일, buffer, grep 결과, LSP 심볼, 최근 파일, 도움말 태그, git 브랜치, 명령 히스토리 — "고를 옵션 리스트" 가진 거 뭐든 Telescope picker 가능. 상호작용 모델이 다 동일: picker pop, filter 위해 입력, Enter 로 pick.

매일 쓸 picker

  • find_files — fuzzy 파일 열기. Cmd-P 대체.
  • live_grep — 프로젝트 가로지르는 파일 내용 검색. Cmd-Shift-F 대체.
  • buffers — 열린 buffer 사이 전환.
  • oldfiles — 최근 열린 파일 (Neovim 재시작 가로질러).
  • lsp_document_symbols — 현재 파일 outline (함수, 클래스).
  • lsp_workspace_symbols — 프로젝트 어떤 심볼이든 검색.
  • diagnostics — LSP 에러와 warning, filterable.
  • help_tags — Neovim 도움말 시스템, fuzzy-search 가능.
Telescope 가 메뉴 세 개 대체. 명령 팔레트, 파일 열기 다이얼로그, 글로벌 검색 패널이 한 키바인딩 패턴으로 collapse. <leader>ff, <leader>fg, <leader>fb 가 손에 박히면, 어떤 프로젝트든 어떤 거든 여는 게 두 키스트로크 + fuzzy 매치 몇 글자.

Code

Treesitter — 풀 셋업·lua
{
  "nvim-treesitter/nvim-treesitter",
  build = ":TSUpdate",
  event = { "BufReadPost", "BufNewFile" },
  dependencies = {
    "nvim-treesitter/nvim-treesitter-textobjects",
  },
  config = function()
    require("nvim-treesitter.configs").setup({
      ensure_installed = {
        "lua", "python", "javascript", "typescript", "tsx",
        "html", "css", "json", "yaml", "toml", "bash",
        "markdown", "markdown_inline", "vim", "vimdoc", "regex",
      },
      auto_install = true,
      highlight = { enable = true },
      indent = { enable = true },
      incremental_selection = {
        enable = true,
        keymaps = {
          init_selection    = "<C-space>",
          node_incremental  = "<C-space>",
          scope_incremental = "<C-s>",
          node_decremental  = "<BS>",
        },
      },
      textobjects = {
        select = {
          enable = true,
          lookahead = true,
          keymaps = {
            ["af"] = "@function.outer",
            ["if"] = "@function.inner",
            ["ac"] = "@class.outer",
            ["ic"] = "@class.inner",
            ["aa"] = "@parameter.outer",
            ["ia"] = "@parameter.inner",
          },
        },
        move = {
          enable = true,
          set_jumps = true,
          goto_next_start = {
            ["]f"] = "@function.outer",
            ["]c"] = "@class.outer",
          },
          goto_previous_start = {
            ["[f"] = "@function.outer",
            ["[c"] = "@class.outer",
          },
        },
      },
    })
  end,
}
Telescope — 일상 사용 키맵 풀 셋업·lua
{
  "nvim-telescope/telescope.nvim",
  cmd = "Telescope",
  dependencies = {
    "nvim-lua/plenary.nvim",
    { "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
  },
  keys = {
    { "<leader>ff", "<cmd>Telescope find_files<CR>",  desc = "Find files" },
    { "<leader>fg", "<cmd>Telescope live_grep<CR>",   desc = "Live grep" },
    { "<leader>fb", "<cmd>Telescope buffers<CR>",     desc = "Buffers" },
    { "<leader>fh", "<cmd>Telescope help_tags<CR>",   desc = "Help" },
    { "<leader>fr", "<cmd>Telescope oldfiles<CR>",    desc = "Recent files" },
    { "<leader>fd", "<cmd>Telescope diagnostics<CR>", desc = "Diagnostics" },
    { "<leader>fs", "<cmd>Telescope lsp_document_symbols<CR>", desc = "Symbols (file)" },
    { "<leader>fS", "<cmd>Telescope lsp_workspace_symbols<CR>", desc = "Symbols (project)" },
    { "<leader>/",  "<cmd>Telescope current_buffer_fuzzy_find<CR>", desc = "Search buffer" },
  },
  opts = {
    defaults = {
      file_ignore_patterns = { "node_modules", ".git/" },
      layout_strategy = "flex",
    },
  },
  config = function(_, opts)
    require("telescope").setup(opts)
    pcall(require("telescope").load_extension, "fzf")
  end,
}
Treesitter text object 작동·vim
daf       " a 함수 삭제 (시그니처 포함 통째로)
dif       " 함수 안 삭제 (본문만)
vac       " a 클래스 visual select
yif       " 함수 본문 yank
]f        " 다음 함수 시작으로
[f        " 이전 함수 시작으로
]c        " 다음 클래스 시작으로
[c        " 이전 클래스 시작으로

External links

Exercise

위 treesitter 와 telescope 블록 install. 진짜 코드베이스 열어. (1) <leader>ff + 파일명 몇 글자 — 열기. (2) <leader>fg + 한 파일에만 쓰는 문자열 — 바로 점프. (3) 함수 안에서 Ctrl-Space 반복 누르고 선택이 AST 노드로 자라는 거 봐. (4) daf 로 함수 통째 삭제. 각 동작이 "이거 없이 어떻게 했지" 처럼 느껴져야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.