logo
vim

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

使う時は PATHLD_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
  • CUIで使うのでGUI系はオフ
  • インストール先は $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

参考

https://vim-jp.org/vimdoc-ja/usr_90.html

依存

設定例

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

ポイント

  • vim-grepper の結果は quickfix に出力する( -quickfix
  • ctrlp で結果を表示するので vim-grepper では結果を開かない( -noopen
  • vim-grepper は 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 でエラーになりますが、再起動すればいいだけなのでスルー気味