레이블이 alacritty인 게시물을 표시합니다. 모든 게시물 표시
레이블이 alacritty인 게시물을 표시합니다. 모든 게시물 표시

vim-gitgutter auto refresh

# 커밋전 코드 변경을 표시하기 위해 vim-gitgutter 플러그인을 사용중이다.
# 원래 커밋 후에는 변경표시(-,+등)이 사라져야 한다.
# 그런데 언제부터인가 커밋 후에도 변경 표시가 남아 있다.
# 임시 방편으로 현재 버퍼(파일) 저장시 :GitgutterAll(모든 버퍼 내용을 갱신) 명령을 설정해 사용하고 있었다.
autocmd BufWritePost * GitGutterAll

# neovim(nvim) 에서는 커밋 후에는 정상적으로 변경 표시가 사라진다.
# vim, nvim 모두 같은 gitgutter 설정을 사용한다.
# 원인 파악을 위해 다음과 같이 설정하면 gitgutter 플러그인 소스 위치에 gitgutter.log 를 생성한다.
let g:gitgutter_log = 1

# 변경내용 커밋 후 nvim 에 포커스를 옮기면 다음과 같이 gitgutter#all 함수가 수행된다.

# 반면 vim 에서는 다음과 같이 FocusGained 이벤트가 발생되지 않아 gitgutter#all이 수행되지 않고 있었다.

# 다음과 같이 vim 에 포커스 이벤트 액션을 설정하면, nvim 에서는 동작하지만 vim 에서 동작하지 않는다.
autocmd FocusGained * echo 'Vim has gained focus'
autocmd FocusLost * echo 'Vim has lost focus'

# iterm 내에서는 vim 포커스 이벤트가 동작한다.
# 찾아 보니 alacritty 에서 focus 이벤트가 동작하지 않는다는 이슈가 있었다.
# 다음과 같이 alacritty 사용시 터미널코드를 별도 설정하면 된다.
# 참고로 :set termcap 으로 설정된 터미널 코드 확인
if &term =~ "alacritty"
  let &t_fe = "\<Esc>[?1004h"
  let &t_fd = "\<Esc>[?1004l"
endif

alacritty korean spaces

alacritty 0.13.2 (bb8ea18) 에서 한글 입력시 ascii 문자 뒤로 공백을 추가하면 2칸이 입력된다.
kitty,iterm 터미널에선 문제없다.
비슷한 이슈가 올려와 있어 커멘트 남겨둠, 빨리 해결 됐으면 좋겠다.

neovide 에서는 한글 자음이 분리되는 현상이 발생한다.

alacritty, neovide 둘다 winit 모듈을 사용하고 관련 이슈가 등록되어 있다.
2023년에 등록된 이슈인데 바빠서인지 아직 해결이 안되고 있다.

musikcube

# terminal music player 로 musikcube 를 사용하고 있다.
# 최근에 musikcube 를 실행하면 abort 에러고 실행이 되지 않는다. 
# 참고로 kitty 터미널에서는 잘됐고, alacritty 에서만 발생한다.
abort musikcube

# 최근 brew install ncurses 로 새버전(v6.5)이 설치됐는데 여기에 버그가 있었다.
# libcursesw.a 정적 라이브러리 내용을 보면 TERMINFO 환경변수의 경로가 요렇다.
strings /opt/homebrew/opt/ncurses/lib/libncursesw.a | rg Cellar/ -B1 -A1
TERMINFO
/opt/homebrew/Cellar/ncurses/6.5/share/terminfo
HOME

# brew ncurses 가 수정되기 전까지 임시방편으로 다음과 같은 환경변수를 설정하고 실행하면 된다.
export TERMINFO=/opt/homebrew/opt/ncurses/share/terminfo
musikcube

ssh - alacritty unknown terminal type

# alacritty 터미널 에뮬레이터 사용중 원격 서버에 ssh 접속 했는데,
# clear 명령 실행시 다음과 메시지가 나오면서 화면이 지워지지 않는다.
'alacritty': unknown terminal type.

# 다음과 같이 ssh alias 로 TERM 변수를 설정해 접속하면 된다.
alias ssh='TERM=xterm-256color ssh'
ssh ysoftman@ysoftman.hostname.blabla

Alacritty terminal emulator

terminal emulator 는 맥에서 iterm2 를, 윈도우에서는 자체 terminal 를 쓰고 있었다.

여담이지만 윈도우에서는 microsoft(마소) terminal 나오기전까지 hyper 를 썼었다.
오픈소스라 좋았지만 자잘한 버그도 꽤있었다. 마소 오픈소스로 terminal(스타수 69K , 2020-11기준)을 내놓은건 정말 잘한것 같다.

여러 터미널 예뮬레이터가 중 아직 0.5 버전이지만 스타수가 27k(2020-11기준)나 되고 
GPU Acceleration 으로 아주 빠르다는 alacritty 를 사용하게 됐다.
사실 rust 로 만들었다고 해서 더 끌렸는데, 
사용중인 ripgrep, fd, bat 등의 rust 로 만든 프로그램들이 아주 좋기 때문이다.

맥(catalina 버전)에서 brew 또는 cargo 또는 깃헙에 올려둔 Alacritty-v0.5.0.dmg 릴리즈 파일을 설치 후 실행하면 다음과 같은 에러가 발생한다.

이때는 system preferences > security & privacy > allows apps download from > app store and identified developers 로 선택한다.

설치하기
직접 클론 받아 빌드 & 설치하는 경우
cd alacritty
make app && make install

빌드 바이너리를 사용하는 경우, 아래 URL 에서 다운받으면 된다.

alacritty 깃헙에서 alcritty.yml 설정 파일을 ${HOME}/.alcritty.yml 로 위치시키고
폰트, 컬러, 크기등을 입맛에 맞게 설정해 저장하면 즉시 반영돼 보인다.

#####

alacritty vs iterm2 (GPU rendering 활성화)
성능 비교를 위해 다음 명령으로 수행시간을 측정했다.
time tree /usr

user+system 수행 시간 자체는 비슷하지만 화면에 뿌려지는 시간 차이가 난다.
alacrityy = 28 s
iterm2 = 35 s

time seq 1 1000000

seq 로 숫자 출력되는 속도도 alacritty 가 빠르다.
alacritty = 1.200 s
iterm2 = 4.156 s

터미널 화면을 크게 하고 cacademo 플레이 했을때도 iterm2 는 많이 끊기는데,
alacritty 는 매끄럽게 재생된다.(이건 fps 결과가 없어 직접 눈으로 체감해봐야 한다.)

역시 rust == fast 다. alacritty 터미널 화면 출력에서 확실히 빠른게 체감된다.
CPU 를 많이 쓰긴 하지만 빠른 화면 출력이 맘에 들고 폰트,컬러등 화면도 잘 나와 iterm2 보다 alacritty 를 주로 사용할것 같다.
(추가로 윈도우에서도 위 테스트를 해봤는데, terminal 더 빠르다. 윈도우에서는 terminal 을 주로 사용)

#####

디폴트 단축키
마우스 클릭으로 URL 오픈시 
iterm2: cmd+click
alacritty: shift+click

마우스 클릭으로 블럭(단어) 선택시
iterm2: alt+double-click
alacritty: shift+double-click

마우스 클릭으로 라인전체 선택시
iterm2: alt+triple-click
alacritty: shift+triple-click

#####

윈도우 환경
설정파일 위치
%APPDATA%\alacritty\alacritty.yml

wsl(windows subsystem for linux) 실행
alacritty -e wsl

rust cli tools

alacritty(https://github.com/alacritty/alacritty) kitty, iterm2 대체
bandwhich(https://github.com/imsnif/bandwhich) iftop 대체
cfont (https://github.com/dominikwilkowski/cfonts) toilet,figlet 대체
coreutils(https://github.com/uutils/coreutils) gnu binary 대체
gitui(https://github.com/extrawurst/gitui) tig,lazygit 대체
grex(https://github.com/pemistahl/grex) 정규표현식
hexyl(https://github.com/sharkdp/hexyl) hexdump 대체
onefech(https://github.com/o2sh/onefetch) git 저장소 neofetch
termscp(https://github.com/veeso/termscp) scp,ftp 대체
termusic(https://github.com/tramhao/termusic) terminal music player
ytop(https://github.com/cjbassi/ytop) top,htop 대체
zenith(https://github.com/bvaisvil/zenith) top,htop 대체
zoxide(https://github.com/ajeetdsouza/zoxide) cd command 대체


vim command

[vim 설치]
# vim 은 vi 를 향상시킨 버전으로 GUI 용인 gVim 도 있다.
# 윈도우 또는 소스설치는 vim 사이트에서 다운로드
http://www.vim.org/
# 레드햇 계열 리눅스
sudo yum install vim
# 데미안 계열 리눅스
sudo apt-get install vim

[용어]
normal 모드 : 기본 모드로 명령을 실행할 수 있는 상태로, 다른 모드로 전환하기 전의 상태
insert 모드 : i, a 등으로 수정(쓰기)작업을 할 수 있는 상태
visual 모드 : v 로 특정 블럭을 지정(선택)할 수 있는 상태
register : yank(copy역할)등으로 저장된 메모리 공간(클립보드 역할)
buffer : 파일을 읽어 놓은 메모리 공간, 버퍼 수정 저장해야 파일로 쓰게 된다.
window : 버퍼 내용이 표시되는 화면
tab : 여러 windows 들의 모음

[.vimrc 설정 예시]
" vimrc 에서 주석은 " 를 사용한다.
" ysoftman .vimrc 설정
syntax on
color elflord
set number
set hlsearch
set incsearch
set backspace=indent,eol,start
set enc=utf-8
set fencs=utf-8,cp949
set tabstop=4
set autoindent
" gvim 의 경우 source $VIMRUNTIME/vimrc_example.vim 에서 텍스트 파일을 열때 textwidth=78 로 설정하고 있는데 이를 수정함
autocmd FileType text setlocal textwidth=0 tabstop=4 shiftwidth=4
if has("gui_running")
 set guifont=나눔고딕코딩:h10 " 폰트 설정
 au GUIEnter * winsize 100 50 " 시작시 윈도크 크기 설정
endif

[vim 명령어]
esc "ctrl+c 명령 취소
syntax on "신택스 기능 활성화
color elflord 또는 colorscheme elflord "컬러설정, syntax 활성화되어야 함
highlight Normal ctermbg=none "하이라이트로 normal 그룹에 color terminal background 색은 무시, 컬러스킴의 black 아닌 none 값으로 검은색 배경이 된다.
highlight ColorColumn ctermbg=brown "colorcolumn 색변경, 컬러스킴 설정 후 에 명시해야 적용된다.
ctrl+w n "새창 만들기, :new
ctrl+w s "현재파일을 수평창으로 나눔, :sp
ctrl+w v "현재파일을 수직창으로 나눔, :vs
ctrl+w o "현재창만 놔두고 모든 분할된 창 닫기
ctrl+w q "현재창 닫기
ctrl+w = "창들을 균등하게 분할
ctrl+w w 또는 방향키 또는 h,j,k,l 방향키 "창들간에 이동
ctrl+w H "현재 창을 왼쪽으로 이동
ctrl+w L "현재 창을 오른쪽으로 이동
ctrl+w J "현재 창을 아래쪽으로 이동
ctrl+w K "현재 창을 위쪽으로 이동
ctrl+w n< "현재 창 n(명시하지 않으면 1)만큼 width 줄이기
ctrl+w n> "현재 창 n(명시하지 않으면 1)만큼 width 늘리기
ctrl+w n- "현재 창 n(명시하지 않으면 1)만큼 height 줄이기
ctrl+w n+ "현재 창 n(명시하지 않으면 1)만큼 height 늘리기
20ctrl+w _ "창 높이를 20라인 크기로 조정, :resize 20
100ctrl+w | "창 폭을 100컬럼 크기로 조정, :vertical resize 100
ctrl+f "page down
ctrl+b "page up
ctrl+d "반페이지 down
ctrl+u "반페이지 up
ctrl+v "visual block mode, 세로로 블럭 지정 가능
insert 모드에서 ctrl+v숫자 "터미널로 입력되는 특수키 문자 파악, 예를 들어 숫자에 027입력하면 ^[ --> ESC 키로 ^와[ 를 조합된게 아님, 065는 A로 표시된다
ctrl+z "vim 중지하고 백그라운드로 전환해 쉘이 보임, fg 로 vim으로 다시실행, :sh 와 exit 도 같은 기능
h "커서 왼쪽 이동
l "커서 오른쪽 이동
j "커서 아래쪽 이동
k "커서 위쪽쪽 이동
2h "커서 왼쪽 2칸 이동
2l "커서 오른쪽 2칸 이동
2j "커서 아래쪽 2줄 이동
2k "커서 위쪽쪽 2줄 이동
10G "10 라인으로 이동
10+ "현재 라인에서 10 라인 아래로 이동
10- "현재 라인에서 10 라인 이전으로 이동
H "현재 화면에서 첫 라인으로 이동
M "현재 화면에서 중간 라인으로 이동
L "현재 화면에서 마지막 라인으로 이동
~ "현재 커서 대문자 -> 소문자, 소문자 -> 대문자 변환
J 또는 블럭 선택 후 :join "현재 라인의 맨끝에서 라인 2개를 1개로 합친다. 합쳐진 라인의 indent 는 삭제되고 공백이 추간된다. 블럭으로 멀티 라인을 선택해서 합칠 수도 있다.
u "최근 편집명령 하나 취소
u "visual 모드, 선택한 블럭 소문자로 변환
U "visual 모드, 선택한 블럭 대문자로 변환
r "현재 커서 글자 하나 수정
R "Replace mode, 모든 문자위에 덮어 쓰기 할 수 있는 상태가 된다.
I "insert 모드, 현재줄 맨 앞에 추가
A "insert 모드, 현재줄 맨 끝에 추가
i "insert 모드, 커서 앞에 추가
a "insert 모드, 커서 뒤에 추가
v "visual 모드, 블럭 문자 단위 지정, :로 명령모드에서 :'<,'> 로 자동 입력
V "visual 모드, 블럭 라인 단위 지정, :로 명령모드에서 :'<,'> 로 자동 입력
y "visual 모드에서 지정한 블럭 register 로 복사
yy "커서가 있는 라인을 복사
yb "커서부터 단어의 앞까지 복사
yw "커서부터 단어의 뒤까지 복사
p "커서 뒤에 1번 붙여넣기, np 하면 n번 반복
P "커서 앞에 1번 붙여넣기, nP 하면 n번 반복
n| "현재라인에서 n컬럼으로 이동
f문자 "현재라인에서 오른쪽방향으로 문자가 있는곳으로 이동
F문자 "현재라인에서 왼쪽방향으로 문자가 있는곳으로 이동
t문자 "현재라인에서 오른쪽방향으로 문자가 있는곳 한칸 전으로 이동
T문자 "현재라인에서 왼쪽방향으로 문자가 있는곳 한칸 전으로 이동
; "f,F,t,T문자 이동 반복
n% "파일의 n%퍼센트 라인으로 이동
x "한글자 삭제
ggdG "전체 삭제, 파일 처음 위치로 가서 파일 끝까지 삭제
횟수dw "횟수만큼 dw 수행
횟수dd "횟수만큼 dd 수행
dw "커서가 있는 단어 삭제
dd "커서가 있는 라인 삭제
d^ "커서 부터 라인 시작까지 삭제
d$ 또는 D "커서 부터 라인 끝까지 삭제
diw "delete inner word, 현재 커서가 있는 단어 하나 삭제, 커서가 공백 위라면 공백만 삭제
daw "delete a word, 현재 커서가 있는 단어 하나 삭제
dis "delete inner sentence, 현재 커서가 있는 문장(. ! ? 공백 탭등으로 구분) 삭제, 커서가 문장 사이에 공백 위라면 공백만 삭제
das "delete a sentence, 현재 커서가 있는 문장((. ! ? 공백 탭등으로 구분) 삭제
dt문자 "현재 커서에서 문자 전 까지 삭제
df문자 "현재 커서에서 문자 까지 삭제
d/스트링 "현재 커서에서 스트링이 있는 곳까지 삭제
cb "현재 커서 이전부터 단어 시작까지 삭제(register 에 저장)하고 insert 시작
cw 또는 ce "현재 커서부터 단어까지 삭제(register 에 저장)하고 insert 시작
cc 또는 S "현재 라인 삭제(register 에 저장함)하고 insert 시작
ciw "현재 커서가 있는 단어 하나 삭제(공백 미포함, 커서가 공백 위라면 공백만 삭제) 후 insert 모드
caw "현재 커서가 있는 단어 하나 삭제(공백 포함) 후 insert 모드
ci( 또는 ci) "현재 커서에서 가장 가까운 () 내용 삭제 후 insert 모드
ca( 또는 ca) "현재 커서에서 가장 가까운 ()과 () 내용 삭제 후 insert 모드
ci{ 또는 ci} "현재 커서에서 가장 가까운 {} 내용 삭제 후 insert 모드
ca{ 또는 ca} "현재 커서에서 가장 가까운 {}과 {} 내용 삭제 후 insert 모드
s "현재 문자 삭제(register 에 저장함)하고 insert 시작
. "마지막 명령 반복 수행
qa "a 이름의 매크로 기록 시작
q "매크로 기록 종료
@a "a 매크로 실행
@@ "이전 실행한 매크로 실행
10@a "a 매크로 10번 실행
$ "현재 라인의 끝으로 이동
0 "현재 라인의 시작으로 이동
^ 또는 _ "현재 라인의 공백아닌 첫문자로 이동
+ 또는 ctrl+m "다음 라인의 공백아닌 첫문자로 이동
- "이전 라인의 공백아닌 첫문자로 이동
w "다음 단어의 첫문자로 커서이동
W "공백으로 구분되는 다음 단어의 첫문자로 커서이동
e "다음 단어의 마지막 문자로 커서이동
E "공백으로 구분되는 다음 단어의 마지막 문자로 커서이동
b "한단어 뒤로 단어의 첫문자로 커서 이동
B "공백으로 구분되는 한단어 뒤로 단어의 첫문자로 커서이동
t문자 "현재 라인에서 오른쪽 방향으로 문자 위치 바로전으로 커서 이동
f문자 "현재 라인에서 오른쪽 방향으로 문자 위치로 커서이동
T문자 "현재 라인에서 왼쪽 방향으로 문자 위치 바로전으로 커서 이동
F문자 "현재 라인에서 왼쪽 방향으로 문자 위치로 커서이동
V(비주얼모드로 블럭선택후) > "sw 크기 만큼 오른쪽으로 이동, indent
V(비주얼모드로 블럭선택후) < "sw 크기 만큼 왼쪽으로 이동
>> "sw 크기 만큼 오른쪽으로 이동, indent
<< "sw 크기 만큼 왼쪽으로 이동
{ "이전 문단으로 이동
} "다음 문단으로 이동
[[ "이전 섹션으로 이동
]] "다음 섹션으로 이동
% "현재 커컷상의 ([{}]) 에 짝이 되는 곳으로 이동
# "현재 커서상의 워드 문자열 찾고 이전으로 이동
* "현재 커서상의 워드 문자열 찾고 다음으로 이동
/string "문자열 앞으로 찾기, n 으로 다음찾기
/\cstring 또는 /string\c "\c로 주면 대소문자 구분없이 찾기
/\Cstring 또는 /string\C "\C로 주면 대소문자 구분해서 찾기
/\<word\> \< 는 단어 시작, \> 는 단어 끝으로 word 길이도 일치해 찾기
/대상1\|대상2\|대상3"\| 구분으로 여러개 한번에 찾기
?string "문자열 뒤로 찾기, n 으로 이전찾기
n "찾은 문자열들 중에서 다음으로 이동
N "찾은 문장열들 중에서 이전으로 이동
gf "명시된 파일로 바로가기
gd "현재 단어(변수) 현재 파일내에서 정의 위치로 가기
gD "현재 단어(변수) 현재 함수내에서 정의 위치로 가기
gt "다음 탭으로 이동 :tabn
gT "이전 탭으로 이동 :tabp
m{a-z} "ma 하면 a이름으로 마크, 현재 버퍼내에서만 마크됨, 다른 파일에선 마크로 이동 못함
m{A-Z0-9} "mA 하면 A이름으로 마크, 파일까지 마크됨, 다른 파일에서도 마크로 이동 가능
'마크이름 "마크 위치의 라인 첫위치로 이동
`마크이름 "마크 정확한 위치로 이동
ctrl+6 "이전 파일 열기
ctrl+o "이전 위치로 점프
ctrl+i "앞 위치로 점프
v zf "블럭 선택 후 블럭 폴딩/닫기
za "현재 커서 위치에서 폴딩 토글
zo "폴딩된 라인에서 폴딩 열기
zc "폴딩된 라인에서 폴딩(닫기)
zd "폴딩 삭제
zk "이전 폴딩으로 이동
zj "다음 폴딩으로 이동
zm "(깊은 폴딩 부터,foldlevel 1개 감소) 폴딩 닫기
zM "모든 폴딩 닫기
zr "(깊은 폴딩 부터,foldlevel1개 증가) 폴딩 열기
zR "모든 폴딩 열기
= "프로그램 소스코드에서 v 로 영역을 선택하고 = 누르면 선택된 영역들의 줄들이 알맞게 들여쓰기됨
== "현재 라인 들여쓰기
gg=G "파일 처음부터 끝까지 알맞게 들여쓰기됨
=% "프로그램 소스코드에서 시작블럭{ 이나 끝블럭} 에서 =% 누르면 블럭내의 줄들이 알맞게 들여쓰기됨
K "현재 커서에 대한 대문자 메뉴얼 페이지 보기
ctrl+r "최근 취소된 편집명령 복구
ctrl+g "현재 파일이름과 라인수 보기
ctrl+n "자동완성 리스트에서 다음 항목
ctrl+p "자동완성 리스트에서 이전 항목, 프로그래밍시 함수,변수에서 ctrl+p 하면 자동완성, 예를 들어 int YoonByoungHon = 0; 후 다음 줄에서 Yo부분에서 ctrl+p 하면 YoonByoungHoon 이 바로 입력되거나 Yo 로 시작하는 리스트중에서 선택가능
"레스트터이름명y "레지스터에 내용 복사
"레스트터이름명p "레지스터의 내용 붙여넣기
"+y "+는 CLIPBOARD, vim -> CLIPBOARD 으로 복사
"+p "+는 CLIPBOARD, CLIPBOARD -> vim 으로 붙여 넣기
:reg "레지스터 내용 보기, type -> c:characterwise, l:linewise, b:blockwise-visual
:help 또는 :h "도움말 보기
:help i "i 도움말보기
:help :e ":e 도움말보기
:help ctrl-r "ctr+r 도움말보기
:messages "vim 이 출력하는 메시지 보기
:stop 또는 :suspend "suspend vim 로 ctrl+z 와 같다.
:color 또는 colo 또는 colorschem "현재 설정된 컬러 스킵 보기, 공백 후 tab, shift-tab 을 누르면 사용 가능한 컬러 스킴이름이 표시된다.
:intro "인트로 화면 보기
:print "현재 커서 위치의 라인 내용 출력
:language 또는 lang "현재 언어 설정 보기
:!외부명령 "외부명령실행, 예를 들어 !ls -ahl 하면 는 ls -ahl 실행
:f "현재 파일이름과 라인 수 보기
:n "n라인으로 이동
:% "%는 현재파일을 의미한다. 파일 전체 범위 지정, :1,$ 와 같다.
:0 또는 gg "파일의 첫번째 행으로 이동
:$ 또는 G "파일의 마지막 행으로 이동
:e filename "파일 새로 열기(버퍼), :e filename 입력시 ctrl+d 하면 현재 위치의 파일 리스트 표시
:e ++enc=cp949 "cp949 인코딩으로 다시 열기, 참고로 .vimrc 에서 set fencs=utf-8,cp949 하면 알맞은 인코딩을 파일을 연다
:w ++enc=utf-8 filename "명시한 파일을 utf-8 로 인코딩해서 저장
:w ++enc=utf-8 % "현재 파일을 utf-8 로 인코딩해서 저장
:e! "파일 다시 읽기
:noau e filename.gz 또는 vi -c "noau e filename.gz" "gzip 파일 압축해서해서 열지 않기, vim 은 기본적으로 gzip 파일은 압축해서 연다.
:bp 또는 bprevious "이전 버퍼로 이동, 버퍼는 메모리에 올라가 있는 파일로 vim a.txt b.txt 했을때 2개의 텍스트 버퍼가 생성된다. 화면 위에 버퍼 내용들이 표시된다.
:echo 표현 "뒤 오는 표현 내용 출력
:echo winnr() "현재 창 번호 출력
:echo winnr('$') "마지막 현재 창 번호 = 창 개수 출력
:echo bufnr() "현재 버퍼 번호 출력
:echo bufnr('$') "마지막 버퍼 번호 출력
:bn 또는 :bnext "다음 버퍼로 이동
:bd 또는 :bdel "현재 버퍼 삭제/닫기
:buffers 또는 :ls 또는 :files "버퍼 리스트 보기
:%bwipeout 또는 :%bw "모든 버퍼 삭제/닫기
:tabs "탭 리스트 정보
:tabe 또는 :tabnew "새탭열기) 또는 :tabe 파일명
:tabc 또는 :tabclose "현재 탭닫기, tabc! 저장하지 않고 닫기
:tabo "모든 탭 닫기, tabo! 저장하지 않고 닫기
:tabp 또는 :tabprevious 또는 gT "이전 탭으로 이동, vim -p a.txt b.txt 했을때 2개의 탭으로 열린다.
:tabn 또는 :tabnext 또는 gt "다음 탭으로 이동, tabn3 3번 탭으로 이동
:marks "마크 리스트
:delmarks 마크이름 ":delmarks a b 하면 a와 b 마크 지우기, :delmarks \" 하면 " 마크 지우기, delmarks 0-9 a-z A-Z 숫자,영문자 마크 모두 삭제, ' 이름의 마크는 바로 이전 위치에 대한 마크로 삭제할 수 없다.
:new "새창 만들기
:sp "수평으로 창을 나누기
:vs "수직으로 창을 나누기
:sp 파일명 "수평으로 창을 나누고 파일 열기
:vs 파일명 "수직으로 창을 나누고 파일을 열기
:Explore "현재 파일 탐색 표시, 탐색창에서 o 는 파일 열기, p 는 파일 프리뷰
:Sexplore "수평으로 창을 나누고 탐색 표시
:Vexplore "수직으로 창을 나누고 탐색 표시
:ju 또는 :jumps "점프 리스트 표시
:clearjumps "현재 윈도우 점프 리스트 지우기
:sh "잠시 쉘로 나가기, 쉘에서 exit 하면 vi로 복귀
:copen "quickfix list 창 열기
:ccl 또는 :cclose "quickfix list 창 닫기
:cw 또는 :cwindow "에러 있으면 quickfix list 창 열기
:cl 또는 :clist "quickfix list 보기
:cn "quickfix list 중 다음 항목
:cp "quickfix list 중 이전 항목
:cfirst "quickfix list 중 첫번째 항목
:clast "quickfix list 중 마지막 항목
:cfdo 명령 "quickfix list 항목별 명령 실행
:lopen "location list 창 열기
:lcl 또는 :lclose "location list 창 닫기
:lnext "location list 중 다음 항목
:lprev "location list 중 이전 항목
:lfirst "location list 중 첫번째 항목
:llast "location list 중 마지막 항목
:retab "set expandtab 으로 탭입력이 스페이스로 변경되는 상태에서, 모든 tab 을 space 로 변경
:retab! "set noexpandtab 으로 탭입력이 스페이스로 변경되지 않는 상태에서, 모든 space 를 tab 으로 변경
:set spell 스펠링 체크 활성화(스펠이 이상한 경우 밑줄 표시)
:set nospell 스펠링 체크 비활성화
:set all "모든 설정 보기
:set 설정명 "설정 값 보기
:set enc=utf-8 "인코딩 utf-8 로 사용
:set visualbell t_vb= "beep 대신 t_vb 로 설정된 문자로 표시하는데 설정 문자가 없어 visual bell 도 사용하지 않게 된다.
:set hidden "버퍼 숨김 활성화, 버퍼를 수정 후 파일로 저장하지 않아도 다른 버퍼로 이동 :bn 할 수 있다. 숨김이 비활성화되어 있으면, 버퍼를 수정 후 저장해야 다른 버퍼로 이동 할 수 있다.
:set autoread "파일 자동 refresh
:set updatetime=1000 "화면 갱신 주기(default: 4000ms), 커서 사용중일때는 갱신 않함
:set laststatus=2 "상태바 활성 0:비활성 1:윈도우가2개이상일때(디폴트) 2:항상
:set showtabline=2 "탭바 활성 0:비활성 1:탭이2개이상일때(디폴트) 2:항상
:set mouse=a "gui 환경에서 마우스 사용 가능, 기본 mouse=""
:set number 또는 :set nu "라인 번호 표시, 끝에 !붙이면 토글
:set nonumber 또는 :set nonu "라인 번호 표시 안하기
:set relativenumber 또는 :set rnu "라인 번호 표시, 끝에 !붙이면 토글
:set incsearch 또는 :set is "키 입력 마다 찾기 결과 표시
:set noincsearch 또는 :set nois "키 입력 후 엔터시에만 찾기 결과 표시
:set hlsearch "검색결과 하이라이트
:nohl "하이라이트 제거
:highlight "하이라이트 색설정 상태
:set showcmd "명령모드에서 명령 표시, 비주얼 모드에서 선택크기 표시
:set cursorline 또는 :set cul "현재 커서 라인 하이라이팅 활성화
:set nocursorline 또는 :set nocul "현재 커서 라인 하이라이팅 비활성화
:set cursorcolumn 또는 :set cuc "현재 커서 컬럼 하이라이팅 활성화
:set nocursorcolumn 또는 :set nocuc "현재 커서 컬럼 하이라이팅 비활성화
:set colorcolumn=100 "컬럼 가이드 라인 컬러로 보이기
:set syntax=sh "파일 타입을 .sh 로 설정
:set autoindent "자동들여 쓰기 활성화
:set noautoindent "자동들여 쓰기 비활성화
:set cindent "C 프로그래밍용 들여쓰기 활성화
:set nocindent "C 프로그래밍용 들여쓰기 비활성화
:set wrap "자동 줄 바꿈
:set nowrap "자동 줄 바꿈 안하기
:set textwidth=n "n만큼 텍스길이기 넘으면 다음줄로 이동, 0이면 다음줄 이동 제한 없음
:set ignorecase 또는 :set ic "찾기시 대소문자 무시
:set noignorecase 또는 :set noic "찾기시 대소문자 구분
:set lines "라인 크기 설정보기
:set lines=80 "라인 80 로 설정
:set iskeyword=@,48-57,_,-,192-255,# "설정된 문자로 연결되면 하나의 워드로 취급
:set iskeyword+=- "워드로 취급문자에 - 도 추가
:set list "탭,스페이스,엔터 등의 기호 표시
:set listchars=tab:→\ ,space:·,trail:·,precedes:«,extends:»,eol:↵ "탭,공백,라인끝공백,접기,펼치기,엔터 문자 설정
:set nolist "탭,스페이스,엔터 등의 기호 표시 안하기
:set ts=n 또는 :set tabstop=n "탭크기를 n으로 설정
:set sw=n 또는 :set shiftwidth=n "들여쓰기 >>, 내여쓰기 <<, 될때 또는 엔터등으로 자동 들여쓰기 될때 이동 크기
:set et 또는 :set expandtab "탭키 입력시 탭 대신 tabstop=n 만큼의 스페이스 사용
:set noet 또는 :set noexpandtab "et 비활성화, 탭키 입력시 탭 사용
:set esckeys "insert 모드에서 방향키 제대로 작동시키기
:set backspace=indent,eol,start "insert 모드에서 백스페이스 제대로 작동시키기
:set paste "붙여넣기모드,텍스트를 복사 후 vim 에 붙여넣기하면 autoindent, textwidth 등의 값이 설정 되어 있는 경우 계단처럼 들여쓰기 되는 현상이 발생한다. set paste 를 수행하면 autoindent, textwidth 등의 값을 리셋하거나 비활성하여 있는 그대로 붙여넣을 수 있다.
:set shellcmdflag=-ic "vim 에서는 .bashrc 를 로딩하지 않아 :!alias명령을 실행 할 수 없는데 shell 에 -i inertactive 모드로 .bashrc 을 로딩하는 새로운 쉘 생성, -c 뒤에 오는 스트링을 명령으로 처리한다. 옵션을 주어 alias 명령도 실행하도록 한다.
:set tm=1000 또는 :set timeoutlen=1000 "맵핑키 입력 완료까지의 대기시간ms, 기본 1000, ttm<0 이면 키코드(<esc><up><enter>등)도 tm 값으로 대기한다.
:set ttm=50 또는 :set ttimeoutlen=50 "ttm>=0 일때 키코드의 입력 후 대기시간ms, 기본:-1
:set foldmethod=syntax "폴딩시 syntax(기본은 manual)기준으로 하기, syntax 방법은 블럭 지정(수동)으로 폴딩이 안되고, synatx 에 맞게만 폴딩한다.
:set foldenable "파일 오픈시 폴딩
:set nofoldenable "파일 오픈시 폴딩 하지 않기
:let "변수 설정 모두 보기
:let 변수명 또는 :echo 변수명 "변수 값 보기
:let 변수명=값 "내부 변수 설정, g:변수명 전역변수, b:변수명 버퍼변수
:let mapleader="," "leader 키 , 로 설정, 디폴트는 \ => "\\" 로 설정
:verbose set "설정된 모든 옵션 보기
:verbose set 옵션이름 "옵션에 대한 상태 보기, tabstop 옵션 상태 보기 예) :verbose set tabstop
:10, 100 d "10~100번재 행 삭제
:w "저장
:w 파일명 "파일명으로 저장
:w! "강제로 저장
:q! "저장하지 않고 종료
:qall! "저장하지 않고 모든 열려있는 창 종료
:wq "저장하고 종료
:wa "변경파일 모두 저장
:xa "변경파일 모두 저장 후 종료
:%!xxd "%파일전체, !외부명령, xxd 명령 실행, hex 모드) 또는 :%!hexdump -C "hexdump 명령 실행, -C(canonical hex+ASCII) hex 모드
:%!xxd -r "xxd 명령 실행, hex 모드 해제
:g/문자/d "파일 전체에서 문자가 포함된 라인들 모두 삭제
:g/문자/m 0 "파일 전체에서 문자가 포함된 라인들 모두 0번째 아래로 이동
:g/문자/m -2 "파일 전체에서 문자가 포함된 라인들 한줄 위로 이동
:g/문자/m +1 "파일 전체에서 문자가 포함된 라인들 한줄 아래로 이동
:%s/문자//gn "파일전체에서 문자 개수 파악
:s/문자1/문자2/ "현재라인에서 문자1을 문자2로 바꾼다.
:s#문자2#문자2# "구분자를 # 로 사용할 수도 있다.
:s/문자1/문자2/i "대소문자 무시한 문자1을 문자2로 바꾼다.
:%s/문자1/문자2/gc "파일전체범위(%), g 옵션이 없으면 각 라인에서 첫번째로 매칭된는것 하나만 변경된다. c를 붙이면 바꿀때 물어본다.
:%s/\<문자1\>/문자2/ "파일 전체에서 문자1(길이까지 일치)을 문자2로 바꾼다.
:%s/\//문자2/ "/ 자체를 문자2로 변경하기
:%s#/#문자2# "/ 자체를 문자2로 변경하기
:%s/\n/\r\r/ 또는 :%s/\n/ctrl+v 후 엔터입력/ "2줄씩 줄바꿈, 줄바꿈 문자변경시 검색부분은 \n 변경부분 \r 를 사용해야 한다.
:라인번호1,라인번호2s/문자1/문자2/ "라인번1~2 사이에서 문자1 문자2로 바꾼다.
:'<,'>s/.\{2}$// "블록지정 후 :s/.\{2}$//) "블럭지정된 영역의 마직막 2글자 삭제
:map 매핑키 매핑내용 "Normal, Visual, Seclt 모드에서 동작하는 키 매핑, 재귀적 매핑, map a b 과 map b c 로 하면 a -> c 로 매핑될 수 있다. map, noremap 은 Normal, Visual, Select, Operator-pending 모드에서 키 매핑을 사용할 수 있다. :h map-table 참고
:noremap 매핑키 매핑내용 "Normal, Visual, Select 모드에서 동작하는 키 매핑, 비재귀적 매핑
:nmap 매핑키 매핑내용 "Normal 모드에서만 동작하는 키 매핑
:nnoremap 매핑키 매핑내용 "Normal 모드에서만 동작하는 키 매핑, 비재귀
:vmap 매핑키 매핑내용 "Visual, Select 모드에서만 동작하는 키 매핑
:vnoremap 매핑키 매핑내용 "Visual, Select 모드에서만 동작하는 키 매핑, 비재귀
:imap 매핑키 매핑내용 "Insert 모드에서만 동작하는 키 매핑
:inoremap 매핑키 매핑내용 "Insert 모드에서만 동작하는 키 매핑, 비재귀
:cnoreabbrev 매핑키 매핑내용 "Command 모드에서 축약어 매핑, 비재귀
:function 설정된 함수리스트 보기
:scriptnames 설치된 플러그인 리스트 보기
:so ~/.vimrc 또는 :source ~/.vimrc "수정된 vimrc 설정 반영

[profiling]
:profile start vim-profile.log
:profile func *
:profile file *
이제 성능이 느린 액션 수행
:profile pause "잠시 멈춤
:profile continue "다시 시작
:profile stop "stop 해야 파일에 써진다.(또는 vim 종료하면 파일에 써진다.)

[diff 사용]
vimdiff 사용시: vimdiff a.txt b.txt
neovim 사용시: nvim -d a.txt b.txt
vim 에서는 창을 수직 분할 후 각 창에 파일을 로딩 한 다음 :windo difft 로 창들을 diff 윈도우에 포함
:diffget 현재 버퍼 커서의 차이부분 가져오기(대체)
:diffput 현재 버퍼 커서의 차이부분 다른 버퍼에 넣기(대체) 

[mac option(alt,meta) 키 동작 안되는 문제 해결하기]
mac 에선 기본적으로 option 키가 조합되면 특정 문자로 취급된다.
option+a == å
option+d == ∂
option+p == π
사실 option 는 alt 와 다르고, 각 터미널에 따른 설정이 필요하다.
iterm --> option 키 normal --> esc+
kitty --> macos_option_as_alt no
alacritty
--> alt_send_esc: true 는0.12.0 에서 디폴트로 설정에서 제거됨
--> windows > option_as_alt: Both 로 설정함
:h key-notation 참고

[remove trailing whitespace, 라인끝 공백 제거]
% 파일전체범위, s 바꾸기, \s\+ 공백1개이상, $ 끝에서, // 빈값으로, e 에러 메시지 표시하지 않기
:%s/\s\+$//e

[블럭내 변경]
visual 모드에서 v 로 블럭 지정
:입력(자동으로 :'<,'> 로 변경)s/대상문자/변경될문자/g

[블럭내 정렬]
visual 모드에서 v 로 블럭 지정
:입력(자동으로 :'<,'> 로 변경)sort  "정렬
:입력(자동으로 :'<,'> 로 변경)sort! "reverse 정렬
:입력(자동으로 :'<,'> 로 변경)sort u "unique 정렬(중복제거)

[멀티라인 수정]
1. 라인 처음으로 커서를 위치 시키고 블록 모드로 변경 ctrl+v
2. 커서로 아래(또는 j)로 멀티 라인 선택
3. 블럭 첫음에 추가시: I(shift+i)로 첫번째 라인 처음에 문자 insert
또는
블럭 수정(삭제하고 입력모드)시: c 로 수정
또는
블럭 끝에 추가시: $로 모든 라인의 끝까지 선택 후 A(shift+a)로 문자 append
4. esc 하면 선택한 전체 라인 반영
참고로 c로 수정하는것 외 insert/append 시 삭제만 하면 멀티 라인으로 반영되지 않는다.

[멀티 커서(선택)로 리팩토리링(변경)하기]
1. v로 검색할 부분 지정 후 ctrl+n 로 선택하고 다음 찾기, ctrl+x는 스킵, ctrl+p는 현재 선택해제 후 이전 선택으로 이동
2. I 로 insert 모드 시작 또는 c 로 삭제 후 insert 모드 시작
3. 수정 후 esc 로 종료

[블럭단위 찾기]
1. v 로 블록지정
2. y 로 디폴트 레지스터에 저장
3. / 찾기모드 변경
4. ctrl+r " 로 디폴트 레지스터의 내용 붙여넣기

[파일들에서 찾아 변경하기]
1. :Rg ysoftman-apple
2. ysoftman-apple 포함된파일들이 보이고, tab또는ctrl+i 으로 선택/해제(alt+a전체선택, alt+d전체해제)후 엔터치면 quickfix 창이 생기고 선택한 목록들이 보인다.
3. quickfix 내 항목들에 대해 변경 명령을 수행, update 변경된 버퍼 저장
cfdo %s/ysoftman-apple/ysoftman-lemon/gc | update