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

gofumpt

neovim(nvim) gopls 설정을 업데이트한 후 .go 파일을 저장하면
var 로 선언된 변수가 := 로 간단하게 변경된다.

찾아보니 gopls 설정에 gofumpt(https://github.com/mvdan/gofumpt) 활성화되어 있었다.

gofumpt 는 gofmt, goimports 기능을 포함하면서 더 엄격한 포맷팅 규칙을 적용하는 확장된 포맷팅 방식이다.
그래서 gofumpt 포맷팅된 코드는 gofmt, goimports 검사를 통과한다고 한다.
요런 규칙들이 있다.
- 복합 리터럴에서 선행 또는 후행 빈 줄 제거
- 할당 연산자 다음의 불필요한 빈 줄 제거
- 인터페이스에서 불필요한 빈 줄 제거
- 가독성을 위해 함수에서 빈 줄 대신 ) { 라인 사용

# 바이너리 설치
go install mvdan.cc/gofumpt@latest

# 이전의 .go 파일들에 대해 포맷팅을 해봤는데 개인적으로 깔끔해져서 가독성에 더 좋은것 같다.
gofumpt -w -l $(fd --type file .go)

# 참고, gopls 체크사항 확인
gopls check $(fd --type file .go)

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

vim-go slow save

# vim 사용중 파일을 저장이 아주 느린 경우가 발생했다.
# :w 를 여러 번 시도했을때 어쩌다 한번은 시간이 오래 걸린다.
# 원인 파악을 위해 다음 프로파일링
nnoremap <leader>ps :profile start vim-profile.log<enter>:profile func *<enter>:profile file *<enter>
nnoremap <leader>pt :profile stop<enter>

# vim-profile.log 결과 vim-go 플러그인의 에서 시간이 오래걸린다.

# promise 함수에서 13초

# vim-go 다양한 기능을 위해 go#promise#New timeout(디폴트 10초)을 두고 사용하는데
# 위 프로파일 결과는 formatting, imports 부분에서 사용됐다.
let l:handleFormat = go#promise#New(function('s:handleFormat', [], l:state), 10000, '')
let l:handler = go#promise#New(function('s:handleCodeAction', ['source.organizeImports', ''], l:state), 10000, '')

# 포맷팅은 오래 걸리지 않을것 같고, imports 부분이 의심이 된다.
# 그래서 vim 을 처음 열고 .go > import {} 에서 패키지를 삭제하고 저장해보니 느려지는게 100% 재현 된다.
# 그뒤 부터는 수정 저장을 해도 빠르게 저장된다.

# argocd dependency 이슈를 해결하니 최초 저장시에도 1~2초로 빨라졌다.

use emoji in terminal

# 터미널에서 emoji(이모지) 사용하기
# 터미널에서 태그 이모지 찾기
# 필요시 디펜던시 패키지 설치
# brew install jq fzf peco
# .zshrc 에 emoji-cli 설치 및 설정
if [ ! -d "$myenv_path/emoji-cli" ]; then
    git clone https://github.com/b4b4r07/emoji-cli $myenv_path/emoji-cli
fi
# 기본 ctrl-s 단축키가 zellij 와 겹쳐서 alt-e 로 변경
export EMOJI_CLI_KEYBIND="^[e"
source "$myenv_path/emoji-cli/emoji-cli.zsh"

#####

# 터미널에서 태그 이모지를 이모지로 출력하기
# 설치
brew install emojify

# 다음과 태크 이모지를 이모지로 변경해서 출력한다.
echo ":four_leaf_clover: Sentimental programmer ysoftman :smile:" | emojify

#####

# vim 에서 태그 이모지 찾아 입력하기
# .vimrc 에 설치 및 설정
Plug 'junegunn/vim-emoji' "fzf emoji
 
"vim.emoji
"insert 모드에서:입력하다 ctrl+x ctrl+u 하면 자동완성 리스트가 보이고 선택.
set completefunc=emoji#complete

#####

# git commit message 에서 이모지를 선택해서 적용하기
# 설치
brew install gitmoji

# gitmoji 로 커밋메시지 작성해서 커밋하기
gitmoji -c

#####

# 맥에서 이모지를 편하게 입력할 수 있도록 해준다.
# 참고로 :q 등 vim 커맨드 입력시 트리거 되지 않도록 다음과 같이 설정에서 double key trigger 를 체크 하자.

golangci-lint

# vim 에서 golang generic(1.18)를 사용하는데 lint 에러가 많이 발생한다.
# vim > vim-go > golint 를 사용하고 있고 golint 바이너리는 업데이트 해도 다음과 같은 메시지가 발생한다.
golint ./...
main.go:12:8: expected ';', found '|' (and 4 more errors)

# vim > ale > gofmt 도 다음과 같은 에러 메시지를 발생한다.
gofmt .
main.go:12:8: expected ';', found '|'
main.go:12:10: illegal character U+007E '~'
main.go:16:2: expected '}', found 'return'
main.go:20:2: expected declaration, found result

https://github.com/golang/lint 가보니 2021년에 deprecated 돼 관리가 안되고 있었다.
# gofmt 바이너리는 2018년에 생성된것을 사용하고 있었다.
type gofmt
gofmt is /Users/ysoftman/workspace/gopath/bin/gofmt --> 2018년도
gofmt is /opt/homebrew/bin/gofmt --> ../Cellar/go/1.22.1/bin/gofmt

# golint 는 삭제하고
rm -f $(which golint)

# 2018년도 gofmt 삭제
rm -f /Users/ysoftman/workspace/gopath/bin/gofmt

# 대안으로 https://github.com/golangci/golangci-lint 를 사용하면 된다.
# 설치
brew install golangci-lint

# 실행
golangci-lint run ./...

# revive 사용시 설치
go install github.com/mgechev/revive@latest

# vim-go 사용시
":GoMetaLinter 명령실행시 동작할 커맨드
let g:go_metalinter_command = "golangci-lint"
"최신 golangci-lint 에서 --deadline 옵션이 --timeout 으로 변경됨
"vim-go 에서는 아직 deadline 을 사용하고 있어 주석처리함
"let g:go_metalinter_deadline = "5s"
"golangci-lint 에서 활성화할 항목
"vet -> govet 으로 바뀜
let g:go_metalinter_enabled = ['govet', 'revive', 'errcheck']

# ale 사용시
"vim-go 와 달리 linter 커맨드를 입력하지 않아도 golangci-lint 결과가 코드에 자동으로 표시된다
let g:ale_linters = {
\ 'python': ['flake8', 'pylint'],
\ 'javascript': ['eslint'],
\ 'go': ['golangci-lint', 'gofmt']
\}


code editors

유료 IDE/editor 가 사용하기도 편하고 기능도 많지만 터미널 환경 + 무료 소프트웨어도 왠만한건 다되고 유료 못지 않게 편해서 이를 더 선호하는 편이다.
유료 에디터는 10년전 윈도우 환경 개발을 위해서 visual studio 사용이 마지막인것 같다.
요즘 많이 쓰는 jetbrains 제품은 사용하지 않는다.

예전에는 vscode 를 한참 썼는데 typescript/javascript 로 만들어서 그런지 뭔가 점점 무거워지고 느린 느낌이 들어 다시 vim 을 주로 사용하게 됐다.
neovim(nvim) 이 좀더 모던한 느낌이긴 한데 기존 vim 커스터마이징한 설정에 익숙해서 쉽게 nvim 으로 넘어가지 못하고 있다.
그러면서 가끔 vscode, neovim-lzayvim 의 command palette(커맨드를 검색해서 실행하는) 기능이 그리워 질때가 있다.

vscode 느낌이면서 가볍고 빠른 rust 로 다음 에디터들을 서브로 사용해 보려 한다.
참고로 요건 vim 에 영감을 받은 터미널 환경의 에디터들, amp는 요즘 관리가 안되고 있어 왠지 사라질것 같다.

zed, lapce 둘다 깃헙 좋아요가 30K 가 넘고, vscode 처럼 커맨드 팔렛트, 익스텐션(아직 개수는 많지 않음)을 사용할 수 있어 좋다.

아톰 만든 사람이 rust 로 만들었다는 zed
cmd+shift+p -> toggle vim mode

lapse 는 디폴트 단축키들이 vscode 많이 비슷해서 최종 낙점!ㅎ
[lapse default short cut]
cmd+shift+p -> enable modal editing (like vim)
cmd+shift+e toggle file explorer
cmd+shift+x toggle plugin focus
cmd+shift+f toggle search focus
cmd+= zoom in
cmd+- zoom out
cmd+] indent line  
cmd+[ outdent line
cmd+p goto file(fuzzy file finder)
alt+up move line up
alt+down move line down
ctrl+- jump location backward
ctrl+shift+- jump location forward
ctlr+` toggle terminal
alt+shift+i insert cursor end of line(multi cursor)
f2 rename
f12 goto definition

fzf esc delay

# fzf 에서는 esc 키 처리 시 기본 50ms delay가 있고 $ESCDELAY 환경변수가 있으면 이 값에 영향을 받는다고 한다.

# 그런데 fzf.vim 을 사용시 :FZF, :Rg, :History 등으로 나오는 팝업창을 취소하려고 esc 키를 누르면 50m 보다 더 지연된다.
# 반면 ctrl+c 키로 취소하면 바로 닫힌다.
# 알고보니 .vimrc 환경에서 mapping/keycode(<esc><up><left><enter>등) 입력완료를 위한 타임아웃을 1초로 설정하고 있었다.
# 이 값을 줄이니 esc 로 취소가 바로 된다.
set timeoutlen=1000

# 흠 그런데 다른 shortcut 을 사용중이라. 저값을 너무 줄일 수는 없었다.
# ctrl+c 를 사용한던가 esc를 연속으로 두번 누르면 되긴 하지만 좀더 근본적인 해결을 위해선 다음과 같이 ttimeoutlen(ttm) 50m 정도로 줄이면 된다.
# ttimeoutlen 은 디폴트가 -1 이다.
# ttimeoutlen < 0 일때는 mapping, keycode 지연모두 timeoutlen값을 사용한다.
# ttimeoutlen >= 0 일때는 mapping 은 timeoutlen, keycode 는 ttimeoutlen값을 사용한다.
ttimeoutlen     mapping delay      key code delay
   < 0          'timeoutlen'       'timeoutlen'
  >= 0          'timeoutlen'       'ttimeoutlen'

# 그래서 다음과 같이 설정해서 해결함
# mapping 타임아웃1초
set timeoutlen=1000
# key code 타임아웃 50ms
set ttimeoutlen=50

golang vim-go GOBIN error

# go 1.19.2 버전 설치 후 .go 파일을 열때 다음과 같은 에러가 발생했다.
# :messages 로 확인해보면
vim-go: 'go env GOBIN' failed
vim-go: could not determine appropriate working directory for gopls
FileNotFoundError: [Errno 2] No such file or directory: '/Users/ysoftman/.vim/plugged/youcompleteme/third_party/ycmd/third_party/go/bin/gopls'

# vim plug 를 업데이트해도 에러가 발생한다.
:PlugUpdate

# 참고로 vim-go 최신 소스를 보면 go env gobin > $GOBIN > GOPATH./bin 순으로 찾고 있다.

# 다음과 같이 설정해도 에러가 발생한다.
# GOBIN (go install 시 실행 binary 설치 경로)
go env -w GOBIN=/Users/ysoftman/workspace/gopath/gopath/bin
go env GOBIN

# 원인은 go 실행 자체가 안되는것이 문제였다.
# go 신규 버전 설치시 macOS(darwin)환경인데 linux 바이너리파일을 설치한것이 문제였다.
# go1.19.2.linux-amd64.tar.gz -> go1.19.2.darwin-amd64.tar.gz 로 변경해서 설치해고 go 가 실행된다.
# 이제 GOBIN 을 설정하지 않아도(GOPATH/bin 로 찾는다.) 에러가 없다.
go env -w GOBIN=

# vim-plug 라면 go binary 업데이트도 해주자.
:GoUpdateBinaries

# ycmd 에러 관련해서는 다음과 같이 설치하면 된다.
cd ~/.vim/plugged/youcompleteme/third_party/ycmd/
git checkout master
git pull
git submodule update --init --recursive
./build.py --go-completer

mac key repeat speed

# mac 에서 vim 이나 터미널에서 커서 이동이나, 삭제등이 느릴때
# 아래 스샷 처럼 keyboard > key repeat:fast, delay until repeat: short 으로 설정하자.

vim slow loading

# 언제부터인가 vim 으로 파일 열기가 아주 오래 걸린다.
# 불과 수십MB 정도 파일 오픈이 완료되기까지 수십초가 걸린다.
# 물론 설정된 .vimrc 를 지우면 빠르다.

# 테스트 파일 40MB 정도의 바이너라파일 다운로드
curl -o aws-iam-authenticator https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/darwin/amd64/aws-iam-authenticator

# 파일을 열때 zzz.log 파일에 각 단계별 소요 시간 측정
vim --startuptime zzz.log aws-iam-authenticator

# 측정 결과 파일을 열어 보자.
vi zzz.log 
# 시간은 ms 단위로 각 라인은 다음 2가지 포맷 중 하나로 표시된다.
# clock   self+sourced   self:  sourced script
# clock   elapsed:              other lineskj
... 생략 ...
517.709  001.802  001.361: sourcing /Users/ysoftman/.vim/plugged/lightline.vim/autoload/lightline/colorscheme/one.vim
30908.522  000.736  000.736: sourcing /Users/ysoftman/.vim/plugged/ctrlp.vim/autoload/ctrlp/utils.vim
30920.392  30422.338: BufEnter autocommands
30920.397  000.005: editing files in windows
... 생략 ...

# BufEnter autocommand 단계가 30초가 넘는다(30422.338)
# 이 부분은 파일을 버퍼로 읽은 후 파일 타입에 맞는 셋팅들이 자동으로 실행되는 부분이다.
# 확인해보면 다수의 플러그인이 실행된다.
:autocmd BufEnter
--- Autocommands ---
filetypedetect  BufEnter
    *.xpm     if getline(1) =~ "XPM2" |   setf xpm2 | else |   setf xpm | endif
    *.xpm2    setf xpm2
NERDTree  BufEnter
    NERD_tree_*
              stopinsert
NERDTreeHijackNetrw  BufEnter
    *         call nerdtree#checkForBrowse(expand("<amatch>"))
NERDCommenter  BufEnter
    *         :call s:SetUpForNewFiletype(&filetype, 0)

... 생략 ...

vimball#ShowMesg(0,"Source this file to extract it! (:so %)")|endif
fugitive_status  BufEnter
    index     call s:ReloadWinStatus()
    index.lock
              call s:ReloadWinStatus()
fugitive_merge  BufEnter
    *         if exists('s:rebase_continue') |   exe s:MergeRebase('rebase', 0, '', [getfsize(fugitive#Find('.git/rebase-merge
/git-rebase-todo', s:rebase_continue)) > 0 ? '--continue' : '--abort'], remove(s:, 'rebase_continue')) | endif
Colorizer  BufEnter
    *         silent call colorizer#ColorHighlight(1)
youcompleteme  BufEnter
    *         call s:OnBufferEnter()
              call s:UpdateMatches()
TagbarAutoCmds  BufEnter
    *         if expand('<amatch>') !~ '__Tagbar__.*' |     let s:last_alt_bufnr = bufnr('#') | endif
              call s:AutoUpdate(fnamemodify(expand('<afile>'), ':p'), 0)


# 위에 나온 플러그인들을 .vimrc 에서 주석 처리하며 파일 오픈 해본 결과
# 다음 플러그인을 비활성화(주석처리)하면 빠르다.
# #123 처럼 #로 시작하면 컬러값을 표시해주는 플러그인으로 역시 전체 파일에서 해당 부분을 찾아 처리하는게 느린것 같다.
# 꼭 필요한 기능은 아니니 주석처리 하자.
"Plug 'lilydjwg/colorizer'

안드로이드폰 termux 사용

# 안드로이드폰으로 터미널 환경을 구성해 보자
# 준비
# 키보드(USB) 를 OTG 를 통해 폰에 연결한다.
# 안드폰에 termux 앱을 설치하자.
# termux는 aarch64(ARM 용으로 포팅한 64bit arch linux) 기반으로
# 패키지 관리자로 apt 또는 pkg(apt를 래핑)를 사용한다.
https://play.google.com/store/apps/details?id=com.termux&hl=en

# 참고로 키보드 사용시 단축키는 윈도우(리눅스)를 생각하면 된다.
alt + tab : 앱(전환)
alt + d : chrome 주소표시줄 포커싱
등등..

# termux 실행 후 필요한 패키지 설치
pkg update && pkg upgrade
pkg install -y zsh python2 python vim rust golang ripgrep curl git tig fzf tmux cmake ctags lua53 fortune cowsay figlet cmatrix golang ruby openssh libandroid-support man lsd dnsutils
pkg install -y vim-python
gem install lolcat

# 기본 zsh 로 변경
chsh -s zsh

# termux 스샷~


# /etc 에서 설정하는 파일들(krb5.conf, resolve.conf ... 등)은 ../usr/etc/ 에 위치한다.
# 만약 ../usr/etc/krb5.conf 설정 후 kinit 시 다음과 같은 에러가 발생한다면
kinit : Cannot contact any KDC for realm 'ysoftman.com' ...

# 각 서버의 디폴트 포트는 다음과 같고 포트까지 명시해보자
kdc = kauth.ysoftman.com:88
admin_server = kadmin.ysoftman.com:749
kpasswd_server = kadmin.ysoftman.com:464 # on UDP

# oh-my-zsh 를 사용하는 경우 powerline 폰트 하나
를 ~/.termux/font.ttf 파일로 생성해야 한다.
cp -v fonts/Hack/Hack-Regular.ttf ~/.termux/font.ttf

# known issue
- 아직 한국어를 지원하지 않고 오직 영어만 된다. 이슈를 줄이기 위해서라는데.. 흠. https://github.com/termux/termux-packages/issues/2796#issuecomment-424589888
- oh-my-zsh 는 동작하지만, prezto 는 zsh 시작시 모듈 로딩을 못하는 문제가 있다.
- vim plugin 중 youcomplteme 는 python 이 포함된 vim 을 사용해야 하는데
apt 로 설치되는 vim 은 python 으로 빌드된 것이 아니라 별도로 vim-python 도 설치해야 한다.

ycmd server SHUT DOWN 에러 해결하기

# youcompleteme(ycm) 플러그인을 설치 후 vim 시작시 다음과 같은 에러가 발생한다.
# 참고로 ycm 은 클라이언트이고 third_party/ycmd 에 서버 소스가 있다.
The ycmd server SHUT DOWN (restart with ':YcmRestartServer')

# 다음과 같이 인스톨을 다시 해줘야 한다.
cd ~/.vim/plugged/youcompleteme
git submodule update --init --recursive
./install.py --all --verbose

# 만약 ./install.py 수행시 c++11 지원 안된다는 에러가 발생하는 경우
CMake Error at CMakeLists.txt:247 (message):
  Your C++ compiler does NOT fully support C++11.

# gcc 는 있지만 g++ 이 설치되어 있지 않아서다.
# 다음과 같이 g++ 를 설치 후 ./install.py
sudo yum install gcc-c++

# 만약 다음과 같은 에러가 발생하는 경우
fatal error: pyconfig.h:

# python-devel 을 설치 후 ./install.py
sudo yum install python-devel

#####

# M1(arm64) 맥북 환경에서 다음과 같이 빌드시 clang 에러가 발생했다.
./install.py --all --verbose

# 원인은 pyenv 로 설치한 python3.12(~/.pyenv/shims/python)가
# 설치시 다음과 같이 gcc 로 빌드해서였다.
CC=/opt/homebrew/bin/gcc-13 pyenv install -v 3.12

# clang 으로 다시 빌드해 설치 후
pyenv install -v 3.12

# ycmd 를 다시 빌드하면 된다.
./install.py --all --verbose

brew python downgrade 와 vim 문제

# 2018-10월 현재 최신 python3.7 로 tensorflow 을 실행 할 수 없음
# mac에서 python 3.6.5 버전으로 다운그레이드하기로 함

# 현재 python 3.7 링크 제거
brew unlink python

# python 3.6.5 버전 설치
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/f2a764ef944b1080be64bd88dca9a1d80130c558/Formula/python.rb

# brew 로 설치한 vim 8.1 이 python 3.7 을 사용하고 있어
# vim 은 다음과 메시지를 발생하며 실행되지 않는다.
dyld: Library not loaded: /usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/Python
  Referenced from: /usr/local/bin/vim
  Reason: image not found
[1]    43109 abort      vim


# vim 제거(제거 후 /usr/bin/vim 을 사용해도 된다.)
brew remove vim

# vim python2 로 재설치
# 디렉토리가 비워있지 않아 설치 에러가 발생하면 /usr/local/Cellar/vim 에서 삭제
brew install vim --with-python@2

# 링크가 깨져 있으면
brew unlink vim && brew link vim

E254: Cannot allocate color 에러 해결하기

# 다음과 같이 brew 업그레이드 후 vim 컬러 할당 에러가 발생하는 경우가 있다.
brew update
brew upgrade
E254: Cannot allocate color

# 해결방법
brew reinstall vim
brew link --overwrite vim

vim-go, fzf c-t 단축키 충돌

# 터미널에서 fzf 를 C-T(control + t)로 기본 사용하고 있어
# vim 환경에서도 같은 shortcut 을 사용하려고 ~/.vimrc 에 다음과 같이 설정했다.
noremap <c-t> :FZF<enter>

# 일반적인 경우에는 잘 동작하는데, *.go 파일을 열었을 경우
# 다음과 같이 godef 스택 관련 명령이 실행된다.
vim-go: godef stack empty

# godef(정의로 이동)를 할때 이동한 위치를 스택으로 쌓는데
https://github.com/fatih/vim-go-tutorial 에 보면
# c-t 는 godef 이전 위치로 이동하는 것으로 지정되어 있다.
# 사용자가 map 으로 설정했지만 .go 에서는 vim-go 의 단축키가 우선하는 것 같다.

# 이런 문제가 나뿐만은 아닌지 이슈가 등록되어 있었다.

# 해결책은 다음과 go_def 매핑을 비활성화시키는 것이다.
let g:go_def_mapping_enabled=0

bash 환경에서 명령줄 vi 스타일로 편집하기

# bash(or zsh)에서 명령줄을 vi 스타일로 편집할 수 있다.
# 다음 명령으로 실행하면
set -o vi

# vi 옵션이 활성화(on)된것을 확인할 수 있다.
set -o | grep vi

# 명령줄을 입력하다가 esc 로 명령모드로 전환해 w, b 로 워드단위로 이동할 수 있다.
# a, i 로 입력모드로 돌아 입력할 수 있다.
# v 로 블럭 지정등 기타 vi 편집 기능을 사용할 수 있다.

# vi 옵션을 비활성화(off)하려면
set -o novi

# 참고
http://linuxcommand.org/lc3_man_pages/seth.html

linux , windows 10 bash 터미널 beep 없애기

# linux , windows 10 의 linux bash 터미널을 열어 작업할때,
# backspace 로 글자를 더이상 지울 수 없는 경우 beep 가 발생한다.
# 습관적으로 backspace 를 연타하게 되는데 beep 가 아주 거슬린다.
# terminal beep
# /etc/inputrc 파일을 열어 bell-style none 으로 설정한다.
# 기본적으로 이부분이 주석처리되어 있어 주석해제해주면 된다.
# 파일 저장 후 bash 종료하고 다시 실행하면 beep 가 발생하지 않는다~
sudo vi /etc/inputrc
set bell-style none

# vim beep
# vim 도 똑같이 beep 가 발생하는데 .vimrc 에 visualbell 을 설정하자.
vi ~/.vimrc

# beep 사용하지 않고 t_vb 로 설정된 문자로 bell 을 표시하는데
# t_vb 로 설정된것이 없어 visual bell 도 사용하지 않게 된다.
set visualbell t_vb=

# 참고
https://linuxconfig.org/turn-off-beep-bell-on-linux-terminal

# 추가로 windows 의 wsl + termianl 앱사용시 less beep
# git diff, man ls 등 페이지 처음/끝에서 더 이동하려고 하면 (less 커맨드) beep 가 발생한다.
# echo $LESS 는 다음과 같이 설정되어 있는데
# LESS='-g -i -M -R -S -w -X -z-4'
# -R -Q 를 추가하면 된다.(bashrc 등에 넣어주자.)
export LESS="$LESS -R -Q"


docker container lines cols 초기값 변경

# 도커 컨테이너에 접속해서 처음 긴명령을 타이핑하거나 vim 을 실행 했을때
# 폭24, 라인80 위치를 넘어가서 덮어 씌워지는 현상이 있다.
# 터미널 크기를 조정하면 그때부터 실제 터미널 폭,라인 크기가 제대로 반영된다.
# 아래 화면을 보면 vim 크기가 터미널 보다 작게 설정된 것을 볼 수 있다.

# 도커 컨테이너를 띄우고 접속을 하면 터미널의 크기가 80x24 로 되어 있다.
# tput 으로 컨테이너의 라인,컬럼을 확인해보자
docker exec -it ysoftman_container tput lines
docker exec -it ysoftman_container tput cols

# 호스트의 실제 터미널의 창 크기($COLUMNS, $LINES) 값을 컨테이너 접속시 전달한다.
docker exec -u ysoftman -e COLUMNS=$COLUMNS -e LINES=$LINES -it ysoftman_centos /bin/bash

# .sh 로 실행해야 할 경우 $COLUMSN, $LINES 는 사용할 수 없어 tput 을 사용한다.
docker exec -u ysoftman -e COLUMNS=$(tput cols) -e LINES=$(tput lines) -it ysoftman_centos /bin/bash

# 관련 이슈 내용 참고

# 참고로 ssh 프로토콜에는 클라이언트의 터미널 크기가 변경될때 크기 다음과 같은 정보를 보낸다.
byte      SSH_MSG_CHANNEL_REQUEST
uint32    recipient channel
string    "window-change"
boolean   FALSE
uint32    terminal width, columns
uint32    terminal height, rows
uint32    terminal width, pixels
uint32    terminal height, pixels

chrome extension - vimium

# vimium
# 현재 웹 페이지에서 특정 부분에 포커스를 해주는 툴
크롬 -> 웹스토어 -> "vimium" 으로 검색해서 설치

# 사용방법
웹 페이지에서 f 키를 누르면 각 부분에 태그명이 표시되고 이를 입력하면 해당 부분에 포커스가 된다.
태그 입력시 대소문자 구분을 하지 않아도 된다.
현재 입력창에 포커스 되어 있거나 특정 웹에서는 동작하지 않는다.

# 사용 예시


# 기타 자세한 명령은 ? 하면 다음과 같이 help 를 볼 수 있다.


Sublime Text vintage 사용하지 않기

Sublime Text 에는 vim 환경을 제공해주는 Vintage 라는 패키지를 기본으로 내장하고 있다.
Sublime Text 의 아래 상태 바에 vim 처럼 command mode / visual mode / insert mode 가 나타난다면 vintage 가 작동하고 있는것이다.

원래는 Preferences -> Settings - Default 에 다음과 같이 기본적으로 Vintage 를 사용하지 않도록 되어 있다.
"ignored_packages": ["Vintage"]

그런데 위와 같이 되어 있는데도 vim 처럼 작동한다면 package control 에서 disable 해야 한다.

Preferences -> Package Control -> Package Control: Disable Pakcage -> Vintage 선택
(또는 Ctrl + Shift + P -> disable package 로 검색해서 선택)

이렇게 하면 Preferences -> Settings - User 에 Vintage 패키지를 무시하도록 아래와 같이 자동 수정된다.(물론 직접 수정해도 된다.)
"ignored_packages":["Vintage"]