시리즈

vim 맛있습니까? 그거 독약입니다.

20210112
drug
extension
plugin
vim
vim plugin
vscode

 

너넨 이런거 하지마라~

https://bengi.kr/1349

이 글을 보고 답글 쓰다가 날아가서 그냥 블로그에 씁니다.

먼저, 전 vim을 무조건 써야 된다고 강요하는 꼰대나 광신도는 아닙니다.

하지만 반대로 vim을 공포의 대상으로 만들고, vim을 쓰는 사람을 신격화할 필요는 없습니다.

vim 바이너리 자체를 강요하기 보다 IDE를 먼저 숙달하고 IDE + vim 키맵 → IDE + vim 플러그인 → vim 바이너리 순으로 '시도' 해보는 걸 추천합니다.

협업과 후임 OJT 등등의 현실적인 문제까지 생각하면 IDE + vim 플러그인 정도가 적절한 타협점입니다.


IDE <<<< IDE + vim

분명한 것은 vim의 방식을 사용하면 코드 생산성의 향상이 있습니다.

vim의 러닝커브는 아주 정직하게 투자한 시간만큼 이득을 얻는 구조입니다.

그래서 시작은 가벼운 마음으로 본인이 익숙한 IDE 환경에서 하는게 좋습니다. IDE에 있는 vim 플러그인/익스텐션을 사용하는 것도 vim을 쓰는 또 하나의 방식입니다. vim 바이너리를 쓰지 않는다고 순수 비머가 아니라고 무시하면 안되고 현실에는 그러는 사람도 없습니다. IDE를 쓰면 vimrc, vim plugin 을 몰라도 화려한 gui 환경에서 vim의 기본을 재밌게 배울 수 있습니다.

~~일 안에 vim을 마스터하겠다는 마음으로 접근하면 끝이 없습니다. 필요한 만큼 배워서 쓰고 또 필요하면 더 배우고 하면 됩니다.

vim의 키맵을 완전히 숙지하지 못해서 불필요한 스트로크를 하게 된다고 해도 크게 상관 없습니다. 어차피 배워가는 과정입니다. G 대신 :9999999 는 분명 손해가 맞지만, Ctrl+G 9999999 와 비교하면 (심지어 code에서는 마지막 라인 넘버를 딱 입력해줘야 하기에 되지도 않는다.) 사실상 차이가 없고 다른 기능을 사용할 때 충분한 이득을 얻습니다.

앞에 count를 활용하게 되고, 매크로까지만 다루게 되면 단순 반복 작업의 처리 속도는 쓰지 않은 경우와 비교할 수 없을 정도입니다.

이후 VimL까지 학습하면 됩니다.

정리하면 IDE에 있는 vi keymap/plugin/extension 을 사용해서

hjkl 키맵 → {count} 를 포함한 조합 키맵 → 매크로 → vimrc 세팅 → vim 플러그인 세팅 → VimL

순으로 단기 학습목표를 정하고 필요할 때마다 배우면 됩니다.

요즘에는 웹 상에 vim을 잘 설명해둔 자료가 많습니다.

점진적으로 배우는 것은 좋지만 제대로 배워야 합니다.

아래 링크들을 추천합니다. 난이도 순 입니다.

https://www.openvim.com/

https://github.com/iggredible/Learn-Vim

https://danielmiessler.com/study/vim/

https://learnvimscriptthehardway.stevelosh.com/

더 필요한 경우, github 에 있는 플러그인 코드나 다른 vimrc 등등을 분석하면 됩니다.


IDE + vim >>>> vim binary(vim, nvim, spacevim...)

IDE에서 제공하는 vim 플러그인에서 키맵은 물론 매크로와 .vimrc 반영까지 할 수 있는 정도이기에 vim 바이너리를 사용하는 이점은 거의 없어보입니다.

특정한 언어와 특정한 환경에 한정된 코딩을 하는 경우에는, 그 언어에 특화된 IDE를 쓰는게 도움이 됩니다. 일반적으로 해당 환경에 특화된 IDE에 있는 기능들이 vim 플러그인을 압도하거나 비등하기 때문에, 설정에 필요한 시간 같은 것을 감안하면 IDE를 선택하는 것이 낫습니다. 이 경우에도 물론 vim 키맵이나 플러그인 등을 사용하는게 아닌 쪽 보다 빠릅니다.

한 언어나 환경에 특화된 IDE가 없는 경우, 또는 여러 언어를 오가면서 하는 상황에서는 vim이 해볼만 합니다. 그래도

현 시점 기준으로, IDE로는 vscode 가 이런 상황에 가장 알맞은 IDE라고 할 수 있습니다. (물론 code를 IDE로 봐야 하는지 대한 논란이 있습니다.) vscode는 익스텐션을 통해서 여러 언어와 환경에 대응합니다.

vscode는 이제 워드프로세서, 엑셀 급의 대중적인 프로그램이기 때문에, 어느 정도 메이저한 개발 스택이라면 vscode 익스텐션을 자체적으로 제공합니다.

웹 개발에 익숙하다면 익스텐션 개발에 쉽게 접근할 수 있습니다.

이래도 쓰겠다고...?

vscode는 훌륭한 프로그램이지만 vim 바이너리가 우월한 점 몇 가지가 있습니다.

  1. 아직까지 filetype을 검사해서 익스텐션을 끄고 켜는 기능이 없기 때문에 비효율이 발생할 수 밖에 없습니다. (추후 추가될 계획이 있습니다.)
  2. 1번 문제가 해결된다고 해도 통합된 환경이 아니기 때문에 최적화된 맞춤형 익스텐션을 구하기가 쉽지 않습니다.
  3. 비주류 개발 스택인 경우, 단순하게 github star 수 에서 vim 플러그인이 더 많은 경우가 일반적입니다. 따라서 vim 플러그인이 빠르게 발전하고 이슈에 대응합니다.
  4. 자신에게 최적화된 고유한 개발환경을 만들기에 적합합니다.
  5. vscode의 vim 플러그인(vscode-vim, neovim) 은 치명적인 단점 몇가지가 있습니다. 간단하게만 생각하는 것만 설명하면
    1. vscode-vim은 최적화가 덜 되어있습니다. 문서 사이즈가 커지면 반응속도가 심각하게 느려집니다.
    2. neovim은 neovim 0.5 nightly 이상을 요구합니다. 이건 brew, apt-get, choco 에서 배포된 최신 stable인 0.4.4 에서는 제대로 동작하지 않는다는 것을 의미합니다. (https://github.com/asvetliakov/vscode-neovim/issues/353)
  6. 웹 개발에 익숙하지 않다면 vscode 익스텐션 개발은 고통의 시간이 될겁니다.
  7. 자원이 부족한 경우 vscode가 무겁게 느껴집니다.
  8. cui 환경이 강제되는 경우
  9. 뭔가 개발을 잘하는 것 처럼 보입니다?
  10. nnoremap <leader>vs :silent exec "!open 1://file/" . expand("%:p") . ":" . line(".") . ":" . col(".")<cr>:redraw!<cr>


볼만한 글

https://bengi.kr/1349 빔 도대체 왜쓰는가

https://www.joinc.co.kr/w/man/12/neovim

https://github.com/manasthakur/learn-vim/blob/publish/modules

https://vim.fandom.com/wiki/Vim_Tips_Wiki

https://dev.to/tavanarad/vim-as-a-flutter-ide-4p16

vim 배우기 (난이도 순)

https://www.openvim.com/

https://github.com/iggredible/Learn-Vim

https://danielmiessler.com/study/vim/

https://learnvimscriptthehardway.stevelosh.com/

(보충학습용)

https://learnxinyminutes.com/

https://kangssu.com/vim-script/

https://devhints.io/vimscript

vscode 확장 만들기

https://code.visualstudio.com/api/get-started/your-first-extension

.

piano (press key Q)

Categories

flutter ( 82 ) dart ( 34 ) android ( 32 ) kotlin ( 11 ) plugin ( 8 ) provider ( 8 ) vim ( 7 ) bloc ( 6 ) iOS ( 6 ) state management ( 6 ) 플러터 ( 6 ) PS ( 5 ) algorithm ( 5 ) architecture ( 5 ) async ( 5 ) getx ( 5 ) java ( 5 ) API ( 4 ) BOJ ( 4 ) class ( 4 ) daily ( 4 ) git ( 4 ) golang ( 4 ) memo ( 4 ) riverpod ( 4 ) state ( 4 ) stream ( 4 ) test ( 4 ) web ( 4 ) widget ( 4 ) windows ( 4 ) HTTP ( 3 ) androidX ( 3 ) app state ( 3 ) context ( 3 ) crash ( 3 ) db ( 3 ) editor ( 3 ) error ( 3 ) extension ( 3 ) github ( 3 ) hive ( 3 ) ide ( 3 ) package ( 3 ) pubspec ( 3 ) python ( 3 ) syntax ( 3 ) vscode ( 3 ) app icon ( 2 ) await ( 2 ) chocolatey ( 2 ) consumer ( 2 ) cp949 ( 2 ) deployment ( 2 ) dev ( 2 ) flavor ( 2 ) gesture ( 2 ) globalkey ( 2 ) go ( 2 ) google ( 2 ) hack ( 2 ) js ( 2 ) json ( 2 ) key ( 2 ) keystore ( 2 ) list ( 2 ) listview ( 2 ) lock ( 2 ) mac ( 2 ) map ( 2 ) navigation ( 2 ) nosql ( 2 ) project ( 2 ) pub ( 2 ) recyclerview ( 2 ) rxdart ( 2 ) sdk ( 2 ) selector ( 2 ) setting ( 2 ) size ( 2 ) soc ( 2 ) synchronized ( 2 ) tdd ( 2 ) tip ( 2 ) version ( 2 ) viewmodel ( 2 ) vundle ( 2 ) webview ( 2 ) xcode ( 2 ) yaml ( 2 ) ( 2 ) 플러터 단점 ( 2 ) 16.0 ( 1 ) 2.0 ( 1 ) 2023 ( 1 ) AATP2 ( 1 ) ChangeNotifierProvider ( 1 ) Example ( 1 ) Guava ( 1 ) ImageReader ( 1 ) Mo's algorithm ( 1 ) OAuth2 ( 1 ) OpenGL ( 1 ) Oreo ( 1 ) ProgressBar ( 1 ) REST API ( 1 ) Trie ( 1 ) activity ( 1 ) adaptive ( 1 ) android P ( 1 ) android context ( 1 ) android11 ( 1 ) apktool2 ( 1 ) app exit ( 1 ) append ( 1 ) appicon ( 1 ) arkit ( 1 ) array ( 1 ) asciidoc ( 1 ) async * ( 1 ) async* ( 1 ) audio ( 1 ) authorization ( 1 ) await for ( 1 ) behaviorsubject ( 1 ) beta ( 1 ) binary ( 1 ) binarysearch ( 1 ) blender ( 1 ) book ( 1 ) bottomsheet ( 1 ) break ( 1 ) broadcast ( 1 ) browser ( 1 ) bubbles ( 1 ) bug ( 1 ) build ( 1 ) buildcontext ( 1 ) buildnumber ( 1 ) bundle ( 1 ) button ( 1 ) bytecode ( 1 ) cache ( 1 ) camera2 ( 1 ) cameramanager ( 1 ) cd ( 1 ) chrome ( 1 ) ci ( 1 ) circle ( 1 ) clean ( 1 ) clean architecture ( 1 ) cli ( 1 ) clip ( 1 ) clipboard ( 1 ) cloud ide ( 1 ) cmdlet ( 1 ) code ( 1 ) coding test ( 1 ) command ( 1 ) comparator ( 1 ) complexity ( 1 ) concurrency ( 1 ) conditional ( 1 ) const ( 1 ) constraint ( 1 ) constraintlayout ( 1 ) controlc ( 1 ) controlv ( 1 ) converter ( 1 ) copy ( 1 ) copy project ( 1 ) coupling ( 1 ) coverage ( 1 ) cp ( 1 ) css ( 1 ) cupertino ( 1 ) cursor ( 1 ) cv ( 1 ) data class ( 1 ) data structure ( 1 ) dataBinding ( 1 ) database ( 1 ) debounce ( 1 ) decompile ( 1 ) delegate ( 1 ) deno ( 1 ) design pattern ( 1 ) development ( 1 ) device ( 1 ) di ( 1 ) dialog ( 1 ) dio ( 1 ) drawable ( 1 ) drug ( 1 ) emmet ( 1 ) encoding ( 1 ) english ( 1 ) entries ( 1 ) environment ( 1 ) equality ( 1 ) equatable ( 1 ) euc-kr ( 1 ) euckr ( 1 ) exit ( 1 ) expand ( 1 ) expanded ( 1 ) export ( 1 ) extension method ( 1 ) facade ( 1 ) fake ( 1 ) field ( 1 ) figma ( 1 ) final ( 1 ) fixed ( 1 ) flutter pub ( 1 ) flutter web ( 1 ) flutter_inappwebview ( 1 ) flutter_test ( 1 ) flutterflow ( 1 ) fold ( 1 ) fonts ( 1 ) form ( 1 ) frame ( 1 ) future ( 1 ) gestureDetector ( 1 ) gestureRecognizer ( 1 ) gesturearena ( 1 ) get-command ( 1 ) get_cli ( 1 ) getbuilder ( 1 ) getx단점 ( 1 ) gitignore ( 1 ) glut ( 1 ) google fonts ( 1 ) gopath ( 1 ) goto ( 1 ) gradient ( 1 ) graphics ( 1 ) gvim ( 1 ) hackaton ( 1 ) hash ( 1 ) hashmap ( 1 ) hot reload ( 1 ) how to ( 1 ) html ( 1 ) i18n ( 1 ) icon ( 1 ) id ( 1 ) impeller ( 1 ) implementation ( 1 ) import ( 1 ) indicator ( 1 ) inkwell ( 1 ) interrupt ( 1 ) intl ( 1 ) introduction ( 1 ) io ( 1 ) isar ( 1 ) iterable ( 1 ) iteration ( 1 ) javascript ( 1 ) julia ( 1 ) juno ( 1 ) jupyter ( 1 ) kakaomap ( 1 ) keytool ( 1 ) korean ( 1 ) kotlin syntax ( 1 ) l10n ( 1 ) lambda ( 1 ) language ( 1 ) layer ( 1 ) layout ( 1 ) lineageOS ( 1 ) localkey ( 1 ) localtoglobal ( 1 ) long list ( 1 ) ls ( 1 ) mac osx ( 1 ) markdown ( 1 ) markup ( 1 ) material ( 1 ) method ( 1 ) microtask ( 1 ) migrate ( 1 ) mintlify ( 1 ) mock ( 1 ) module ( 1 ) monitor ( 1 ) moor ( 1 ) mouse ( 1 ) mouseregion ( 1 ) multiplatform ( 1 ) multiset ( 1 ) multithread ( 1 ) mutable ( 1 ) mvvm ( 1 ) new ( 1 ) node ( 1 ) nodejs ( 1 ) nosuchmethod ( 1 ) null-safety ( 1 ) numberformat ( 1 ) nvim ( 1 ) object ( 1 ) objectbox ( 1 ) objectkey ( 1 ) obx ( 1 ) online ide ( 1 ) operator ( 1 ) orientation ( 1 ) parabeac ( 1 ) parse ( 1 ) paste ( 1 ) path ( 1 ) pattern ( 1 ) pitfall ( 1 ) play store ( 1 ) pod ( 1 ) podfile ( 1 ) pointer ( 1 ) pointers ( 1 ) powershell ( 1 ) private ( 1 ) programming ( 1 ) pull to refresh ( 1 ) puzzle ( 1 ) pycharm ( 1 ) realitykit ( 1 ) recursion ( 1 ) reduce ( 1 ) reference ( 1 ) regex ( 1 ) regular expression ( 1 ) release note ( 1 ) renderbox ( 1 ) renderobject ( 1 ) repl ( 1 ) repository ( 1 ) response ( 1 ) rm ( 1 ) rotue ( 1 ) round ( 1 ) run ( 1 ) scope ( 1 ) scroll ( 1 ) search ( 1 ) server ( 1 ) serverless ( 1 ) service ( 1 ) sharp ( 1 ) singlerepo ( 1 ) singleton ( 1 ) sketch ( 1 ) sliver ( 1 ) sliverlist ( 1 ) snippets ( 1 ) sogae ( 1 ) sorting ( 1 ) source ( 1 ) sparse ( 1 ) sparse array ( 1 ) spec ( 1 ) split ( 1 ) sqflite ( 1 ) sqlite ( 1 ) sqrt decomposition ( 1 ) stateful ( 1 ) statefulwidget ( 1 ) step ( 1 ) stepper ( 1 ) string ( 1 ) stringbuffer ( 1 ) stringbuilder ( 1 ) studio ( 1 ) study ( 1 ) sub-directory ( 1 ) svn ( 1 ) swiftui ( 1 ) swipe to refresh ( 1 ) system_alert_window ( 1 ) system_cache ( 1 ) systemnavigator ( 1 ) tail recursion ( 1 ) tailrec ( 1 ) tap test ( 1 ) text ( 1 ) texteditingcontroller ( 1 ) textfield ( 1 ) texttheme ( 1 ) themedata ( 1 ) then ( 1 ) thread ( 1 ) throttle ( 1 ) time ( 1 ) tool ( 1 ) tools ( 1 ) tooltip ( 1 ) ts ( 1 ) tutorial ( 1 ) typescript ( 1 ) ui ( 1 ) unittest ( 1 ) update ( 1 ) usb ( 1 ) utf8 ( 1 ) ux ( 1 ) valuekey ( 1 ) variable ( 1 ) vector ( 1 ) versioncode ( 1 ) very_good ( 1 ) view ( 1 ) vim plugin ( 1 ) vimrc ( 1 ) virtualenv ( 1 ) wasm ( 1 ) web app ( 1 ) webview_flutter ( 1 ) while ( 1 ) widget tree ( 1 ) window ( 1 ) wsl ( 1 ) yield ( 1 ) 강의 ( 1 ) 개발 ( 1 ) 개발 공부 ( 1 ) 공부법 ( 1 ) 그래픽스 ( 1 ) 꼬리재귀 ( 1 ) 꿀팁 ( 1 ) 데노 ( 1 ) 두줄 ( 1 ) 디노 ( 1 ) 번역 ( 1 ) 블록 ( 1 ) 상태관리 ( 1 ) 실험 ( 1 ) 안드로이드 ( 1 ) 안드로이드프로젝트 ( 1 ) 안드로이드프로젝트복사 ( 1 ) 어이없는 ( 1 ) 조건부 임포트 ( 1 ) 주절주절분노조절실패의식으흐름 ( 1 ) 패키지 ( 1 ) 프로젝트복사 ( 1 ) 플러그인 ( 1 )