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

vim scriptデバッグ方法

$
0
0

現在、 @mattn氏作のQiita-vimがどうしても使いたくて、色々と修正をしています(Qiita API v2に対応させる必要があるため)
その時に使ったデバッグ方法です
(vim script初心者のため最適解ではない可能性があります)


vim scriptのデバッグ方法はいくつかあります

:debugコマンド

:debug<command>

と実行することで、コマンドをステップ実行することができます。
ステップ実行の際のコマンドで、主に自分が使ったものをあげておきます。
尚正確かつ全てのコマンドについてはこちらのvim-jpさんの:help日本語訳のページにあります。
説明のテキストもそこから借りています(正確さのため)

12
stepコマンドを実行しそれが終わるとデバッグモードに戻る。
ユーザー関数やソースファイルの呼び出し時には呼び出し先の行に進む。
bt現在のデバッグセッションの呼び出しスタックトレースを表示する
finish実行中のスクリプトやユーザー関数を終了し呼び出し元でデバッグモードに戻る。
up呼び出しスタックトレースを 1 つ上へ移動する。
down呼び出しスタックトレースを 1 つ下へ移動する。
quit異常停止する。これはCTRL-Cを使うことに似ているが、全てを停止するわけではない。次のブレークポイントで停止する。

自分は上記のコマンドのみ使いました...(breakポイントは設定してみたのですがうまく使えなかった)

:verboseコマンド

:<num>verbose<command>

上記:debugでのステップ実行がいちいちめんどくさい時は、これで全コマンドログを見ることができます。
breakポイントの設定ができればそちらの方がいいのですが自分はうまく使いこなせなかったので...
初めはこちらでログを見ていました。
<num>の部分に与えた数値によって挙動が変わるようです。
参考例では99を設定していたので自分もそのまま使いましたが、どうやらもっと小さな値で良いようです...(これについては参考サイトを忘れてしまったためうろ覚えです)

参考: [Gist] mugyu/vimscript_debug.vim


ちなみにこれは後から見つけたのですが、ログをファイルに出力することもできるようです。
(尚情報源が古いので今動くのか確認していません。)(まぁvimは後方互換大事にしていると聞くので多分使えるとは思いますが...)
誰か情報持っていれば教えてくださるとありがたいです

dackdive's blog/vimでランタイムログを出力する


これまたちなみにですが、Qiita-vimを動かせるようになったらまた投稿します。今度はQiita-Vimから。


Qiita-vim復活させた(い)話(作業中)

$
0
0

現在絶賛作業中なのでまだ完成してないですがぼちぼちあげるのも面白いなぁと

Qiita-vimとは

@mattn氏作の、vimからQiitaへの投稿、閲覧、更新など色々できるプラグインです。
しかし最終更新日時が6年前、Qiita API v2に対応していないため現在使うことができません。
しかしどうしてもvimからQiitaを使いたい(Qiita書くためだけにGUI環境に出てきたくない)ので、自分でなんとか対応させてみることにしました。

Github: mattn/qiita-vim
作業中のfork: Cj-bc/qiita-vim, feature/v2 branch

デバッグ方法

主には、:debugと変数の定数置き換えによってデバッグしました。
:debugについてはちょっと書いたのでこちらを: Cj-bc/vim scriptデバッグ方法

定数書き換えとは

勝手に呼んでいるだけです()
挙動が怪しいなと思ったところを定数に書き換え、同時に複数の不具合が起こらないようにしました。
今回は、固定できるところ、つまりself.url_name(QiitaのURLにある名前。@以下のやつ。)を自分の名前(Cj-bc)に固定したり、
今回のケースでは省いてもそこまで問題がなさそうな処理を省いたりしました。

具体例ですがほんのちょっとだけ長くなるのでしまっておきます

例を置いておきます、コメントアウトされているのがテストのためにいじったコードです。
実際のデバッグ時にはそれらのコメントアウトを外し、既存の該当する部分と置き換えて走らせました。

list_user_items()
...trylet old_undolevels =&undolevels
    silent %d _
    redraw|echon'Listing items... 'let items =a:api.user(a:user).items()"call setline(1, split(join(["this is test", "second line"], "\n"))) " for debug"call setline(1, split(join(map(items, 'v:val.uuid . ": " . v:val.title'), "\n"), "\n")) " for debug 2call setline(1, split(join(map(items,'v:val.uuid . ": " . webapi#html#decodeEntityReference(v:val.title)'),"\n"),"\n"))catchbw!...
user.items()
function!s:user.items()"let res = webapi#json#decode(webapi#http#get(printf('https://qiita.com/api/v2/users/%s/items', 'Cj-bc'), {'token': self.token}).content)letres= webapi#json#decode(webapi#http#get(printf('https://qiita.com/api/v2/users/%s/items', self.url_name),{'token': self.token}).content)if type(res)==4&& has_key(res,'error')throwres.error
  endifif type(res)!=3throw'invalid response'endif...

APIをv2に書き換える

これは至極単純で

:%s/v1/v2/g

で行いました。
一応、間違って置換されてないか確かめるために/v2で確認もしました

2. うまく走らないのをなんとかする

大雑把ですがめっちゃ時間かかりました...
ちなみに、大掛かりにデバッグとかしてますが遠回りしただけだったりします(単純に仕様変更のせいだったりした)

2.1 Vim(call):E716: Key not present in Dictionary: uuid . ": " . v:val.title

これです

qiita-vim-err-uuid.gif
)

これは結局、APIの仕様変更に伴い削除された値を読みに行っていたのが問題でした。
具体的にはここ

list_user_items()
call setline(1, split(join(map(items,'v:val.uuid . ": " . webapi#html#decodeEntityReference(v:val.title)'),"\n"),"\n"))

github
使用されているAPI: /api/v2/users/:user_id/items

前後のコード読まないとなんともわからないとは思いますが、v:val.uuidの部分が違っていました。
これ、uuidは削除されてるんですね...v2だと...
代わりにidなるものがありましたので、置き換えたら動きました。やったね。

解決までの道のり

call setline(1, split(join(["this is test","second line"],"\n")))

まずこれで置き換えてエラーが出ないことを確認。置き換える前の部分に問題があるなと推定(ちょっと雑すぎるかも?)

call setline(1, split(join(map(items,'v:val.uuid . ": " . v:val.title)'),"\n"),"\n"))

webapi#html#decodeEntityReferenceの部分は、URLエンコードを外すためのものらしく、今回の件とは関係なさそうなのでとりあえず外す。
この時点で文字列は表示されてなかったため、URLエンコードされたままでもまぁ問題ないと判断。
これでもエラーが出る& エラーが.uuidで始まることから、uuidを疑う。
ここでリファレンス見たらuuidなるものが存在せず、代わりにidなるものがあるので使って見た。
そしたら動いたので置換しておいた。
ここまで約1日かかった...エラーからすぐに見破れなかったのはちょっと悲しい

この後webapi#html#decodeEntityReferenceももとに戻してエラーが出ないことを確認、この部分についてはおそらくこれで完了


この先も随時更新しまふ

[HD/Streams] Crawford vs Benavidez Live Stream boxing On Tv

$
0
0

**Terence Crawford vs. Jose Benavidez Jr. fight prediction, start time, stream, odds, card, pick

The Irish are 21-point favorites and the Over-Under for total points scored is 54 in the latest Crawford vs. Benavidez odds. Before you make any Crawford vs. Benavidez picks, listen to what SportsLine senior analyst Josh Nagel has to say.**#

Live Here===>>http://bit.ly/2weqXpz

It's no different in boxing, especially for WBO welterweight champion Terence Crawford on Saturday in his home city of Omaha, Nebraska. In what was first met by critics as simply a stay-busy fight, Crawford's title defense against fellow unbeaten Jose Benavidez Jr. at CHI Health Center (ESPN, 10:30 p.m. ET) has escalated into much more.

The Irish are 21-point favorites and the Over-Under for total points scored is 54 in the latest Crawford vs. Benavidez odds. Before you make any Crawford vs. Benavidez picks, listen to what SportsLine senior analyst Josh Nagel has to say.
A Nevada-based expert with 20 years of experience in the sports wagering industry, Nagel specializes in handicapping college athletics. He's having another solid season in college football, hitting on 60 percent of his spread picks for SportsLine members. Moreover, he has had a keen eye for the tendencies of these two programs. Over the past two years, Nagel boasts an amazing record of 7-1 in against the spread picks involving either Crawford or Benavidez.

In Week 1, for example, Nagel advised SportsLine members to back Crawford after Michigan climbed to a three-point road favorite. The Irish dominated early and held off a rally to secure a 24-17 win, and Nagel's followers picked up another winner.

Now, Nagel has scrutinized Crawford vs. Benavidez from every possible angle to reveal a strong point-spread pick that he's sharing only at SportsLine.

Vim を使ったファイル整理術

$
0
0

はじめに

画像などのファイル名を一括で変更したい、という場面に何度も直面してきました。
便利なソフトウェアや、シェルスクリプト(Windowsだとバッチファイル)を作成しても良いのですが、Vim でもサクッと似たようなことができます。

「Vim はこんな使い方もできる」と知っておくと、意外と重宝するので記事にしました。

Vim を使ったファイル整理術(基礎)

ファイル一覧を取得

フォルダ内にあるjpgファイルを取得するには、下記のコマンドを使います。
putコマンドは空行が発生するので、globalコマンドで空行を削除します。

:put!=expand('*.jpg')|g/^$/d

mv コマンドのひな形を作成

ファイルリストからコマンドのひな形を作成します。

:%s/\(.*\)$/mv "\1""PREFIX_\1"/ge

リネーム処理の実行

Windows の場合、エンコードによりファイル名が正しく処理できない場合があります。
fileencoding を cp932 に変更してバッチ処理に渡します。

# Unix
:w!sh

# Windows
:set fenc=cp932
:w!cmd

Vim を使ったファイル整理術(応用)

前述したリネーム処理を応用して、連番をつけたファイル名に一括変換する処理を実行します。

ファイルリストに対して、コマンドのひな形を作成します。
globalコマンドは重複させられないため、ファイルリスト取得とは別で実行します。

:g/^/| s/.*/\="mv \"".submatch(0)."\" PREFIX_".line('.')/ | s/_\(\d\{1}\)$/_0\1/e| s/_\(\d\{2}\)$/_0\1/e | s/_\(\d\{3}\)$/_\1.jpg/e

処理について補足します。

まず g/^/で全ての行を対象に処理をおこないます。

sedコマンドで、オリジナルファイル名(submatch(0))、変更後のファイル名(PREFIX_000.jpg)を置換するコマンドを作成します。
オリジナルファイル名は空白スペースを含む可能性があるため、ダブルクォーテーションで囲みます。
line('.')は現在行を取得する vimscript の関数です。

取得した行数は zero supply されてないため、1 ~ 9 行目に対してゼロを補完します。(2個目の sed
3個目の sedで 1 ~ 99 行目対して、ゼロを補完しています。
最後の sedで拡張子 jpg を補完します。この処理は 1 ~ 999 行目に実行します。

これで mvコマンドのひな形が完成したので、:w !shで実行すれば完成です。

おわりに

世の中には便利なソフトウェアがたくさんあるので、必ずしも Vim でやる必要はないと思います。

一方で、 Vim エディタとしての機能と、シェルを実行する機能を持ち合わせているため、がっつりシェルスクリプトを書くのはしんどいようなケースで役に立つことがあります。

Vim はシンプルでありながら、強力な機能を持っているのでお気に入りのエディタのひとつです。
もし他にもおすすめの Vim 活用方法があれば、シェアしていただけると幸いです。

vimgolfをやろう!

$
0
0

vimgolfとは

https://www.vimgolf.com/

準備

サインインにはTwitterアカウントが必要。
アカウント登録後、TOPに記載されている通りにセットアップする。

Your VimGolf key: please sign in$ gem install vimgolf
$ vimgolf setup
$ vimgolf put [challenge ID]

※ ruby必須, winでもたぶんできると思うけど上記コマンドになるかは不明

vimgolfのコツ

普通では使わなそうな処理がいくつか必要に見える。
まだまだあると思うので、思いついたら書き足す。
(普通に業務利用する技術は記載しない)

ファイル保存

通常は :wqとするが ZZを使うことで1文字短縮する。
ZZを使うと、変更しなくてもファイルタイムスタンプが矯正で上書きされるようだが、使う人は通常業務でも使うのかも…?

マクロ登録

通常は qa{macro操作}qでマクロ登録し {繰り返し回数}@aなどでマクロを実行する。
vimgolfでは i{macro操作}<Esc>でマクロを .に登録し {繰り返し回数}@.でマクロ実行する。
これによって1打少なくマクロの登録&実行が可能。

Asynchronous Lint Engineで静的解析を自動化 python編

$
0
0

この記事ではAsynchronous Lint Engine, 通称ALEの導入例を紹介します.

例として, pythonの静的解析ツールautopep8を導入しますが, 他の言語やツールでも同じようにできると思います.

環境とバージョン

OS: Ubuntu 16.04(WSL)
VIM - Vi IMproved 8.1
Python 3.6.5:: Anaconda, Inc.

ALEとは

ALEとは静的解析を非同期で実行してくれるものです.

そもそも静的解析とは, コードを静的に(実際にコードを実行せず, コード自体の表面上の)解析します.

変数の宣言がおかしいとか, 変数のスペルミス, ライブラリ読み込んだけど使ってないよとか, インデントがずれてるよといった実際にコードを動かさなくても分かる範囲のバグを自動で検出してくれます.

pythonの静的解析ツールはflake8mypyなど様々です.

実際, 静的解析ツールを使うには, シェル上で, コマンドを叩く必要があります.

しかし, ALEは, vim上で非同期で静的解析ツールを自動で実行してくれるすぐれものです.

つまり, いちいちシェルに戻ったり:!を使うことなく, コードを書きながらチェックができるようになります.

静的解析ツールの導入

flake8

入れたいバージョンのpythonで,

pip install --upgrade pip
python -m pip install flake8

autopep8

pip install autopep8

ALEを導入

deinでインストールします.

~/.vimrcに,

call dein#add('w0rp/ale')

を追加してvimを再起動.

使うLinterを設定

使うLinterを設定します.

言語ごとに違うので, おすすめは~/.vim/ftplugin/<プログラミング言語>.vimに設定を書くと良い.

今回は, pythonなので, ~/.vim/ftplugin/python.vimに設定を書くと,

pythonファイルを読み込んだときにその設定が読み込まれます.

さて, 使うLinterの名前をb:ale_fixersg:ale_fixers(グローバルかbufferごとか)にリストで代入します.

~/.vim/ftplugin/python.vim
letb:ale_fixers=['autopep8']

どうしても.vimrcに書きたいという方は, ハッシュ形式で言語を指定できます.

~/.vimrc
letb:ale_fixers={'python':['autopep8']}

また保存時にファイルを自動で修正することも可能です.

この場合, g:ale_fix_on_save1にする.

~/.vim/ftplugin/python.vim
letg:ale_fix_on_save=1

他にも自動補完や定義ジャンプなど便利な機能があるので, README.mdを見るとよい.

CentOS7 & Vim でシンプルなGoの開発環境を作る

$
0
0

 記念すべきQiita初投稿です。CentOS7上でVimによるGoのシンプルな開発環境を作る方法を書いていきます。私は普段Windows GUIアプリ関連の仕事をしているので、Linuxの専門ではありません。ですのでこの記事も、LinuxやGoに慣れていない方向けに書いていきます。

Vim8のインストール

 まずVim8をインストールしていきます。今回使うVimのプラグイン管理ツールVundleを導入するにあたって、Vimのバージョンが古いためです。

curl -L https://copr.fedorainfracloud.org/coprs/unixcommunity/vim/repo/epel-7/unixcommunity-vim-epel-7.repo -o /etc/yum.repos.d/unixcommunity-vim-epel-7.repo
yum -y update vim*

Vimのプラグイン管理ツールを設定する

 Vundleというプラグイン管理ツールを導入していきます。VimでGo言語のシンタックスハイライトを導入するのに便利だからです。すでに何かしらのツールを導入されている方は必要ありません。

$ mkdir ~/.vim/bundle
$ yum -yinstall git # 無ければ$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
$ vim ~/.vimrc

.vimrcを編集する

 .vimrcに、Vundleを導入するための基本的な設定と、vim-goというGo言語のシンタックスハイライトプラグインの情報を書き込みます。ちなみに.vimrcは、Vimの設定ファイルです。

"Vundleの設定set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()
Plugin 'VundleVim/Vundle.vim'"vim-goの情報を記入する
Plugin 'fatih/vim-go'"プラグイン情報が終わったら、最後に以下を書き込みます。call vundle#end()filetype plugin indent on"以下、お好きな設定をどうぞ
syntax on "シンタックスが効かなくなることがあるので念のため

編集したら、最後に:PluginInstallとすると、プラグインをインストールすることが出来ます。

GoのインストールとHello World

 Go言語をインストールし、適当にフォルダーを作ります。以下は例です。

$ yum -yinstall golang
$ mkdir ~/go_practice
$ cd ~/go_practice
$ touch hello.go
$ vim hello.go

次に、Hello World するためのコードを書いていきます。

/* シンタックスハイライトされるはず */packagemainimport"fmt"funcmain(){fmt.Println("Hello World")}

保存したら、実行します

$ go run hello.go
Hello World

以上になります。

客先常駐なVimmerのためのGit付属のVim使用方法

$
0
0

Vimが使いたい

客先常駐のSE/PGにとってはネット環境がない+フリーソフト導入禁止みたいな環境で
働くことはよくあることかと思います。

サクラエディタや秀丸(筆者は秀丸は使ったことないが)は多くの現場で
導入されている/使っているのを見る一方で、Vimが導入されている/使っている人がいる現場など
見たことがありません(筆者はみたことない)、当然Vimを使うことも入手することもできません。

しかし、幸運にもバージョン管理にGitを使っているならまだ望みはあります。

GitのVimを使う

Gitのインストール先のディレクトリを開きます。
Git付属のVimは下記のパスにいます。
(version 2.16.2.windows.1の場合)
これをコマンドプロンプトなどから直接起動することでVimを単体で使うことができます。
cmd_vim.png
Git\usr\bin\vim.exe

ですがこの方法では環境によっては(バージョンの影響かも?)
日本語の全角文字の表示が乱れたり、スクロール時に残像がのこったりします。
そこでこれまたGit付属のMinttyを使います。

GitのMinttyでVimを使う

Git付属のMinttyはVimと同じパスにいます。
ダブルクリックで起動して、MSYSを選択します。

select_shell.png

Git\usr\bin\mintty.exe

vimを起動します。

mintty.png
mintty_vim.png

フォントなどはお好みで変えてください、ウインドウのタイトル部分の右クリックメニューから
設定画面を出すことができます。

option.png


VimでVue.jsをある程度快適に編集する

$
0
0

シンタックスハイライト

  • vim-vueを入れるだけでOK
  • dein.vimを使っているなら、遅延読み込みを使うと良い
[[plugins]]repo="posva/vim-vue"on_ft=["vue"]

途中からハイライトされなくなる現象

  • .vimrcに以下の設定を追記すると解決する……らしいんですが自分の環境では直りませんでした(なんでや!)
autocmd FileType vue syntax sync fromstart

スクロールが重い場合の対処法

  • READMEによると、プリプロセッサー言語のシンタックスハイライトが原因らしいです
  • set ttyfastset lazyredrawを設定すると結構速くなる
set ttyfast
set lazyredraw
  • プリプロセッサー言語を使わない場合は、ハイライトを無効にしてしまうのもアリ
letg:vue_disable_pre_processors=1

deoplete、neosnippet

以下の3つを入れると、自動補完・snippetが使えます

NERDCommenterやcaw.vimでコメントの文字列を使い分ける

  • templatescriptstyleでそれぞれ挿入されるコメントの文字列を変えたいとき
  • caw.vimで使用する場合は、context_filetype.vimを入れるだけで自動で判別してくれます
  • NERDCommenterを使う場合は.vimrcに以下を追記します(READMEより参照)
letg:ft=''function! NERDCommenter_before()if&ft =='vue'letg:ft='vue'let stack = synstack(line('.'),col('.'))if len(stack)>0letsyn= synIDattr((stack)[0],'name')if len(syn)>0
        exe 'setf '. substitute(tolower(syn),'^vue_','','')endifendifendifendfunctionfunction! NERDCommenter_after()ifg:ft=='vue'setf vue
    letg:ft=''endifendfunction

viもしくはvimでファイルを開いたら文字化け・・・。でも、慌てずファイルエンコードを変えれば読めるよ!

$
0
0

viもしくはvimでファイルを開いたら文字化け・・・。でも、慌てずファイルエンコードを変えれば読めるよ!

う~ん。viの使い方ぐらいSEなら覚えようよ・・・。
viで文字化けしてたからって、scpでgetしてエディタで開くとか時間の無駄だから・・・。

まずは、viの文字コードを確認

viでファイル開いた状態で
:set enc?

すると画面最下部に[encoding=<文字コード>]って表示されるから、これがviのデフォルトの[fileencodings]もしくは[encoding]だよ。
都度viで設定が面倒なら、ユーザ毎に[~/.vimrc]にて設定出来るから。

ちなみに

確実にファイルの文字コードを調べたいなら(他にも調べる方法はあるから自分で調べてね)
nkf --guess <file name>Shift_JIS (LF)

[~/.vimrc]の設定するなら

[~/.vimrc]の設定内容は、こんな感じで

# default encoding
set encoding=utf-8

# Character code when opening. 
# If more than one is specified, it tries to open with matched ones from the beginning.
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8

# Automatic recognition of line feed code.
set fileformats=unix,dos,mac

vi上で文字コードを変更

vi上で表示の文字コードを変更するなら
:e ++enc=<文字コード>

これで読めるようにはなったでしょ?

vi上で文字コードを変更して保存するなら

もし、ファイルが意図しない文字コードであれば、文字コードを変更して保存することもデキるからね。

ファイルの文字コード変更
:set fenc=<文字コード>
もちろん、その後保存してね
:wq

XVimでタブ移動

$
0
0

~/.xvimrcに以下を追記

nnoremap gt :xccmd selectNextTab<Cr>

純正Vimの動きを踏襲してgtで次のタブ移動

単純だけどやったら便利なVimのキーマッピング

$
0
0

割り当てるコマンドは使いやすい感じに合わせてください。

0レジスタの貼り付け

pだと削除したものとかも貼り付け対象になるので、dしたりyを連続でしたい時に便利

vimrc
nnoremap <C-p> "0p

行の最後までヤンク

Dのヤンク版

vimrc
nnoremap Y y$

タブの遷移

タブ移動は結構使うのにコマンドが長めなので

vimrc
" 次のタブに遷移する
nnoremap sn:tabNext<CR>" 前のタブに遷移する
nnoremap sp:tabprevious<CR>

ウィンドウ移動

<C-w>って押しにくいんですよね。。

vimrc
nnoremap sh<C-w>h
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l

最後に

他にもこんなものがあるよ!とか、間違ってるよ!とかあったら教えてください。

[vim]read only のファイルをsudoで強制的に保存する

vimの文字色を変える(themeを使う)

$
0
0

vimの文字色を変えたかったのでメモ
https://github.com/chriskempson/vim-tomorrow-theme

Tomorrow-Night-Brightの設定が好きなのです。個人的に。

  1. .vimrcに指定する
colorscheme Tomorrow-Night-Bright

2.https://github.com/chriskempson/vim-tomorrow-theme
を/.vimにクローンする

pwd
/homes/${USER}/.vim
git clone https://github.com/chriskempson/vim-tomorrow-theme

3.https://github.com/chriskempson/vim-tomorrow-theme/colors
の置き場所を/homes/${USER}/.vim/colorsにする。

source .vimrc

で色が適用されました。

When I do bad things, I tried to construct an unfriendly world (Linux) to be reported immediately

$
0
0

This article is an automatic translation of the article[71ca7ee8adefbc1e3c29] below.
https://qiita.com/speaktech/items/71ca7ee8adefbc1e3c29

In the first part, when you do"bad things I think"with the vim editor, I will show you how to create an inexhaustible world to be reported.
(In this case, reporting = log output, but actions can be changed as appropriate.)

** 2018/09/29 Update:
In order to record logs only when editing is added, we made the following corrections.
· Save file hash value to environment variable when opening file with vim
· Report only when the hash value at file open is different from the hashed value after editing **

Material

  • vim Editor configuration file (/etc/vimrc)
  • Shell script

The bad things I think

  • Edit history file     - Edit the command history is"bury the mistake in the dark"bad thing
  • Edit the log file     - Editing the log file is"to falsify the facts"Bad

How to create a world that is not easy

1. Put a trap in the vim editor

Add the setting below to the end of the vim editor's configuration file (/etc/vimrc).
The shell script (watchvim.sh) will now be executed ** when editing the file **.
Pass the file name (<afile>) you are editing, the hash value of the file (\$PREHASH), and the user name (\$USER) as arguments.

/etc/vimrc
augroup watchvim
autocmd!
autocmd BufRead * silent :let $PREHASH = system('md5sum ' . expand('%:p') . ' | awk "{print \$1}"')
autocmd BufWritePost * silent !/etc/vimrc.d/watchvim.sh <afile> $PREHASH $USER
augroup END

Also, in preparation for users using the vi editor, register vim with syntax highlight turned off as vi's alias.
(** It is not only to notice that you are using the vim editor, but also to give consideration to users who do not want to use syntax highlighting **)

/etc/profile.d/force_vim.sh
# Force users to use vim instead of vialias vi="vim -c ':syntax off'"

2. Put a shell script to log output when a specific file is edited

First of all, I will create a placement place

mkdir /etc/vimrc.d 

Place the following shell script (watchvim.sh) and configuration file (watchvim.conf) in/etc/vimrc.d/.

/etc/vimrc.d/watchvim.sh
#!/bin/bashPROGNAME=$(basename$0)PROGDIR=$(dirname$0)CONFPATH="$PROGDIR/${PROGNAME%.*}.conf"VERSION="1.1"

usage(){echo"
Usage:
    $PROGNAME [FILE] [FILEHASH] [USER]

Description:
    $PROGNAMEは、vimで編集されたファイルの名前をログ出力するためのシェルスクリプトです。
    /etc/vimrcから呼び出されることを想定しています。
    同一ディレクトリに配置される${PROGNAME%.*}.confに記載されたファイル一覧を監視対象とします。

    /etc/vimrcにおける使用例: 
    autocmd BufRead * silent :let $PREHASH = system('md5sum ' . expand('%:p') . ' | awk \"{print \$1}\"')
    autocmd BufWritePost,FileWritePost * silent !/etc/vimrc.d/$PROGNAME<afile> \$PREHASH \$USER

Options:
    --help, -h      ヘルプを表示
    --version, -v   バージョン情報を表示"exit 1
}for OPT in"$@"do
    case"$OPT"in'-h'|'--help')
            usage
            exit 1
            ;;'-v'|'--version')echo$VERSIONexit 1
            ;;
        -*)echo"$PROGNAME: illegal option -- '$(echo$1 | sed's/^-*//')'" 1>&2
            exit 1
            ;;*)if[[!-z"$1"]]&&[[!"$1"=~ ^-+ ]];then
                param+=("$1")shift 1
            fi;;esacdone

if[${#param[@]}-ne 3 ];then
    echo"$PROGNAME: 3 arguments is required." 1>&2
    echo"Try '$PROGNAME --help' for more information." 1>&2
    exit 1
fi

if[!-e$CONFPATH];then
    echo-e"# Created by $PROGNAME
# This is the $PROGNAME configuration file.
# $PROGNAME watches only the files you specify below and logger who edits them
# when they are edited with Vim.">$CONFPATH 2>&1
fi

set-ffor FILEPATH in`grep-v"^#"$CONFPATH`;do
    EDITFILE=`readlink-f${param[0]}`if[[$EDITFILE==$FILEPATH]];then
        EXHASH=`md5sum$EDITFILE | awk'{ print $1 }'`if[${param[1]}!=$EXHASH];then
            logger -p local0.warning -t"$PROGNAME""$EDITFILE has been edited by ${param[2]}."fi
        break
    fi
done
set +f
/etc/vimrc.d/watchvim.conf
# Created by watchvim.sh
# This is the watchvim.sh configuration file.
# watchvim.sh watches only the files you specify with absolute path below and logger who edits them.
# when they are edited with Vim.
/var/log/*
*bash_history

Change the permission so that it can be run from any user.

chmod 755 /etc/vimrc.d/watchvim.sh

chmod 644 /etc/vimrc.d/watchvim.conf

This completes the preparation.

I tried a bad thing

  • I tried to edit the history file
[badman@notkind ~]$ vim /home/badman/.bash_history

(It erased the file accidentally, so delete the history of rm command ...)

/var/log/messages
Sep 25 14:51:45 notkind watchvim.sh: /home/badman/.bash_history has been edited by badman.

It will remain in the log perfectly.

  • I tried editing the log file
[badman@notkind ~]$ sudo vim /var/log/yum.log

(Since I added the package without permission with yum, I will tamper with the log ...)

/var/log/messages
Sep 25 14:54:33 notkind watchvim.sh: /var/log/yum.log has been edited by badman.

This will also remain in the log as perfectly.
The realization of the unfriendly world has come closer and closer.

A postcard

By writing the file name to the setting file (watchvim.conf), you can set the monitoring target freely. Wild cards can also be used.
If you are interested, please try using it.

~~ ※ Please note that when you execute": w"with the vim editor, it will judge that it was edited even if not editing anything in the specification · · ·. ~~
** * Fixed to be notified only when edit is added in 2018/09/29 update **

In the second part, we introduce the mechanism of change detection using shell script.
I think that polishing will take place in a world that is not easy because it is a mechanism that detects whether it is a vim editor or a sed command anyway after editing.

** Thank you very much for your continued reading until the end.
We are looking for ways to create a gentle world, so if you have recommendations on how to make it, please let me know! **


vimで1行をコメントアウト・アンコメントアウトするショートカットの紹介

$
0
0

目的

最近、vimを使ってC++のソースコードを編集する機会が多い。

試行錯誤する際に便利なのが"yy"で1行ヤンクして"p"でコピーして別パターンを試す流れである。

その時に1行まるごとコメントアウトをするのだが、この動作をすることが多いため、簡単にできないかと思い、少し無理やりだがmatlab風に以下のショートカットを作成した。

Ctrl+r : コメントアウト
Ctrl+t : アンコメントアウト(実際には先頭文字を消去する動作)

ショートカットの作成

~/.vimrc に以下を記述。

nnoremap <C-r> 0i//<Esc>
nnoremap <C-t> 0xx

使った感想

普段だったらインサートモードにして"//"を挿入してEscでノーマルモードにしていたのだが、そこがひとまとまりの動作になったのでとても便利であった。

他の言語で使うなら〜Pythonによる例〜

その言語で用いられるコメントアウトに対応させればよいはずである。

~/.vimrc にこちらを記述。

nnoremap <C-r> 0i#<Esc>
nnoremap <C-t> 0xx

自分では試していないので使い勝手はわかりませんが、よかったらぜひ試してみてください。

vimをカスタマイズする ( NERDTree導入とvimのショートカットメモ )

$
0
0
  • vimのプラグイン管理ツールをインストールする(NEOBUNDLE)
$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
  • vimrcを編集する
if has('vim_starting')
  set nocompatible
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

set number
imap <C-j> <esc>
nnoremap <silent><C-e> :NERDTreeToggle<CR>

call neobundle#begin(expand('~/.vim/bundle/'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'kien/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

call neobundle#end()

filetype plugin indent on
NeoBundleCheck
  • vim .vimrcを開くと下記のようにインストールが始まるので yと入力
Not installed bundles:  ['vimshell', 'ctrlp.vim', 'vim-..., 'vim-fugitive', 'neosnippet.vim', 'neosnippet-snippets']
Install bundles now?
(y)es, [N]o:

ショートカット

コマンド説明
Ctr+wwタブを移動する
Ctr+eNEDRTreeモードにする
Ctr+jESCボタン
Ctr+whカーソルを左のウィンドウに移動する
Ctr+wjカーソルを下のウィンドウに移動する
Ctr+wkカーソルを上のウィンドウに移動する
Ctr+wlカーソルを右のウィンドウに移動する

ファイル操作

コマンド説明
oファイルオープンする
tタブでオープンする
i水平分割でファイルをオープン
s垂直分割でオープンする
gt画面タブを移動する

コマンドモード

コマンド説明
:shシェルを実行してから戻ってこれる(vimが開いている状態になる)

※ vimのショートカットメモは適宜更新します

MacのvimでEditorConfigを効かせるハナシ

$
0
0

この文書は

MacOS High Sierra環境で、brew install vim editorconfigした上で、.editorconfigの使いかが分からなかったので試してみた、という話。

分からないポイント

  • EditorConfig-Vimのドキュメントに書いてあるといえば書いてあるけれど、.vimrcの書き方とか分からない
  • Vimのプラグインの仕組みを知ろうとすると、VundleとかNeoBundleとかDeinとかいろんなやり方があって、血で血を洗う抗争をしているらしいことしか分からない

やってみた

EditorConfig-Vimのドキュメントに書いてある方法

最初の方法

  • Download the archive and extract it into your Vim runtime directory (~/.vim on UNIX/Linux and $VIM_INSTALLATION_FOLDER\vimfiles on windows). You should have 3 sub-directories in this runtime directory now: "autoload", "doc" and "plugin".

おっしゃるように、git clone https://github.com/editorconfig/editorconfig-vim.gitしてから、.vimに、autoloaddocpluginとをcp -pRしてコピーする。

この状態で、.vimrcがない状態で、とりあえず、indent_style=tabとかindent_style=spaceとかを適当に設定を変えてみると、その通りに動作する。これなら、問題ないんだけれど、.vimrcが空の状態では、いろいろ都合が悪い。

とりあえず、以下の設定だけはしてみた。

syntax onfiletype plugin onfiletype indent on

pathogenを使う方法

最初の方法でイケたので、これ以上何もする必要はないんだけれど、pathogenというのも試してみることにする。

先ほど作成した.vimは潔く消してしまうゼ。ワイルドだろう?(ネタが古い)

まずはpathogenをインストールする。

mkdir-p ~/.vim/autoload ~/.vim/bundle &&\
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

次に、さっき書いた.vimrcを編集する。

"pathogen
execute pathogen#infect()

syntax onfiletype plugin onfiletype indent on

そして、EditorConfigをインストールする。

cd ~/.vim/bundle/ && git clone https://github.com/editorconfig/editorconfig-vim.git

この状態で、indent_style=spaceな上で、indent_size=3みたいな、あんまりやらなさそうな設定でpythonのコードを書くと、ちゃんとソレっぽく書ける。

forninrange(0,10):print(n)

Vundleを使う方法

  • Use Vundle by adding to your .vimrc Vundle plugins section:

Plugin 'editorconfig/editorconfig-vim'

まず、Vundleを使えるようにする。

mkdir-p ~/.vim/bundle &&cd ~/.vim/bundle && git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

次に、.vimrcを編集する。

set nocompatible
filetype off

set rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'editorconfig/editorconfig-vim'call vundle#end()

syntax onfiletype plugin onfiletype indent on

vimを起動して、:PluginInstallしたら、ちゃんとEditorConfigの設定が効くようになった。

NeoBundleとDein

いずれの方法でも問題なかったので、改めて他の方法を試す気分にもなかなかならないが、NeoBundleとDeinについても後で試してみることにする。

VimでPHPを書くならPhpactorが便利そうですよ(入力補完・ジャンプ・リファクタリング)

$
0
0

※これはPHPのリファクタリングツールPhpactorの紹介記事ですが、試せていない機能が多く現時点では入力補完についてしか書いていません。随時加筆いたします。

※記事中あやまり等ありましたら、ご指摘いただけますと幸いです。

1. はじめに

私は職場でVimを使ってPHP(Laravel)を書いています。

入力補完や定義ジャンプにはphpcd.vimctagsgtagsによるジャンプを併用しています。トレイトやインタフェースへのジャンプがうまくいかなかったり、補完に失敗することもあるので「もう少し安定してジャンプや補完ができればいいなあ」と思い、こちらの記事を読んでいましたら、Phpactorというプラグインが紹介されていました。

phpactor is simply a must have. It can help you for a lot of things (see the Refactoring / code styling plugins section).
The autocompletion it provides is very good and pretty stable.

It allows you as well to import automatically class namespaces or even to jump to classes or methods definition without ctags.

「単純に必携」「超goodかつ安定」(意訳)と銘打たれていたので、気になって日本語の記事を探しましたが、こちらの記事をはじめとする数件(いずれも同じ方が書いていました)が見つかったのみでした。

「日本では知名度も低くて流行ってないのかな?」と思いつつも、とても高性能かつ多機能なツールだと感じたので、私自身もさわりはじめたばかりですが、簡単ながらご紹介します。

2. Phactorとは

2.1. 概要

公式ドキュメントによると、Phpactorは高機能な入力補完とリファクタリングツールであり、次のような特長を備えています。

  • 発音は「Phpactor」で「ふぁくたー」
  • 文脈を考慮したスマートな入力補完
  • Composerに最適化されており、リアルタイムで高速に動作する
  • クラスやメソッド定義元へのジャンプ機能
  • クラスの移動、コンストラクタ補完、メソッド生成などのリファクタリング機能
  • 公式でVimをサポート(Emacsサポートは目下製作中)
  • コマンドライン上で実行するツールとしても使用可能
  • 自身と似たプロジェクトとして、PHP Language Serverを挙げている

GitHubを見ると、現在は開発段階で最新リリースは0.9.0(2018-09-13)です。

2.2. Phpactorの導入

動作には

  • PHP7.0以上
  • Composer
  • Vim8/Neovim(Vimで利用する場合)

が必要になります。

プラグイン管理にdein.vimを利用しています。tomlにこんな具合に書いて保存してVimを再起動し、:call dein#install()でインストールできます。

[[plugins]]repo='phactor/phactor'on_ft=['php']build='composerinstall'

手動で導入する場合は、git cloneでお好みのディレクトリにPhactorをダウンロードして、そのディレクトリでcomposer installをすればOKなんでしょうかね?必要がなかったので未調査です。

:call phpactor#Status()で、きちんとPhactorが導入できたか確認できます(以下の表示例は公式からのコピペです)。見たところ、パフォーマンスの関係で既定の動きではXDebugを無効にするようです。

Support
-------
[✔] Composer detected - faster class location and more features!
[✔] Git detected - enables faster refactorings in your repository scope!
[✔] XDebug is disabled. XDebug has a negative effect on performance.

Config files
------------
[✔] /home/daniel/www/phpactor/phpactor/.phpactor.yml
[✔] /home/daniel/.config/phpactor/phpactor.yml
[✘] /etc/xdg/phpactor/phpactor.yml

以下は、コマンドラインから実行可能なコマンドの一覧を表示したところです。

Phpactor dev-develop@a5162573d8766d00d54601190e06a7240d77eacc

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
  -d, --working-dir=WORKING-DIR  Working directory
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  complete           Suggest completions DEPRECATED! Use RPC instead
  help               Displays help for a command
  list               Lists commands
  rpc                Execute one or many actions from stdin and receive an imperative response
  status             
 cache
  cache:clear        Clear the cache
 class
  class:copy         Copy class (path or FQN)
  class:inflect      Inflect new class from existing class (path or FQN)
  class:move         Move class (path or FQN) and update all references to it
  class:new          Create new class (path or FQN)
  class:reflect      Reflect a given class (path or FQN)
  class:search       Search for class by (short) name and return informations on candidates
  class:transform    Apply a transformation to an existing class (path or FQN)
 config
  config:dump        Show loaded config files and dump current configuration.
 file
  file:info          Return information about given file
 offset
  offset:info        Return information about given file at the given offset
 references
  references:class   Find and/or replace references for a given path or FQN
  references:member  Find reference to a member
 server
  server:start       EXPERIMENTAL start a Phpactor language server

いろいろなことができそうですね。

また、Phactorは導入しても既存のキーマップを変更しないようです。なので、自分で設定してやる必要があります。
公式には、設定例として<Leader>をプリフィクスにしたキーバインド例がのっています。<C-U>があったりなかったり…記法が微妙に統一されていない…。

" Include use statement
nmap <Leader>u:call phpactor#UseAdd()<CR>" Invoke the context menu
nmap <Leader>mm :call phpactor#ContextMenu()<CR>" Invoke the navigation menu
nmap <Leader>nn :call phpactor#Navigate()<CR>" Goto definition of class or class member under the cursor
nmap <Leader>o:call phpactor#GotoDefinition()<CR>" Transform the classes in the current file
nmap <Leader>tt :call phpactor#Transform()<CR>" Generate a new class (replacing the current file)
nmap <Leader>cc:call phpactor#ClassNew()<CR>" Extract expression (normal mode)
nmap <silent><Leader>ee :call phpactor#ExtractExpression(v:false)<CR>" Extract expression from selection
vmap <silent><Leader>ee :<C-U>call phpactor#ExtractExpression(v:true)<CR>" Extract method from selection
vmap <silent><Leader>em:<C-U>call phpactor#ExtractMethod()<CR>

2.3. 入力補完

入力補完については、.vimrcに次のように記述することで、Vimの組込みオムニ補完でPhpactorを利用できます。

.vimrc
" <C-x><C-o>で補完候補を表示できます。
autocmd FileType php setlocal omnifunc=phpactor#Complete

導入さえしてしまえれば、Composerプロジェクトでなくても入力補完機能の大部分は使えるようです(未検証)。ただ、動作が多少遅くなるかもしれないそうです。

自動補完を有効にするため、入力補完プラグインを使うことができます。公式に対応している入力補完プラグインとして、

が記載されています。

ncm2ではVim8への対応はおまけのようだったので("Note that vim8 support is simply a bonus."とある)、deoplete.nvimを使ってみることにしました。私はこれまでneocomplete.vimを使い続けてきたので、これを機にようやくdeoplete.nvimに移行することができました。

deoplete.nvimでphpactorの補完を利用する場合は、deoplete-phpactorをあわせてインストールします。 正しくインストールできていれば、次のようにグレートな補完ライフを享受することができるようになります(例はLaravelです)。

グレートな補完の様子

おめでとうございます。ちゃんとDocコメントを見て補完してくれています。動作の軽快さ・重さについては、これから常用してみて確かめていこうと思っています。

3. おわりに

一部しかご紹介できていないので、便利そうな機能をもっと探していければ、と思います。

ちなみに冒頭の記事はググっていたらたまたま見つけたものですが、ほかにもおもしろそうなプラグインが紹介されています(vim-bbyeとか)ので、興味のある方はご一読ください。

4. 参考

tmuxを効率よく使って開発を爆速にする最高の設定

$
0
0

リポジトリを横断しての開発

自分は普段いくつかの(主にマイクロサービス)リポジトリを横断しつつコーディングをしています。
その際に tmux + zsh + neovim を使っているのですが、tmux(とzsh)を使って複数のリポジトリを横断する最高の設定を使っているので紹介します。

まず前提として、複数リポジトリのマイクロサービスを立ち上げるとめちゃくちゃコンソールが増えると思います。
自分はプロジェクト毎にローカルサーバで1-2個・エディタ1つ・シェルで1つ・REPLで1つくらいは平気で使います。ついでに一時的な検証をするワークスペースを作って5-7個くらいは平気でプロジェクトを横断することがあります。

これを tmux の window と pane だけで管理するのは辛いのでやめましょう。
tmux には session という便利な機能があるのでこれを使います。

簡単に説明すると window はブラウザにおけるタブで session はブラウザの別ウィンドウみたいな感じです。
ブラウザ1枚で複数のプロジェクトの情報が混在したまま作業をするのは大変ですよね?
今すぐプロジェクト毎に別のウィンドウに切り分けて管理しましょう。

iTermなどの高機能なアプリケーションを使えば別のアプローチで解決するのかもしれませんが、特定の端末アプリケーションへの依存をしたくないため行っていません。(ssh先で使えないなどの問題もあります)
というか最近4k近くの高解像度でvimを使うとiTermでは描画が重すぎて実用に耐えないので最低限の機能だけ実装された端末のAlacrittyを使っています。

session と window の一手移動

では自分がどのように tmux を操作してるか画像で説明します。
tmux-move-session-and-window.png
tmux-with-meta-key.png
上記のように session の切り替えと window の切り替えを Metaキーを使って一手で実行できるようにしています。
使用頻度が高いコマンドについてはPrefixを使わずに一手で実行できるようにしましょう。体感の快適さが全く変わります。

あとは頭の中でイメージを作って、それに対して直感的なキーを振ると手が動きやすいです。
自分は上記画像のイメージで、vimに近い体型の操作をしています。

設定は以下です。

tmux.conf
# window の作成, 移動
bind -n M-c new-window -c "#{pane_current_path}"
bind -n M-j next-window
bind -n M-k previous-window

# session の作成, 移動
bind -n M-C new-session
bind -n M-l switch-client -n
bind -n M-h switch-client -p
 
# pane の分割
bind -n M-v split-window -h -c "#{pane_current_path}"
bind -n M-s split-window -v -c "#{pane_current_path}"

ついでに以下のような設定をして tmux のステータスラインに現在のセッション名の表示も行っておきましょう。

tmux.conf
set -g status-left "#[fg=colour108,bg=colour237,bold] [#S:#I:#P] "

pane 間の ctrlキーを使った一手移動

window 内での pane の移動については ctrlキーを使っています。これについてはC-hやC-kを殺したくないため zsh と連携させて多少便利に動作するようにしています(後述します)。

pane-with-ctrl.png
pane の移動の詳細については zsh, vim と組み合わせているため下で説明します。

最低限の設定は以下です

tmux.conf
bind -n C-h select-pane -L
bind -n C-j select-pane -D
bind -n C-k select-pane -U
bind -n C-l select-pane -R

全ての session, window, pane を俯瞰するコマンド choose-tree, choose-session

上記の session の移動を行っていると、 session の順序が分からなくなり、無駄に移動を繰り返すことがあります。
それを解決するために、 tmux には choose-tree と choose-session というコマンドが存在します。
以下が choose-tree のGIFになります。

2018-10-15 16-17-43.2018-10-15 16_26_15.gif

choose-tree session, window, pane についてツリーとサムネイルの表示を行いながら選択できる機能になっています。
choose-session は session のみのリスト表示 choose-tree -w は window のみのリスト表示を行います。
自分は

tmux.conf
bind -n M-a choose-tree
bind -n M-e choose-session
bind -n M-w choose-tree -w

と設定しています。

tmux, zsh, vim を連携させた pane の移動

シェル, エディタ, Fuzzy Finder などで入力をしている際には、 C-h や C-k はそれらのプロセス上で動作して欲しいことが多いと思います。
そこで、C-h,j,k,l での pane の移動については tmux でシェルのプロセスを確認した上で、 pane の移動について処理の分岐をしています。
zsh, vim, fzf, pecoの場合はC-h や C-k をそれらのプロセスに送り、状態次第で tmux に send-key で処理を戻すといった実装をしています。
以下がそのコードです。

tmux

tmux.conf
# Vim Tmux Navigator
is_zsh="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE 'Ss\\+\\s*-zsh$'"
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE 'S\\+\\s*?g?(view|n?vim?x?)(diff)?$'"
is_fzf="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE 'S\\+\\s*fzf$'"
is_peco="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE 'S\\+\\s*peco$'"
bind -n C-h run "($is_zsh && tmux send-keys C-h) || ($is_vim && tmux send-keys C-h) || ($is_fzf && tmux send-keys C-h) || ($is_peco && tmux send-keys C-h) || tmux select-pane -L"
bind -n C-j run "($is_zsh && tmux send-keys C-j) || ($is_vim && tmux send-keys C-j) || ($is_fzf && tmux send-keys C-j) || ($is_peco && tmux send-keys C-j) || tmux select-pane -D"
bind -n C-k run "($is_zsh && tmux send-keys C-k) || ($is_vim && tmux send-keys C-k) || ($is_fzf && tmux send-keys C-k) || ($is_peco && tmux send-keys C-k) || tmux select-pane -U"
bind -n C-l if-shell "$is_vim" "send-keys C-l"  "select-pane -R"

zsh

function _left-pane() {
  tmux select-pane -L
}
zle -N left-pane _left-pane

function _down-pane() {
  tmux select-pane -D
}
zle -N down-pane _down-pane

function _up-pane() {
  tmux select-pane -U
}
zle -N up-pane _up-pane

function _right-pane() {
  tmux select-pane -R
}
zle -N right-pane _right-pane

function _backspace-or-left-pane() {
  if [[ $#BUFFER -gt 0 ]]; then
    zle backward-delete-char
  elif [[ ! -z ${TMUX} ]]; then
    zle left-pane
  fi
}
zle -N backspace-or-left-pane _backspace-or-left-pane

function _kill-line-or-up-pane() {
  if [[ $#BUFFER -gt 0 ]]; then
    zle kill-line
  elif [[ ! -z ${TMUX} ]]; then
    zle up-pane
  fi
}
zle -N kill-line-or-up-pane _kill-line-or-up-pane

function _accept-line-or-down-pane() {
  if [[ $#BUFFER -gt 0 ]]; then
    zle accept-line
  elif [[ ! -z ${TMUX} ]]; then
    zle down-pane
  fi
}
zle -N accept-line-or-down-pane _accept-line-or-down-pane

bindkey '^k' kill-line-or-up-pane
bindkey '^h' backspace-or-left-pane
bindkey '^j' accept-line-or-down-pane

vim

vim には Vim Tmux Navigator
プラグインを導入します。

fzf で tmux の session を管理する

tmuxの操作を選択的UIでインタラクティブにするの一部を抜き出して書き直させていただき、 yuki-ycino/tms: tmux session manager for fzfyuki-ycino/tmk: tmux session killer for fzfを使っています。
ありがとうございます。

ghq と fzf でのプロジェクトの管理と移動

以下の関数を使うことでプロジェクト毎のセッションを作成と移動をしています。
ghq で管理しているプロジェクトを選択し、自動で tmux の session を作成とリネームを行います。
既にそのプロジェクトの session が存在する場合は、 対象の session に移動します。

function f() {
  local dir repository session current_session
  dir=$(ghq root)/$(ghq list | fzf --prompt='Project >')

  if [[ $dir != "$(ghq root)/" ]]; then
    if [[ ! -z ${TMUX} ]]; then
      repository=${dir##*/}
      session=${repository//./-}
      current_session=$(tmux list-sessions | grep 'attached' | cut -d":" -f1)

      if [[ $current_session =~ ^[0-9]+$ ]]; then
        cd $dir
        tmux rename-session $session
      else
        tmux list-sessions | cut -d":" -f1 | grep $session > /dev/null
        if [[ $? != 0 ]]; then
          tmux new-session -d -c $dir -s $session
        fi
        tmux switch-client -t $session
      fi
    else
      cd $dir
    fi
  fi
}
Viewing all 5727 articles
Browse latest View live