例えば、 "hoge, fuga" という文字列を ["hoge", "fuga"] にする。
:echo split(substitute("hoge, fuga", " ", "", "g"), ",")
例えば、 "hoge, fuga" という文字列を ["hoge", "fuga"] にする。
:echo split(substitute("hoge, fuga", " ", "", "g"), ",")
Vimscrpit にはBoolean型がないが、JSONではBooleanを扱えるのでその変換をどうするか。
webapi#json#encode に渡す辞書に、webapi#json 内でnull, true, falseを扱うための関数の参照を突っ込んでおくと、適宜null, true, falseに置き換えられたJSON文字列を生成してくれる。
:let json = webapi#json#encode({'flag':function('webapi#json#true')}) :echo json #=> {"flag":true}
webapi.vim のjson.vimを読めば分かるけど、備忘録として。
[2013-05-28 23:55]
ってことありますよね?例えば/etc/hosts
とかを編集しよーっていうことでVimを立ち上げて
編集後に保存しようとしてVimに怒られた経験ありません?
そんなときは、
:w!sudo tee % >/dev/null
とすると、何もなかったかのように保存できます。
原理としては英語ですがこちらが詳しいかも。
他にはプラグインとしてSudo.vimとかSudoEdit.vimとか使うほうが
ラクちんですけども。
C/C++やObjective-Cのコードをいい感じに整形してくれるUncrustify、最近気に入ってて使ってます。
んでこれをvimで使おうと思って設定したんだけどなんかいい感じにならない。
例えば外部コマンドを使ってフォーマットするformatprgを使って
:setformatprg=uncrustify\ -c\ ~/misc/uncrustify.cfg\ -l\ CPP\ --no-backup\ 2>/dev/null
こんな感じで設定して、gqで現在の行をフォーマット、ggVGで全選択してからgqで全体をフォーマットできます。
だけどuncrustifyは前後関係を見てうまいこと整形してくれるから1行だけフォーマットなんてしないし、ggVGで全選択するとさっきいた行まで戻るのがめんどい。
もっといい感じにできないかなーと思って探してたら、ありました。
Using Uncrustify with VIM - Stack Overflow
このAnswerのコード。フォーマットしたあと位置を復元してくれるので、めっちゃ便利。
これだ!と思ってちょろっと改変して、言語を自動検出して自動的に言語毎の設定でフォーマットするようにしました。
以下のコード
"----------------------------------------" uncrustify"----------------------------------------" see http://stackoverflow.com/questions/12374200/using-uncrustify-with-vim/15513829#15513829" 例: Shift-Fでコードのフォーマットを行う.nnoremap<S-f> :call UncrustifyAuto()<CR>" 例: 保存時に自動フォーマット" autocmd BufWritePre <buffer> :call UncrustifyAuto()" uncrustifyの設定ファイルletg:uncrustify_cfg_file_path ='~/.uncrustifyconfig'" uncrustifyでフォーマットする言語letg:uncrustify_lang =""
autocmd FileTypecletg:uncrustify_lang ="c"
autocmd FileType cpp letg:uncrustify_lang ="cpp"
autocmd FileType java letg:uncrustify_lang ="java"
autocmd FileType objc letg:uncrustify_lang ="oc"
autocmd FileTypecsletg:uncrustify_lang ="cs"" Restore cursor position, window position, and last search after running a" command.function! Preserve(command)" Save the last search.let search = @/
" Save the current cursor position.let cursor_position = getpos('.')" Save the current window position.
normal! H
let window_position = getpos('.')call setpos('.', cursor_position)" Execute the command.
execute a:command
" Restore the last search.let @/ = search
" Restore the previous window position.call setpos('.', window_position)
normal! zt
" Restore the previous cursor position.call setpos('.', cursor_position)endfunction" Don't forget to add Uncrustify executable to $PATH (on Unix) or" %PATH% (on Windows) for this command to work.function! Uncrustify(language)call Preserve(':silent %!uncrustify'.' -q '.' -l '.a:language.' -c '.
\shellescape(fnamemodify(g:uncrustify_cfg_file_path,':p')))endfunctionfunction! UncrustifyAuto()ifg:uncrustify_lang !=""call Uncrustify(g:uncrustify_lang)endifendfunction
うまいことでけた!満足
他にもっと良い感じにできるよーて人がいれば教えて下さい
gvim +1 -d ファイルA ファイルB
なんて感じにdiffモードで起動した時に、ボタンクリックで差分を前後に移動できるようにしてみた。マウスだけでボケーッと使える。
if has("toolbar")" セパレータ
an ToolBar.-MySeparatorNo01-<Nop>" ]cで前の差分に移動してzzでカーソル行を画面中央にするtmenu ToolBar.JumpPreviousDiff Jump previousdiff
an ToolBar.JumpPreviousDiff [czz
" ]cで次の差分に移動してzzでカーソル行を画面中央にするtmenu ToolBar.JumpNextDiff Jump next diff
an ToolBar.JumpNextDiff ]czz
" セパレータ
an ToolBar.-MySeparatorNo02-<Nop>" パスが長すぎてファイル名が読めないと困る。" カレントディレクトリをファイルパスに変更する。tmenu ToolBar.SetCurrentDir Set current directry tofilepath
an ToolBar.SetCurrentDir :cd %:h<CR>" セパレータ
an ToolBar.-MySeparatorNo03-<Nop>endif
そして、ランタイムディレクトリのbitmapsに
JumpPreviousDiff.bmp
JumpNextDiff.bmp
SetCurrentDir.bmp
を置く。
linuxではxpmらしい。共通フォーマットにしたいがまだやってない。
すこぶる便利や・・・・
忘れそうな便利な命令を使いそうにないregに登録する。例えば、g/^\s*$/dをreg kに記録して、@kでマクロ実行するようにする。
適当な編集画面でg/^\s*$/dを入力、
入力した命令部分をビジュアルモードにて、範囲指定
"kyでreg kにコピーする。
これで、@kで実行できる。
使用は空行のある、ラインを範囲指定して、:@kを実行する。
vimを終了、再立ち上げしてもregには残っているので、reg kを別の用途で使用しない限り継続して利用できる。
同様に忘れそうな命令を登録すれば便利ではないか。
cd ~/dev/tmp
git clone https://github.com/JugglerShu/XVim.git
XVim.xcodeprojをXcodeで開いてビルド(Command + B)し、Xcodeを再起動する.
aliasを設定すればよし。
alias gitdiff='git difftool --tool=vimdiff --no-prompt'
これで
gitdiff
とだけすると差分全部がでるし、
gitdiff [commit]
とすればにしていしたブランチやSHA-1との差分を出してくれる。
ただしvimdiffはreadonlyで開かれるのでそのまま編集はできませんが
頑張ってc++11も!というのも込めてこんなのをgtest_setup.vimとして作成してます。
このファイルを開いて :so %して、 ファイルタイプがcppなファイルで :Quickrunすれば、即gtestが走ります。
let g:quickrun_config['cpp'] = {
\'cmdopt': '
\ -std=gnu++11
\ -g
\ -I ~/work/programming/cpp/lib/gtest/gtest-1.6.0/include/
\ -I ~/work/programming/cpp/lib/gmock-1.6.0/include
\ -I .
\ ~/work/programming/cpp/lib/gtest/gtest-1.6.0/make/gtest_main.a
\ ~/work/programming/cpp/lib/gmock-1.6.0/make/gmock_main.a
\ ' }
この記事で紹介されている通り「/get uri」を使うことで直接チャット窓を開けるためのショートカットが出来ます。
上記記事内ではキーボードオンリーで特定のチャットを「絞り込み&開く」ためにSpotlight等を勧められています。
また、Alfredで開くようにするのも流行っているみたいです。
ただ自分の場合、次のような理由からUnite.vimで開くことにしました。
Uniteからチャットを開くのは簡単です。
「:Unite file」等を使いskypeチャットのショートカットを絞りこみ、startアクションを実行する、ただそれだけです。
command!-nargs=0 Skype :Unite file_rec/async:~/skype_link -buffer-name=file-start-insert -default-action=startnnoremap<Space>s :Skype<CR>
「~/skype_link」にショートカットを置いていることが前提です。
default-actionとしてstartを設定しているので、Enterするだけで開けます。
「:Skype」で起動しますが、それですら面倒なのでノーマルモードでの「s」でも起動するようにしています。
これでVimでチャット用の文章を書いてから、チャットに貼り付ける作業がとても楽になりました。
Goの開発環境Vim版について、mattnさんの記事を見ながら作りました。
私はVimの環境にVundleを使っており、その絡みでほんの少し手順に違いがあったので、メモとして残しておきます。
ついでにLintも入れてみる次第です。
Goの環境変数はGOROOT(Goのインストールフォルダ)とGOPATH(Goの外部ライブラリを保存するフォルダ)の2つがありますが、このうちGOPATHを用いて $GOPATH/bin を環境変数PATHに含めます(Windowsの場合は%GOPATH%\bin)。
gocodeは下記コマンドでインストール。
go get github.com/nsf/gocode
Golintは下記コマンドでインストール。
go get github.com/golang/lint
それぞれ、$GOPATH/bin/ 以下にgocode, golintの実行形式ファイルが出来ていればOKです。
Vundle用gocode設定として、下記の設定を追加し、BundleInstallでインストールします。
Bundle 'Blackrush/vim-gocode'
既にVundleをご利用の方は、""Vundleの設定と書いているコメントより下の2行が既に.vimrcに書かれているかと思います。
このVundleの設定よりも上に、gocodeとgolintの設定を記述します。
" gocodesetrtp+=$GOROOT/misc/vim"golint
exe "set rtp+=" . globpath($GOPATH,"src/github.com/golang/lint/misc/vim")""Vundleの設定setrtp+=~/vimfiles/bundle/vundle/call vundle#rc('~/vimfiles/bundle')
最後にGo用に下記も記載してください。
"" Gofiletype plugin indent onsyntaxon
これでVimの設定は完了です。
コードの補完はオムニ補完を使えばOKですが、使い方は最初に上げたmattnさんの記事が断然参考になります。
mattnさんの記事に書かれていないLintの使い方ですが、単純に:Lintと打てばOKです。
少し触った感じですと、publicの関数・メソッドに対してコメントが書かれていない場合などに指摘してくれるようです。
この辺は対応して行きたい…
+ quickrunによるテスト
+ ソース保存時の自動フォーマット → 追記しました(2013-06-11)
保存時に自動フォーマットを行うには、下記を.vimrcに追加してください。
これで保存時に有無を言わさず自動フォーマットがかかります。
auto BufWritePre *.go Fmt
Vundle なら以下の通り
Bundle 'vim-scripts/gtags.vim'
NeoBundle なら以下の通り
NeoBundle 'vim-scripts/gtags.vim'
[2013-06-10 23:55]
ソースコードのアウトラインを表示してくれるUnite.vimのsourceであるunite-outlineですが、"C is not supported."などと怒られアウトラインがうまく表示されない場合があります。
どうやら、h1mesuke氏のリポジトリは1年以上メンテされていないようで。
とりあえずShougoさんのforkした最新のリポジトリを使用するようしたら、上記の問題は発生しなくなった模様です。
NeoBundle を使っているなら、例えば以下のようにすればOK
NeoBundle 'Shougo/unite-outline'
[2013-06-13 00:36]
特定のファイルタイプでのみ、モードラインを無効にしようと思ってmodelines(モードラインとして調べる行数)を0行と3行などで切り替えていましたが、どうもうまく行きませんでした。
" 駄目な例setmodelines=3
autocmd FileType php setlocalmodelines=0
一見正しく動くのですが、↑の場合phpでだけモードラインを無効にしたいのに、一度phpファイルを開いた後は常に0行しかモードラインを見なくなります。
理由は簡単でした。
modelinesがグローバルなオプションのため、setlocalしても全体に適用されてしまうのです。
modeline(sが付かない!)はバッファローカルなオプションなので、それを使いましょう。
setmodelinesetmodelines=3
autocmd FileType php setlocalnomodeline
特筆するような話題ではないのですが、油断しているとこの手の「実はグローバルなオプションだった」ということに気付くのに遅れて悲しい気持ちになることがよくあります。
helpを見ればすぐに分かることなので、helpを見る癖をつけないと駄目ですね。
普段タブ幅4のタブインデントなファイルをよく弄ります。
僕としてはタブ幅は2もあれば十分で切り替えたいのですが、いかんせん行末のコメントなどでタブを使っている場合などに、見た目の整合性が取れなくなるため自重していました。
ただ、逆に言えばコミット時などにサクっと切り替えさえ出来れば普段タブ幅2でも生きていけると思い、ざっくりと切り替える用のマッピングを用意しました。
function!s:toggle_indent()if&tabstop==2setlocalshiftwidth=4setlocaltabstop=4setlocalsofttabstop=4elsesetlocalshiftwidth=2setlocaltabstop=2setlocalsofttabstop=2endifendfunctionnnoremap<silent><Space>ot :<C-u>call<SID>toggle_indent()<CR>
ビックリするくらいアナログですね!
ノーマルモードで「スペース → o → t」と押すとタブ幅が2と4で切り替わります。
既存のタブ幅を半分にしたり戻したり出来るプラグインを作ると良さそうとか思いつつ、↑の用な設定だけして誤魔化してます。
スペースインデント派だった僕ですが、こういう設定をするとタブインデントも悪くないかなと思うようになりました。
.vimrcに下記を記述。
数字は好きな幅(文字数)を指定。
let NERDTreeWinSize=26
http://stackoverflow.com/questions/8557025/how-to-make-window-size-fixed
https://github.com/mileszs/ack.vim
http://www.glidenote.com/archives/1437
<leader>sにアサインする例
" ack
cnoremap %%% <C-R>=expand("<cword>")<cr>
map <leader>s :Ack %%%<cr>
" window manage nnoremap<c-j><c-w>jnnoremap<c-k><c-w>knnoremap<c-h><c-w>hnnoremap<c-l><c-w>l
これで、control + hjklでウィンドウ左上下右の移動ができる。
echoをマップして、
動かないようにしてしまいます。
nnoremap<Left> :echoe"Use h"<CR>nnoremap<Right> :echoe"Use l"<CR>nnoremap<Up> :echoe"Use k"<CR>nnoremap<Down> :echoe"Use j"<CR>
この投稿は、変にややこしいやり方を使ってたこの投稿を改善したものです;-)
smartinputは括弧のペアを入力してくれるプラグインとして知られてますが、ペアになった括弧をまとめて削除するような機能もあります。しかし、<BS>
や<CR>
に別のプラグインの機能をマッピングしていて忘れ去られていることが多いように思います。(※当社比)
この問題に対処するためにsmartinputが提供する機能を含んだ<BS>
や<CR>
に対して代わりの名前を付けて、呼び出しやすくします。
まずは、 smartinput 側の設定です。
call smartinput#map_to_trigger('i','<Plug>(smartinput_BS)',
\ '<BS>',
\ '<BS>')call smartinput#map_to_trigger('i','<Plug>(smartinput_C-h)',
\ '<BS>',
\ '<C-h>')call smartinput#map_to_trigger('i','<Plug>(smartinput_CR)',
\ '<Enter>',
\ '<Enter>')
これで、smartinputが提供する機能を含んだ<BS>
、<C-h>
、<CR>
を、<Plug>(smartinput_BS)
、<Plug>(smartinput_C-h)
、<Plug>(smartinput_CR)
で使えるようになりました。
例としてこれらを、 neocomplcacheの一般的な設定に当てはめて利用してみましょう。
" <BS> でポップアップを閉じて文字を削除
imap <expr><BS>
\ neocomplcache#smart_close_popup() . "\<Plug>(smartinput_BS)"" <C-h> でポップアップを閉じて文字を削除
imap <expr><C-h>
\ neocomplcache#smart_close_popup() . "\<Plug>(smartinput_C-h)"" <CR> でポップアップ中の候補を選択し改行する
imap <expr><CR>
\ neocomplete#smart_close_popup() . "\<Plug>(smartinput_CR)"" <CR> でポップアップ中の候補を選択するだけで、改行はしないバージョン" ポップアップがないときには改行する
imap <expr><CR> pumvisible() ?
\ neocomplcache#close_popup() : "\<Plug>(smartinput_CR)"
<BS>
、<CR>
、<C-h>
の代わりに、新たに作ったマッピングを利用しています。また、inoremap
をimap
に変更しているのがポイントです。