코드 편집기

열기, 강조, 서식

텍스트/코드 파일은 구문 강조가 적용된 편집기(Scintilla)에서 열립니다. 주석/주석 해제(Ctrl+/), 줄 이동 및 복제, 북마크(Ctrl+F2), 심볼/함수 목록, 단어 기반 자동완성, 들여쓰기 안내선, 자동 줄바꿈, 확대/축소, 디스크상 파일 변경 감지 기능이 있습니다. 버전 관리를 활성화하면 여백에 마지막 버전 이후 추가/변경된 줄이 표시됩니다.

매크로(Ctrl+Shift+R / F4로 편집 시퀀스 기록/재생, 도구 → 실행 → 매크로), 서식/정리(Shift+Alt+F), 탭 도구 모음의 ASCII 표(문자/박스 그리기 문자 삽입용), 맞춤법 검사기 (Hunspell)도 있습니다. pt-BR와 en-US는 내장되어 있으며, 다른 언어는 설정 → 메모와 글쓰기 → 맞춤법의 표(언어별 한 행, 다운로드/ 제거 버튼 포함)에서 필요할 때 다운로드합니다. 기록 중인 로그 파일을 따라가려면 탭 자체 도구 모음의 모니터링 (tail -f) 버튼을 사용하세요. 매우 큰 파일(약 1 MB 이상)은 보이는 부분만 불러오는 가상화된 경량 편집기에서 열리며, 열기 → 경량 편집기로 열기...로 강제로 사용할 수도 있습니다. 모든 줄을 색인할 메모리가 부족하면 편집기의 띠에 경고가 표시되고 앞부분의 줄만 사용할 수 있습니다.

서식과 린트: Shift+Alt+F로 문서 서식을 맞춥니다. JSON, XML, SQL은 LightNote가 직접 서식을 맞추며 따로 설치할 것이 없습니다. 바뀌는 것은 공백뿐이고, 키 순서와 숫자, 텍스트는 작성한 그대로 남습니다. 확장자만이 아니라 상태 표시줄에 표시된 형식이 기준입니다. 임시 글 탭에 JSON을 붙여 넣고 형식을 JSON으로 고른 뒤 서식을 맞추세요 ({, [, <로 시작하는 텍스트는 고르지 않아도 인식됩니다). 오류가 있으면 텍스트는 바뀌지 않고, 그 위치에 빨간 밑줄이 그어지며 커서가 그곳으로 이동하고, 상태 표시줄에 줄, 열, 이유(쉼표 누락, 따옴표 없는 키 등)가 표시됩니다. 서식 버튼의 화살표에는 압축(JSON이나 XML을 한 줄로)이 있고, 선택 영역이 있으면 둘 다 그 부분에만 적용됩니다. 로그 한 줄에 들어 있는 JSON에 유용합니다. 한 줄에 완전한 JSON이 하나씩 있는 텍스트(JSON Lines, NDJSON이라고도 하며 로그와 내보내기에 흔함)는 인식되어 하나의 문서로 합치지 않고 줄마다 서식이 지정됩니다.

F7은 검사입니다. JSON과 XML은 저장하지 않아도 텍스트 자체에서 검사하고, 그 밖의 언어는 린터(ruff, eslint, shellcheck, luacheck 등)를 실행해 편집기와 문제 패널(하단 창, 이동 가능)에 문제를 표시합니다. 그 밖의 언어는 외부 포맷터(black, prettier, clang-format, gofmt, rustfmt 등)를 사용합니다. 해당 형식에 아직 포맷터가 없으면 서식, F7, F5가 도우미를 열어 그 형식의 도구만 보여 주고, 이미 설치된 것을 표시하며, 선택한 도구를 한 번의 클릭으로 설치합니다(다른 프로그램의 명령을 입력할 수도 있습니다). 전체 목록은 설정 → 코드 도구 → 언어별 포맷터와 → 언어별 린터에 있고, 저장 시 서식 맞추기 / 저장 시 린트 옵션도 있습니다. F6으로 파일을 출력 패널에서 실행하거나(종료 코드와 소요 시간 기록, 중지/재시작 가능) F8로 일부 코드만 실행할 수 있습니다.

형식 간 변환: 변환 하위 메뉴는 편집, 서식 버튼의 화살표, 상태 표시줄의 형식 메뉴, 편집기의 오른쪽 클릭 메뉴(노트 포함)에 있습니다. 선택 영역에, 선택한 것이 없으면 텍스트 전체에 적용됩니다. 맨 위에는 인식한 내용("선택 영역: JSON", "텍스트 전체: CSV")이 표시되고, 그 내용에 맞는 변환이 먼저 나옵니다. 나머지는 그룹으로 묶여 있으며, 해당하지 않으면 이유와 함께 회색으로 표시됩니다. JSON ↔ YAML, JSON ↔ XML(속성은 @이름이 됩니다), JSON ↔ CSV와 JSON → Markdown 표(중첩된 객체는 a.b 열이 됩니다), CSV ↔ Markdown 표, CSV → SQL INSERT, JSON Lines (NDJSON) ↔ JSON 배열, HTML ↔ Markdown, URL 매개변수 ↔ JSON, Base64, URL 인코딩, HTML 엔터티, JSON 문자열, Unix 타임스탬프 ↔ ISO 8601 날짜가 있습니다. 키 순서와 숫자는 작성한 그대로 남고, CSV는 Excel의 ;도 인식합니다. 텍스트 전체를 변환하면 탭의 형식도 바뀌지만(표가 된 CSV는 Markdown이 됩니다) 파일 확장자는 그대로이며, 상태 표시줄이 이를 알려 줍니다. JSON에서는 필드 이름 하위 메뉴가 키만 camelCase, PascalCase, snake_case, kebab-case로 바꿉니다. 값, 숫자, 들여쓰기는 그대로이며, 같은 객체의 두 필드가 같은 이름이 되면 아무것도 바꾸지 않습니다. 이름 스타일(camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE)은 편집 → 대소문자에서 대문자로·소문자로·단어 첫 글자 대문자 아래에 있습니다. 선택 영역에, 선택이 없으면 커서 아래의 이름에 적용되며 파일 전체에는 적용되지 않습니다. 이름만 바뀌고 따옴표, 콜론, 중괄호는 그 자리에 남습니다. 구절 하나뿐인 줄("customer name")은 이름 하나(customerName)가 됩니다.

코드로 연 .md는 클릭 한 번으로 다시 노트가 됩니다. 열려 있는 파일이 노트일 때 편집기 막대에 노트로 열기가 나타납니다. 트리 메뉴의 다른 형식으로 열기 → 코드의 반대이며, 탭을 서식 편집·읽기·개요·속성이 있는 노트 보기로 되돌립니다. 전환이 가능할 때만 나타납니다. 너무 큰 노트는 코드 편집기에 그대로 남습니다.

다중 커서, 기록, 정의

추가 편집 기능: 항목별 다중 커서(Ctrl+D, 전체는 Alt+F3), 줄 복제(Ctrl+Shift+D), 줄 합치기 (Ctrl+Shift+J), 범위 단위 선택 확장/축소(Ctrl+Shift+Space / Ctrl+Alt+Space), 사각형 선택(Alt+드래그), 모두 접기/펼치기, 스니펫(Ctrl+J, 설정 → 편집기에서 편집 가능), 파일 내 심볼로 이동(팔레트의 #)과 프로젝트 내 이동 (Ctrl+T 또는 ##), 이동 기록(Alt+←/→), 편집기 상단의 브레드크럼 경로, 열 눈금자, 괄호 쌍 색상 강조, 자동 닫기/감싸기 괄호, 저장 시 정리(공백 제거, 끝 줄바꿈)까지 모두 설정 → 편집기에 있습니다.

Tab으로 스니펫. 트리거를 입력하고 Tab을 누르세요. SQL 파일에서 sf는 SELECT * FROM TABLE;이 되고 TABLE이 선택된 상태가 됩니다. 테이블 이름을 입력하면 Tab으로 다음 필드로 이동합니다(Shift+Tab은 뒤로, Esc는 종료). sf, sc, sw, sj, sg, ins, upd, del이 기본으로 들어 있습니다(마지막 두 개는 처음부터 WHERE 포함). 각 스니펫은 한 언어 또는 모든 언어에 적용되며, 설정 → 편집기에서 어떤 언어로든 직접 만들 수 있습니다. 필드 ${1:NAME}, 반복 $1, 커서 끝 위치 $0를 쓸 수 있고, 선택 영역을 오른쪽 클릭하면 선택 영역으로 스니펫 만들기가 나옵니다. 스니펫은 자동 완성 목록에도 나타납니다. 목록이 열려 있으면 Tab은 목록에 쓰입니다. Tab으로 스니펫을 펼치지 않으려면 Tab으로 스니펫 펼치기를 끄세요. Ctrl+J는 계속 쓸 수 있습니다.

로컬 기록과 클립보드: 저장할 때마다 LightNote는 파일의 버전을 보관합니다(파일 → 로컬 기록…, 복원 가능, Git과는 별개). Ctrl+Alt+V는 클립보드 기록을 열어 이전에 복사한 항목을 붙여넣습니다. Ctrl+Shift+T는 마지막에 닫은 탭을 다시 엽니다. 탭은 고정할 수 있으며(컨텍스트 메뉴), 고정된 탭은 유휴 상태에서 해제되지 않도록 보호됩니다.

정의로 이동: 식별자 위에서 F12 또는 Ctrl+클릭하면 작업 공간에서 정의된 위치로 이동합니다. Shift+F12는 사용처를 찾습니다.

미니맵과 텍스트 작업

미니맵. 편집기 오른쪽 가장자리에 문서 전체의 축소판이 표시됩니다. 코드의 ‘형태’(구문 강조 색을 축소한 모습)를 보여 주고 현재 보이는 영역을 표시합니다. 클릭하거나 드래그하면 파일의 어느 위치로든 이동합니다. 보기 → 미니맵 또는 설정 → 편집기에서 켜고 끕니다. 코드 탭 자체 도구 모음의 미니맵 버튼(ASCII 옆)으로 편집기를 벗어나지 않고 켜고 끌 수 있습니다. 축소판 왼쪽 가장자리에는 표시 띠가 있습니다. 파란색은 책갈피가 있는 줄(여백의 점과 같은 것), 호박색은 빠른 검색의 일치 항목입니다. 화면 밖 부분까지 포함해 파일 전체에 어떻게 분포하는지 한눈에 볼 수 있습니다.

텍스트 조작. 편집 메뉴(및 편집기 컨텍스트 메뉴)에 줄(이동, 복제, 삭제, 정렬, 합치기, 뒤집기, 번호 매기기)과 정리(공백 제거, 빈 줄·중복 줄 제거, 탭 ↔ 공백) 하위 메뉴가 있습니다. 선택 영역이 있으면 컨텍스트 메뉴에 선택 영역을 새 파일로 저장…도 나타나며, 현재 파일 옆에 조각을 기록하고 탭으로 엽니다(원본은 그대로).

들여쓰기, 주석, 괄호

파일의 들여쓰기. 상태 표시줄의 줄 끝 문자 옆에 있는 공백: 4(또는 탭: 4) 버튼이 해당 탭의 들여쓰기 방식을 보여 줍니다. 클릭하면 메뉴가 열립니다. 공백으로 들여쓰기 또는 탭으로 들여쓰기, 들여쓰기 너비(2, 3, 4, 8열), 들여쓰기를 공백으로 변환과 탭으로 변환(기존 줄의 들여쓰기를 다시 씁니다), 내용에서 감지, 그리고 선택을 새 파일의 기본값으로 저장하는 기본값으로 사용이 있습니다. 여기서 고른 것은 그 탭에만 적용됩니다.

들여쓰기를 정하는 순서. 파일을 열면 LightNote는 그 폴더와 상위 폴더에서 .editorconfig를 찾고(root = true가 있는 파일까지) indent_style, indent_size, tab_width를 적용합니다. trim_trailing_whitespace와 insert_final_newline은 저장할 때, end_of_line과 charset은 새 파일에만 적용됩니다. .editorconfig가 없으면 파일 자체의 줄을 보고, 들여쓰기가 분명하면 그것을 따르고 아니면 기본값을 유지합니다. 순서는 .editorconfig, 파일, 그리고 설정 → 편집기의 기본값입니다(기본 들여쓰기, 열 때 각 파일의 들여쓰기 감지, 작업 공간의 .editorconfig 따르기도 여기에 있습니다).

스마트 들여쓰기. {, (, [ 뒤에서(Python에서는 줄 끝의 : 뒤에서도) Enter를 누르면 다음 줄이 한 단계 더 들여써집니다. {} 사이에서 Enter를 누르면 블록이 세 줄로 열리고 커서는 가운데 줄에 놓이며, Ctrl+Z 한 번으로 모두 되돌릴 수 있습니다. 빈 줄에서 입력한 }, ), ]는 그 괄호를 연 줄의 들여쓰기로 돌아갑니다. Enter가 윗줄의 들여쓰기만 복사하게 하려면 설정 → 편집기에서 스마트 들여쓰기를 끄세요.

주석, 괄호, 자동 완성. Ctrl+/는 탭이 사용하는 언어의 구문으로 주석을 답니다. 파일이 없는 임시 글이나 상태 표시줄에서 구문 색상을 바꾼 경우에도 마찬가지이며, 블록 주석만 있는 언어(HTML, CSS)에서는 블록 주석을 씁니다. Ctrl+Shift+\는 커서가 있는 소괄호, 대괄호 또는 중괄호의 짝으로 이동하고, Ctrl+Shift+Alt+\는 거기까지 선택합니다. 둘 다 오른쪽 클릭 메뉴에도 있습니다. 자동 완성 목록에는 문서의 단어 다음에 언어의 키워드(def, return…)가 나오며, 파일에 아직 없는 키워드도 포함됩니다. 보기 → 줄 번호로 줄 번호 영역을 숨기거나 표시할 수 있습니다.

최근 탭 (Ctrl+Tab)

Ctrl+Tab은 옆의 탭이 아니라, 같은 창에서 직전에 사용한 탭으로 돌아갑니다. Ctrl을 누른 채 Tab을 누를 때마다 창 가운데에 나타나는 최근 탭 목록에서 아래로 이동합니다. Ctrl을 놓으면 고른 탭이 열리고, Esc를 누르면 취소됩니다. Ctrl+Shift+Tab은 반대 순서로 이동합니다. 목록은 창마다 따로 있고, 닫은 탭은 목록에서 빠지며, 탭이 하나뿐이면 아무것도 나타나지 않습니다.

나란히 놓는 창과 그리드

그리드. 편집 영역은 각자 탭을 가진 여러 창으로 나뉘며, 행과 열에 맞춰 배치됩니다. 한 행에는 하나 이상의 창이 나란히 놓이고, 행은 위아래로 쌓입니다. 왼쪽 위의 창이 기본 창이며 절대 사라지지 않고, 마지막 행은 터미널 행입니다. 창은 사용자가 요청할 때만 생기고, 마지막 탭이 빠지면 저절로 사라집니다.

분할. 창 → 오른쪽으로 분할은 활성 탭의 두 번째 보기를 지금 있는 창 바로 오른쪽의 새 열에 엽니다. 창 → 레이아웃 → 아래로 분할은 같은 일을 새 행에서 하며, 새 행은 활성 창이 있는 행 바로 아래, 터미널 행 위에 생깁니다. 두 보기는 같은 텍스트를 편집합니다. 창을 하나 더 놓을 공간이 없으면 보기는 이웃 창으로 갑니다. 창 → 분할 제거는 기본 창 오른쪽의 창을 닫습니다. 도구 모음의 분할 버튼에도 같은 항목이 있습니다.

탭 끌기. 탭을 끄는 동안 각 창의 오른쪽 가장자리와 아래쪽 가장자리에 띠가 나타납니다. 오른쪽 띠에 놓으면 그 창 바로 오른쪽에 열이, 아래쪽 띠에 놓으면 바로 아래에 행이 생깁니다. 영역 맨 아래의 띠는 탭을 터미널 행으로 옮깁니다. 공간이 부족해 창을 만들 수 없는 띠는 나타나지 않습니다. 탭의 메뉴(마우스 오른쪽 클릭)에서 오른쪽 새 창으로 이동은 끌지 않고 같은 일을 하며, 다음 창으로 이동과 이전 창으로 이동은 탭을 이웃 창으로 옮깁니다.

미리 정한 레이아웃. 창 → 레이아웃(분할 버튼에도 있음)에서 그리드를 한 번에 정리합니다. 창 1개, 2열, 3열, 2×2 그리드 중에서 고릅니다. 레이아웃을 적용해도 탭은 절대 닫히지 않습니다. 남는 창의 탭은 남아 있는 이웃 창으로 합쳐지고, 터미널은 바뀌지 않습니다. 크기 균등하게는 각 행의 열 너비와 행 높이를 똑같이 맞춥니다. 이 화면에 들어가지 않는 레이아웃은 비활성으로 표시되고, 툴팁에 이유가 나옵니다.

빈 창. 레이아웃이 비어 있는 채로 만든 창에는 탭을 여기로 끌어 오거나, 여기를 클릭한 뒤 파일을 여세요라는 안내가 나옵니다. 클릭하면 그 창이 선택되고, 다음에 여는 파일이 그 창으로 들어갑니다. 이 창은 저절로 사라지지 않으며, 창 닫기 버튼으로 없앨 수 있습니다.

창이 몇 개 들어가는지. 한도는 숫자가 아니라 화면 크기로 정해집니다. 새 열은 그 행의 모든 창이 너비를 약 420픽셀 이상 유지할 때만 생기고, 새 행은 모든 행이 높이를 약 240픽셀 이상 유지할 때만 생깁니다. 다만 2열과 2행은 언제나 들어갑니다. 노트북에서는 그리드가 2열에 머물고, 울트라와이드 모니터에서는 4열이나 5열이 들어갑니다.

키보드로. Ctrl+Alt+PgDn과 Ctrl+Alt+PgUp은 포커스를 다음 창과 이전 창으로 옮기며, 행 단위로 진행하고 끝에서 처음으로 돌아갑니다. 터미널도 포함됩니다. 창 → 레이아웃에는 탭을 다음 창으로 이동과 탭을 이전 창으로 이동도 있습니다.

폴더를 다시 열 때. 그리드는 떠날 때 모습 그대로 돌아옵니다. 행, 열, 크기, 그리고 각 창의 탭(선택할 때 비로소 파일을 읽어 옵니다)까지 돌아옵니다. 더 작은 화면에서 열면 들어가지 않는 열은 마지막으로 들어간 열로 합쳐지며, 탭은 하나도 사라지지 않습니다.

프로젝트 작업

프로젝트의 빌드, 테스트, lint는 터미널로 가지 않고 도구 → 프로젝트 작업에서 실행할 수 있습니다. LightNote는 열린 폴더의 작업을 스스로 찾습니다. package.json의 scripts(있는 잠금 파일에 따라 npm, pnpm, yarn), Makefile의 대상, CMakePresets.json의 buildPresets, Rust 프로젝트의 cargo build/test/run/check, 이를 설정한 pyproject.toml의 pytest, justfile의 레시피입니다.

직접 만든 작업. 손으로 쓴 작업은 VS Code 형식(버전 2.0.0)의 tasks.json에 넣으며, .vscode/tasks.json과 .lightnote/tasks.json에서 읽습니다. VS Code의 파일이 이미 있다면 따로 쓸 필요가 없습니다. label, type(shell 또는 process), command, args, options.cwd와 options.env, isDefault가 있는 group, windows/linux/osx 블록, 주석, 변수 ${workspaceFolder}, ${file}, ${fileDirname}, ${fileBasenameNoExtension}을 지원합니다. 오류가 있는 파일은 이유와 함께 메뉴에 표시되고 무시되며, 작업은 200개까지 읽습니다.

실행. 메뉴에서 작업을 고르거나 Ctrl+Shift+B를 눌러 기본 작업을 실행합니다. 기본 작업은 도구 → 프로젝트 작업 → 기본 작업에서 고른 것(폴더마다 저장)이고, 고르지 않았으면 tasks.json에서 isDefault로 표시한 작업이며, 둘 다 없으면 LightNote가 실행할 작업을 묻습니다. 출력은 종료 코드와 중지 버튼이 있는 출력 패널에 나옵니다. 프로젝트 작업 편집은 .vscode/tasks.json이 있으면 그것을 열고, 없으면 예제가 든 .lightnote/tasks.json을 만듭니다. 작업의 프로그램이 설치되어 있지 않으면 상태 표시줄이 어떤 프로그램인지 알리고 외부 프로그램을 안내합니다.

언어 서버 (LSP)

따로 설정하지 않으면 정의로 이동, 사용처 찾기, 이름 바꾸기, 자동 완성은 이름으로 찾습니다. 빠르지만 범위를 이해하지는 못합니다. 언어 서버(LSP)는 VS Code가 쓰는 것과 같은 별도의 프로그램으로, 언어를 제대로 이해합니다. 처음에는 꺼져 있으며, 설정 → 코드 도구의 언어 서버(LSP) 그룹이나 도구 → 언어 서버 → 언어 서버 사용(LSP)에서 켭니다. 파일 종류마다 전용 서버가 있습니다: pyright(Python), typescript-language-server(JavaScript와 TypeScript), clangd(C와 C++), gopls(Go), rust-analyzer(Rust), lua-language-server(Lua), bash-language-server(셸).

달라지는 점. 서버가 켜져 있으면 F12는 서버가 가리키는 정의로 이동하고, Shift+F12는 실제 사용처를 검색 패널에 나열하며, 이름 바꾸기는 올바른 기호만 바꿉니다. LightNote는 "N개 파일에서 이름을 바꾸시겠습니까?"라고 묻고, 열린 탭을 고치며(탭마다 Ctrl+Z 한 번으로 되돌림), 닫힌 파일은 인코딩을 유지한 채 저장합니다. 자동 완성에는 서버의 제안이 나오고, 오류에는 밑줄이 그어지며 문제 패널에도 표시되고, 이름 위의 도움말에는 형식과 문서가 나옵니다. 그 종류에 서식 도구가 설정되어 있지 않으면 Shift+Alt+F는 서버로 서식을 지정합니다. 서버가 응답하지 않거나, 느리거나(자동 완성은 1.5초 기다림), 답을 모르면 전처럼 이름으로 찾습니다. 설정한 린터는 Ctrl+S에서도 계속 동작합니다.

표시기와 설치. 상태 표시줄의 표시기는 탭의 서버와 그 상태(pyright · 준비됨, 시작하는 중…, 오류, 설치되지 않음)를 보여 줍니다. 클릭하면 서버 다시 시작, 서버 중지, 로그 보기…, 구성이 나옵니다. 설치하려면 도구 → 언어 서버 → .py용으로 구성…을 쓰세요. 서식 도구와 같은 도우미가 명령을 보여 주고 클릭 한 번으로 설치합니다. 탭을 여는 것만으로 설치를 권하는 일은 없습니다. 서버는 그 종류의 첫 탭에서 시작하고 마지막 탭을 닫은 지 5분 후에 멈춥니다. 동시에 최대 4개까지 실행되고, 1 MB를 넘는 파일은 서버로 보내지 않으며, 파일마다 오류를 500개까지 표시합니다.

목차

편집

도구

자동화(AI / 스크립트)

참고