vim에서 빠른 시작 시간의 환상 만들기

6466 단어 neovimvimshell

Pueden leer la versión en español .



"Illusion"이라는 단어를 강조합니다. 내가 보여주려는 것은 vim을 더 빠르게 만드는 "마술"이 아닙니다. 희망을 가지지 마십시오. 여기서 우리가 할 유일한 일은 불가피한 것을 지연시키는 것입니다.

우리는 무엇을 달성하고 싶습니까?



vim 인터페이스가 완전히 로드되고 준비가 된 후 선택적 플러그인을 로드하고 싶습니다.

왜요?



vim을 열 때 2~3초 정도의 짧은 시간 동안 "무엇을 하려고 했지?""예, 그 것"에. 플러그인을 로드하고 싶을 때입니다. 이렇게 하면 시작 시 필요한 항목만 처리하고 나머지 "있으면 좋은"작업은 내가 편집기에서 아무것도 하지 않는 이 시간 프레임에서 발생할 수 있습니다.

시작하자



vim에는 VimEnter라는 event이 있으며 모든 초기 스크립트 및 플러그인 실행이 완료되면 방출됩니다. 이론상으로는 이 정도면 충분하지만 저에게는 그렇지 않습니다. 정말 확신하고 싶습니다. 그래서 제가 하고 싶은 것은 이 이벤트가 발송된 후 20밀리초를 기다리는 것입니다. vim이 인터페이스를 로드한 다음 플러그인을 로드하기에 충분한 시간이어야 합니다.

이를 위해서는 자동 명령과 timer_start 함수가 필요합니다. 그럼 테스트를 해봅시다. vim이 시작된 후 5초 후에 메시지를 출력하겠습니다. 우리는 이것을 .vimrc에 넣을 것입니다.

function! s:load_plugins(t) abort
  echom "vim is ready"
endfunction

augroup user_cmds
  autocmd!
  autocmd VimEnter * call timer_start(5000, function('s:load_plugins'))
augroup END


다음에 vim을 열면 몇 초 후에 vim is ready 메시지가 표시됩니다. 놓친 경우 :messages 명령으로 확인할 수 있습니다.

이제 우리는 그것이 작동한다는 것을 압니다. 지연 시간을 5000에서 20로 변경합니다. 그리고 s:load_plugins에 플러그인을 로드하는 데 필요한 모든 명령을 입력합니다.

이 다음 부분은 플러그인을 관리하는 방법에 따라 많이 달라집니다. packages 이라는 내장 기능을 사용하겠습니다. 일부 플러그인 관리자는 이를 사용하지 않으므로 문서를 읽어서 사용하는지 확인하세요.

퍼즐의 마지막 조각은 packadd 명령으로 모든 "선택적 플러그인"을 로드하는 데 사용할 것입니다. 따라서 우리의 기능은 이와 같아야 합니다.

function! s:load_plugins(t) abort
  " list of plugins
  packadd vim-surround
  packadd vim-obsession

  "(optional) run all the scripts in the `after` folder
  runtime! OPT after/plugin/*.vim

  "(optional) emit a user 'event'
  " so we can call other autocommands in this moment
  doautocmd User PluginsLoaded
endfunction

augroup user_cmds
  autocmd!
  autocmd VimEnter * call timer_start(20, function('s:load_plugins'))
augroup END


그게 다야. 하지만 아직 끝나지 않았습니다.

루아는?



Neovim(버전 0.5)을 사용하면 구성 파일 전체를 lua로 작성할 수 있으며 많은 사람들이 그렇게 하고 있습니다. 이를 lua 구성에 작성할 수 있지만 API의 현재 제한 사항으로 인해 많은 vimscript를 작성해야 합니다.

다음은 루아에서 해야 할 일입니다.

function load_plugins()
  vim.cmd [[
    packadd vim-surround
    packadd vim-obsession

    runtime! OPT after/plugin/*.vim
    doautocmd User PluginsLoaded
  ]]
end

vim.cmd [[
  augroup user_cmds
    autocmd!
    autocmd VimEnter * lua vim.defer_fn(load_plugins, 20)
  augroup END
]]


나는 그것을 작성하는 가장 쉬운 방법이기 때문에 전역 함수를 사용하고 있습니다. 일반적으로 나는 그것에 대해 조언합니다. lua 모듈을 만들고 사용하는 방법을 알고 있다면 그것을 대신 사용하십시오.

공정한 경고



이 방법을 사용하여 로드할 플러그인을 고려해야 합니다.
NERDTree(파일 관리자)를 예로 들어 보겠습니다. 터미널에서 폴더를 열면 vim . , NERDTree 와 같이 폴더의 파일이 자동으로 표시될 수 있습니다. 그러나 VimEnter 이후에 로드하면 해당 특정 기능이 작동하지 않습니다.

구문 플러그인도 이에 영향을 받을 수 있습니다. 프로세스 후반에 로드하면 기본 색상이 플러그인에서 선언한 색상으로 변경될 때 실제로 볼 수 있습니다. 좋은 경험이 아닙니다.

결론


VimEnter 시작 프로세스가 완료되면 vim에서 발생하는 이벤트에 대해 배웠습니다. timer_startvim.defer_fn 에 대해 배웠고 나중에 함수를 실행하는 데 사용할 수 있는 방법을 배웠습니다. 마지막으로, 우리는 사용자가 편집기와 상호 작용하지 않는 특정 순간에 모든 선택적 플러그인을 로드하기 위해 이 모든 것을 결합했습니다.

그러나 우리는 이것 또한 조심해야 합니다. 시작 프로세스 외부에서 플러그인을 로드하면 예기치 않은 부작용이 발생할 수 있습니다. 따라서 우리는 먼저 어떤 플러그인이 선택적일 수 있는지 결정해야 합니다.

출처



  • :help timers

  • :help :doautocmd
  • :help User
  • :help :packadd

  • :help :runtime
  • :help vim.defer_fn



  • 시간 내 주셔서 감사합니다. 이 문서가 유용하고 내 노력을 지원하고 싶다면 buy me a coffee ☕ .

    좋은 웹페이지 즐겨찾기