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

Vimにmolokaiカラースキームを入れる

$
0
0
$ mkdir-p ~/.vim &&cd ~/.vim &&mkdir-p colors && git clone https://github.com/tomasr/molokai &&mv 
molokai/colors/molokai.vim ~/.vim/colors && vim ~/.vimrc
colorscheme molokai
syntax onletg:molokai_original=1letg:rehash256=1set background=dark

gitは

Macの場合は

$ brew install git

Centosの場合は

$ yum install git

WindowsでUnityのコーディングをgvimで行う(OmniSharp-Vim)

$
0
0

OmniSharp-Vimを使えばVimでUnity(C#)のコーディングを行うときもインテリセンス機能を使えます

今まではVisual Studio Codeでコードを書いていたが,Unityと同時起動していると時々重く感じることがあったのでVimへの以降を試してみました.
以下のサイトを参考にしたのですが,いずれのページもそのままでは動かなかったので自分が導入できた時に行った変更点などを記します

参考ページ

使用環境

VimにPythonを導入する

デフォルトの状態では,Vim起動後に :echo has('python')と入力すると0が表示されました(Pythonが使用できない状態)
PythonのダウンロードページからPython2.7.15をインストールし,Python27ディレクトリの中にあったPython27.dllをVimと同じディレクトリに置きます.
再度Vimを起動し,:echo has('python')を入力すると,1が返されるようになりました.

NeoBundleのインストール

自分はLinux環境やWSLでは既にdein.vimを使用していますが,OmniSharp-Vimをインストール時にビルドするなどはっきりと分かっていない部分があったので一旦参考記事に従いNeoBundleを使用しました.
WindowsにGitをインストールし,windows vim 開発環境構築メモ(gvim + neobundle) - Qiitaに従いNeoBundleを導入しました.

OmniSharp-Vimのインストール,ビルド

ここが最も躓きました.

VimでUnity C#のコーディングをするための設定 - Yucchiy's blog
に従っていくとビルドに失敗しました.
もとのインストールスクリプトは以下の用になっていました.

vimrc
NeoBundleLazy 'OmniSharp/omnisharp-vim',{      \'autoload':{'filetypes':['cs','csi','csx']},      \'build':{      \'windows':'msbuild server/OmniSharp.sln',      \'mac':'xbuild server/OmniSharp.sln',      \'unix':'xbuild server/OmniSharp.sln',      \},      \}

まず一度目は,msbuild not foundといった趣旨のエラーメッセージが発生しました.
Omnisharp導入でハマったところ - 踊るプログラマーでも同じようなエラーが出ており,MSBuild.exeの実行ファイルが存在するディレクトリをパスに追加すれば動いたとの報告もあったのですが,自分の環境では動作しませんでした.
そこで,NeoBundleのスクリプト内にMSBuild.exeのフルパスを渡すことでこのエラーは出力されなくなりました.
また,他のページでも書かれていたように/p:Platform="Any CPU"も追記したのですが,これが必須だったのかは確認できていません.

この状態でもビルドは通らなかったので,VimでUnity C#のコーディングをするための設定 - Yucchiy's blog
を確認すると,2年前の時点ですがビルドが通らないと書かれており,修正後のリポジトリが上げられていたのでそちらを利用するとビルドすることができました

修正後のvimrc

上記の修正を踏まえて,以下のように修正を行った結果,OmniSharp-Vimのインストール及びビルドに成功しました.

vimrc
NeoBundleLazy 'yucchiy/omnisharp-vim',{      \'autoload':{'filetypes':['cs','csi','csx']},      \'build':{      \'windows':'C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\MSBuild.exe server/OmniSharp.sln /p:Platform="Any CPU"',      \'mac':'xbuild server/OmniSharp.sln',      \'unix':'xbuild server/OmniSharp.sln',      \},      \}

OmniSharp-Vimでオムニ補完を利用する

NeoCompleteをあまり使ったことがなかったので,一旦 gvimでOmniSharpを使おうとすると“'omnifunc' は設定されていません”と出る - stack overflowにかかれている設定を利用しました.

vimrc
letg:acp_enableAtStartup=0letg:neocomplete#enable_at_startup =1letg:neocomplete#enable_smart_case =1letg:neocomplete#sources#syntax#min_keyword_length =3letg:neocomplete#lock_buffer_name_pattern ='\*ku\*'letg:neocomplete#sources#dictionary#dictionaries ={    \'default':'',    \'vimshell': $HOME.'/.vimshell_hist',    \'scheme': $HOME.'/.gosh_completions'    \}if!exists('g:neocomplete#keyword_patterns')letg:neocomplete#keyword_patterns ={}endifletg:neocomplete#keyword_patterns['default']='\h\w*'

autocmd FileTypecssetlocal omnifunc=OmniSharp#Complete
if!exists('g:neocomplete#sources#omni#input_patterns')letg:neocomplete#sources#omni#input_patterns ={}endifletg:neocomplete#sources#omni#input_patterns.cs='[^.]\.\%(\u\{2,}\)\?'

これで,コードを書いていくと,自動で補完が表示されます.

Unityからgvimを起動可能にする.

UnityのEditPreferenceExternal ToolExternal Script Editorでデフォルトで使用するエディタを変更できますが,ここで直接gvim.exeを指定すると常に新規ウィンドウで開いて,複数ファイルの編集が面倒だったので既にgvimが起動されている場合はタブとして起動するように変更を加えました.
gvimを起動するvim.batと,それをウィンドウ非表示のプロンプトから呼び出すvim.vbsの2つのスクリプトを作成し,UnityのExternal Script Editorにはvim.vbsを選択します

vim.bat
@echo off
"C:\Program Files\vim80-kaoriya-win64\gvim.exe" -p --remote-tab-silent "%1"
vim.vbs
CreateObject("WScript.Shell").Run """C:\Program Files\vim80-kaoriya-win64\vim.bat """ & Wscript.Arguments(0) ,0

Program Filesにスペースが含まれているのでダブルクォートを3つ使用しています.
Vimのディレクトリへのパスは必要に応じて変更してください.

完成

これで,Unityのコーディングをgvimでできるようになりました.
まだVimの操作に十分慣れている状態ではありませんが,上達すれば,従来の環境よりも効率よくコーディングできると思います.

最小限のカスタマイズでvimを普段使いのメモ帳として使えるようにする

$
0
0

要件

概要

これまでmac標準のNotesを使ってメモを取っていたが、入力効率やファイルフォーマットの汎用性の観点から、vim + markdownの組み合わせでメモを取れるようにしたくなった。
既に様々なプラグインや補助ツールがリリースされていそうだが、やりたいこととしてはほぼ標準のコマンドの組み合わせで実現できて然るべき内容なので、本記事では「最小限のカスタマイズによる要件の達成」を目標とし、環境を構築する。

メモ帳に求められる要件

以下の要件を満たす方法をそれぞれ考える

  • メモを取りたい時に素早く起動できる
  • 各メモ冒頭の数行を一覧し、対応するメモを素早く開ける
  • メモを横断して検索できる
  • 見やすい形で人に提示できる

それぞれの要件に対する実現方法

メモを取りたい時に素早く起動できる

以下のような関数を .zshenvに登録し、 scratchというコマンドですぐメモを取り始められるようにした。

function scratch (){
    nvim --cmd'cd ~/Scratches' ~/Scratches/`scratchf $1`}function scratchf (){echo`date +%F``echo$1 | sed's/^\(.\)/-\1/'`.md
}

scratchコマンドを打つと、今日の日付のファイル( e.g. 2018-05-17.md )を開く、または新規作成した状態でvimが起動する。
scratch fooというように引数を渡すと、引数がファイル名末尾に付与された状態( e.g. 2018-05-17-foo.md )で上記の挙動となる。
--cmd 'cd ~/Scratches'という引数を渡しているのは、起動したvimのカレントディレクトリを設定する目的でそうしている。
なお ~/Scratchesというディレクトリは、あらかじめ作成しておく。

scratchfscratch関数から参照されており、ファイル名を生成する関数。
この関数を単体で利用するケースについては、後述する。

scratch後に別名のメモを作成したくなった場合

上述の scratchfコマンドを利用する。
具体的にはvimのコマンドモードで :edit `scratchf foo`のようなコマンドを打てば、shellの実行結果が展開された状態で :editが実行されるため、それを利用する。

各メモ冒頭の数行を一覧し、対応するメモを素早く開ける

普通に headコマンドを利用する。
具体的には ~/Scratchesカレントディレクトリがある状態で head *とするだけで、ファイルの先頭部分が一覧できる。

==> 2018-05-16.md <==
# 備忘録

出社前に必ず靴を履くこと。
裸足で出社した場合は誰かから靴を借りる。

==> 2018-05-17.md <==
# 今日のやること

* 掃除
* 餌やり

## 忘れそうなこと

* ゴミ出し

vimからその一覧を閲覧したいときは :new | read ! head *などとすれば、新しいバッファでシェルの結果が表示される。
そこからファイルを開きたいときは、ファイル名にカーソルを合わせた状態で gfなりなんなりすれば、ファイルを開くことができる。

メモを横断して検索できる

標準のvimgrepを使う。
:vimgrep foo * | copenなどど打てば、quickfixウィンドウからマッチしたポジションにジャンプできる。

見やすい形で人に提示できる

markdownをプレビューするプラグインを導入する。
今回は https://github.com/iamcco/markdown-preview.vimを利用した。
編集中にリアルタイムでプレビューが更新されたり、カーソル位置にスクロールが追従したり使い勝手は良いと感じた。

おまけ

日本語入力をスムーズにする

コードを書いているときは気にならなかったが、メモとして日本語を打っているとinsertモードを抜けた後にIMEをオフにするのが煩わしく感じた。
Karabiner-Elementsを利用し 単発の左Ctrl英数キー + Escにマッピングするようにした。
具体的には以下のような設定となる。

{"title":"alone ctrl -> eisuu + esc","rules":[{"description":"alone ctrl -> eisuu + esc","manipulators":[{"type":"basic","from":{"key_code":"left_control","modifiers":{"optional":["any"]}},"to":[{"key_code":"left_control","lazy":true}],"to_if_alone":[{"key_code":"japanese_eisuu"},{"key_code":"escape"}],"parameters":{"basic.to_if_alone_timeout_milliseconds":200}}]}]}

デフォルトのタイムアウトだと予期せずescが発動してしまうことが多かったので、 basic.to_if_alone_timeout_millisecondsを短めに設定した。( デフォルトは 1000 )

まとめ

プラグインを書いたり導入したり専用のソフトをインストールしたりしなくても、ちょっとした工夫の組み合わせでできることは意外と多いと感じた。
単一の目的に最適化するのもいいが、自分の場合は多少不便でも汎用的なものの組み合わせを使う習慣をつけておく方が大事だと思った。

Vim script ファイル検索

$
0
0

概要

findやdirを記述したsh,batファイルを置くだけで下位ディレクトリのファイルを簡単に検索できるようにしてみた
EditorConfigのようにディレクトリを遡って特定のファイルを探す発想


/Eccube/Controller/Admin/default/TemplateController.phpがカレントバッファの時に検索を実行すると下記のファイルを順番に探す

/Eccube/Controller/Admin/default/.lsfile
/Eccube/Controller/Admin/.lsfile
/Eccube/Controller/.lsfile
/Eccube/.lsfile
/.lsfile

見つけた.lsfileから検索ワードに一致するファイルパスをgrepやfindstrで抜き出してQuickFixに表示する
.lsfileが見つからずにmake_lsfile.(sh|bat)が見つかった場合は実行してlsfileを作成するか問い合わせをする

動作確認

OSAPP◯✗
CentOS7.5Neovim 0.2.2
macOS High SierraMacVim 8.0
Windows10KaoriYa Vim 8.0

イメージ

検索結果をQuickFixに読み込み

osx kekka.png

sh,batの実行

ファイル検索時に.lsfileが見つかない時にmake_lsfile.shかmake_lsfile.batがカレントディレクトリとルートの間にある場合に問い合わせをする

#linux
execute? [!cd "/Eccube/"; /bin/bash '/Eccube/make_lsfile.sh']

#Windows
execute? [!D: & cd "D:\Eccube\" & "D:\Eccube\make_lsfile.bat"]

win.png

検索、再作成

検索

:FS `検索文字列`

もしくは

:QFSFileSearch
   >Enter filename:`検索文字列`

.lsfile作成、再作成

make_lsfile.(sh|bat)を親ディレクトリを遡って探して実行問い合わせ

:QFSMakeList

検索文字列に関して

IDEのファイル検索に近いフィーリングで検索できるよう置換している

if has('win32')letl:grep_cmd ='!findstr'elseletl:grep_cmd ='!\grep -G -i -s -e'endifletl:searchword = substitute(a:searchword,'\([^\.]\)\*','\1.\*','g')letl:searchword = substitute(l:searchword,' ','.*','g')

sh,batサンプル

sh .git以外

\find `pwd`-type d -name lib -prune-o-not-iwholename'*/.git/*'-type f -print> .lsfile

sh 拡張子で

\find `pwd`-type d -name lib -prune-o-type f \(-name\*.php -o-name\*.js -o-name\*.css \)-print> .lsfile

bat .git以外

dir /s /b /a-d * | findstr /i /v "\\\.git\\" > .lsfile

bat 拡張子で

dir /s /b /a-d *.php *.twig *.js *.css  > .lsfile

**入れておいた方が安心かも

sh

cd$(dirname$(readlink-f$0))

bat

cd %~dp0..\

.vimrc

letg:qsf_lsfile='.lsfile'letg:qsf_maxline=200letg:qsf_focus_quickfix=1letg:qsf_mkfile='make_lsfile.bat'letg:qsf_mkfile='make_lsfile.sh'"noremap <C-F12> :<C-u>QFSFileSearch<CR>

GitHub

https://github.com/naoyuki1019/vim-quickfilesearch2

ほぼ同じ作りでctagの実行と:set tagsを楽にするやつ
https://github.com/naoyuki1019/vim-autosettags

Vim script でCtagsの実行とセット

$
0
0

動作確認

OSAPP◯✗
CentOS7.5Neovim 0.2.2
macOS High SierraMacVim 8.0
Windows10KaoriYa Vim 8.0

概要

同じ仕様のファイル検索版 → Vim script ファイル検索

Vim script ファイル検索と同様にEditorConfigのようにディレクトリを遡って.tagsファイルを探してセットする
.tagsが見つからなかった時はmake_tas.(sh|bat)探す。見つかった場合は実行するか問い合わせをする
g:ast_autosetが1の時はBufReadのタイミングで自動的にセットされ、一度セットされると自動セットは無効になる

Command

  • :AST
    ディレクトリを遡って.tagsファイルを探して:set tags

  • :ASTMakeTags
    ディレクトリを遡ってmake_tags.(sh|bat)を探して実行

/Eccube/Controller/Admin/default/TemplateController.phpがカレントバッファの時に:ASTを実行すると下記のファイルを順番に探す

/Eccube/Controller/Admin/default/.tags
/Eccube/Controller/Admin/.tags
/Eccube/Controller/.tags
/Eccube/.tags
/.tags

sh,batの実行

ファイル検索時に.tagsが見つかない時にmake_tags.shかmake_tags.batがカレントディレクトリとルートの間にある場合に問い合わせをする

#linux
execute? [!cd "/Eccube/"; /bin/bash '/Eccube/make_tags.sh']

#Windows
execute? [!D: & cd "D:\Eccube\" & "D:\Eccube\make_tags.bat"]

画像はVim script ファイル検索だが同じ
win.png

Setting

~/.vimrc

letg:ast_tagsfile='.tags' "default
letg:ast_autoset=1 "default
letg:ast_mkfile='make_tags.bat' "default windows
letg:ast_mkfile='make_tags.sh' "default linux

make_tag

\ctags -R--exclude=.git --exclude=node_modules --languages=PHP --langmap=PHP:.php --php-types=c+f+d -f .tags .

GitHub

https://github.com/naoyuki1019/vim-autosettags

同じ仕様のファイル検索版
https://github.com/naoyuki1019/vim-quickfilesearch2

vimでTODOやFIXMEなどがハイライトされないようにする

$
0
0

概要

vimでTODOとかFIXMEみたいなドキュメンテーションコメントがハイライトされてしまう挙動、カラーリングによっては見栄えが悪くなるので消した話。

スクリーンショット 2018-05-19 14.39.15.png

vimのディレクトリを確認

以下のvimコマンドでわかる

:echo $VIMRUNTIME
/usr/share/vim/vim80

対象の設定ファイルを弄る

今回はvimのディレクトリが/usr/share/vim/vim80で、言語はRubyを使用しているので、/usr/share/vim/vim80/syntax/ruby.vimを編集する。

448行目ぐらいに

ruby.vim
syn keyword rubyTodo>-  FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained

と、Rubyにおけるドキュメンテーションコメント(FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX)が定義されているので、今回は思い切ってコメントアウトしてみた。

ruby.vim
"syn keyword rubyTodo>  FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained

動作確認

vimを再起動すると、FIXMEコメントがハイライトされなくなっている。

スクリーンショット 2018-05-19 14.49.15.png

もっとサクッとオフにできる方法ありそうなので詳しい方ご教授お願いします。

Vim備忘録

$
0
0

Vimの基本的なコマンド

主に、自分が普段使っていなかったが使えるようにしたいコマンド集
参考資料:vimtutor(コマンドラインでvimtutorと打つと読める)

移動・削除

表示上の行の移動 移動コマンドの前にg 
行先頭へ移動 ^
上下の行の先頭へ移動 +, -
半画面上下 ctrl + u, d (up, down)
1画面上下 ctrl + b, f (back, forward)
段落毎上下 {, }

前のカーソル位置へ移動 ctrl + O
次のカーソル位置へ移動 ctrl + I
対応する括弧へ移動 括弧の上で% #括弧の不一致によるデバッグ時に便利な操作

単語の削除(次の単語まで) dw
単語の削除(カーソル上の単語末まで) 
コマンドモードのまま de
挿入モードに自動で変更 ce
行末まで削除  d$
挿入モードに変更 c$

オペレーターとしてのヤンク
一単語ヤンク yw
一行ヤンク y$

置換

コマンドモードのまま文字を置換 変更箇所にカーソルを置いてrのあとに変更したい文字を入力
複数文字 R→変更文字列→Esc

ある1行内の文字列の置換 :s/OLD/NEW/g (gがなければ行の最初の一つのみ、gがあれば全て 以下同様)
指定行中の文字列置換 :#,# s/OLD/NEW/g
文書全体の文字列置換 :%s/OLD/NEW/g
一箇所ずつ確認 :s/OLD/NEW/gc

コピー&ペースト

ヤンクした内容を矩形選択でまとめてペースト

ctrl+v → Iでブロック挿入モード後、ctrl+r "

表示関連

差分の表示 :diffsplit (ファイル名)
文字列の検索 (検索対象にカーソルを置いて) #
コードをPDF化 :hardcopy > filename.psでポストスクリプト形式でエクスポートし、コマンドラインでps2pdf filename.psでPDF形式に変換
行数非表示 :set nonumber
大文字/小文字に一括変換 矩形選択後にU/u

コマンドの実行

外部コマンドを実行 :!(コマンド内容)

ファイルの入出力

部分選択し保存 矩形選択の後に:w $FIlLENAME
外部ファイルの挿入 :r $FILENAME

コマンド補完

コマンドモードで:文字入力後にctrl + d

.vimrcでの設定

色々と設定はしていますがとりあえず1点だけ

マウススクロールによるカーソル移動

vimでのマウスの使い方については個人の好みの違いが大きいと思いますが、私はマウスのスクロールでカーソルを移動させる操作に慣れています。macのターミナルでは自然とそのような操作だったのですが、iTerm2へ切り替えた時にそのような挙動を示さなかったため、自分で設定する必要が生じました。
以下の通りに記載するとそれが可能になります(3行分ずつ上下するよう設定しています)。

noremap <ScrollWheelUp> 3k
noremap <ScrollWheelDown> 3j

vimのデフォルト設定を使いこなす

$
0
0

実践vimはいい本。vimを今後長く付き合っていくパートナーと考えたならば、一度は読んでおきたいと思いました。本記事は実践vimで得たtipsの自分用羅列です。

最初にvimをやろうかと思った人は、この本買うよりも前に、ブラインドタッチをマスターすることと、vimのインストールと、vimインストール時点で同梱されているvimtutor(インタラクティブなvimのチュートリアル)を一通りやっておきましょう。

この投稿は順次アップデートしていく予定です。

tips

  • 繰り返ししやすいようにエディットする癖をつける。

    • VIM Golf: vimエディットのスコアリング
    • 理想は移動にキー1入力、何かするのにキー1入力
    • f,tコマンドやオペレータ(d,y,c+移動キー)の組み合わせで移動とアクションを同時に行う
    • j.や.;.;だけで高速編集したい。
    • dap, caw, ciw, yaw, yapとか。pはパラグラフ。{}で移動できる範囲
  • ワンストロークでツーアクションするキーを覚える

    • I, A: 行頭、行末へ移動しながら挿入モードへ移行
    • D, (C): 行末へ向かって削除(からの挿入モードへ移行)
    • O, o: 改行しながら挿入モードへ移行
  • 繰り返しコマンドをなるべく使う

    • .動作の繰り返し
    • ;移動の繰り返し
    • @マクロの繰り返し
    • & exコマンドの繰り返し
  • インサートモード中に矢印キーで移動すると、ノーマルモードで移動したとvimは考える。

    • つまり、uによる移動に区切りができる。
    • アンドゥする単位を決める、すなわち粒度を制御をするためにわざと矢印キーを使うのも手かな。
    • <CR>で改行するよりはoで改行する癖をつける。

移動

  • H,Lで画面の上下にカーソルを移動して、zzで中央に寄せるのが速くて読みやすい。
  • もちろ<C-D><C-U>も使える。
  • f{char}, t{char}と;(その反対は,)は他のエディタにはない横移動最強コマンド

検索

  • '/'よりは'*'
  • '?'よりは'#'
  • <C-A><C-X>は行内の数字を勝手に探して、インクリメント、デクリメントしてくれる。

作業スペース

作業スペースは小さい方からbuffer < window < tabの順

buffer

  • バッファは散らかった机、引数リストは整頓された作業スペースのイメージ
  • :lsはバッファを見るためのvimから備わった機能
  • :argsはex時代からある引数リストと言われる機能
    • argsの引数にはshellコマンドが使える。バッククォート`を使おう。
    • argsの引数には*(ファイル名)や**(ディレクトリ名)が使える。
  • argsは自分の好きなように
  • :argdo:bufdoする前にset hidden設定しておくことで、バッファの保存をしなくてもバッファ移動ができる。
  • <C-^>: で代替ファイル,さっき編集していたファイルへ移動。
  • 移動は:bn[ext](反対はbp[revious])
    • 以下のようにキーマップを変えるのも良い。
buffer操作のキーマップ
nnoremap <silent>[b:bprevious<CR>
nnoremap <silent>]b:bnext<CR>
nnoremap <silent>[B :bfirst<CR>
nnoremap <silent>]B :blast<CR>
  • :e %:h
    • e: edit
    • %: 現在アクティブなファイルのファイル名
    • h: ファイル名を隠す
ファイルパス展開
" `:e %%`アクティブなファイルが含まれているディレクトリを手早く展開する" :eだけでなく:wや:rでも使える。
cnoremap <expr> %% getcmdtype()==':' ? expand('%:h').'/':'%%'

window

  • vim用語でウィンドウとは、バッファに対するビューポートのこと。
  • 移動は<C-W>h[jkl]
  • <C-W><C-L>: 二分割の場合、水平分割を垂直分割に置き換える
  • <C-W><C-K>: 二分割の場合、垂直分割を水平分割に置き換える
  • <C-W><C-O>: 現在のウィンドウのみにする(only)
  • <C-W><C-C>: 現在のウィンドウを閉じる(close)
  • lcdで作業スペースごとに現在のディレクトリを指定する。

tab

  • タブはウィンドウのコレクションを格納するコンテナだと考える。
  • 仕事をいくつかのワークスペースに区切ることができる。
  • 急な案件や、全く別の仕事を始めたい時にタブを活用して全く別の作業空間を作り出す使い方をする。
  • 多くのソフトウェアにおける、「新しいウィンドウ」のイメージ。「タブ」という名前だが、多くのソフトウェアのそれとは別物であることに注意。
  • :tabedit {filename}<C-W>Tで新たにウィンドウを開く
  • 移動はgt(反対はgT)
  • <C-PageUp>(<C-PageDown>)でも切り替えられる。

続きます。


Vim備忘録

$
0
0

Vimの基本的なコマンド

主に、自分が普段使っていなかったが使えるようにしたいコマンド集
参考資料:vimtutor(コマンドラインでvimtutorと打つと読める)

それぞれのコマンドの由来と関連付けると覚えやすく、そういう意味でこちらが非常に詳しいです。

移動・削除

表示上の行の移動 移動コマンドの前にg 
行先頭へ移動 ^
上下の行の先頭へ移動 +, -
半画面上下 ctrl + u, d (up, down)
1画面上下 ctrl + b, f (back, forward)
段落毎上下 {, }

前のカーソル位置へ移動 ctrl + O # older cursor positionでoらしい(参考リンク
次のカーソル位置へ移動 ctrl + I
対応する括弧へ移動 括弧の上で% #括弧の不一致によるデバッグ時に便利な操作

単語の削除(次の単語まで) dw
単語の削除(カーソル上の単語末まで) 
コマンドモードのまま de
挿入モードに自動で変更 ce
行末まで削除  d$
挿入モードに変更 c$

オペレーターとしてのヤンク
一単語ヤンク yw
一行ヤンク y$

置換

コマンドモードのまま文字を置換 変更箇所にカーソルを置いてrのあとに変更したい文字を入力
複数文字 R→変更文字列→Esc

ある1行内の文字列の置換 :s/OLD/NEW/g (gがなければ行の最初の一つのみ、gがあれば全て 以下同様)
指定行中の文字列置換 :#,# s/OLD/NEW/g
文書全体の文字列置換 :%s/OLD/NEW/g
一箇所ずつ確認 :s/OLD/NEW/gc

コピー&ペースト

ヤンクした内容を矩形選択でまとめてペースト ctrl+v → Iでブロック挿入モード後、ctrl+r "

表示関連

差分の表示 :diffsplit (ファイル名)
文字列の検索 (検索対象にカーソルを置いて) #
コードをPDF化 :hardcopy > filename.psでポストスクリプト形式でエクスポートし、コマンドラインでps2pdf filename.psでPDF形式に変換
行数非表示 :set nonumber
大文字/小文字に一括変換 矩形選択後にU/u

コマンドの実行

外部コマンドを実行 :!(コマンド内容)

ファイルの入出力

部分選択し保存 矩形選択の後に:w $FIlLENAME
外部ファイルの挿入 :r $FILENAME

コマンド補完

コマンドモードで:文字入力後にctrl + d

.vimrcでの設定

色々と設定はしていますがとりあえず1点だけ

マウススクロールによるカーソル移動

vimでのマウスの使い方については個人の好みの違いが大きいと思いますが、私はマウスのスクロールでカーソルを移動させる操作に慣れています。macのターミナルでは自然とそのような操作だったのですが、iTerm2へ切り替えた時にそのような挙動を示さなかったため、自分で設定する必要が生じました。
以下の通りに記載するとそれが可能になります(3行分ずつ上下するよう設定しています)。

noremap <ScrollWheelUp> 3k
noremap <ScrollWheelDown> 3j

vim8.1.1 カラースキームの簡易適用手順

$
0
0

vimのupdate(8.1.1)が原因なのか現状不明だけど
deinを利用して適用していたvimのカラースキームが読み込まれなくなっていたので
取り急ぎカラースキームを反映させる応急処置の作業メモ

参考

https://qiita.com/godgarden/items/9bded65665834438cc3e

vimのカラースキーム適用作業

自分の場合は
luciusのカラースキームを適用させたいので。。。
(他のカラースキームでも、GitHubのURLカラースキーム名を置換えればなんでも対応可能かと)

#.vim が存在しなければ「mkdir ~/.vim」で作成cd ~/.vim
mkdir colors

#gitから最新のみ複製
git clone --depth 1 https://github.com/jonathanfilip/vim-lucius
#ファイル移動mv vim-lucius/colors/lucius.vim ~/.vim/colors/

vim ~/.vimrc

.vimrc内の最初に下記を追記。(先頭行でないと反映出来なかった。。。)

~/.vimrc
colorscheme lucius

再読込して反映されてるか確認

vim ~/.vimrc

とりあえずこれでカラースキームは
読み込めた。。。

脳を鍛える大人のvimトレーニング - 挿入モードを理解する

$
0
0

やっとじっくりとリファレンスが読める時間が出来たので、今週は挿入モードに関してガッツリ調べていきたいなーと…

AIがとまらない

まずは基本をおさらいせねば…

WhereWhichCommand
カーソルの前からi(nsert)
後ろからa(ppend)
行の先頭からI
最後からA
下の新しい行からo
上の新しい行からO
前の編集箇所からgi

このへんはよく理解しているので改めて確認したという感じです。問題は理解しただけで使えてないわけなんだけど…他のエディタの癖が抜けないのでいまだに行末にカーソルを持っていく癖が抜けないんですよ。同様に癖が抜けないので行末にカーソル持っていったら改行コード分を汲んでくれると思ってi押して…ということが多いので、うまくaAを使っていかないとダメってことっすね。この他にインデントを無視した行頭から挿入するgIがあるんだけど、まぁこれは使わなそうなのでいいや…整形された文章作るときはもっぱらGsuiteやLibreOfficeに任せてるし。

前回のトレーニング!

解説の前に初心者の備忘録に付き合っていいね!押していただいてありがとうございます。おかげでいい具合にモチベーションが保てております。で、そのガッツリいいねもらったエントリでまとめたオブジェクト単位の選択で、なんちゃらa/なんちゃらiの内側/外側の関係をまとめたんですけど、この関係と挿入モードの関係がよく対応してるのでここもうまく記憶とリンクしておくべきだなと思っております。うまく説明できんけどとっても似てるイメージなんです。

挿入モードの繰り返しに注意!

挿入モードの際にもカウントが使えるので、これ改行一気に入れたい時に2oとかするの便利だなぁと思ったんですけど、
挿入自体を繰り返してしまうのでそんなに役立たなかったんですよ。繰り返しを意識しようとするとついやってしまうので気をつけないと…
挿入自体を繰り返してしまうのでそんなに役立たなかったんですよ。繰り返しを意識しようとするとついやってしまうので気をつけないと…

大事なことなので2回言いました。1

(挿入モード中に)わたしにできること

本当によくチェックしておきたかったのは挿入モード中のコンビネーションキーだったのでここ重点で…

小指に頼るな

もっとvimっぽく、というかギーグっぽくエンターキーを「ターンッ!」ってするのをやめて、Ctrlを使ってできるコンビネーションはどんどんそちらに寄せていこうと思ったのでちょっとそこをまとめておきます。

Ctrl+
[<Esc>
m<CR>
h<BS>
i<Tab>

要は<Esc>辞めるんなら<CR>,<BS>,<Tab>も視野に入れたらどうや?と思ったんですよ。昔よく(ぉみたいな90年代オタクのイキr^h^h…

…歳バレますね、さておき、いらないオタク知識としてでも^H知ってるんだからちゃんと活用しなさいって話っすね。この文章打ってる時点で当たり前のようにホームから手離すんで先は長いんですけど。まーこのままvimと添い遂げると決めたんで、USキーボード買えば<C-[>のクセくらいはついてくれるんじゃないかなーって。ちなみにEscのつもりでも使える<C-c>は、一応Linuxの癖もあるんで手につくキーバインドなんですけど、文章打ってる最中には押していけなかったんで、何かちょっと挙動違うらしいし、「そういうのがある」だけ覚えておきました。

で、これは完全に備忘録なんですけど、hjklにもっと依存するために追加したOS側のバインドを確認…

Ctrl+
<Space>IMEのon/off
変換中にh文節をを左に移動
j次の変換候補
k前の変換候補
l文節を右に移動
H文節を縮める
L文節を伸ばす

Ctrl+Shift押しづらいんでいっそ旧ATOKバインド風で頑張ろうかと思ったんですけど、今更戻れませんでした。

魂の座

コピペその他、使い回しに関するキーバインドが結構あったのでちゃんと確認しようと思います。ちょっと複雑に見えたので<C-r>に関してだけ先に…

↓制御コード \ 改行後のインデント→するしない
タイプされたものとみなす<C-r>[レジスタ]<C-r><C-o>[レジスタ]
そのまま貼り付ける<C-r><C-r>[レジスタ]<C-r><C-p>[レジスタ]

「制御コード」に関しては、例えばレジスタに^Mの制御コードが入ってたら改行と解釈するかどうかって認識で良さそう。インデントの方は「インデントをした行を<C-r>から使うと改行時のオートインデントが更に掛かる」ことだけ覚えとけば気をつけられそうです。まー使いたいのは<C-r><C-o>+くらいっすね。どっちかって言うと+以外の特殊なレジスタ覚える方が先か。

特殊なレジスタ内容
"最後にヤンク/削除された内容 (名前なしレジスタ)
[0-9]ヤンクしたものの履歴 (0が直近)
-直近の削除したものの履歴 (取るのは一つだけ)
[a-zA-Z]"[a-zA-Z]で指定したレジスタ
+クリップボード、もしくはX端末上のプライマリセレクション
*クリップボード (OSを問わない)
:最後に実行したコマンド
/最後に実行した検索パターン
.最後に挿入したテキスト
%カレントファイル名
=式評価

概ね使ったことあるものだけだったので大丈夫だろうなと思うんだけど、式評価は意識してもいいのかなぁ…関数覚えないとっすね。リファレンスの気になる記述は<C-r><C-o>.をしても<C-r>.と一緒らしいので忘れると大変なことになるやつですねこれ。ちなみに".のレジスタは挿入モード中に繰り返しが出来る<C-a><C-@>で使っているそうで、ちなみに".のレジスタは挿入モード中に繰り返しが出来る<C-a><C-@>で使っているそうで、大事なことなので2回言いました2

ケミカルマジカルVimming

こっからは把握が甘いところの学習です。

<BS>より更に速く

<C-w>を使うとノーマルモードのb相当分のバックスペースが出来るとのことなので、派手に間違えたときには…いや一旦挿入モード終われば?と思うんだけど、どうでしょ?挿入モード抜ける癖つかないよねこういうの覚えちゃうと。更に豪快に間違えてたときは<C-u>で挿入前の状態までアンドゥできるんだけど、よくIMEのonを忘れるのでこれで戻してあげれば手っ取り早くなりそう。

<C-y>,<C-e>が超有能

<C-y>/<C-e>で上/下の行をそのままトレース出来る。もう使い込んでるけど忘れないように。

挿入モードからインデントを操作する

上手く使えるかどうかはわからないけどちゃんと把握しておくように。<C-t>/<C-d>で現在行をインデント/逆インデント、0<C-d>でインデントを消す、^<C-d>で現在行だけインデントを消して、改行後にインデントを戻す。最後のは「ラベル入力に役立つ」そうで…これバッチファイルでやりたかったやつっすね。

特殊な文字をそのまま入力する方法

ホームポジションを維持するための活用と逆で、スクリプト上の特殊なキー定義や、ここの更新で書くためにラク出来ることとして、<C-k>からVimで使うダイグラフを直接入力できるのと、<C-v>から制御コードを入力できるので必要な時に頑張って思い出す事。制御コード、使うかなぁー…よく分かってなかった時に正規表現中に^Mとかは確かにやってたんだけど…

今の僕には理解できない

スクリプト書く時にクッソ便利そうな<C-x>なんだけど、ちょっと使いこなせる自信ないどころかそんなにスクリプトも書かないので、とりあえず今把握して便利そうなやつだけ…

<C-x>…補完するもの
<C-d>定義、もしくはマクロ
<C-v>vimのコマンド

理解できたのはこれだけでした。候補が出たら選択は<C-n>(ext)と<C-p>(revious)で…にしても<C-x><C-d>はもう十分活用できてるので及第点かもしれないです。まぁスクリプト殆ど書かないからね。今はvimscriptだけなんとかなれば…

今日はここまで

なんだかんだでこのお勉強、当たり前のように半日持っていくんでしんどいんですよ。

え、:read?…いやなんか、流し込めるんでしょ?(もう個人的なスクリプトで使ってます)

編集中に気がついたこと

  • 今まで使ってたc$Cだけでいい
  • imapしておくとhtmlのエスケープでお世話になりそうだったので<C-,>,<C-.>,<C-6>あたりを定義しようと思ったら出来なかったんだけどというか、この辺にキーコードの割り当てがありませんでした。
    • というわけで短縮入力のトリガーになる<C-]>を使ってマップしてあげると捗りそうだったので…でも<C-]><,<C-]>>ってコンビネーション的にShift絡んでめんどいよね…
remap.vim
" 短縮入力用" htmlのエスケープ
inoremap <C-]><Space>&nbsp;
inoremap <C-]>& &amp;
inoremap <C-]><&lt;
inoremap <C-]>,&lt;
inoremap <C-]>>&gt;
inoremap <C-]>.&gt;
  • Markdownの作表もこのノリでやれたらいいっすねってことで…
remap.vim
" Markdownの作表
inoremap <C-]>ll:--|
inoremap <C-]>cc:-:|
inoremap <C-]>rr --:|
  • IMEのモードを指定して挿入モードに入るキーを作ると捗るらしいのでちょっと試しに追加しておいてみる。(^^は制御コード)
remap.vim
" IMEのモードを指定して挿入モードに入れないだろうか?
nnoremap <Leader>ii^^
nnoremap <Leader>aa^^
nnoremap <Leader>I I^^
nnoremap <Leader>A A^^
nnoremap <Leader>oo^^
nnoremap <Leader>O O^^
  • 校正用キー作ったほうがいい
remap.vim
" 校正用
nnoremap <Leader>,i,<Esc>
nnoremap <Leader>.i.<Esc>
nnoremap <Leader>? i?<Esc>
nnoremap <Leader>!i!<Esc>
nnoremap <Leader>...i...<Esc>
nnoremap <Leader>/ i/<Esc>
nnoremap <Leader>\ i\<Esc>
nnoremap <Leader>,,i<Esc>
nnoremap <Leader>..i<Esc>
nnoremap <Leader>?? i<Esc>
nnoremap <Leader>!!i<Esc>
nnoremap <Leader>/// i<Esc>

  1. ソースのMarkdown参照 

  2. 要は編集中に試してるってことです。 

個人的な校正用スクリプト collar.vim

$
0
0

昨日エントリ書きながらこういうのあったらいいなと思ったものをとりあえずこさえてみました。

ソース

collar.vim
letg:collar_marks=[[            \'`',' ̄','!','@','#','$','%','^',            \'&','*','(',')','_','ー','+','=',            \'[',']','{','}',';',':','’','”',            \'<','>',',','.','/','?','|','¥','\',' '],            \['`','~','!','@','#','$','%','^',            \'&','*','(',')','_','-','+','=',            \'[',']','{','}',';',':','''','"',            \'<','>',',','.','/','?','|','\',  '\', ' ' ]            \]function!s:deStain() abort
    letl:currentChar = matchstr(getline('.'),'.',col('.')-1)ifmatch(g:collar_marks,l:currentChar)==0letl:replacedChar =g:collar_marks[1][match(g:collar_marks[0],l:currentChar)]
        execute 'normal r'.l:replacedChar
    elseifmatch(g:collar_marks,l:currentChar)==1letl:replacedChar =g:collar_marks[0][match(g:collar_marks[1],l:currentChar)]
        execute 'normal r'.l:replacedChar
    endifendfunction

command! DeStain calls:deStain()

ナニコレ

今やることは1つだけです。

  • 記号の半角/全角を入れ替える

適当に:DeStainをリマップして使ってやってください。やってることは単純だけど、折角スクリプト書いてるんだし面白そうだからgithub登録してみようかなと思ってるんですけど、スクリプト公開するときのお作法とかよく分かってないんで「こういうふうにするとプラグイン入れた人からカスタマイズしやすいですよ」みたいなアドバイスをいただけるとすげぇ助かります。

もうあったらどうしよう…

vim×HHKB(無刻印)に乗り換えたら日々が楽しくなった.

$
0
0

開発環境をMac標準keybordとAtomからHHKBとvimに乗り換えました.
標準keybordでも良いと思いますし,atomでも十分便利かと思います.

HHKBに乗り換えた理由

  • タイピングに手癖がありすぎて矯正するため
  • 周りの強い方がHHKBを使っていたので真似した.
  • 結果的に投資になるだろうとの思った.

結果

  • 手癖が直り,タイポも減った.
  • タイピング速度が上がった.
  • まだまだ課題はあるが,買ってよかったと思っている.

vimに乗り換えた理由

  • HHKBを買う際に,せっかくだから全部キーボードで操作をしたいと思った.
  • 開発速度が上がるのでは?と感じた. 
  • Emacsと迷ったが,手が小さいのでCtrキーを頻繁に押したくなかった.

結果

  • カスタマイズが楽しい.どこまでも工夫出来て,度々カスタマイズ波がくる.
  • プログラミングが更に楽しくなった
  • chromeにvim拡張機能を入れると時間短縮出来て.トータル1年くらい時間が増える.

参考リンク

VimでFSharpを実行(Run)・テスト(Test)・デバッグ(Debug)する

$
0
0
=== 2018/05/21 Mon ===
はてなブログに以前書いたものを加筆・訂正したものです
======================

この記事はF# Advent Calendar2017 2日目の記事です ( see : F# Advent Calendar 2017 - Qiita )
この記事はVim2 Advent Calendar2017 2日目の記事です ( see : Vim2 Advent Calendar 2017 - Qiita )

IDEを使わなければ、コンピュータが自動でやってくれることなどほとんどなく、あとは自分の手でやるしかないのです。プログラミングとは元々そういうものだったはずです

see : Hello, Worldから始めよう | プログラマが知るべき97のこと

Greeting

こんにちは!最近ポンド円でほぼ死にかけのcallmekoheiです!みなさまいかがお過ごしでしょうか?今回はF#VimAdvent Calenderに同時にポストします!

思えばなんで僕、VimF#のコード書いてるんでしょうね?Visual StudioとかVisual Studio Codeとか他にも書きやすい環境があるのに。。。なんというかですね、なんというかですね、VimF#はウイスキーに生ハムぐらい合うんですよ。も、もちろん個人の意見ですがwww。まぁ、あれですよ。僕が複雑なこと理解できないやつなんでシンプルな環境の方が好きなんですよね。

というわけで、VimF#のコード書くときのちょっとした環境構築について書いてみます。というか僕自身が趣味でコード書いてるのでお仕事とかで使うには辛いかもですが、まぁすごくシンプルな環境なんでお勉強とかちょっとしたテストとかにはいいと思ふのですよ。

それと環境構築はMac OSXで書いてますが、WindowsでもLinuxでもおんなじ感じですっ(だと思う・・・)

もしなにかあれば @callmekohei ( twitter )まで〜

Environment

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.13.4
BuildVersion:   17E202

00 - Install

まずは下地を整えませう〜

01. インストーラーをゲッツ!

Macの場合Homebrewというインストーラーがあるのでこれをまずゲッツします。
Homebrewのホームページからコマンドをterminalで実行します。

Example of install Homebrew ( 2018/05/21 Mon )

$ /usr/bin/ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

02. 各種アプリ・コマンドをゲッツ

vimはテキストエディタ、monoF#の実行環境、そしてPaket.NET libraryダウンローダーです。

$ brew install vim
$ brew install mono
$ brew install paket

.bash_profile or .bashrcに書く

export MONO_GAC_PREFIX="/usr/local"

03. Vimのプラグインをゲッツ

see also : Vim におけるプラグイン管理についてまとめてみた

ここでは例えばdein.vimというプラグインダウンローダー(plugin manager)を使ってみます。

01. deinフォルダーとdein.tomlファイルを作成します。たとえばこんな感じ。

$ mkdir-p$HOME/.config/nvim/dein/
$ touch$HOME/.config/nvim/dein.toml

02. .vimrcに下記を書きます。

" setting of dein" ====== Fit your path!!! =====lets:dein_dir= $HOME .'/.config/nvim/dein'lets:toml= $HOME .'/.config/nvim/dein.toml'" =============================lets:dein_repo_dir=s:dein_dir.'/repos/github.com/Shougo/dein.vim'if!isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim's:dein_repo_direndif

execute 'set runtimepath+='.s:dein_repo_dirif dein#load_state(s:dein_dir)call dein#begin(s:dein_dir)call dein#load_toml(s:toml,{'lazy':0})call dein#end()call dein#save_state()endifif dein#check_install()call dein#install()endif" turn on pluginsset nocompatible
syntax enable
filetype plugin indent on

03. dein.tomlファイルにゲッツしたいプラグインを書いてみる

[[plugins]]repo='Shougo/dein.vim'#----------------------------------------------------------# Aquires for running Neovim-plugins on Vim8#----------------------------------------------------------[[plugins]]repo='roxma/nvim-yarp'[[plugins]]repo='roxma/vim-hug-neovim-rpc'#----------------------------------------------------------# Auto-complete for F# script#----------------------------------------------------------[[plugins]]repo='Shougo/deoplete.nvim'hook_add='''letg:deoplete#enable_at_startup=1'''[[plugins]]repo='callmekohei/deoplete-fsharp'build='bashinstall.bash'hook_add='''calldeoplete#custom#option({\'auto_complete_delay':0,\'ignore_case':v:true,\})"removeduplicatecandidatescalldeoplete#custom#source('_',\'converters',['remove_overlap'])"DisablethecandidatesinComment/Stringsyntaxes.calldeoplete#custom#source('_',\'disabled_syntaxes',['Comment','String'])'''#----------------------------------------------------------# Debug for F# script#----------------------------------------------------------[[plugins]]repo='callmekohei/tigaDebugger'#----------------------------------------------------------# Run fsharp command#----------------------------------------------------------[[plugins]]repo='Shougo/vimproc.vim'build='make'[[plugins]]repo='thinca/vim-quickrun'hook_add='''setsplitrightletg:quickrun_config={}letg:quickrun_config._={\'runner':'vimproc'\,'runner/vimproc/updatetime':60\,'hook/time/enable':1\,'hook/time/format':"\n***time:%gs***"\,'hook/time/dest':''\,"outputter/buffer/split":'vertical'\,'outputter/buffer/close_on_empty':1\}letg:quickrun_config.fsharp={\'command':'fsharpi--readline-'\,'tempfile':'%{tempname()}.fsx'\,'runner':'concurrent_process'\,'runner/concurrent_process/load':'#load "%S";;'\,'runner/concurrent_process/prompt':'>'\}'''#----------------------------------------------------------# Show indent guid lines#----------------------------------------------------------[[plugins]]repo='nathanaelkane/vim-indent-guides'hook_add='''letg:indent_guides_enable_on_vim_startup=1letg:indent_guides_start_level=2letg:indent_guides_guide_size=1letg:indent_guides_auto_colors=0autocmdVimEnter,Colorscheme*:hiIndentGuidesOddguibg=blackctermbg=0autocmdVimEnter,Colorscheme*:hiIndentGuidesEvenguibg=blackctermbg=0'''

01 - 実行Runしてみよう!

sample.gif

01.コードを書いてみる

$ vim foo.fsx

foo.fsx

"hello"|>stdout.WriteLine

02.vim commandを実行

:w:QuickRun

result

[Loading /Users/callmekohei/tmp/foo.fsx]
hello
namespace FSI_0003


*** time : 0.134435 s ***

02 - テストTestしてみよう!

image.png

===== caution =====
2018/05/21 Mon
Persimmon本体がNuget互換性対応中のためPersimmon.Scriptが上手く動作しません

see also : Persimmon 対応中のお知らせ

01.fooフォルダを作成し移動

$ mkdir foo/
$ cd foo/

02.persimmon.scriptをダウンロード

$ paket init
$ vim paket.dependencies 

    generate_load_scripts: true
    source https://www.nuget.org/api/v2
    nuget persimmon.script

$ paket install

03.コードを書いてみる

$ vim foo.fsx

foo.fsx

#load"./.paket/load/net471/main.group.fsx"openPersimmonopenUseTestNameByReflectionopenSystem.Reflection/// write your test code here.let``a unit test``=test{do!assertEquals12}/// print out test report.newPersimmon.ScriptContext()|>FSI.collectAndRun(fun_->Assembly.GetExecutingAssembly())

04.vim commandを実行

:w:QuickRun

result

[Loading /Users/callmekohei/tmp/deopletefs/.paket/load/net471/main.group.fsx
 Loading /Users/callmekohei/tmp/foo/foo.fsx]
x
begin FSI_0003.Foo
 Assertion Violated: a unit test
 1. Line Number: 9
    Expect: 1
    Actual: 2
end FSI_0003.Foo
============================== summary ===============================
run: 1, error: 0, violated: 1, skipped: 0, duration: 00:00:00.0008641
namespace FSI_0003.Main

namespace FSI_0003
  val ( a unit test ) : Persimmon.TestCase<unit>


*** time : 0.491798 s ***

03 - デバッグDebugしてみよう!

tigadebugger.gif

01. install

sdbsdbplgが必要です。

sdb

// download
$ git clone --depth 1 https://github.com/mono/sdb

// clone the submodules
$ cd ./sdb/
$ git submodule update --init--recursive

// build
$ make
$ make install

sdbplg

// download
$ git clone --depth 1 https://github.com/callmekohei/sdbplg

// build
$ cd ./sdbplg/
$ bash build.bash

// put `.sdb.rc` file on `$HOME`$ cp .sdb.rc $HOME/

// set path
$ vim $HOME/.bash_profile
    export SDB_PATH=/PATH/TO/sdbplg/bin/

2. デバッグしてみる!

01.コードを書いてみる

$ mkdir foo/
$ cd foo/
$ vim foo.fsx

foo.fsx

letfoo()=letmutablex=1x<-2x<-3xfoo()|>stdout.WriteLine

02.vim commandを実行( デバッグシンボル.mdbを作成し、debugger(tigaDebugger)を起動 )

:! sharpc -g--optimize- %
:TigaSetDebugger sdb
:Tiga foo.exe

03.デバッガーコマンドを入力

" set break point: TigaCommand bp add at foo.fsx 3" run: TigaCommand r" next: TigaCommand n" quit debug mode: TigaQuit

ショートカットでらくらく操作〜

PressTo
ctrl bAdd or delete Breakpoint
ctrl dDelete all breakpoints
ctrl rRun
ctrl kKill (Break)
ctrl pReplace watch variable
ctrl yAdd watch variable
ctrl tDelete watch variable
ctrl nStep over ( Next )
ctrl iStep In
ctrl uStep out ( Up )
ctrl cContinue

deoplete.nvimのソースをつくってみた

$
0
0

Summary

下記のような感じでオートコンプリートしたい

apと入力したらapple
baと入力したらbanana
chと入力したらcherry

image.png

必要なもの

deoplete.nvim

# dein.toml の記入例
[[plugins]]
repo ='Shougo/deoplete.nvim'
hook_add ='let g:deoplete#enable_at_startup = 1'

ソースをつくる

ソースの置き場所

$XDG_CONFIG_HOME/nvim/rplugin/python3/deoplete/sources

まずフォルダをつくる

cd $XDG_CONFIG_HOME/nvim
mkdir -p rplugin/python3/deoplete/sources

ソース(パイソンファイル)を作成

cd rplugin/python3/deoplete/sources
vim callmekohei.py

callmekohei.pyの中身(さわるところは3ヶ所のみ!)

from.baseimportBaseclassSource(Base):def__init__(self,vim):super().__init__(vim)self.name='callmekohei'# なまえself.mark='[kohei]'# mark のなまえdefgather_candidates(self,context):return["apple","banana","cherry"]# ポップアップのリスト

init.vimに記入
filetype plugin indent onの前に書く

set runtimepath+=$XDG_CONFIG_HOME/nvim/rplugin

filetype plugin indent on
syntax   enable

やりたいこと2

fruits.と入力したらapple, banana, cherry

image.png

ソース

importrefrom.baseimportBaseclassSource(Base):def__init__(self,vim):super().__init__(vim)self.name='callmekohei'self.mark='[kohei]'self.input_pattern=(r'^fruits\.')# input_pattern で fruits. を指定するdefget_complete_position(self,context):# input_pattern を使うときは必須m=re.search(r'\w*$',context['input'])returnm.start()ifmelse-1defgather_candidates(self,context):return["apple","banana","cherry"]

最小のセッティング

set runtimepath+=~/.config/nvim/rplugin
set runtimepath+=~/.config/nvim/plugins/deoplete.nvim
letg:deoplete#enable_at_startup =1filetype plugin indent on
syntax enable

やりたいこと3

appleを選択したらappleの説明を表示したい

image.png

ソース

from.baseimportBaseclassSource(Base):def__init__(self,vim):super().__init__(vim)self.name='callmekohei'self.mark='[kohei]'defgather_candidates(self,context):return[{'word':"apple",'abbr':"apple  : red, round and delicious!",'info':"Apple is delicious",'kind':"Food",'dup':1}]

参照

ヘルプ :help deoplete

CREATE SOURCE                   *deoplete-create-source*

To create source, you should read default sources implementation in
rplugin/python3/deoplete/source/*.py.

The files are automatically loaded and deoplete creates new Source class
object.
Source class must extend Base class in".base".

Note: The sources must be created by Python3 language.

Note: If you call Vim functions in your source, it is not asynchronous.

次世代補完フレームワークdeoplete.nvimと、そのソースの内部を詳しく


僕はただ Hello world がしたかっただけなんだ

$
0
0

IMG_6732.jpg

Summary

この記事はたんなるポエム

たんなる事務員さんがプログラミングをした話

Hello Worldするなら最初はIDEがお得

テキストエディタはまさに人生を行くが如し

きっかけ

そう短くはない期間、営業職・事務職としてお仕事してたんですけど、まぁ辞めようかなと決めたのが3年前の秋口。で退職してひまひま〜だったので、暇つぶしにプログラミングしようかなと。

なんとなく関数型言語

たしか当時、今書いてるブログサイトQiitaで、関数型言語とは?みたいな論戦がなんとか壁さんを中心にあって、それで関数型言語やってみようかな〜と。

事務処理でVBAというのを触ったことがあったので、同じマイクロソフトという会社が作ってるF#というのがあったので、それをやってみようかなと。

コードを書いてみたのよ

Mac持ってるんですけどVisual StudioVM上のWindows8.1にインストールして使ってみようと思ったんだけど、ものすごく複雑すぎて、僕にはむり〜となってすぐ消したんですよ。

たぶんテキストエディタの方が簡単だろうとな思ってVimというのが最初からパソコンにあったので、これでやろうとかなと。

とりあえず四苦八苦しながら下記のコードを書いて

Printfn"Hello World"

Vimのコマンドで:QuickRunとしたら

Hello World

おおお。でた!

ここからが大変だった

Hello Worldを表示させるのに3秒ほどかかるとか、単語の補完するのに結構な頻度でエラーになったりとか、どうやったらテストコードを書けるのかとか、デバッグをどうやったらいいのか、とかとか。

意地になって環境改善してみたら

VimF#のコードを実行、テスト、デバッグさせるのに、気づいたら2年が経過してたぽよ、、、。というか、例えばシャワーを浴びてる時でさえどうやって改善しようかとかvimのことずっと考えてましたし。

感想(あくまでも個人の感想です)

テキストエディタはやさしいというのは嘘。

テキストエディタにはいろいろなものがあるみたいですが、特にVimというテキストエディタはスモーキー。(たったった たったった ほわ〜ん)

実際のところ関数型言語もVBAもそんなには変わらない。

Pythonがオススメな気がする。

Sler, SE, Programmerな人たちに質問すると最初は優しいけど、徐々に厳しくなってきて、上達の気(け)が見えてこないと叱咤する傾向がある。

IDEがあるならそっちを使うのがいいかも〜。でも、テキストエディタでHello Worldすることは色々な意味で鍛えられる。

Thanks

当たり前ですが、色々な方のヘルプがあったおかげでF#'s Hello Worldができました。本当に本当にありがとうございます!

// special thanks:
// twitter account

@ShougoMatsu 
@mattn_jp 
@thinca 

@yukitos 
@bleis 
@htid46 
@omanuke 
@haxe 
@kekyo2 
@pocketberserker

Vimチートシート

$
0
0

凡例

  • []内は同じ意味
  • ()内は省略可能
  • {}内は{}を含め読み替える
  • 大文字のものはShiftキーを押しながら

通常モード

カーソル移動

コマンド動作
h
j
k
l
^ [0]行頭へ
$行末へ
w次の単語の先頭へ
e単語の先頭へ
b前の単語の先頭へ
ggファイルの先頭へ
Gファイルの末尾へ
Ctrl + f次のページへ
Ctrl + b前のページへ

編集操作

コマンド動作
y選択範囲(選択されていない場合行全体)をコピー(ヤンク)
Y行をヤンク
pヤンクした内容をペースト
Pヤンクした内容を現在位置にペースト
xカーソル位置の文字を1文字削除
dカーソル位置を起点として、続いて入力された方向の文字(もしくは行)を削除
D行内、カーソル位置以降を削除
dd行を削除
u元に戻す
Ctrl + rやり直し
r次に入力された文字でカーソル位置の文字を1文字置き換える
R置換モードに切り替える(入力された文字で以降の文字を置き換えていく)
gu小文字にする(選択されていない場合単語全体を小文字にする)
gU大文字にする(選択されていない場合単語全体を小文字にする)
vビジュアルモードに切り替える(選択できるようになる)
Vビジュアル 矩形モードに切り替える(矩形選択できるようになる)

検索・置換

コマンド動作
:{LINE_NUMBER}{LINE_NUMBER}に指定された行にカーソルを移動
#カーソル位置に存在する単語を検索する
/{SEARCH}{SEARCH}に指定された文字列を検索、nで次へマッチ、Nで前へマッチ
:%s/{SEARCH}/{STRING}/g{SEARCH}に指定された文字列を検索しマッチした文字列を{STRING}ですべて置き換える
:%s/{SEARCH}/{STRING}/gc{SEARCH}に指定された文字列を検索しマッチした文字列を{STRING}ですべて置き換える、置き換える際1つずつマッチを確認する

文書の保存・破棄

コマンド動作
:w上書き保存
:w読み取り専用を強制上書き保存
:w {NAME}名前を付けて保存
:e {NAME}ファイルを開く
:qVimを終了(保存されていない場合は終了できない)
:q!Vimを終了(変更を破棄して終了する)
:wq上書き保存して終了
:wq!読み取り専用を強制上書き保存して終了

その他小技

コマンド動作
:set nu(mber)行番号を付ける(解除は:set nonu(umber)
:set noet[noexpandtab]Tabキーを押したときにTab文字ではなく半角スペースを使う(逆は:set et[expandtab]
:set tabstop={N}Tabキーを押したときのインデントを{N}文字にセットする
:set autoindentオートインデントを有効にする
:set noautoindentオートインデントを無効にする

挿入モードに切り替える系

コマンド動作
iカーソル位置で挿入モード
Iカーソル行の行頭で挿入モード
aカーソル位置の1文字次で挿入モード
Aカーソル行の行末で挿入モード
oカーソル行の次行に改行を入れ挿入モード
Oカーソル行に改行を入れ挿入モード
cカーソル位置を起点として、続いて入力された方向の文字(もしくは行)を削除して挿入モード
Cカーソル行を空行(削除するが行は残す)にして挿入モード

挿入モード

コマンド動作
Ctrl + nキーワード補完、Ctrl + nで次のマッチへ
Esc挿入モードを抜け通常モードに切り替える

小技

複数行をインデント

  • Vで矩形選択モードに切り替える
  • 複数行選択
  • ^で行頭に移動
  • Iで挿入モードに切り替えて任意の文字数スペースを入れる
  • Escで抜ける
  • j(他のでも可)でカーソル移動

複数行のインデントを解除

  • Vで矩形選択モードに切り替える
  • インデント部分を選択
  • Xで削除

おまけ

カラースキームの変更

  • monokaiを使ってみる
$ cd ~/.vim
$ git clone https://github.com/sickill/vim-monokai.git
$ mv -T ./vim-monokai/colors ./colors
$ cd ~/
~/.vimrc
syntax enable
colorscheme monokai

netrwから元のファイルに戻る

$
0
0

netrwを使ってから元のファイルに戻れなくなったことがあったのでメモ
その他、基本的なコマンドも記載

元のファイルに戻る
(これはnetrwではなく、vim一般のコマンド)
ctrl+o新しいファイルを作成する
%
(ファイル名を入力)

d新しいディレクトリを作成する

以上。

vim で PlugInstall したら怒られたメモ

$
0
0

経緯

~/.vimを消して作り直したとき。

:PlugInstall

したら怒られた。

Not an editor command ^M

言ってることはわかるんだけど、この前まで動いてたじゃん。

原因

~/.gitconfigを編集したのが原因だった。

autocrlf = true

チェックアウト時にLF→CRLF する設定にしたの忘れてた。
ので、修正。

- autocrlf = true
+ autocrlf = input

[Note] Vim 8.0

$
0
0

version

$ vim --version
VIM - Vi IMproved 8.0
Huge version without GUI.

Change Mode

Key内容
EscNormal Mode
vVisual Mode
iInsert Mode
:Command Mode

Normal Mode

移動

Key内容
h
j
k
l
gg先頭行(1行目)
5gg5行目
G最終行
Ctrl-f1ページ上
Ctrl-b1ページ下
w単語単位(前)
b単語単位(後)
0行頭
^文頭
$行末(文末)
%対応する括弧

削除

Key内容
x文字
dd行(1行)
5dd5行
di"ダブルクオート内
da"ダブルクオート以外

ヤンク(コピー)

Key内容
yy行(1行)
5yy5行

ペースト

Key内容
p右(文字列)/下(行)
P左(文字列)/上(行)

検索

Key内容
/wordword
n
N
#カーソル上の単語を上に検索
*カーソル上の単語を下に検索

操作

Key内容
uundo
Ctrl-rredo
.直前の操作の繰り返し
=インデント調整

レジスタ操作

Key内容
"ayyaレジスタにヤンク
"apaレジスタのペースト
"0p無名レジスタと同時に0レジスタにも格納される
:h registersレジスタヘルプ
:regレジスタ一覧

Visual Mode

選択

Key内容
v文字
V
Ctrl-v短形
gg + V + G全体

複数行操作

Key内容
Ctrl-v + Ctrl-I(or x)複数行挿入や変更
Ctrl-v + $ + Ctrl-A複数行末変更
Ctrl-v + J複数行改行削除

Insert Mode

挿入

Key内容
iカーソル前
aカーソル後
I行頭
A行末
O行前(1行前)
o行後(1行後)

その他

Key内容
Ctrl-n補完
Ctrl-r + " or (レジスタ)貼り付け

Command Mode

保存/終了

Key内容
:w保存
:w filenamefilename名で保存
:w 1,51行目から5行目までを保存
:q終了
:q!強制終了
:e filename別ファイルを開く

置換

Key内容
:s/置換前/置換後/gカーソル行の置換
:%s/置換前/置換後/g全体の置換
:%s/置換前/置換後/gcチェックしながら置換

画面

Key内容
:sp上下に画面を分割
:vs左右に画面を分割
Ctrl-w + w分割画面間の移動
:close分割画面を閉じる
:tabnew新しいタブを開く
:tabe filenameタブを開く
gtタブの移動
:tabcloseタブを閉じる
vim -p filename1 filename2vim起動時にタブで開く
:tabdo %s/置換前/置換後/gタブ間で置換

その他

Key内容
:help Ctrl+r Ctrl+wカーソル上の単語をhelp

vimrc

" color
syntax on"Display Settingsetnumber         " 行番号を表示する
"set cursorline     " カーソル行の背景色を変える"set cursorcolumn   " カーソル位置のカラムの背景色を変えるset laststatus=1   " ステータス行を常に表示
set cmdheight=2    " メッセージ表示欄を2行確保
set showmatch      " 対応する括弧を強調表示
set helpheight=999 " ヘルプを画面いっぱいに開く
"set list           " 不可視文字を表示" 不可視文字の表示記号指定"set listchars=tab:>,eol:>,extends:>,precedes:<"Scrool Settingset backspace=indent,eol,start " Backspaceキーの影響範囲に制限を設けない
set whichwrap=b,s,h,l,<,>,[,]  " 行頭行末の左右移動で行をまたぐ
set scrolloff=8                " 上下8行の視界を確保
set sidescrolloff=16           " 左右スクロール時の視界を確保
set sidescroll=1               " 左右スクロールは一文字づつ行う

" Filesetconfirm    " 保存されていないファイルがあるときは終了前に保存確認
set hidden     " 保存されていないファイルがあるときでも別のファイルを開くことが出来る
set autoread   "外部でファイルに変更がされた場合は読みなおす
set nobackup   " ファイル保存時にバックアップファイルを作らない
setnoswapfile " ファイル編集中にスワップファイルを作らない

" Searchset hlsearch   " 検索文字列をハイライトする
set incsearch  " インクリメンタルサーチを行う
set ignorecase " 大文字と小文字を区別しない
set smartcase  " 大文字と小文字が混在した言葉で検索を行った場合に限り、大文字と小文字を区別する
set wrapscan   " 最後尾まで検索を終えたら次の検索で先頭に移る
set gdefault   " 置換の時 gオプションをデフォルトで有効にする

" Tab/Spaceset expandtab     " タブ入力を複数の空白入力に置き換える
set tabstop=2     " 画面上でタブ文字が占める幅
set shiftwidth=2  " 自動インデントでずれる幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent    " 改行時に前の行のインデントを継続する
set smartindent   " 改行時に入力された行の末尾に合わせて次の行のインデントを増減する

set nobackup

参考サイト

Viewing all 5720 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>