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

vimのgitプラグインを作ってる話

$
0
0

TS;DR

普段Vimを使っててたまーにターミナルに戻らずvimの中からGitコマンドを使いたいたい時があったので

簡単にプラグインを作ってみた

Vitter

コマンド

現状使える基本的なコマンドは以下の通り

git branch

:Gb <オプション>

git checkout

:Gc <オプション>

checkoutでファイルを開いてるファイルを直接した場合は一度閉じる

git log

:Gl <オプション>

git diff

:Gd <オプション>

git rebase

:Gl <オプション>

その他コマンド

現在開いてるファイルをcheckoutする

:Gcf

インストール

pluginディレクトリの下にファイルを配置するとNeoBunldeで入れれる様になるため

NeoBundleで簡単に入れれるようにした

.vimrcのNeoBundleの設定内に以下を追記すれば次vimの起動時にインストールしてくれる

NeoBunldeの使い方は適当に調べてください

以下追記

NeoBundle "723gt/vitter"

今後

まだまだ完全に使える状態じゃないので時間を見つけてアップデートしていきたい
具体的には

- git rebase -i hoge等をしたときエディタが起動しないため現状使えない
- 開いてるファイルが変更されたときに更新されない(現状強制的に閉じている)
- 実装していないgitコマンドがある(addとcommitは追加する気はあまりない)

とりあえずこんな感じでゆるく作ってます

日本語版README代わりにでもなれば

バグや機能追加等あればここにissueかPRください


Vue.js 開発環境構築

$
0
0

Vue.jsの開発環境を構築したときのメモです。

ビルドツール

公式のツールである Vue CLI 3で開発用アプリケーション起動からリリース用ビルドまでできる。

インストール
# vue-cli (1.x or 2.x) がインストールされている場合はアンインストールする。
npm uninstall vue-cli -g
npm install-g @vue/cli
使い方
# プロジェクトの新規作成
vue create {プロジェクト名}# 対話形式で利用するプラグインを指定する。
# 開発用にアプリケーションを起動する。
npm run serve
# リリース用にアプリケーションをビルドする。
npm run build
# Lintを実行する。
npm run lint
参考

エディタ

IDEでワンストップ開発・有償ライセンスを用意できる場合は WebStorm、オープンソース系でやりたい場合は Visual Studio Code + Veturが人気がある。私の場合は開発環境が非力で Vetur がもっさりしていたので Vim + vim-vueを使っている。

参考

デバッガ

vue-devtoolsでコンポーネントの状態やVuexで管理されている状態、イベントの監視などができる。スタンドアロンアプリケーション(Electron製)の他にChromeもしくはFirefoxプラグイン(ベータ版)が提供されている。

vimrc

$
0
0

"base
syntax on
set ignorecase
set smartcase
set termencoding=utf-8
set fileencodings=utf-8,euc-jp,cp932
set autoindent
set smartindent
set cindent
set showmatch
set ruler
set fdm=marker
set shiftwidth=4
set tabstop=4
" カーソル行をハイライト
set cursorline
" カレントウィンドウにのみ罫線を引く
augroup cch
autocmd! cch
autocmd WinLeave * set nocursorline
autocmd WinEnter,BufRead * set cursorline
autocmd InsertChange * :echo "insert change"
autocmd InsertLeave,CursorMoved * :echo "auto save exec event in leave"
autocmd CmdwinEnter,CmdwinLeave * :echo "auto save exec event"
augroup END
"highlight CursorLine ctermbg=white guibg=white
"highlight CursorLine ctermbg=white guibg=white
highlight CursorLine ctermbg=black guibg=black
""
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=lightblue
match ZenkakuSpace / /
" 
set laststatus=2 " 常にステータスラインを表示

set history=100

nnoremap ;b
nnoremap ;f
nnoremap ;o o
nnoremap ;r
"nnoremap lp $
"nnoremap i// {{{ dust
"nnoremap ; i// }}}
nnoremap ;j /^[^0-9*\/]
nnoremap ;h :s/,/---/g
nnoremap ;k /^[^0-9*\/]:s/,/---/g

nnoremap pa yypl

ゼロからはじめるやさしいVim

$
0
0

モテたくてVimをちゃんと使い始めて2週間くらい経ちました。
Vim使ってる人ってかっこいいけど、初心者のためのVim入門みたいなのを見ても、コマンド多すぎでとにかくとっつきづらいと思ってました。
そんな私でも最近少しVim充できるようになるようになってきたので、もしかすると頑張りすぎなくてもVimとの仲を深められるかもしれません。

対象読者

  • Vim使ってモテたいと思ってる人
  • でもちょっと調べてはい無理〜ってなってる人

Vimを開いて書いて保存して閉じる

とりあえず開いて保存して閉じるまではできる、と言う人は多いと思います。
私は初めてVimでファイルを開いた時、閉じるコマンドが打てずにあたふたしてました。

開く

ターミナルを開いて、とりあえずVimコマンドでなんか開きます。
指定したファイルがなかったら勝手に作ってくれます。

vim hoge.txt

書く

開いたらなんか書きたいですよね。
キーボードのiを押すと書けるようになるのでhogehogeとか書きます。

保存する

残念ながらCtrl + sでは保存できません。
Ctrl + [キーを押してから、:+w+Enterで保存できます。
wはwriteの頭文字なのでそう覚えます。
この時:wと左下に表示されているのを確認してからEnterターンッします。

閉じる

保存した時と同じように、:+q+EnterでVimでの編集を終了してファイルを閉じます。
保存しない場合は:q!、保存と終了を一気に行う場合は:wqでいけます。

ここまではVimを触ったことがあれば余裕ですね。

モードを切り替える

Vimにはモードという概念があります。
モードによってできることが違うのがVimの難しいところですよね。
とりあえずプチVim充するためには、この2つを行き来できれば大丈夫。

  • ノーマルモード
  • インサートモード(ノーマルモードからiで入ってCtrl + [で抜ける)

そしてノーマルモードの使い方を少し覚えれば、おっVim使えそう、って思えます。(多分)

ノーマルモード

ノーマルモードとは

Vimを開いた瞬間のモードがノーマルモード。
Vimっぽいコマンドが色々使える。保存とか終了のコマンドを使っていたのもノーマルモード。
基本的に書いてる時以外はノーマルモードにいるのがVimmerの嗜みで、ノーマルモードでチャカチャカとコマンド使って編集するのがかっこいい。

ノーマルモードでやりたいこと

ノーマルモードでは色々出来すぎて覚えられなくて挫折しますが、Vim始めたての私はとりあえずこれだけ覚えました。
とりあえずこれだけで闘えます。

  • カーソル移動
  • 文字列削除
  • コピペ

カーソルの移動

ご存知の通り矢印キーで移動していてはVimmerにはなれません。

まずはこれ

h:← j:↓ k:↑ l:→

慣れるまでは割と辛いですがホームポジションで移動できるのは本当に快適になります。頑張りましょう。
とはいえ一文字づつ移動するのは苦行なので、左右には単語単位で移動できれば便利です。

b:単語の先頭へ移動 e:単語の末尾に移動

ざっくり移動してからhlで微調整する感じで使いましょう。

上下は、

Ctrl + u:半ページ上へ移動 Ctrl + d:半ページ下へ移動

10000行とかのソースコードでなければ、とりあえずこれでほとんど対処できると思います。

文字列削除

削除するときはインサートモードに入って一文字ずつ、ではなくガバッと消したいので、最低限覚えました。

x:一文字削除
dd:行削除

範囲選択削除も覚ておきたいですね。

vを押してからh j k lで範囲選択→dで削除。
Shift + vで行選択)

コピペ

一応マウスでもできますがコマンドでやりたいですよね。

vを押してからh j k lで範囲選択→yでコピー
vを押してからh j k lで範囲選択→dで切り取り
貼り付け位置に移動して、pで貼り付け

まとめ

ここまで挙げたコマンド一覧

ファイル操作
:w:保存
:q:編集終了
:q!:保存せずに終了
:wq:保存して終了
モード切り替え
i:インサートモードへ移動
Ctrl + [:ノーマルモードへ移動
カーソル移動
h:← j:↓ k:↑ l:→
b:単語の先頭へ移動 e:単語の末尾に移動
Ctrl + u:半ページ上へ移動 Ctrl + d:半ページ下へ移動
範囲選択
vを押してh j k l:範囲選択
Shift + v:行選択
文字列削除
x:一文字削除
dd:行削除
d:選択範囲削除。
コピー切り取り貼り付け
y:コピー
d:切り取り
p:貼り付け

こうしてみると20個もあるやんけって感じですが、見ながら使ってればなんだかんだすぐ覚えられると思います。
私の場合、一気にたくさん覚えるのは心が折れるので、最初2日3日は気が向いたときにVimを使って、これくらいの最低限のコマンドをチートシート見ながら覚える、くらいのカジュアルさで初めてみました。
特にカーソル移動に慣れてくるとこれだけでもある程度編集もスムーズになってくるので、不便だと思ったことを調べて、使えるコマンドとかプラグインを増やしていくという感じで無理なくVimと付き合ってます。

これからもよきVim充ライフを送っていきたいですね。

macOSXのVim/Neovimで日本語を入力してみたった

$
0
0

Summary

Vim/Neovimで日本語を入力する

こんな感じ

vimとNeovimとではちょっとやり方が変わります

vimの場合

help通りにやる( :h japanese )

functiong:ImActivateFunc(active) abort
  if!a:activecall system('osascript -e "tell application \"System Events\" to key code 102" &')endifendfunctionfunction!g:ImStatusFunc() abort
  letl:cmd ='ObjC.import("Carbon") ;var current_source = $.TISCopyCurrentKeyboardInputSource(); ;var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID); ;ObjC.bindFunction("CFMakeCollectable", [ "id", [ "void *" ] ]); ;Ref.prototype.toNS = function () { return $.CFMakeCollectable(this) } ;cfs.toNS()'letl:foo = system('osascript -l JavaScript -e "'.l:cmd .'" &')if stridx(l:foo,'Japanese')return1endifendfunctionset iminsert=2set imsearch=2set imcmdline
set imstatusfunc=g:ImStatusFuncset imactivatefunc=g:ImActivateFunc

Neovimの場合

function!s:imStatusFunc() abort
  letl:cmd ='ObjC.import("Carbon") ;var current_source = $.TISCopyCurrentKeyboardInputSource(); ;var cfs = $.TISGetInputSourceProperty(current_source, $.kTISPropertyInputSourceID); ;ObjC.bindFunction("CFMakeCollectable", [ "id", [ "void *" ] ]); ;Ref.prototype.toNS = function () { return $.CFMakeCollectable(this) } ;cfs.toNS()'letl:foo = system('osascript -l JavaScript -e "'.l:cmd .'" &')if stridx(l:foo,'Japanese')return1endifreturn0endfunctionfunctions:imDeactivateFunc() abort
  call system('osascript -e "tell application \"System Events\" to key code 102" &')endfunction

autocmd callmekohei-vimrc InsertLeave * ifs:imStatusFunc()|:calls:imDeactivateFunc()|endif

Vim/Neovim共通
vim
noremap <silent><nowait><ESC><ESC>
\ :nohlsearch<CR><C-l>
\ :<C-u>call <SID>imDeactivateFunc()<CR>

みどころ

IMEの状態を見る関数

13時間ほどぶっ続けでやって結局は stack overflow に書いてあったみたいな(泣)

JavaScriptもOSXのObjective-Cとかもぜんぜんわからずにアタックしましたよwww

辛すぎ〜

see also:How can we reading / coerce CFArray and CFString etc values from within OS X JXA?

// Carbonをインポート;古いAPIを使えるようにするObjC.import('Carbon')varcurrent_source=$.TISCopyCurrentKeyboardInputSource();varcfs=$.TISGetInputSourceProperty(current_source,$.kTISPropertyInputSourceID);ObjC.bindFunction('CFMakeCollectable',['id',['void *']]);Ref.prototype.toNS=function(){return$.CFMakeCollectable(this)}cfs.toNS()

動作的に

日本語切り替えを入れると全体的に動作がもさっとします。とくにインサートからノーマルにいくときに、:wを押す癖がついてるのですが、これができなくなるのですよ。たぶん0.3秒ほどウエイトがかかるんですけどそこにちょっと、あああな感じですけど慣れるしかないんでしょうね・・・。うん、でもそれ以外は今のところ快適ですね。

できれば・・・

いまはIMEの状態チェックでおさを(osascript)。切り替えるときにもおさを(osascript)。もったいないですよね。ここ。なんとか一つにしたいと思ってるところです。どたなたやってみませんか?

Linux—ファイル閲覧するなら view コマンドを使えば良いじゃない ( Vim の閲覧専用モード )

$
0
0

ファイルを読むのにどのコマンドを使っているだろう。

  • less
  • cat
  • more

自分は cat派。
だがたまに「vimをファイル閲覧に使いたいけど、ミスって編集するのが嫌だな」と思っていた。

閲覧モードがあるじゃない

viewコマンドを使ってみよう。
vim の閲覧専用モード ( vim -R ) がコマンド化されているもののようだ。

vim の検索とか、キーストロークとか、全部使えていい感じ。

挙動

image

実はテキスト編集自体は出来てしまう。

image

保存ができない仕様。 ( :w )

image

VIMを抜けるには強制脱出する。 ( :q! )

Links

Vim — ggとG のキーストロークを絵で覚える ( G は重力のG )

$
0
0
  • gg - ファイルの最上段に移動
  • G - ファイルの最下段に移動

これだ。

小文字のgは軽くて、大文字のGは重たい。

image

Links

Vimのタブで複数ファイルを一気に開く&以前の状態を復元する

$
0
0

タブで複数ファイルを一気に開く

オプションに-pをつけるとタブで開いてくれる。

$ vim -p test.php test2.php

vimP.gif

git管理下で作業しているときにmodifiedのファイルを一気に開きたいときに便利。
modified.png

git diffのオプションで--name-onlyをつけるとless形式でmodifiedのものだけ表示できる。これをvim -pに渡してあげる。

$ vim -p`git diff --name-only`

vim-modified.gif

作業前の状態をまるごと復元する

vimを開いているときに:mksと打つとカレントディレクトリにSession.vimというファイルが作られる。
通常Session.vimがすでに存在しているとエラーが吐かれるが、:mks!とすると強制上書きとなる。ちなみにmksは「make session」の略。

Session.vimを作ったら以下で復元する。

$ vim -S Session.vim

またはvimを開いているときに以下のコマンドを打つ

:source Session.vim

SessionVim.gif

カーソルの位置まで保存してくれるので本当にそのまま復元する形となる。


Vim—H T K L のキーストロークを絵で覚える ( 左下上右に移動 )

vimiumの微妙に嫌な所を改善する。

$
0
0

Vimiumって凄い。

vimの操作に微妙に慣れてきたので、vimっぽく動かせるchromeのアドオンを探していたのですが
Vimiumっていうすんごいアドオンに出会ってしまいました。
fキーで選択出来るわ、検索用のモーダル出せるわ、何やこいつ状態です。
しかし、微妙に使いづらい所があったんで、そこら辺の修正方法を書いておこうと思います。

googleの検索結果もコマンドで次ページへ移動出来るようにする

初期状態では、gooleの検索結果を[[や]]で改ページ出来ません。これは検索するうえで不便だと思います。

タイトルなし.png

設定のPrevious pattrnsとNext patternsに"前へ"と"次へ"を追加します。
これで改ページを行えるようになります。

新規タブを検索画面にする。

僕のchromeの設定のせいかもしれませんが、初期状態の新規タブだとアドレスバーにフォーカスした状態になってしまいます。そのうえ、javascriptでフォーカスを抜ける技も使えませんでした。これは新規タブの画面を通常の検索画面にすることで改善出来ました。

タイトル2し.png

設定のNew tab URLを検索画面にしてください。

検索すると勝手にテキストボックスにフォーカスされている

oを押してカスタムエンジンを使うと、勝手にテキストボックスにフォーカスされていて一々Escで抜けるのが面倒でした。

タイトルなし3.png

これも設定のDon't let pages steal the focus on load にチェックボックスを入れるだけで改善出来ます。

Vim でヌルヌルページめくり

$
0
0

最近また vim を使い始めて、 amix/vimrcを触っていたが、面白い動きをしていた。
C-u, C-dがヌルヌル動いたのである。

こんな感じ

調べてみると comfortable-motionというプラグインのおかげだった。
デフォルトのページめくりでは瞬間的に切り替えられるため、読んでいたところを見失ったりしたことがあったが、これならそんなことは起こらなくなるだろう。
ちょっと気分が良くなるので、使ってみてはどうだろうか。

コマンドまとめ~ubuntu, vim, git, tig

$
0
0

モブプログラミングを仲間とする時に、よく使うコマンドをまとめておくことにしました。
ubuntu, vim, git, tigのコマンドを記載しています。
閲覧のしやすさを考え、同じ記事にしています。

ubuntu

コマンド説明
$ Ctrl + c実行コマンドキャンセル
$ cd ~ホームディレクトリに移動
$ cd /ルートディレクトリに移動
$ cd ..親ディレクトリに移動
$ lsカレントディレクトリの中身確認
$ mv {現ファイル名} {新ファイル名}ファイル名変更
$ grep -r "{検索文字列}"ファイル内検索
$ vim {ファイル名}ファイルをvimで開く

vim

ファイル準備

コマンド説明
:vsplit垂直分割
:split水平分割
Ctrl + w, →分割画面間の移動
:e {ファイル名}ファイルを開く

編集

コマンド説明備考
yyコピー5yy(5行コピー)
pペーストカーソルの1行下に入る
dd切り取り3dd(3行切り取り)
u元に戻すUndo
Ctrl + rやり直しRedo
v選択
o改行◦ カーソルの1行下に入る
◦ Insertモードに移行する
iInsertモードに移行EscでCommandモードに戻る

移動

コマンド説明
ggファイル先頭に移動
Shift + gファイル末尾に移動
{数字}gg数字行に移動
^行のテキスト先頭に移動
0行頭に移動
$行末に移動
%対応する括弧に移動

検索/置換

コマンド説明
/ {検索単語}後方検索
? {検索単語}前方検索
:%s/{置換前単語}/{置換後単語}ファイル内の最初に見つかった単語を置換
:%s/{置換前単語}/{置換後単語}/gファイル内のすべての単語を置換
:%s/{置換前単語}/{置換後単語}/gcファイル内のすべての単語を確認しながら置換

保存/終了

コマンド説明
:wファイル保存
:waすべてのファイルを保存
:qファイルを閉じる
:qaすべてのファイルを閉じる
:wqaすべてのファイルを保存して閉じる

git

ステージ
$ git add -A
コミット
$ git commit -m '{コメント}'
プッシュ
$ git push origin {LocalBaranchName}:{OriginBranchName}
プル
$ git pull origin {OriginBranchName}

tig

$ tigでmain画面起動させた後のコマンドです。

コマンド説明
$ sstatus確認
$ uステージ(アップ/ダウン)
$ !変更を元に戻す
$ Shift + cコミット
$ Enter選択ファイルを開く
$ k↑移動
$ j↓移動
$ !変更を1つずつ元に戻す ※ファイルを開いた状態

Vim—現在開いているカレントファイルを直接実行する

$
0
0

やりたいこと

Vimの中から現在開いているスクリプトを直接実行したい。

Vimの例

Vimで実行権限のあるファイルを開いてから

vim ./example.sh

コマンド入力

:! %:p

でOK

Vim じゃない例

こんな感じ。

echo'#/bin/sh'> ./example.sh
echo'echo ok'>> ./example.sh
chmod +x ./example.sh
./example.sh
ok

結果

$ vim ./example.sh
ok

コマンドの意味

  • : - コマンドモードの開始
  • ! - 外部コマンドを実行する
  • %:p - カレントファイルのフルパス

ショートカットをマッピングする例

~/.vimrcを編集する

F5キーにマップする場合

map <F5> :! %:p

Enterも打ちたくない場合

map <F5> :! %:p<Cr>

Links

Ack.vim と qfreplace で気軽に複数ファイルの一括置換

$
0
0

Vim での複数ファイルの一括置換については、何となく :argdoなどを使うっぽいということだけ知っていた状態で、あまり使ったことはありませんでした。

しかし、複数ファイル一括置換をするような場面に出くわし、簡単にできる方法は無いかと探していたところ、Ack.vimqfreplaceの組み合わせが簡単そうだったので紹介します。

利用する Vim プラグインについて

Ack.vim

自分のお気に入りの検索ツール(agripgrepなど)による検索結果を、Quickfix ウインドウに表示してくれるプラグインです。
Quickfix ウインドウの検索結果から、対象ファイルを直接開くことも可能です。

qfreplace

Quickfix ウインドウに一覧表示されたリストを一括置換できるプラグインです。
Quickfix ウインドウのリストから置換バッファを作成し、こちらを編集・保存することで、該当のファイルを一括置換することができます。

複数ファイル一括置換の流れ

以下の流れで一括置換していきます。

  1. Ack.vim で検索したい文字列で検索、Quickfix ウインドウ表示
  2. qfreplace で Quickfix ウインドウから置換バッファウインドウ作成
  3. 置換バッファ内で置換
  4. 置換バッファを保存
  5. 置換を確認

手順

例として、以下では puma-devリポジトリ以下全ファイルの darwinという文字列を、 charlesという文字列に変更する手順で書こうと思います。

環境

  • Mac OS X 10.13.6
  • Vim 8.1.202

0. 下準備

手順実施前に、お好みの Vim プラグインマネージャーなどを使って Ack.vim と qfreplace をインストールしておきます。
以下では dein.vim の例で記載します。

call dein#add('mileszs/ack.vim')call dein#add('thinca/vim-qfreplace')

Ack.vim で ag を使いたいという方は、ag をインストールした状態で.vimrcに下記を追記します。
(特に変更はいらないという方は飛ばしていただいて構いません)

if executable('ag')letg:ackprg='ag --vimgrep'endif

1. Ack.vim で検索したい文字列で検索、Quickfix ウインドウ表示

それでは実施していきます。まず puma-dev リポジトリをクローンし、Vim を起動します。

$ git clone https://github.com/puma/puma-dev
$ cd puma-dev
$ vim

Vim が起動したら、:Ack darwinと入力し実行します。
すると検索ヒットした結果が Quickfix ウインドウに表示されます。

1_ack.png

2. qfreplace で Quickfix ウインドウから置換バッファウインドウ作成

次に、Quickfix ウインドウが開いた状態で、:Qfreplaceと入力し実行します。
すると、Quickfix ウインドウの上部にさらに qfreplace の置換バッファウインドウが開きます。

2_qf.png

内容は Ack.vim の Quickfix ウインドウに表示された検索行がそのまま表示された形になります。
置換バッファの表示ができたら、Ack.vim の Quickfix ウインドウは閉じてもOKです。

3. 置換バッファ内で置換

qfreplace の置換バッファ内で置換を実行します。この置換バッファ内ではインサートモードで手動編集もできるのですが、今回はコマンドで置換します。

:% s/darwin/charles/gと入力し実行します。
すると、置換バッファ内の darwinという文字列がすべて charlesという文字列に置換されます。

3_replace.png

4. 置換バッファを保存

最後に、置換バッファ内で、:wを入力し保存を実行します。
すると、検索ヒットした行に該当するファイルに一括で保存処理が走り、変更が保存されます。

4_save.png

5. 置換を確認

最後に置換ができているかを確認してみます。

Vim を終了し、git diffしてみると、確かに置換ができていることが確認できます。

5_diff.png

終わりに

僕はこれで気軽に複数ファイル一括置換ができるようになりました。また検索結果を確認しながら作業ができるのもいい感じです!

参考URL

Vim起動時に指定したファイルをバッファでロードしつつ画面分割で特定のバッファを開いておく

$
0
0

概要

  • :rolling_eyes:vim (ファイル or ディレクトリ path)だと最初にマッチしたファイルのみがウィンドウに表示された状態で起動する
  • :thinking:しかし ファイルは一式バッファにロードしておきつつ特定ファイルを画面分割なりタブなりで開いた状態にしておきたい
  • :smile:そういうときは -cオプションと -[oOp]オプションを併用すると実現できそう
  • :triangular_ruler:プロジェクト単位で作業するときに便利そう

vimのバッファについて(復習)

(分かる人は「やりたいこと」まで読み飛ばして下さい)

vim にはバッファという仕組みがあります。
すごく簡単に言うと、 複数ファイルを裏で開いておいてすぐに切り替えできるようにする仕組みです。
Intellijを始めとしたIDEでは、複数のファイルをタブで開きタブで切り替えることができます。
しかしvimのバッファは目に見えないバックグラウンドでファイルをロードしてある状態で、編集するにはそれをウィンドウ(手前の画面)に持ってくる必要があります。
またウィンドウはバッファを表示する「窓」でありバッファからは完全に独立しています。
そのため、別のファイルを編集したいときにはウィンドウ自体を新規に作るよりも、今のウィンドウ内のバッファを切り替える方が方法としては一般的です。

vimの起動時にバッファとしてファイルを読み込んでおくには、引数に読み込みたいファイルを指定します。
例えば以下のようなディレクトリがあるとします。

sample
  + index.html
  + css
  | + style.css
  | + reset.css
  + js
    + script.js
    + jquery.min.js

この中でsampleディレクトリ内のファイル一式を開くには

vim index.html css/*.css js/*.js

あるいは

vim **/*.{html,css,js}

を実行します。
すると5つのファイルがバッファにロードされます。

ロードされたバッファを確認するには :buffersを実行します。

buffer.png

やりたいこと (本題)

ここでバッファをロードして起動が終わった状態を確認してみてください。

おそらくですが index.htmlだけが画面に開かれている状態で、画面分割もタブも表示されていないものと思われます。

人によってはCSSやJSのファイルが表示されているかもしれませんが、大切なのはバッファロードをしても起動時の画面には1つのバッファしか表示されていないという点です。

ここで自分は vim起動時に特定の複数ファイルを画面分割ないしタブで開いておきたい :exclamation:と思ったのです。

先程の例で言うと

  1. 5つのファイルをすべてバッファロードしたうえで
  2. index.htmlstyle.cssscript.jsは画面分割でトップに開いておきたい

ということになります。

絵にするとこういうことになります。

ideal.png

画面分割/タブで開くには -[oOp]オプションを使う

実はvimには、画面分割やタブによるウィンドウ表示を起動時に行うためのオプションが存在します。
それぞれ次のとおりです。

  • -oで指定したファイルを水平分割で開く
  • -Oで指定したファイルを垂直分割で開く
  • -pで指定したファイルを新規タブで開く

例えば index.htmlstyle.cssscript.jsを垂直分割で並べるには以下を実行します。

vim -O index.html css/style.css js/script.js

large-o-option.png

バッファロードと同時に画面分割をするには

しかしこれには以下の問題点があります。

  1. 開いたファイル以外のファイルをバッファにロードできていない
  2. 開くときのウィンドウの分割の仕方を理想通りにできない

2の問題点はおいておき、1についてですが、 vim (バッファロードしたいファイル) -o (ウィンドウで開きたいファイル)のようなコマンドでできるかと思いきや、これではうまくいきません。

ではどうするかというと 起動時に特定コマンドを実行するための -cオプションを併用します:bulb:
vimには起動後にバッファへファイルをロードするための :argsコマンドが存在します。
つまり -c "args" で起動後にバッファをロードし -oで特定ファイルをウィンドウに読み込めばよいわけです。

よって

vim -c"args (バッファロードしたいファイル)" -[oOp] (水平/垂直/タブで開きたいファイル)

でやりたいことが実現できそうです。
先程の例ではコマンドは以下のようになります

vim -c"args **/*.{html,css,js}"-O index.html css/style.css js/script.js

ウィンドウの開き方をより詳細に指定するには

前述の2の問題点に戻ります。
vimのリファレンス(日本語版)を見たところ

-oと-Oが両方指定されたときは最後に指定された方を使用する。

とあります。

つまり -o-Oはそれぞれ排他的なコマンドであり、要するに水平分割と垂直分割とタブ表示は組み合わせられないということです:warning:
-pも記載はありませんでしたが、挙動を見たところ排他的なようでした。) 
よって、理想としているようなT字型の分割をするのはどうやら難しそうです...

しかしすでに触れたとおり -cオプションで起動後に任意のvimコマンドを実行できます。
ならば splitvsplittab-cでつなげてしまえば良さそうです:ok_hand:

さらに、ウィンドウやタブの移動をエミュレートするvimコマンドとして wincmdが用意されているので、好きなウィンドウに移動してから分割を実行することもできそうです。
例えば以下の場合

vim -O index.html css/style.css -c"wincmd l"-c"split js/script.js"
  1. 垂直分割で index.htmlcss/style.css を開き
  2. 右側のウィンドウへ移動して
  3. 水平分割で js/script.jsを開く

ということを起動時に行います。

まとめ

以上のことから、起動時に指定したファイルをバッファでロードしつつ画面分割で特定のバッファを開いておくコマンドは次のとおりとなります。

vim -O index.html css/style.css -c"args index.html css/*.css js/*.js"-c"wincmd l"-c"split js/script.js"

clear.png

ウィンドウが理想通り分割されて、かつバッファにも必要なファイルが読み込まれていることが確認できます。
バッファをロードするのをウィンドウの移動よりも前に指定している点に注意して下さい (入れ替えるとどうなるか自分で試してみて下さい)

なおリファレンスによれば -cオプションは最大10個まで指定できるようです。

Vimコマンドの引数として "+" か "-c" をあわせ、最大10個まで使うことができる。

とはいえ、はじめからウィンドウを10個も20個も開いておきたいケースは多くはないはずです。
あくまで起動時のウィンドウで2,3ファイルとタブを1つくらい開いておき、あとはバッファ切り替えでウィンドウにロードすれば、少なくとも自分は十分都合良かったです。

参考資料


ALE(on NeoVim)でPythonコードを楽に整形する

$
0
0

tl;dr;

PythonのLinterであるflake8はpep8に従っていろいろと教えてくれますが、
マニュアルで行うとなかなかに面倒な修正案を提示します。
近頃Golangの自動フォーマッタに慣れてしまった自分としては、
もう勝手にやってくれよ、とちょいちょい思ってました。

非同期にLinterを実行するVimプラグインとして有名なALEには、
エラー箇所を自動で修正するALEFixコマンドがあり、前々からやってみようかなと思っていたので、
この機会にALEでPythonコードのLintと自動整形をやらせてみたいと思います。

前提

NeoVim

私は素のVimではなくNeoVim使いなのでこっちを使った方法になります。
素のVimとはPythonのパス解決の仕方が異なるのでご注意ください。

  • NVIM v0.3.1

あとALEを使うのでALEのインストールはもちろん必要です。公式は丁寧に書いてあるのでわかりやすいです。

pyenv

ALEから呼び出しするflake8などのコマンドはpyenvにてインストールしたPythonのものを使用します。
これはNeoVimから呼び出すPythonのパス解決を固定するためです。

  • pyenv 1.2.7-1-g71902168

pyenvにてインストールしたPythonのパスを固定する手段としては、
deoplete-jediのwikiが非常に参考になるため参照してみてください。

準備

まず準備としてNeovimが参照するPythonのパスが固定されている必要があります。
なぜならばNeoVim起動時にどのPythonを参照するかによって都度都度必要なツールをインストールするのは面倒だからです。

pyenvでNeoVim参照用のPython仮想環境を作成する

開発者であればPythonはvirtualenvやpipenv,pyenvなどにより複数のPythonバージョンを持っていることが多いと思います。
Pythonのパスが固定されていなければ、ALEから呼び出しするflake8等のPythonツール群は、
実行環境によって様々なPythonパスを参照してしまい、参照したパスにツールがインストールされていない場合、
パス解決ができずALEから実行できない恐れがあるからです。

globalのpyenv使ってるときは問題ないのに、virtualenvをロードした後にALEでflake8実行できなかったことないですか?
あったら原因はパス解決のせいだと思います。

手順は以下のツールが既にインストール済みである前提で話を進めます

  1. NeoVim参照用のPythonを作る

    # pyenvに最新のpython3を入れる
    pyenv install 3.6.5
    # pyenv-virtualenvでneovim用の仮想環境として定義
    pyenv virtualenv 3.6.5 neovim3
    
  2. pyenvのパスは環境変数に入れとく

    export PYENV_PATH=$HOME/.pyenv
    
  3. init.vimにPythonのパスを入れる

    letg:python3_host_prog= $PYENV_PATH .'/versions/neovim3/bin/python'
    • ちなみに自分はanyenvとpyenvが端末によって入ったり入ってなかったりするので以下のように書いてます

      if isdirectory(expand($PYENV_PATH))letg:python3_host_prog= $PYENV_PATH .'/versions/neovim3/bin/python'endifif isdirectory(expand($ANYENV_PATH))letg:python3_host_prog= $ANYENV_PATH .'/envs/pyenv/versions/neovim3/bin/python'endif

ツールのインストール

なお今回使用するツールは以下の通りです。

ツール名用途
flake8いわずもがなPythonのLinter
flake8-import-orderflake8でimport順序をチェックする拡張
autopep8pep8の規約に沿って整形するフォーマッタ
black改行を整形するフォーマッタ
isortimport順序を整形するフォーマッタ

下記手順で、pyenvに必要ツールぶち込みます

# 上記で作った環境をロード
pyenv shell neovim3
# 仮想環境に必要ツールをインストール
pip install-U flake8 flake8-import-order autopep8 black isort
# アンロード
pyenv shell --unset

ALEの設定

なかなか面倒ですがやっとALEの設定ができます。
大きく分けてやりたいことは以下の3つです。

  1. flake8をLinterとして登録
  2. 各ツールをFixerとして登録
  3. 各ツールの実行オプションを変更してPythonパスを固定
" flake8をLinterとして登録letg:ale_linters={    \'python':['flake8'],    \}" 各ツールをFixerとして登録letg:ale_fixers={    \'python':['autopep8','black','isort'],    \}" 各ツールの実行オプションを変更してPythonパスを固定letg:ale_python_flake8_executable=g:python3_host_progletg:ale_python_flake8_options='-m flake8'letg:ale_python_autopep8_executable=g:python3_host_progletg:ale_python_autopep8_options='-m autopep8'letg:ale_python_isort_executable=g:python3_host_progletg:ale_python_isort_options='-m isort'letg:ale_python_black_executable=g:python3_host_progletg:ale_python_black_options='-m black'" ついでにFixを実行するマッピングしとく
nmap <silent><Leader>x<Plug>(ale_fix)" ファイル保存時に自動的にFixするオプションもあるのでお好みでletg:ale_fix_on_save=1

補足

わかりづらいので解説しときますと各ツールの実行オプションを変更してPythonパスを固定のところは

オプション説明
g:ale_python_*_executableFixer実行時のPythonのパスを指定
g:ale_python_*_optionsg:ale_python_*_executableのパスで実行した場合のPythonのオプションを指定

となっているご様子です。英語弱者なので解釈違ったら申し訳ございません。
特にg:ale_python_*_optionsは自信ない...

ちなみにPythonの-mオプションは-mで指定したPythonモジュールを実行するフラグですね。

あと、別にg:python3_host_progを使わなくてもpyenvで作ったpyenv-virtualenv環境を、
g:ale_python_*_executableに入れてあげてもよかったのですが、
こっちのほうが後でpyenvの環境つくり直したときとかに便利かなと思ってあえてそう書いてます。
素のVim使いの方々はg:ale_python_*_executableに直接書いてもいいかも。

実はyapfってフォーマッタがまだあって、
これが賢いらしいので使ってみたかったのですが、なんかALE側がちゃんと整備できてなさそう。
g:ale_python_*_executable以外のyapf用のオプション何故かないんですよね。
そのうちPR送りたい。

実行する

autopep8のサンプルをはっつけるので試してみましょう。

importmath,sys;defexample1():####This is a long comment. This should be wrapped to fit within 72 characters.some_tuple=(1,2,3,'a');some_variable={'long':'Long code lines should be wrapped within 79 characters.','other':[math.pi,100,200,300,9876543210,'This is a long string that goes on'],'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,20,300,40000,500000000,60000000000000000]}}return(some_tuple,some_variable)defexample2():return{'has_key() is deprecated':True}.has_key({'f':2}.has_key(''));classExample3(object):def__init__(self,bar):#Comments should have a space after the hash.ifbar:bar+=1;bar=bar*bar;returnbarelse:some_string="""
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""return(sys.path,some_string)

多分以下のように整形されるはずです。やったね。

importmathimportsysdefexample1():# This is a long comment. This should be wrapped to fit within 72 characters.some_tuple=(1,2,3,"a")some_variable={"long":"Long code lines should be wrapped within 79 characters.","other":[math.pi,100,200,300,9876543210,"This is a long string that goes on",],"more":{"inner":"This whole logical line should be wrapped.",some_tuple:[1,20,300,40000,500000000,60000000000000000],},}return(some_tuple,some_variable)defexample2():return{"has_key() is deprecated":True}.has_key({"f":2}.has_key(""))classExample3(object):def__init__(self,bar):# Comments should have a space after the hash.ifbar:bar+=1bar=bar*barreturnbarelse:some_string="""
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""return(sys.path,some_string)

Vim patchダイジェスト [2018/08] (仮)

$
0
0

Vim patchダイジェスト [2018/08] (仮)
(8.1.02308.1.0301)

  • 8.1.0301: GTK: マルチモニター環境でモニター間を跨る位置のGVimにてIM未確定文字の表示位置がおかしい件を修正しました。(※patchの説明はIMのポップアップの表示位置について書かれていますが、実際にはIM未確定文字の表示位置のBugfixです)
  • 8.1.0295: :four_leaf_clover::vimgrep, :vimgrepadd, :lvimgrepおよび :lvimgrepadd'incsearch'に対応させました。(関連patch: 8.1.0271)
  • 8.1.0294: Windows: 短いディレクトリ名を使用することがあったのを修正しました。(関連patch: 8.1.0297)
  • 8.1.0291: :four_leaf_clover::sort'incsearch'に対応させました。(関連patch: 8.1.0271)
  • 8.1.0290: 空のHTMLタグにcitを実施するとタグ全体が変更される件を修正しました。
  • 8.1.0289: quickfixでジャンプした後、カーソルのカラムがおかしい場合があるのを修正しました。
  • 8.1.0286: :four_leaf_clover::smagic:snomagic'incsearch'に対応させました。(関連patch: 8.1.0271, 8.1.0287)
  • runtimeファイル更新:
    • todoの更新。
    • helpファイルのmodelineにnoetを追加(修正漏れ分)とtypo修正。
  • 8.1.0271: :four_leaf_clover:'incsearch'を正規表現パターンを使用するコマンド(:s, :gおよび :v)に対応させました。(関連patch: 8.1.0273, 8.1.0274, 8.1.0275. 8.1.0276, 8.1.0277, 8.1.0278, 8.1.0279, 8.1.0280, 8.1.0281, 8.1.0282, 8.1.0283, 8.1.0284, 8.1.0286, 8.1.0287, 8.1.0291, 8.1.0295, 8.1.0296)
  • 8.1.0269: :four_leaf_clover:if_ruby: Kernel.#pメソッドを実装しました。
  • 8.1.0263: :four_leaf_clover:チャネルのログにチャネルの役割("sock", "out", "err", "in")を表示するようにしました。
  • 8.1.0260: :four_leaf_clover:README.mdにLGTMのシールドを埋め込みました。
  • 8.1.0253: :four_leaf_clover:ウィンドウタイトルの保存と復元が機能しないことがあったのを修正しました。('t_ST', 't_RT', 't_Si', 't_Ri'を追加しました) (関連patch: 8.1.0254)
  • 8.1.0251: :four_leaf_clover:'backupdir'のディレクトリ名の末尾に "//" または "\\" を付けると、バックアップファイル名をフルパス名基準で作成するようにしました。('directory'と同様) (関連patch: 8.1.0255, 8.1.0264)
  • 8.1.0250: Windows console: ウィンドウサイズの変更が正しくなかったのを修正しました。
  • 8.1.0249: GTK: 画面のDPIが変更された時の処理をしていない件を修正しました。
  • 8.1.0247: Python: モジュール内部から発行されたImportErrorのエラーメッセージが正しくない件を修正しました。
  • 8.1.0245: TextChangedIイベント内でsetline()を呼ぶとundo情報が壊れてしまう件を修正しました。
  • 8.1.0244: Unix: SIGSTOP受信後のSIGCONT受信で再描画されない件を修正しました。(関連patch: 8.1.0300)
  • 8.1.0243: :term ++close ++hiddenでウィンドウが閉じてしまう件を修正しました。
  • 8.1.0240: 関数内で'statusline'を設定するとactual_curbufのスコープが関数ローカルになり、g:actual_curbufで参照できなくなる件を修正しました。
  • 8.1.0238: :term++hiddenオプション付きで実行して当該のterminalウィンドウを開くと'buftype'がクリアされる件を修正しました。
  • 8.1.0237: if_ruby: Cygwinで+ruby/dynがちゃんと動かない件を修正しました。
  • 8.1.0235: ?を含む:helpの一部が間違った位置にタグジャンプする件を修正しました。(修正対象: -?, q?, v_g?expr-ではじまりかつ?を含むもの) (関連patch: 8.1.0231)
  • 8.1.0234: if_perl: 参照カウント処理が正しくないのを修正しました。(関連patch: 8.1.0190)
  • 8.1.0232: :four_leaf_clover: if_ruby: エラー時にバックトレースを出力するようにしました。(関連patch: 8.1.0236, 8.1.0239)

凡例

表記意味
:four_leaf_clover:新機能、大幅な仕様変更
'hoge'オプション (:h options参照)
:hogeExコマンド (:h :index参照)
hoge()組み込み関数 (:h functions参照)
v:hogeVim定義済変数 (:h v:参照)
+hogefeature (:h +feature-list参照)

方針

こちらを参照。

Vim — カット&ペーストではなく単に削除する ( "_d ) ( クリップボードにコピーしない削除 )

$
0
0

"_dで可能。

何にこれ? と思うが、そのとおりにキーを入力すれば良い。

ダブルクォート・アンダースコア・ディー。
(「詠唱」、「祈り」、「念じろ」)

削除したテキストは pでもペーストされないのが分かる。

組み合わせ

  • "_3dd - 3行をコピーせずに削除

など。

呼び方

"_ぶらっくほーるれじすたーというらしい。吸い込まれそうだ。

押しにくい

そのままでは押しにくいので、キーマップを登録すると良いっぽい。

You can setup your own mappings to save typing, of course. I have these:

nnoremap d "d
xnoremap d "_d
xnoremap p "
dP

copy paste - How to delete (not cut) in Vim? - Stack Overflow

Version

  • Vim version 8.1.250

あわせてよみたい?

Ubuntu16.04にVimを導入する

$
0
0

まえがき

UbuntuにVimを導入したい人のメモ。

Vimのインストール

Ubuntuにはデフォルトで"Vim-tiny"というエディタが入っていますが、最小限の機能しかなく使いづらいので、Vimをインストールします。

sudo apt-get install vim

VimBootstrapで.vimrcを作成する

.vimrcとはVimの設定ファイルです。
Vimを使いやすくするために、様々な機能を導入できます。
Vimに慣れてくると自分でカスタマイズする人もいるのですが、始めからカスタマイズするのは難しいので、今回は、VimBootstrapを使って、さくっと.vimrcを作ってしまいます。

VimBootstrap使用の準備

VimBootstrapのGitHubを見て、必要なものをインストールします。

sudo apt-get install git exuberant-ctags ncurses-term curl

.vimrcの設置

VimBootstrapを使って作ったファイルをDownloadsからHomeへ移動し、ファイル名を.vimrcに変更します。

mv ~/Downloads/generate.vim ../
mv generate.vim .vimrc

あとがき

これである程度使える形になります。
このあとは実践Vimを読んだり、色々な人の.vimrcを覗いてカスタマイズするのがおすすめです。

Mac — Vimでクリップボードを直接編集する

$
0
0

結論から先に書く

function pbvim (){readonly pbvim_tmp_file=./.pbvim.tmp

  pbpaste | vim - +"w $pbvim_tmp_file"cat"$pbvim_tmp_file" | tr-d"\012"| pbcopy # tr は末尾の改行を削除するためrm-f"$pbvim_tmp_file"}

上記の関数を rc ファイルに追加する。 ( e.g ~/.bashrc~/.zshrc )

シェルを再起動して pbvimを実行すると、vimでクリップボードのテキストを直接編集して上書き出来る。

ccc/pbvim at master · YumaInaura/ccc

ステップ解説

Step. 標準出力からVim編集を開始する

pbpaste | vim -

ただ、このやり方だとファイル名を渡していないため、そのままだと編集できない

Step. Vimにファイルパスを渡す

pbpaste | vim - +"w some_filepath"

「シェルから実行するvimコマンド」の引数として「vim 内部のコマンド」を渡す。

:w some_filepathという「vim内部のコマンド」がファイル編集前に実行される。 ( some_filepathという名前で編集内容を保存 )

Step. 一時ファイルを利用

vimでの編集内容を pbcopy コマンドに標準入力として渡したいが、
vim コマンドはファイル内容を標準出力するわけではないので、ここでは一時ファイルを利用する。

  1. 一時ファイルを作成
  2. pbpaste での標準出力をvimに渡す
  3. vimで編集して一時ファイルに記録された内容を、別コマンド ( cat ) で標準出力する
  4. 標準出力を pbcopy コマンドに渡す
  5. 一時ファイルを削除する

この流れ全体を実行したのが最初の例である。

Versions

  • VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 7 2018 21:58:18)
  • Max OS X High Sierra

Ref

Links

Viewing all 5765 articles
Browse latest View live


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