Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5770 articles
Browse latest View live

Vim Script でカンマ区切りの文字列を余計なスペースを除去しつつリストに変換する

$
0
0

例えば、 "hoge, fuga" という文字列を ["hoge", "fuga"] にする。

:echo split(substitute("hoge, fuga", " ", "", "g"), ",")


webapi.vim の、webapi#json#encode での真偽値の扱い

$
0
0

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]

やべえ、root権限じゃないのにVimで保存したいファイルあるわ…

$
0
0

ってことありますよね?例えば/etc/hostsとかを編集しよーっていうことでVimを立ち上げて
編集後に保存しようとしてVimに怒られた経験ありません?

そんなときは、

Vim Script
:w!sudo tee % >/dev/null

とすると、何もなかったかのように保存できます。

原理としては英語ですがこちらが詳しいかも。

他にはプラグインとしてSudo.vimとかSudoEdit.vimとか使うほうが
ラクちんですけども。

vimでuncrustifyをいい感じに適用する

$
0
0

C/C++やObjective-Cのコードをいい感じに整形してくれるUncrustify、最近気に入ってて使ってます。

んでこれをvimで使おうと思って設定したんだけどなんかいい感じにならない。

例えば外部コマンドを使ってフォーマットするformatprgを使って

Vim Script
: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のコード。フォーマットしたあと位置を復元してくれるので、めっちゃ便利。
これだ!と思ってちょろっと改変して、言語を自動検出して自動的に言語毎の設定でフォーマットするようにしました。
以下のコード

Vim Script
"----------------------------------------" 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のツールバーにdiff用ボタンを追加した

$
0
0

スクリーンショット_053013_025304_PM.jpg

gvim +1 -d ファイルA ファイルB

なんて感じにdiffモードで起動した時に、ボタンクリックで差分を前後に移動できるようにしてみた。マウスだけでボケーッと使える。

_gvimrc
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に登録しておく

$
0
0

 忘れそうな便利な命令を使いそうにないregに登録する。例えば、g/^\s*$/dをreg kに記録して、@kでマクロ実行するようにする。

 適当な編集画面でg/^\s*$/dを入力、
 入力した命令部分をビジュアルモードにて、範囲指定
 "kyでreg kにコピーする。
 これで、@kで実行できる。
 使用は空行のある、ラインを範囲指定して、:@kを実行する。

 vimを終了、再立ち上げしてもregには残っているので、reg kを別の用途で使用しない限り継続して利用できる。
 同様に忘れそうな命令を登録すれば便利ではないか。

XcodeでVimキーバインドで操作するXVimを導入する

$
0
0
terminal
cd ~/dev/tmp
git clone https://github.com/JugglerShu/XVim.git

XVim.xcodeprojをXcodeで開いてビルド(Command + B)し、Xcodeを再起動する.

gitのdiffをvimで見る

$
0
0

aliasを設定すればよし。

alias gitdiff='git difftool --tool=vimdiff --no-prompt'

これで

gitdiff

とだけすると差分全部がでるし、

gitdiff [commit]

とすればにしていしたブランチやSHA-1との差分を出してくれる。

ただしvimdiffはreadonlyで開かれるのでそのまま編集はできませんが


vim-quickrunのオレオレgtest設定

$
0
0

頑張って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
\ ' }

Unite.vimでSkypeチャットルームを開く

$
0
0

ショートカットの作りかた

この記事で紹介されている通り「/get uri」を使うことで直接チャット窓を開けるためのショートカットが出来ます。

開き方

上記記事内ではキーボードオンリーで特定のチャットを「絞り込み&開く」ためにSpotlight等を勧められています。
また、Alfredで開くようにするのも流行っているみたいです。

ただ自分の場合、次のような理由からUnite.vimで開くことにしました。

  • Vimで清書してから貼り付けたい事が多い(そうでなえればマウスでもいい)
  • そもそも「絞り込んで何かをする」と言えばUnite.vim
  • 設定も簡単に出きそう

設定の仕方

Uniteからチャットを開くのは簡単です。
「:Unite file」等を使いskypeチャットのショートカットを絞りこみ、startアクションを実行する、ただそれだけです。

VimL
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 + Vundle編)

$
0
0

Goの開発環境Vim版について、mattnさんの記事を見ながら作りました。
私はVimの環境にVundleを使っており、その絡みでほんの少し手順に違いがあったので、メモとして残しておきます。
ついでにLintも入れてみる次第です。

大前提:PATHの設定

Goの環境変数はGOROOT(Goのインストールフォルダ)とGOPATH(Goの外部ライブラリを保存するフォルダ)の2つがありますが、このうちGOPATHを用いて $GOPATH/bin を環境変数PATHに含めます(Windowsの場合は%GOPATH%\bin)。

gocodeとGo用lintのインストール

gocodeは下記コマンドでインストール。
go get github.com/nsf/gocode

Golintは下記コマンドでインストール。
go get github.com/golang/lint

それぞれ、$GOPATH/bin/ 以下にgocode, golintの実行形式ファイルが出来ていればOKです。

.vimrcの設定

Vundle用gocode設定として、下記の設定を追加し、BundleInstallでインストールします。

.vimrc
Bundle 'Blackrush/vim-gocode'

既にVundleをご利用の方は、""Vundleの設定と書いているコメントより下の2行が既に.vimrcに書かれているかと思います。
このVundleの設定よりも上に、gocodeとgolintの設定を記述します。

.vimrc
" 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用に下記も記載してください。

.vimrc
"" Gofiletype plugin indent onsyntaxon

これでVimの設定は完了です。

コード補完、Lintの実行方法

コードの補完はオムニ補完を使えばOKですが、使い方は最初に上げたmattnさんの記事が断然参考になります。

mattnさんの記事に書かれていないLintの使い方ですが、単純に:Lintと打てばOKです。
少し触った感じですと、publicの関数・メソッドに対してコメントが書かれていない場合などに指摘してくれるようです。

TODO

この辺は対応して行きたい…
+ quickrunによるテスト
+ ソース保存時の自動フォーマット → 追記しました(2013-06-11)

ソース保存時の自動フォーマット (2013-06-11追記)

保存時に自動フォーマットを行うには、下記を.vimrcに追加してください。
これで保存時に有無を言わさず自動フォーマットがかかります。

.vimrc
auto BufWritePre *.go Fmt

VundleやNeoBundleでgtags.vimをインストール

$
0
0

Vundle なら以下の通り

Bundle 'vim-scripts/gtags.vim'

NeoBundle なら以下の通り

NeoBundle 'vim-scripts/gtags.vim'

[2013-06-10 23:55]

unite-outline で"C is not supported."などという風に怒られる罠

$
0
0

ソースコードのアウトラインを表示してくれるUnite.vimのsourceであるunite-outlineですが、"C is not supported."などと怒られアウトラインがうまく表示されない場合があります。

どうやら、h1mesuke氏のリポジトリは1年以上メンテされていないようで。
とりあえずShougoさんのforkした最新のリポジトリを使用するようしたら、上記の問題は発生しなくなった模様です。

NeoBundle を使っているなら、例えば以下のようにすればOK

NeoBundle 'Shougo/unite-outline'

[2013-06-13 00:36]

modelineとmodelinesとグローバルなオプション

$
0
0

特定のファイルタイプでのみ、モードラインを無効にしようと思ってmodelines(モードラインとして調べる行数)を0行と3行などで切り替えていましたが、どうもうまく行きませんでした。

VimL
" 駄目な例setmodelines=3
    autocmd FileType php setlocalmodelines=0

一見正しく動くのですが、↑の場合phpでだけモードラインを無効にしたいのに、一度phpファイルを開いた後は常に0行しかモードラインを見なくなります。

理由は簡単でした。
modelinesがグローバルなオプションのため、setlocalしても全体に適用されてしまうのです。

modeline(sが付かない!)はバッファローカルなオプションなので、それを使いましょう。

VimL
setmodelinesetmodelines=3
    autocmd FileType php setlocalnomodeline

特筆するような話題ではないのですが、油断しているとこの手の「実はグローバルなオプションだった」ということに気付くのに遅れて悲しい気持ちになることがよくあります。
helpを見ればすぐに分かることなので、helpを見る癖をつけないと駄目ですね。

タブ幅を瞬時に切り替える

$
0
0

普段タブ幅4のタブインデントなファイルをよく弄ります。
僕としてはタブ幅は2もあれば十分で切り替えたいのですが、いかんせん行末のコメントなどでタブを使っている場合などに、見た目の整合性が取れなくなるため自重していました。

ただ、逆に言えばコミット時などにサクっと切り替えさえ出来れば普段タブ幅2でも生きていけると思い、ざっくりと切り替える用のマッピングを用意しました。

VimL
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で切り替わります。

既存のタブ幅を半分にしたり戻したり出来るプラグインを作ると良さそうとか思いつつ、↑の用な設定だけして誤魔化してます。

スペースインデント派だった僕ですが、こういう設定をするとタブインデントも悪くないかなと思うようになりました。


NERDTreeのツリー部分の横幅を設定

Vimでカーソルが指している単語をコマンドでAckする

vimのwindow切り替えをしまくる設定

$
0
0

vimrc
" 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でウィンドウ左上下右の移動ができる。

vimでカーソルを使う癖を矯正する!!

$
0
0

echoをマップして、
動かないようにしてしまいます。

vimrc
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 の や の汎用性を高める

$
0
0

この投稿は、変にややこしいやり方を使ってたこの投稿を改善したものです;-)

smartinputは括弧のペアを入力してくれるプラグインとして知られてますが、ペアになった括弧をまとめて削除するような機能もあります。しかし、<BS><CR>に別のプラグインの機能をマッピングしていて忘れ去られていることが多いように思います。(※当社比)

この問題に対処するためにsmartinputが提供する機能を含んだ<BS><CR>に対して代わりの名前を付けて、呼び出しやすくします。

まずは、 smartinput 側の設定です。

VimL
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の一般的な設定に当てはめて利用してみましょう。

VimL
" <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>の代わりに、新たに作ったマッピングを利用しています。また、inoremapimapに変更しているのがポイントです。

Viewing all 5770 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>