neovim をビルドして、$HOME/.local/
にインストールする
git clone https://github.com/neovim/neovim.git
cd neovim
make CMAKE_INSTALL_PREFIX=$HOME/.local CMAKE_BUILD_TYPE=Release
make install
リビルド
make distclean
make CMAKE_INSTALL_PREFIX=$HOME/.local CMAKE_BUILD_TYPE=Release
make install
vim で :qa
をよく使うのだけれど、毎回3文字入力するのが面倒なので :Q
で同じ動きをするようにコマンドを追加した
vimrc
に以下を追記:
command! -bang Q execute("qa<bang>")
:Q
で :qa
と同じ、 :Q!
で :qa!
と同じ動きをするようになる
$HOME/.local
にインストールをする
mkdir src
cd src
# Lua をビルド
curl -O https://www.lua.org/ftp/lua-5.4.4.tar.gz
tar -zxvf lua-5.4.4.tar.gz
cd lua-5.4.4
make INSTALL_TOP=$HOME/.local
make install INSTALL_TOP=$HOME/.local
cd ..
# LuaJIT をビルド
curl -O https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz
tar -zxvf LuaJIT-2.1.0-beta3.tar.gz
cd LuaJIT-2.1.0-beta3
make PREFIX=$HOME/.local
make install PREFIX=$HOME/.local
# macOSの場合 `MACOSX_DEPLOYMENT_TARGET=YY.MM` をつける
# (例)
# MACOSX_DEPLOYMENT_TARGET=12.2 make PREFIX=$HOME/.local
# MACOSX_DEPLOYMENT_TARGET=12.2 make install PREFIX=$HOME/.local
ln -sf luajit-2.1.0-beta3 $HOME/.local/bin/luajit
cd ..
# vim をビルド
git clone --depth=1 https://github.com/vim/vim.git
cd vim
./configure --prefix=$HOME/.local --enable-multibyte --enable-nls --enable-fail-if-missing=yes --with-features=huge --without-x --disable-xim --disable-gui --disable-sysmouse --disable-netbeans --disable-xsmp --enable-largefile --enable-luainterp --with-lua-prefix=$HOME/.local --with-luajit
make
make install
使う時は PATH
と LD_LIBRARY_PATH
にパスを追加する
export PATH=$HOME/.local/bin/:$PATH
export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
自前でvimをビルドする際のコマンドメモ。
git clone --depth=1 https://github.com/vim/vim.git
cd vim
./configure --prefix=$HOME/.local --enable-multibyte --enable-nls --enable-fail-if-missing=yes --with-features=huge --without-x --disable-xim --disable-gui --disable-sysmouse --disable-netbeans --disable-xsmp
make
make install
$HOME/.local
$HOME/.local
にインストールした lua
を使って +lua
でビルドする場合:
./configure --prefix=$HOME/.local --enable-multibyte --enable-nls --enable-fail-if-missing=yes --with-features=huge --without-x --disable-xim --disable-gui --disable-sysmouse --disable-netbeans --disable-xsmp --enable-luainterp --with-lua-prefix=$HOME/.local
nnoremap <leader>g <cmd>Grepper -noopen -quickfix -noswitch<cr> nnoremap <leader>* <cmd>Grepper -noopen -quickfix -noswitch -cword<cr> augroup on_grepper_finished autocmd! autocmd User Grepper execute 'CtrlPQuickfix' augroup END
-quickfix
)-noopen
)autocmd User Grepper
の指定がある場合、処理後にそれを実行してくれるので、 :CtrlPQuickfix
を実行して、quickfixを表示するVim8.1以上でphpのメソッド呼び出しの ->
の位置を揃えない方法
let g:PHP_noArrowMatching=1
Netrwでファイルを開く時開く先のwindowを指定できるように拡張する。
.vimrc
に以下を記述
fu! MyNetrwBrowse(isLocal)
let l:wincount = winnr('$')
let l:fname = netrw#Call('NetrwGetWord')
let l:ischoose = 0
if !(l:fname =~ '/$')
if l:wincount > 2
let l:winid = win_getid()
call choosewin#start(range(2, l:wincount))
let g:netrw_chgwin = winnr()
call win_gotoid(l:winid)
en
en
let l:path = netrw#Call('NetrwBrowseChgDir', a:isLocal, l:fname)
if a:isLocal
call netrw#LocalBrowseCheck(l:path)
else
call netrw#Call('NetrwBrowse', 0, l:path)
en
if g:netrw_chgwin != -1
let g:netrw_chgwin = -1
en
endf
" override keymappings
let g:Netrw_UserMaps = []
call add(g:Netrw_UserMaps, ['<CR>', 'MyNetrwBrowse'])
call add(g:Netrw_UserMaps, ['l', 'MyNetrwBrowse'])
call add(g:Netrw_UserMaps, ['o', 'MyNetrwBrowse'])
win_getid()
を使用しているため Vim 8以上でないと動きません。Vim 7で動かしたい場合は要調整。
scp経由でファイルを編集している時の保存を非同期化する
.vimrc
に以下を記述
" inspired by https://github.com/skywind3000/asyncrun.vim/wiki/Get-netrw-using-asyncrun-to-save-remote-files
" required: skywind3000/asyncrun.vim
fu! s:AsyncSaveRemoteFile(...) abort
let l:tmpfile = tempname()
sil exe 'w! '.fnameescape(v:cmdarg).' '.fnameescape(tmpfile)
let curbufname = expand('%')
let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
let machine = substitute(curbufname,scpurm,'\1','')
let port = substitute(curbufname,scpurm,'\2','')
let fname = substitute(curbufname,scpurm,'\3','')
if port != ''
let scpcmd = 'scp -P '.shellescape(port)
else
let scpcmd = 'scp'
endif
let escaped_tmpfile = shellescape(tmpfile, 1)
let escaped_fname = shellescape(machine.":".fname, 1)
let bufnr = expand('<abuf>')+ 0
call asyncrun#run(
\ '',
\ { 'post': 'call delete('.escaped_tmpfile.')|call setbufvar('.bufnr.',"&modified",0)|echo "Saved. '.curbufname.'"' },
\ scpcmd.' '.escaped_tmpfile.' '.escaped_fname)
endfu
com! -range=% -nargs=* AsyncSaveRemoteFile call s:AsyncSaveRemoteFile(<f-args>)
fu! SetupAsyncSaveRemoteFile()
" disable Netrw's BufWriteCmd
au! Network BufWriteCmd scp://*
aug SetAsyncSaveSCP
au!
au BufWriteCmd scp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe "AsyncSaveRemoteFile ".fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
aug END
endfu
aug AsyncSaveRemoteFile
au!
au VimEnter * call SetupAsyncSaveRemoteFile()
aug END
vimfilerからNERDTreeに乗り換えた時、ファイルツリーでの操作でどうしても馴染めなかった箇所をvimfilerのような動きをするように変更
ファイルを開く際にウィンドウを選択させるために、 vim-choosewin を利用
[[plugins]] repo='t9md/vim-choosewin' hook_add=''' let g:choosewin_label='sdfghjkl' let g:choosewin_overlay_enable = 1 let g:choosewin_overlay_clear_multibyte = 1 ''' [[plugins]] repo='preservim/nerdtree' depends=['vim-choosewin'] hook_add=''' let g:NERDTreeMouseMode = 0 let g:NERDTreeMapToggleHidden = '.' let g:NERDTreeMapCustomOpen = 'o' let g:NERDTreeMapActivateNode = '<CR>' nn <Leader>e :NERDTreeToggle<CR> ''' hook_post_source=''' cal NERDTreeAddKeyMap({ 'key': 'l', 'callback': 'OpenCurrentDir', 'scope': 'DirNode', 'quickhelpText': 'Open current dir' }) cal NERDTreeAddKeyMap({ 'key': 'h', 'callback': 'CloseCurrentDir', 'scope': 'Node', 'quickhelpText': 'Close current dir' }) cal NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'callback': 'ChooseWinOpen', 'scope': 'FileNode', 'override': 1 }) fu! OpenCurrentDir(dirNode) abort if !a:dirNode.isRoot() && !a:dirNode.isOpen cal a:dirNode.activate({}) let l:children = a:dirNode.getVisibleChildren() cal l:children[0].putCursorHere(1, 0) en endf fu! CloseCurrentDir(node) abort let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node if !l:node.isRoot() && !empty(l:node.parent) && !l:node.parent.isRoot() && l:node.parent.isOpen cal l:node.parent.putCursorHere(1, 0) cal l:node.parent.activate({}) en endf fu! ChooseWinOpen(fileNode) abort let l:wincount = winnr('$') if l:wincount > 2 let l:nardwinnr = winnr() cal choosewin#start(range(2, l:wincount)) silent exe l:nardwinnr.'wincmd w' en cal a:fileNode.activate({ 'reuse': 'all', 'where': 'p', 'keepopen': 1 }) endf '''
※ 諸事情でいまだにvim7を利用する場合があるので、vim7でも動くような実装になっています。
プラグイン管理は dein.vim を利用しています。
NERDTreeAddKey
を実行するとき、 hook_post_source
でしかうまく起動時に追加されなくて、
post_source
を使うために、別途 .vimrc
には au VimEnter * cal dein#call_hook('post_source')
を追加してます。
※ 上記はtomlファイルの中の内容を一部抜粋したものです。
※ 新しいプラグインを追加した時に、毎回 NERDTreeAddKey
でエラーになりますが、再起動すればいいだけなのでスルー気味