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

Windows10でMacライクなターミナル環境を構築する

$
0
0

この記事は dots.女子部 Advent Calendar 2016の13日目です。

dots.女子部には一度しか参加したことがありませんが、Advent Calendar 書かせてもらいます makasn です。
最近転職して、開発機がMacからWindowsになったので手元の開発環境を整えるのに四苦八苦してました。今回は、なるべくMacに近づけたい一心で整えたターミナル環境を紹介します。

必要なもの

アプリversion(構築時のもの)
NYAGOSv4.1.7_0
Cmderv1.3.2
less(文字化け対応用)v481

※今回はOS Windows10で構築してます。

NYAGOS

UNIX風コマンドラインシェルです。Unicodeにもしっかり対応してくれており、かつ個人的に内蔵カラーlsとアイコンが好きなので使い始めました。
参考:NYAGOS なら Unicode ファイル名にも自信が持てます
サイト:http://www.nyaos.org/index.cgi

Cmder

コンソールエミュレーターです。とても多機能でタブも使えるし、FullバージョンならGit for windowsもついてきます。Git BashがUNIXコマンドをだいぶそろえてくれているので、これだけでほぼMacライクなターミナル環境は作れそうなのですが、残念ながら私の環境ではlsコマンドでUnicodeが文字化けしてしまいます。
サイト:http://cmder.net/

less

今回はCmderと一緒に落としてきたGit for windowsのUNIXコマンドを使用しますが、lessがUnicode対応していないので、新しいものに差し替えます。(何が困るかというとgit logの表示にlessを使用しているのでコミットメッセージとかが文字化けしてしまう。)
サイト:http://www.greenwoodsoftware.com/less/index.html

導入手順

NYAGOSのインストール

https://github.com/zetamatta/nyagos/releases
から最新のzipファイルをダウンロードし、任意の場所に展開する。
(今回はnyagos-4.1.7_0-amd64.zipをダウンロードし、C:\Program Files\nyagosに展開しました。)

Cmderインストール

http://cmder.net/
のDownload Fullからzipファイルをダウンロードし、任意の場所に展開する。
(今回はC:\Program Files\cmderに展開しました。)

Cmderのセットアップ

Cmder.exeを実行すると、最初はこんな感じの画面になります。

Cmderfirst.PNG

これで、λマークが表示されればOKです。

デフォルトのシェルを設定する

Cmderの画面の右下のハンバーガーアイコンを押すとメニューが表示されるので、そこからSettingsを選択します。

Cmdersetting.PNG

Settingsが開いたら、左の一覧からTasksを選択します。
今回は、デフォルトシェルとしてnyagosを登録したいので、Predefined tasksの下部の+ボタンをクリックし、新しくtaskを追加します。
設定は ↓ こんな感じ。

Cmderafter2.PNG

その後、左の一覧からStartupを選択し、Specified named taskでnyagosを選択する。

Cmderafter3.PNG

そして、右下のSave settingsをクリックする。
以上で、Cmderのデフォルトシェルがnyagosになりました。

Cmderを閉じてからもう一度開いて、タブの部分がnyagos.exeと表示されていればOKです。
これで概ねいい感じで動かせるのですが、Cmderと一緒に落としてきたgitとかにパスが通っていません。
(シェルにcmd:Cmderを指定すると何もせずに使えます。)

CmderのGitとUNIXコマンドにパスを通す

CmderのSettingsからEnvironmentを開き、必要なパスを設定する。
(今回はGit for windowsを落としてきたときに通るパスをすべて指定しています。)

Cmderafter5.PNG

これでSave settingsして、一度閉じて開きなおせば設定が反映されGitコマンドもその他のコマンドもvimも使用できるようになります。

ただし、vimは.vimrcを設定してあげないとちゃんと表示してくれないので、

~/.vimrc
set encoding=utf-8
set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8
set fileformats=unix,dos,mac

を作成してください。

ただ、これでもまだ足りないのがGitのコマンド周り。
git logやらgit diffのUnicodeが文字化けしてしまうので、最後にそれだけ解消してあげます。

less.exeの差し替え

冒頭にも述べましたが、git logやらgit diffやらが文字化けするのはlessの仕業です。なので、lessのサイトから新しいものを引っ張ってきます。

http://www.greenwoodsoftware.com/less/download.html
にアクセスし、BinariesのWindows binaries are available at:のリンクをクリックします。(現在はこちらです:http://guysalias.tk/misc/less)

遷移先のページのless.481.1.7zをクリックするとzipファイルがダウンロードできます。
zipファイルを展開した中にあるless.exeとlesskey.exeをCmderのvendorの中にあるものと差し替えます。
今回はCmderをProgram Files配下に置いたので、lessのありかは下記になります。

C:\Program Files\cmder\vendor\git-for-windows\usr\bin

less.PNG

この2つを差し替えたら、最後にもう一度CmderのSettingsを開きます。
Environmentにchcp utf-8を追加します。

Cmder6.PNG

これで完成です!
sshコマンドもここから叩けるのでめっちゃ快適:relaxed:← 一番ほしかった!
あとは色とかフォントとかいろいろCmder側で調整できるので、好きなように設定してみてください♪

参考記事

ConEmu + nyagos で Windows ターミナル環境を作る
Git日本語対応備忘録


Vim 8.0 Advent Calendar 13 日目 undo を分割せずにカーソルを移動

$
0
0

この記事は Vim 8.0 Advent Calendarの 13 日目の記事です。

普段はあまり気にしないかもしれませんが、undo の単位は重要です。この undo について、新しい機能が追加されました。

挿入モードでの操作の分割

挿入モードでの操作中に、<Left>などでカーソル位置を動かすと、undo 情報や .でのリピートが壊れてしまいます。
例えば以下のキーマッピングがあった場合、

inoremap(()<Left>

挿入モードで foo(barと入力することで foo(bar)が入力できます。

入力: afoo(bar<Esc>
↓
foo(bar)

しかし、ここで uコマンドで undo を行うとfoo()となってしまいます。また、.コマンドでリピートを実行すると、barが挿入されます。

foo(bar)
↓
入力: u
↓
foo()
foo(bar)
↓
入力: j.
↓
foo(bar)
bar

これは <Left>により入力情報が途切れてしまうためです。つまり、<Left>を行った時点で、挿入モードを一旦抜けて入り直したのと同じことになります。

挿入モードでの <C-g>Uコマンド

この問題を避けるために、<C-g>Uコマンドが追加されました。これはカーソルを動かすコマンドの直前で使用します。
このコマンドを使うために、キーマッピングを以下のように書き換えます。

inoremap(()<C-g>U<Left>

最初の例と同様に foo(barを入力し、その後それぞれ uコマンドや .コマンドを実行すると、入力された foo(bar)全体が 1 つの入力として動作します。

foo(bar)
↓
入力: u
↓

foo(bar)
↓
入力: j.
↓
foo(bar)
foo(bar)

この <C-g>Uコマンドは、カーソルが行を跨がない移動をする場合のみ有効です。

<C-g>Uコマンドは便利ですが、手で入力するにはちょっと複雑です。今回の例のように、キーマッピングで使うとよいでしょう。

備忘録_ctagsをscssで利用

$
0
0

環境

  • Mac
  • Neovim

手順

1 ctagsの導入

$ brew install ctags

2 .ctagsファイルの作成

// .ctagsの設定ファイルを作成
$ vi $HOME/.ctags

3 .ctagsファイルに下記の設定を追加

--langdef=SCSS
--langmap=SCSS:.scss
--regex-SCSS=/^\s*(\$[a-zA-Z_-][a-zA-Z0-9_-]+)/\1/d,var/

4 init.vimに設定を追加

init.vim
if expand("%:t") =~ ".*\.scss"
    setlocal iskeyword+=$
    setlocal iskeyword+=-
endif

5 tagファイルの作成

プロジェクトのルートディレクトリに移動後、下記のコマンドを実行

$ ctags -R

tagファイルが作成され、その中にタグが作成される

参考
https://teratail.com/questions/58237

vimでsudoを忘れてreadonlyで編集してしまった場合

$
0
0

w !sudo tee%
w : ファイルの保存
!sudo tee : ! にて コマンド「sudo tee」を指示
% : 現在開いているファイル
⇒ 現在開いているファイルに対して、tee コマンドで強制的に上書きすることになります。

q!

http://tm.root-n.com/unix:command:vim:readlonly_write

Vimプラグイン開発の勉強を兼ねて、docker-composeのシンタックスハイライト対応させた件

$
0
0

皆さまはじめまして。しくみ製作所のvim大好き@taru-mです。

この記事はDocker Advent Calendar 2016の12日目がキャンセルされてしまったため、代わりに書いてます。
あとDockerカレンダーですがVimの内容多めです。。w
何卒ご容赦下さいm(__)m

序章

最近、業務時間外は無為に過ごしてしまっていたのですが、ふとtwitterのタイムラインに@mattn_jpさんのこんなツイートが流れてきました。

内容を見るとvimmerとしてのレベルが定義されていたのですが、結構いい加減な内容で皆さん言っているとおり1と2の落差が激しいですw
ただ、vimプラグインという単語を見たときにふと、そろそろ何か作ってみたいな~と思い、
軽率にもこんなつぶやきをしてしまいました。


ということで、有言実行をモットー(嘘)にしている@taru-mは実際に作ってみることにしました。とは言え、一から作るのは敷居が高いため、誰かのプラグインにパッチを送るという形でまずはやってみます。

何をしようかと考えた結果、最近業務でDockerをよく触っているので、ekalininさんのDockerfile.vim(Dockerfileのシンタックスハイライト&スニペット)をdocker-composeに対応させてみよう!ということで勉強をはじめました。

開発環境の構築

まずはVimプラグインの開発環境構築です。

Vimプラグインを開発する場合、他のプラグインを入れていると、それらが邪魔をして正しい動作確認が出来ずにバグのもとになります。なので開発のときだけ設定を無効にし、開発以外はプラグインを有効にしたい...

そんな環境を簡単に構築できる@b4b4r07さんの記事が参考になりました。(記事の内容はNeoBundleを使った場合の設定方法でしたがdein.vimでも多少修正すればいけます)
http://qiita.com/b4b4r07/items/b319ce2fd414b1d1d833

上記の方法で、.development.vimが置かれたディレクトリ配下ではvimプラグインが無効になり、ディレクトリ配下にあるプラグインだけが有効になります。便利ですね!

docker-composeハイライト対応

さて、環境ができたのでようやく作業に入ります。Dockerfile.vimをforkしてまずはdocker-composeのキーワードを列挙。

docker-compose.vim
" Keywordssyn keyword dockercomposeKeywords build context dockerfile args cap_add cap_drop
syn keyword dockercomposeKeywords command cgroup_parent container_name devices depends_on
syn keyword dockercomposeKeywords dns dns_search tmpfs entrypoint env_file environment
syn keyword dockercomposeKeywords expose extends extends external_links extra_hosts
syn keyword dockercomposeKeywords group_add image isolation labels links logging log_driver
syn keyword dockercomposeKeywords log_opt net network_mode networks aliases
syn keyword dockercomposeKeywords ipv4_address ipv6_address link_local_ips pid ports
syn keyword dockercomposeKeywords security_opt stop_signal ulimits volumes volume_driver
syn keyword dockercomposeKeywords volumes_from cpu_shares cpu_quota cpuset domainname hostname
syn keyword dockercomposeKeywords ipc mac_address mem_limit memswap_limit oom_score_adj privileged
syn keyword dockercomposeKeywords read_only restart shm_size stdin_open tty user working_dir
"" Volume configuration referencesyn keyword dockercomposeKeywords driver driver_opts external labels
"" Network configuration referencesyn keyword dockercomposeKeywords driver driver_opts enable_ipv6 ipam internal labels external
"" Versioningsyn keyword dockercomposeKeywords version services

taru-m/Dockerfile.vim#L15-L31
最近docker-composeはよく使ってはいたけどまだまだ知らないキーワードが沢山あって驚いた..
まだまだ奥が深いな~
(今見ると重複しているキーワードもありますがそれはご愛嬌ということでw)

続いてこれらのキーワードをハイライトさせる。

docker-compose.vim
(中略)" Highlightinghi link dockercomposeKeywords  Keyword

taru-m/Dockerfile.vim#L60

以上。簡単ですね。もっと複雑な構文があるとこうは行きませんが。

docker-composeスニペット対応

次にスニペットもちゃちゃっと書いちゃいましょう。

docker-compose.snippets
snippet veversion: ${1:2}
snippet volumes
    volumes:
        - ${1:value}
snippet volume_
    volume_driver: ${1:driver}
snippet volumes_
    volumes_from:
        - ${1:name}
snippet exter
    external: ${1:boolean}
snippet ser
    services:
        ${1:name}
snippet bu
    build:
        ${1:value}
snippet conte
    context: ${1:dir}
snippet com
    command: ${1:command}
snippet dep
    depends_on:
        ${1:value}
snippet env
    environment:
        ${1:name}: ${2:value}


()

taru-m/Dockerfile.vim/snippets/docker-compose.snippets

ここまでのコードを動作確認してみるとちゃんとシンタックスハイライトされています!Vim神ってる!マジ神ってる!!(神ってるって全然聞かないけどほんとに流行大賞なの...??)
スクリーンショット 2016-12-13 16.13.02.png

|

動作テストが完了したらプルリク送ります。結果、無事マージされました!ekalininさんありがとう!!

スクリーンショット 2016-12-13 16.11.20.png

最後に

プラグイン開発というと結構敷居が高そうに思えますが以外と簡単に出来ます。(題材が簡単すぎたのかもしれませんが。。)

DockerやVimをもっと便利に使うためにご参考になれば幸いです。
それでは皆さま、良きDocker&Vimライフを!

初めてのvimプラグイン作成 - 最小限なvimプラグイン

$
0
0

どうも、凡人です。
以前から作ってみたかったvimプラグインを作ってみました。

最小限なvimプラグイン

やはり何事も、非常に簡単なものから始めるのがいいと思います。
ということで、死ぬほど簡単な処理を実行するだけのvimプラグインを作るとしましょう。

最小限なスクリプト

今回作るプラグインは、vimのノーマルモード時に[z]キーを押すと、"Hello World"が表示されるだけのプラグインです。スクリプトは次のようになります。

scriptencoding utf-8
:nmap z :echo "Hello World!"<CR>

"scriptencoding"は、エンコーディング指定です。ここではutf-8を指定しています。
さすがにこれは必要かなと思い、設定しました。

プラグインの名前決め

適当に"helloworld-vim"とします。

フォルダとファイルの用意

最小限のファイルとフォルダを用意しましょう。

helloworld-vim
      +- plugin
          +- helloworld-vim

GitHubへアップロード

上記のファイルとフォルダでgitのリポジトリを作成し、GitHubへアップロードします。

https://github.com/bonjin6770/helloworld-vim

プラグインとして設定する

私はプラグイン管理にNeoBundleを使っているので、vimrcに次の記述を追加します。

NeoBundle 'bonjin6770/helloworld-vim'

プラグインのインストール

プラグインをインストールします。

:NeoBundleInstall

プラグインの実行

vimのノーマルモード時に、[z]キーを押します。

スクリーンショット 2016-12-13 23.35.49.png

どうやら成功したようです。
スクリーンショットを撮ってて「これ意味あるのかな」ってこんなに思ったのは初めてです。

まとめ

「vimプラグインを作る」という目的が達成できた以外、何の価値もないプラグインが誕生しました。

git, cd, su, cat, diff, vim...-(ハイフン)でできること@コマンドライン

$
0
0

こんにちは。
今年の秋からHHKB Pro2 type-sと木製パームレストを使い始めたら肩こりが完全に解消された@ryosukesです。
この記事はベーシックのAdvent Calendar 2016の14日目の記事になります。早速始めていきます。

コマンドラインでハイフンを使うと言ったら、思いつくのはどんなときでしょうか。
90%以上の方は、きっとコマンドにオプションを追加するときでしょう。
私も例に漏れずオプションで使うことがほとんどです。

が、他にも使えるタイミングがいくつかあります。
そこでどんなタイミングで使えるのか少し調べてまとめてみました。
(最後にPOSIXとGNUについて軽く触れますが深くは触れないことにします)

目次

git、cd、suでハイフンを引数に渡すと…

作業が捗ることがあります。見ていきましょう。

git

  • $ git -
    Unknown optionとなり何も起きません。。使えるのは以下のような他のgitコマンド実行時です。

  • $ git checkout -
    一つ前の作業ブランチに戻る事ができます。
    作業途中で差し込みタスクが入った場合など、僕は以下のような感じで上記コマンドを使用して作業しています。

# 作業途中の内容を一時的に退避$ git stash 
# 適当にブランチ切る$ git checkout -b hoge upstream/develop
# 差し込み対応する$ ...
# 対応完了後元のブランチに戻る$ git checkout -
# 退避した内容を戻す$ git stash pop
  • $ git merge -
    直前にいたブランチを現在のブランチにマージすることができます。
    個人的にはあまり使いませんが、個人開発時などにブランチを分けて作業したい場合は良いかもしれません。

  • $ git checkout -- hoge.txt
    上記のコマンドと似ていますが、ハイフンを続けた後に引数でファイルを指定しています。
    何か編集作業を行った際、$ git statusを実行すると(use "git checkout -- <file>..." to discard changes in working directory)とコメントも出るのでだいたいの方がご存知かと思いますが、指定したファイルのみを編集前に巻き戻すことができます。

cd

  • $ cd -
    直前にいたディレクトリに戻ることができます。
    間違って移動した際や、調べ物をしている際などに使うことが多いです。

su

  • $ su - hoge
    hogeユーザーになり、hogeユーザーのホームディレクトリに移動します。 この時、ディレクトリが移動するだけではなく、hogeユーザーの環境設定がそのまま引き継がれます。そのため、hogeユーザーでしかパスが通っていないコマンドも扱えるようになります。 (もしハイフンがない$ su hogeを実行した場合、hogeユーザーになりますが実行したディレクトリに残ります)

cat, diff, vim, wgetでハイフンを引数に渡すと…

標準入力または出力として認識されます。
ワンライナーでごにょごにょしたいとき便利ですね。

cat

$ cat -

とコマンドを叩くと、入力ができるようになり入力したものがそのまま出力されます。

$ cat -
hoge(←入力)
hoge(←出力される)

これをパイプを使って応用すると、
「piyo」とだけ書かれたpiyo.txtと「fugafuga」と書かれたfuga.txtをつなげて標準出力で表示できるようになります。

$ cat piyo.txt | cat - fuga.txt
piyo
fugafuga

diff

aaabbbとだけ書かれたtest.txtファイルをsedコマンドで置換、
その後cccdddとだけ書かれたtest2.txtとの差分を表示!
みたいなことがワンライナーでできるように。

$ sed "s/ab/cd/g" test.txt | diff - test2.txt
1c1
< aacdbb
---
> cccddd

vim

vim, lessコマンドでもハイフンが使えます。
diffコマンドなどで表示された差分でハイライトしたい場合に便利だそうです。
git diffなどでも使えるそう(vimmerではないのでまったく使わず…)

なおlessを使えばハイフンすら不要なので代替できるかと思いましたがうまくいかず。
lessでソースコードに色をつける(Mac OS編)を参考に色がつけられるようにしているのですが、パイプで渡すと環境変数が読み込まれていないようでした。
このあたり詳しい方いらっしゃったらご教示いただけると嬉しいです。

wget

wgetコマンドは-O (--output-document=) オプションでファイル名を指定でき、ファイル名にハイフンを渡すとそのまま標準出力へ出てきます。

$ wget http://www.example.com/ --output-document=-

さらにパイプを繋げてgrepすることで情報が抽出できます。
このあたりハイフンを使った便利な標準入出力指定でのコマンドラインという記事が非常に参考になりました。

■ 参考
catの-(ハイフン)オプションを使う
ハイフンを使った便利な標準入出力指定でのコマンドライン

ハイフンから始まるファイルの扱い

ここからはおまけみたいなものです。

ハイフンから始まるファイルが神のいたずらによって作られてしまって、
消せなくてググったという方、意外といらっしゃるのではないでしょうか

$ rm -hoge.txt

これ、オプションとして認識されてしまって消せないんですよね。
この時の対処方法は2つあります。

# その1$ rm -- -hoge.txt
# その2$ rm ./-hoge.txt

ちなみに、あえてハイフンから始まるファイルをgit addしたい場合やmvしたい場合、
同様にハイフンを2つ並べて上げれば操作可能です。

$ mv -- -hoge.txt piyo/
$ git add -- -hoge.txt

touchなどでハイフンから始まるファイルを作ろうとしても、だいたいオプションとして認識され作成に失敗するのでレアケースかと思いますが、
ハイフンから始まるファイルはハイフン2つを与えてやれば、大方対応できそうですね。

オプションとしてのハイフンの仕様

コマンドラインのオプションで、ハイフンが1つのものと2つものがあります。
この違いは何でしょう。

ざっくり動作の部分だけ説明すると、
1つの場合複数のオプションをまとめて指定でき、
2つの場合長くてわかりやすいオプション名で指定できます。

# 1つの場合$ ls -aF
# 2つの場合$ ls --all --classify

このコマンドオプションの定義に関しては、POSIXとGNUという異なった仕様が存在し、
使用しているOSによって使えるオプションも異なってきます。
詳しいことは割愛しますが、どんなオプションが使えるかは必ずmanコマンドや-h/--helpなどで確認するのが良いです。
Linuxで使えるけどMacでは使えないとかままあります。

POSIXとGNUに関してですが、下記記事が分かりやすかったです。
コマンドラインプログラムにおける引数、オプションなどの標準仕様

また下記の記事でもPOSIX互換環境について触れていて、なかなか面白かったです。
昔WindowsにCygwin入れて少しだけ使ったけれど、すぐUbuntu入れたのを思い出しました。
技術屋にMac使いが多い理由ってなに?

以上です。

Vim 8.0 Advent Calendar 14 日目 新しいオプション その 1

$
0
0

この記事は Vim 8.0 Advent Calendarの 14 日目の記事です。

新オプション紹介その 1 です。追加されたものの中でも便利なオプションについて解説します。

'breakindent' (真偽値) 'breakindentopt' (カンマ区切り文字列)

オンにすると、折り返して表示される行がインデントされて表示されます。
つまり以下のようになります。左が 'breakindent'がオフ、右がオンです。また、'showbreak'オプションの値に >が設定されています。4 行目の折り返しに注目してください。
`'breakindent'` オプションのオフとオンの比較

また、'breakindentopt'オプションで細かい挙動を制御できます。このオプションはカンマ区切りの文字列で、以下の要素を指定できます。

  • min:{n}
    • 深いインデントが短すぎる幅で折り返されないように、1 行の最小の幅を指定します。未指定の場合は 20 になります。
  • shift:{n}
    • 折り返された位置をずらします。正数で右に、負数で左にずらします。未指定の場合は 0 で、ずらしません。
  • sbr
    • インデントの左側に 'showbreak'を表示します。

例えば、shift:4,sbrを指定すると、以下のようになります。

:setlocal breakindentopt=shift:4,sbr

'showbreak'である >記号が行頭に移動し、折り返しのインデントが ifのインデントに比べて右に 4 つずれています。

'fixendofline' (真偽値)

通常、Vim は保存時にファイルの末尾に必ず改行を入れます。これは POSIX にて、テキストは行の集合であり、行は必ず改行で終わるとされているからだと思われます。
このファイル末尾の改行の付与は、ファイル末尾に改行のないファイルを開いて編集し、保存した場合にも行われます。
これは特にチームで作業している場合に困る場合があります。また、一部の CSV の処理系など、ファイル末尾の改行の有無で意味が合わるファイルを扱う場合も困ります。

そこで 'fixendofline'オプションが追加されました。このオプションはデフォルトではオンで、保存時にファイル末尾に改行を追加します。
オフの場合、'endofline'オプションに従って改行を付与します。オンなら改行が付与され、オフなら改行は付与されません。
この 'endofline'オプションは、既存のファイルを開いた際にはファイルの末尾の改行を見て自動でオンオフされます。

つまりまとめると以下のようになります。

  • ファイル末尾の改行をいじって欲しくない場合は、set nofixendoflineを vimrc ファイルに書きます。
  • ファイル末尾の改行の有無を操作したい場合は、上記に加えて、都度 'endofline'オプションの値を変更します。

'belloff' (カンマ区切り文字列)

Vim はエラーが発生した際にベルを鳴らします。これを無効化したい場合、以前は以下のような設定を書いていました。

setvisualbellt_vb=

新しく追加された 'belloff'オプションを使うと、代わりに以下のように書けます。

set belloff=all

'belloff'オプションは、どんな時にベルを鳴らさないようにしたいのかが細かく指定できます。特定の場合のベルのみ無効にしたい!といったことも可能です。
どのような値が指定可能かは help を参照してください。


tmux 上で Vim を True Color (24 bit color) で使う

$
0
0

Vim には、termguicolorsというオプションがあり、端末上でも True Color を使用することが出来ます。

set termguicolors

tmux 上で Vim を使う場合

tmux で True Color を用いる場合、以下のような設定をします。
コメントに @ttdodaさんによる terminal-overrides の解説がありますのでそちらも御覧ください

set -g default-terminal "screen-256color"
set-option -ga terminal-overrides ",xterm-256color:Tc"

ちなみに、xterm-256colorを設定する記事を度々見かけますが、tmux/FAQ at master · tmux/tmuxによると screen系以外は非推奨のようです。

TERM=screen-256colorを設定した場合、Vim でも追加の設定が必要です。
:h xterm-true-colorを参照すると解説が書いてあります。

set termguicolors
let&t_8f ="\<Esc>[38;2;%lu;%lu;%lum"let&t_8b ="\<Esc>[48;2;%lu;%lu;%lum"

TERM=xterm-256colorの場合は、t_8ft_8bはデフォルトの値が設定されるようです。

環境

  • iTerm 2 3.0.12
  • tmux 2.3
  • MacVim 8.0.124

調べた動機

以下のツイートを見かけて調べてみました。

vim の :! コマンドでも .bashrc のエイリアス設定を有効にする

$
0
0

Vim でシェルのコマンドを実行したいとき、 :!の後にコマンドを打てばよいことはご存知かと思います。しかし、デフォルトのままでは .bashrc に書いてあるエイリアスの設定が有効にされていません。例えば、

.bashrc
alias ll='ls -l'

と設定していても、vim 上で :!llは使えません( command not foundとなる)。

これを使えるようにするためには、適当なファイル(~/.bash_aliases としておきます)に

.bash_aliases
shopt -s expand_aliases
alias ll='ls -l'

と記述し、 .vimrc 内に

.vimrc
let $BASH_ENV = "~/.bash_aliases"

と記述しておけば大丈夫です。この状態で vim を再起動し、 :!llを試してみましょう。動くはずです。この .bash_aliases に自分の好きなエイリアスを書いて使ってください。

参考リンク:
http://stackoverflow.com/questions/4642822/commands-executed-from-vim-are-not-recognizing-bash-command-aliases(Zahnon 氏の回答)
http://stackoverflow.com/questions/8841116/vim-not-recognizing-aliases-when-in-interactive-mode(Jacob 氏の回答)

メモ

以下、ちょっとした解説がてらのメモです。動けばそれで満足、という方は以下は読まなくても構いません。

shopt って何だ?

.bash_aliases 内 1 行目の shoptは、その名の通りシェルのオプションです。エイリアスの設定を有効にするためにこの行が必要で、普通のインタラクティブモードのシェル(ターミナル)ではデフォルトで有効になっています。vim の :!はインタラクティブではないため、明示的に設定してやる必要があります。

shellcmdflag じゃダメか?

いろいろな回答を見ていくと、「.vimrc 内に set shellcmdflag=-icと書いておけばおk」みたいな回答がだいたい先頭に出てきます。しかし、これをしてしまうと、vim からターミナルが立ち上がってしまい、コマンド終了後に例の Press ENTER or type command to continueが出てこず、ターミナルがそのまま居座ってしまうのです。

僕はもとの :!コマンドの使用感(終了後何かキーを押せば終了)が好きでしたので、冒頭の解決策に落ち着きました。

Vim 8.0 Advent Calendar 15 日目 新しいオプション その 2

$
0
0

この記事は Vim 8.0 Advent Calendarの 15 日目の記事です。

新オプション紹介その 2 です。その 1 に比べると地味なオプション達を簡単に紹介します。それぞれ詳細は help を参照してください。

'renderoptions' (特殊形式文字列)

テキストレンダラの設定です。このオプションを設定することによって、Windows ではレンダリングに DirectX を使えます。
また、DirectX に対して様々なオプションを設定できます。

'emoji' (真偽値)

オンにするとユニコード絵文字を全角とみなします。デフォルトはオフです。

'langremap' (真偽値)

元々 'langnoremap'オプションがありました。このオプションは真偽値のオプションであったため、これをオフにしようとすると以下のようになります。

set nolangnoremap

これは二重否定でわかりづらい、ということで追加されたのが 'langremap'オプションです。'langnoremap'オプションは今も互換性のために残されていて、この 2 つのオプションは常に逆の値を指すようになっています。

'signcolumn' (特定文字列)

sign の桁を表示するかどうかを設定します。デフォルトは autoで、sign が存在する場合のみ表示されます。
その他、yesnoで常にオン/オフが可能です。

sign は本来の目的以外でも、行全体をハイライトするために hack 的にプラグインから使われる場合があり、このような時に noを設定することで余計な sign カラムを非表示にすることができます。

'tagcase' (特定文字列)

タグファイル内を検索する際の大文字小文字の区別する方法を指定します。
元々はこれは 'ignorecase'オプションの値に依存していましたが、'ignorecase'はインタラクティブな検索などで使われることもあり、オンにしている人が多いかと思います。一方、タグファイル内の検索はプログラミング言語の識別子などが入っていることもあり、大文字小文字は区別して欲しい場合が多いです。そこで、それぞれ独立して設定できるようにするために 'tagcase'オプションが追加されました。
デフォルト値は followicで、互換性を保つために 'ignorecase'に追従します。常に大文字小文字を区別して欲しい場合は、matchを設定します。他にもいくつか設定できる値があります。

'termguicolors' (真偽値)

オンにすると、ターミナル内でも GUI 用の 24 ビットカラーのカラースキームが使用できます。ただし、ISO-8613-3 互換のターミナルが必要です。
対応していないターミナルでオンにすると残念なことになるので注意してください。

'luadll''perldll''pythondll''pythonthreedll''rubydll''tcldll' (文字列)

Vim には様々な言語のインターフェースがあり、ビルド時にこれらを指定できます。
ダイナミックリンクも可能でしたが、これまでは、その dll のファイル名はビルド時に指定したものに固定でした。
しかし、タイナミックリンクである以上、ファイル名は環境によって変わる場合があります。そこで、オプションによって dll のファイル名を指定できるようになりました。
'pythonthreedll'は Python 3 のためのものです。本来 'python3dll'としたかったようですが、オプション名に数値が使えないという制約が存在したため、このようになっています。

Vimでtreeっぽくディレクトリ構成を書きたい、そんなアナタの為のVim Plugin、できてます。

$
0
0

この記事は Vim (その2) Advent Calendar 2016 - Qiitaの15日目です。

こんな時ってありませんか?

  • 記事を書く時に、サンプルディレクトリ構成をtreeで表現したい
  • でも手元のディレクトリは余計なファイルが多い
  • 手元のディレクトリを$ tree > vim -で出力 & Vimで余計なファイルを消す

もしくはこんな時ってありませんか?

  • 記事を書く時に、サンプルディレクトリ構成をtreeで表現したい
  • でも手元にいいディレクトリがない
  • ダミー構成を $ mkdir hoge$ touch hogege-でつくって $ tree > hoge.mdで書き出す

もっと楽にtreeっぽくディレクトリ構成が書けるVim Pluginつくりました

shinespark/vim-list2tree: GitHub

使い方は簡単です。markdownのlist記法でディレクトリ構成を書いて、

* .
  * dir
    * file
    * file
    * file
  * dir
    * dir
      * file
      * file
  * file

行選択をして、:'<,'>List2Treeを叩くだけです。

.
├── dir
│   ├── file
│   ├── file
│   └── file
├── dir
│   └── dir
│       ├── file
│       └── file
└── file

デモ

https://gyazo.com/62150c7ba5ce5ffdd371a930e54893cc

マッピング

お好みで、↓のようにマッピングして、Ctrl + Tなどでtree化することも可能です。1

vnoremap<c-t> :<c-u>'<,'>List2Tree<CR>

ambiwidth について

set ambiwidth=doubleとvimrcに書いている方は罫線素片が崩れてみえることもありますが正常です。通常のtreeの罫線素片も set ambiwidth=double環境では崩れてみえます。(気になる方は :set ambiwidth=してみてください。)

treeと同じ罫線素片で構成されている為、一般的なmarkdownに対応したサービス(GitHub, Qiita, はてなブログ, etc.)では崩れず表示されます。

後はVimで記事を仕上げてGitHubやQiitaやはてなブログに公開するだけです。

初めての自作 Vim Plugin

ということで、今回初のVim Pluginをつくってみました。

5年前にVimを使いはじめた私のVim力は、ちょこっとvimrcが充実しているレベル程度で、正直Vim Scriptがよく分かってないレベルでした。

Vim Script については、

を参考にしました。

基本的にはVim Scriptがよく分かってないので :helpです。書いてて他言語との差異を確認する必要が出てくるので、結局は :help eval部分を通読するのが確実なのかもしれません。

Vim Plugin については、

を参考にしました。Vimプラグインが出来るまで - ぼっち勉強会はautoloadとpluginディレクトリの違いも分かっていないレベルの私にとって、段階的に学べるように構成されていたので非常に助かりました。

ということで、本記事ではVimでtreeっぽくディレクトリ構成を書く為のPlugin shinespark/vim-list2tree: GitHubの紹介と、初めてのVim Plugin制作のお話でした。

自分の使っているVim Pluginすらまともにコードを読めてなかったのですが、一度実際にPluginを書いてみたら多少読めるようになったのでやはりより知識を求めるなら実際に書いてみるのが一番だと実感しました。

それではよい Happy Vim Life を。


  1. Ctrl + Tは他のキーバインドと競合することもある為、環境に応じて他のキーに割り当ててください。 

Viで複数行にタブ挿入

$
0
0

複数行に一気にタブ挿入する方法

① Ctrl + v で矩形選択モードへ

② Shift + g で下まで選択

③ Shift + .(2回)でタブ挿入

Gmailをキーボードのみで操作する

$
0
0

最低限キーボードのみでGmailを操作するためのショートカット一覧。慣れればマウス操作がほぼ必要なくなる。自分なりの覚え方も記載。

ショートカットの有効化

歯車のアイコン→設定→全般→キーボードショートカット
から有効にできる。

共通の操作

スレッドリストに移動(go)

基本的なものは以下で移動をするのが便利。ラベルの移動は下記の検索を使うと移動できる。

g + i 受信ボックス(inbox)
g + s スター付き(started)
g + t 送信済み(transmitted)
g + d 下書き(drafts)
g + a すべてのメール(all)

UIにフォーカス

検索で label: ~ のように入力すると、他のラベルに移動ができるので便利。

/ 検索ボックスにフォーカス(viの検索)

個別のメール操作

スレッドリスト内で複数選択をすればそれらに適応される。

x チェックをつける(x[check] mark)

Shift + i 既読にする
Shift + u 未読にする(unread)

e アーカイブする(archiv e)
s スターをつける(star)

# 削除する

スレッドリスト内の操作

未読のみチェックが特に便利。

j 下のスレッドを選択(viの下移動)
k 上のスレッドを選択(viの上移動)

* + a 全てチェック(all check)
* + n 全てアンチェック(none check)
* + u 未読のみチェック(unread)

スレッド内の操作

p スレッド内の前のメールを選択(previous)
n スレッド内の次のメールを選択(next)
j 前のスレッドに移動(viの下移動)
k 次のスレッド移動(viの上移動)

r 返信(reply)
a 全員に返信(all reply)
f 転送(forward)

u スレッドリストに戻る(undo)

メール作成

Shift + Esc メインウィンドウにフォーカス
Esc 最新の作成ウィンドウに戻る

詳細

その他詳細のショートカットは以下を参照。
https://support.google.com/mail/answer/6594?co=GENIE.Platform%3DDesktop&hl=ja

Vimの練習

$
0
0

最近、vimに触ることがあり、「ショートカットなんだっけ???」といつも忘れてしまうので、
vimのショートカットをまとめ、練習をしてみました。
自分はMacユーザのため、そのまとめです。

基本移動の操作

キー動作
h左へ移動
j下へ移動
k上へ移動
l右へ移動
w次の単語の頭へ移動
w記号を含めた次の単語の頭へ移動
gg先頭へ移動
G末尾へ移動
キー動作
o一行改行して編集
x削除

終了

キー動作
:q保存せずに終了
:wq保存して終了

練習

vimの練習用にvimpackをインストールしてみました。
PacVimは、Vimコマンドで操作するパックンゲームです。
導入はすごく簡単で、下記サイトを参考にしました。
ショートカットは限られているらしいのですが、身体が覚えるにはとてもいいと思いました。

公式サイト
PacVim
日本語でわかりやすかったので、導入はこちらの記事を参照しました。
Pacman風ゲーム「PacVim」でVimの操作を覚えよう

まとめ

PacVim基本的なカーソル移動が利用できるので、すごく便利です。
ただ、本当に最初は適当なファイルを作って、vimのコマンドを利用した方が、わかりやすいかなと思いました。
ゲームだと焦ってしまいます(苦笑)
でも、ターミナルでPacVimと打てば、遊べるのでいい気分転換になります。


Vim 8.0 Advent Calendar 16 日目 新しい Ex コマンド

$
0
0

この記事は Vim 8.0 Advent Calendarの 16 日目の記事です。

Vim 8.0 で利用できる新しい Ex コマンドのうち、まだ紹介していないものを紹介します。

:filter[!] {pat} {command}

{command}の出力のうち、{pat}で指定した正規表現にマッチする行だけを表示します。[!]を指定すると、逆にマッチしない行だけを表示します。
{pat}/foo/のように /などの記号で囲われた形式です。ただし、パターンが記号などを含まない場合は /は省略できます。

以下に使用例を挙げます。

" マークを記録してあるファイルのうち、.txt で終わるものを表示します。
filter /\.txt$/oldfiles" 読み込まれた Vim script のうち、パスに vimrc を含むものを表示します。
filter vimrc scriptnames
" 開かれているバッファのうち、.vim を含むものを表示します。
filter /\.vim/buffers" キーマッピングのどこかに <C-r> を含むものを表示します。
execute "filter /\<C-r>/ map"" 現在のバッファから、foo を含む行を表示します。
filter foo %print
" ↑の例は :global でも実現できます。
global/foo/print

最後に注意点として、この Ex コマンドは全ての出力をフィルタするわけではありません。例えば、:echoの結果はフィルタされません。

:keeppatterns {command}

検索履歴に手を加えずに {command}を実行します。
:substitute (:s///) や :globalなどの一部の Ex コマンドは、通常は Vim script 中で使った場合でもパターンが検索履歴に追加されてしまいます。これはプラグインの中などで使う場合に問題になります。
そこでこの :keeppatterns Ex コマンドを使って :keeppatterns global/.../などのようにすることで、検索履歴が変更されてしまうのを防ぐことができます。

これは {command}の実行中はずっと手を加えないということではなく、直接指定した Ex コマンドが検索を使うものだった場合だけ有効です。つまり以下の場合は、検索履歴は変更されてしまいます。

" :execute を挟む
keeppatterns execute "s/\<CR>//ge"" 関数経由function!s:work() abort
  s/\e//ge
endfunction

keeppatterns calls:work()

:noswapfile {command}

{command}を実行します。このとき、新しいバッファが開かれた場合はスワップファイルを作成しません。
これはプラグインが仮想バッファを作成する際に便利です。

この Ex コマンドも :keeppatterns Ex コマンドと同様、バッファを開くコマンドを {command}に直接指定した場合のみ有効です。
ただし、:vertical Ex コマンドや :leftabove Ex コマンドなどの、ウィンドウを開く先を指定する修飾子コマンドは含まれていても問題ありません。

:clearjumps

現在のウィンドウのジャンプリストを空にします。

カーソルを大きく移動させるコマンドを実行したり、バッファを移動したりした場合、そのカーソルの移動はジャンプリストに記録され、あとから辿って移動することができます。
これは多くの場合便利ですが、例えばプラグインが仮想バッファを開いた際などに、戻れてしまうと不便な場合もあります。そういった場合にこの Ex コマンドが使えます。

:helpclose

現在のタブページにヘルプウィンドウがあれば、1 つだけ閉じます。
これは現在のウィンドウがヘルプウィンドウではない場合にも動作するので、離れた場所にあるヘルプウィンドウを閉じるのに便利です。
1 つもヘルプウィンドウがない場合は特にエラーにもならず、何も起きません。

Vim 8で便利になった組み込みMRU

$
0
0

この記事は Vim Advent Calendar 2016の 16 日目の記事です。

みなさん、VimのMRUといえば、mru.vimとかctrlpとかunite/neomruでしょうか?あまり知られていませんが、Vim自体にも、最近開いたファイルを記録してくれる機能(MRU)があります。

:oldfiles

まずは、:oldfilesコマンド。実行すると、番号とファイルパスの一覧が出力されます。

:oldfiles実行例:

1: ~/.vimrc
2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
3: /usr/share/vim/vim74/doc/syntax.txt
4: ~/Dropbox/memo/2016-12-14.md
5: ~/Dropbox/config_swx-04.txt
6: ~/.vimplugins/vimdoc-ja/doc/options.jax

続けるにはENTERを押すかコマンドを入力してください

この出力のファイル名の左の数字を使うことで、該当するファイルを開くことができます。

:oldfilesの結果に基づいてファイルを開く例

" 2番のファイルを開く:e #<2" ウインドウを分割して3番のファイルを開く:split #<3" 新しいタブで5番のファイルを開く:tabe #<5

:browse oldfiles

数字を指定するのはちょっと面倒ですよね。単に開くだけならもっと簡単な方法があります。:browse oldfilesです。このコマンドも:oldfilesと同じ一覧が表示されますが、最後に番号を入力するプロンプトが表示されるという違いがあります。

:browse oldfiles実行例:

1: ~/.vimrc
2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
3: /usr/share/vim/vim74/doc/syntax.txt
4: ~/Dropbox/memo/2016-12-14.md
5: ~/Dropbox/config_swx-04.txt
6: ~/.vimplugins/vimdoc-ja/doc/options.jax
番号と<Enter>を入力してください (空でキャンセル): _

Vim 8の:filterコマンドと組み合わせる

...前置きが長くなりましたが、ここからが本題のVim 8ネタです。上記の:browse oldfilesですが、Vim 8で追加された:filterコマンドと組み合わせると、Vimの正規表現で事前に一覧を絞り込んでおくことができます。oldfilesの結果が多くなっているときに便利度が上がります。

使い方:

:browse filter /パターン/oldfiles

:browse filter /\.jax$/ oldfiles実行例:

2: ~/.vimplugins/vimdoc-ja/doc/tagsrch.jax
6: ~/.vimplugins/vimdoc-ja/doc/options.jax
番号と<Enter>を入力してください (空でキャンセル): _

こういうマッピングを定義しておくと便利かな。

nnoremap<Leader>e  :<C-u>/ oldfiles<Home>browse filter /

注意::filterによる絞り込みは出力が絞り込まれるだけなので、選択時に入力する数字は絞り込み前のものと同じです(番号が振り直されるわけではないです)。また、絞り込み後に表示されていなくて元の一覧にある別の番号でも開けます。

以上、:browse oldfiles:filterを組み合わせたお手軽MRUの紹介でした。

開発環境で今年変えてみたこと

$
0
0

私の開発環境に関して今年変えてみたことや知ったことをまとめてみたいと思います。

ターミナルから他のアプリケーションを起動する

よく使うコマンド

私は作業を始めるときに、まずターミナルにて対象システムのディレクトリへ移動します。
そして、そこからGitを操作するSourceTreeやIntellij IDEAを起動します。
そのためのaliasが以下です。

# gg は以前は git-guiをこのaliasで起動していた名残alias gg='open -a SourceTree.app'alias idea='open -a IntelliJ\ IDEA\ CE.app'

使い方は以下の通りです。

$ cd myapp

# このディレクトリのプロジェクトをIntellij IDEAで開く$ idea .

# このディレクトリのgitリポジトリをSouceTreeで開く$ gg .

# このディレクトリをFinderで開く$ open .

OSXの openコマンドはファイルを開く・アプリを起動するといった"開く"(Finder上でcommand + o)操作を行うコマンドです。
このコマンドは、引数のファイルやディレクトリを-aオプションで指定したアプリで開くことができます。
また、アプリを指定しなかった場合は対象がディレクトリであればFinderを開くことができます。
これの起動方法のおかげで、アプリを起動してからアプリ内で対象ディレクトリを開く操作を省くことができます。

openコマンドで特殊な起動

ついでにopenを使ったtipsをもう少し。

openを使うことでアプリの起動時に引数を渡すことができます。
例えば、Google Chromeは起動時の引数に--app="<URL>"と指定すると、
Chromeのウインドウをアプリモード(タブバー、アドレスバーが表示されないモード)で起動できます。
これを使うことで、GmailやChatworkといったアプリ的なWebサイトをデスクトップアプリのように使えます。

open -n -a "Google Chrome.app" --args --app="https://www.google.com/"

vimからFinderを開く

Vimでファイルを編集しているときに、以下のコマンドでそのファイルが存在するフォルダをFinderで開くことができます。

:!open %:h

Exコマンドで!にて外部コマンドとしてopenを実行します。%:hが現在のファイルのディレクトリに展開されます。

Git関連

gitコミットコメントをMacVimで記述する

以下の環境変数でGitでのコミットコメント記述にはvimを使っていたのをMacVimに変えました。
今までもそうしたかったのですが、mvim起動時に"-f"オプションをつけなければいけないことを知りませんでした。

# mvim : MacVim起動用コマンド。vimコマンドのMacVim版#   -f or --nofork フォアグラウンド: GUIを始めるときにforkしないexport EDITOR="mvim -f"

Gitのログを見やすい形式で取得する

アプリのCHANGELOGを書くときに以下のコマンドでgitログを取得すると整理しやすいです。

$ git log --graph --stat --topo-order origin/master..HEAD | mvim - # パイプ先はお好きなエディタを。

こうすると以下のようにfeatureブランチがメインブランチにマージされる流れがわかりやすい表記になります。
この中でメインブランチへの結合点の内容をピックアップしていくとCHANGELOGを作成できます。

*   commit ded5a3beee8a11fecd4866bace35038c16c5158e
|\  Merge: 383085d a1e72b3
| | Author: namutaka <namutaka+g@gmail.com>
| | Date:   Sat Aug 20 16:37:57 2016 +0900
| |
| |     Merge branch 'feature1'
| |
| * commit a1e72b31b5651c0feb848bd816d4b0a3969fa8d1
|/  Author: namutaka <namutaka+g@gmail.com>
|   Date:   Sat Aug 20 16:37:21 2016 +0900
|
|       Add something
|
|    example/somefile.js         | 15 ++-------------
|    1 files changed, 10 insertions(+), 28 deletions(-)
|
* commit e1061dd7784518c57424ac2828ad6bf426ea5138
  Author: namutaka <namutaka+g@gmail.com>
  Date:   Sat Aug 13 15:58:08 2016 +0900

      Improved something

SSH接続

sshrcというツールの紹介記事を見つけて導入してみたのですが、地味に便利でした。

sshrcは、手元の環境に以下のようなファイルを用意しておけば、sshrcコマンドでssh接続したサーバー内でこのファイルを自動で読み込んで(source)してくれます。
これによって、接続先のサーバー1つ1つに個人の環境設定を行わなくてもよくなります。

$HOME/.sshrc
# aliasalias ll='ls -l'alias la='ls -la'alias rm='rm -i'alias grep='grep --line-buffered'# プロンプトにサーバー名を表示export PS1="[\u@\h \W]\$ "# vim# 手元で $HOME/.sshrc.d/.vimrc というファイルで vim設定を用意しておくexport VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"
which vim > /dev/null 2>&1&&alias vi=$(which vim)

sshrcはsshコマンドの代わりに使うのですが、私はaliasでsshrcをsshとして使うようにしています。

# sshrcalias ssh='sshrc'

注意として、sshrcでは接続先側でコマンドを実行させたい場合にsshから帰ってこない場合があるので、適宜aliasなしのsshと使い分ける必要があります。

# ssh を sshrcとする$ alias ssh='sshrc'# sshでサーバー内でコマンド実行した結果を取得$ ssh server1 grep "info" app.log
→ このとき、grepを実行したあとでsshが終了せずサーバーに入ったままになる

# そういう時は、コマンド前に"\"を記述してaliasなしでのsshコマンド実行をする$ \ssh server1 grep "info" app.log

Vim

知っているひとには今更なことがいくつかあると思いますが、まとめておきます。

標準入力をUTF-8として開く

vimでは何らかのコマンドの結果をパイプして開くときに、文字コードが latin1 になって文字化けてしまいます。これを回避するために以下の設定を入れました。

.vimrc
"" 標準入力はUTF-8と見なすautocmdStdinReadPre * setfileencodings=utf-8

使い方

$ echo"あいう"| vim - # UTF8で開くようになった

一括で連番を作る

数字の連番を一括で作るのを、g<C-a>g<C-x>でできることを知りました。

詳しい説明は以下の記事を参照ください
http://vim-jp.org/blog/2015/06/30/visual-ctrl-a-ctrl-x.html

vim-quickrunを非同期で実行する

編集中のスクリプトをその場で即座に実行できるという非常に便利なvimプラグインのvim-quickrunを以前から使わせていただいています。
ですが、最初にあまり詳しく調べなかったもので、非同期で実行できるのを今更知りました。
vim-quickrunに関する設定は以下のような感じなのですが、"'runner/vimproc/updatetime' : 60"という部分を指定することでVimの操作を止めずに実行できるようになりました。

.vimrc
vim-quickrun
" QuickRun {{{
Plugin 'thinca/vim-quickrun'letg:quickrun_config = {}
letg:quickrun_config['_'] = {
\  'split' : '',
\  'runner' : 'vimproc',
\  'runner/vimproc/updatetime' : 60
\}

Unite のファイル検索を ag(The Silver Searcher) を使う

Vimの操作を補助してくれる unite.vimの検索を、agを使うようにしました。
設定方法はどなたかの紹介記事からそのままなのですが、どこだったかを忘れてしまいました。
設定としては以下のような感じです。

.vimrc
Plugin 'Shougo/unite.vim'" The prefix key.nnoremap    [unite]   <Nop>
nmap    <C-q>  [unite]

" grep検索nnoremap<silent> [unite]g  :<C-u>Unite grep:. -buffer-name=search-buffer<CR>" カーソル位置の単語をgrep検索nnoremap<silent> [unite]gr :<C-u>Unite grep:. -buffer-name=search-buffer<CR><C-R><C-W>" grep検索結果の再呼出nnoremap<silent> [unite]gg  :<C-u>UniteResume search-buffer<CR>" unite grep に ag(The Silver Searcher) を使うif executable('ag')letg:unite_source_grep_command ='ag'letg:unite_source_grep_default_opts ='--nogroup --nocolor --column'letg:unite_source_grep_recursive_opt =''endif

テキスト整形を Align から easy-align に切り替えた

これまで、CSVなどを区切り文字に沿って表形式に整形するのにAlignを使っていました。
ですが、最近になって類似の物がないかを調べてvim-easy-alignに変えてみました。

Align で十分使えていたのですが、以下のような点で少し不便さを感じていました。

  • 処理がやけに遅い(行が増えると顕著)
  • 整形後にカーソルが変な位置に飛ぶ
  • Markdownの表組みのような先頭と終端に区切り文字がある場合に整形後に先頭と終端に空白が入る

そこでeasy-alignに変えてみたところ、概ね上記の問題が解消しました。

公式の説明では、以下の interactive mode での起動を最初に紹介していますが、使い方がVimとしては独特なのでちょっと操作に慣れるまで戸惑いそうです。

.vimrc
nmap ga <Plug>(EasyAlign)
xmap ga <Plug>(EasyAlign)

それよりも、Exコマンドとして使う方がVim的な感じで使いやすそうな気がします。
範囲選択後に:EasyAlign */<区切り文字>/[Enter]で整形できます。

本当に最低限のVim入門 #vim

$
0
0

本当に最低限のVim入門

この記事はVim Advent Calendar 2016の17日目の記事です.

先日はtodashutaさんで, Vim 8で便利になった組み込みMRUでした. こんな便利な機能があったんですね(無知ですみません...).

対象読者

以下のような読者を想定しています.

  • Vimを使ってみたいけど何から始めればいいか分からない人
  • Vimをそっ閉じした経験がある人(そっ閉じすら出来なかった人も含む)
  • サーバーを触っていてVimを触らざるを得なくなった人
  • 友人にキチガイじみたVimmerがいる人(←new)

はじめに

Unix系OSやLinuxの場合は標準でインストールされている事がほとんどですが, もし入っていなかった場合はパッケージマネージャーからインストールして下さい.

Debian系Linuxの場合

$ sudo apt-get install vim

RedHat系Linuxの場合

$ sudo yum install vim

Fedora22以降の場合

$ sudo dnf install vim

ソースからコンパイルする場合

$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ make

Windows10の場合は, Bash on Windowsを使えば上記Ubuntuと同じようにインストールできます. それ以外のバージョンのWindowsの場合は, KaoriYaさんのホームページからダウンロードできるので, それを使えばいいかと思います.

起動と終了

Terminalでvimコマンドを実行して下さい.

$ vim

Vimが起動しましたね.

では次に終了の仕方です. 以下のように打ち込んでEnterを押して下さい.

:q

終了しましたか?

もし終了しなかった場合は, Escを連打してからもう1度試してみて下さい.

設定ファイルの作成

Terminalでvimコマンドを実行する際に引数にファイル名を与える事で, そのファイルをVimで開く事ができます. また, まだ存在しないファイル名を指定すると新規ファイルを作成する事ができます.

今回は, 皆さんが今後1番Vimで編集する事になるであろう, Vimの設定ファイルを作成しましょう. Vimの設定ファイルの名前は.vimrcです. ホームディレクトリに保存します.

以下のように設定ファイルを新規作成しましょう.

$ vim ~/.vimrc

何も書かれていないファイルが開いたと思います(環境によっては初めから何か書かれている可能性があります).

では最初の設定を書き込みましょう.

今の状態では文字を入力することはできません. Vimを文字入力入力できる状態にするには, 挿入モードに切り替える必要があります.

Vimはデフォルトではノーマルモードになっています. ノーマルモードから挿入モードに切り替えるには, iと入力して下さい. すると文字が入力できるようになります.

以下のように入力してみて下さい.

syntaxon

次に, 保存の方法です. 保存を行うにはノーマルモードに戻す必要があります.

ノーマルモードに戻るにはESCCtrl+[を押します. US配列のキーボードを使っている人は後者の方が楽かと思います. 今後よく分からない状態になってしまった場合は, とりあえずESCを連打してみましょう. 大体なんとかなります.

保存は以下のように入力することで行います.

:w

設定の反映

では次に設定を反映してみましょう. Vimを再起動することによっても反映することができますが, 以下のコマンドを入力すると再起動なしに設定の反映が行なえます.

:source ~/.vimrc

色が付いたら成功です.

設定の追加

更に設定を追記します.
oを入力して下さい. すると改行して挿入モードに切り替わります.
以下を入力してみて下さい.

setnumber

ESCでノーマルモードに戻って下さい.
次に, この行を複製します. まずyyを入力して下さい.
そのままpを入力して下さい. すると先程の行がペーストされます.
次にVimのカーソル操作です. Vimではhで左, jで下, kで上, lで右に移動できます.
set numberのnの上までカーソルを移動させます.
次に連続置換です. そこでRを押して下さい. カーソル位置から連続で置換をすることができます.
cursorlineと入力してESCでノーマルモードに戻って下さい.
以下のようになると成功です.

setcursorline

保存して終了

最後に保存して終了です. :wqを入力してエンターを押して下さい.

終わりに

以上で本当に最低限のVim入門を終わります.
これ本当に最低限か?全然足りねえよ, むしろ最低限ならそれ要らないだろ, 偏りすぎだ, 等の意見が多方面から聞こえて来そうですが...
(こんな記事を書いてから言うのも何ですが, シェル上でvimtutorコマンドを叩いてみると主要な機能を網羅した素晴らしいチュートリアルが始まります. 30分ぐらいの時間の余裕があるならそっちをやる事をおすすめします)

Vimのコミュニティでは, 毎週土曜日23時からvimrc読書会というものを行っています. ここでは毎週強いVimmerの方々が色んな人の設定ファイルを読んで意見交換をしています. もっとVimの設定に関して知りたい方は, これに参加すると良いかと思います.
vimrc読書会のロゴを作らせて頂きました. こういう形でしか力になれなくて申し訳ないですが...

明日はmattnさんの記事です. どんな記事なのか楽しみですね.

Vim の下着で gVim を高速起動する (起動するとは言ってない

$
0
0

この記事は Vim (その2) Advent Calendar 2016 の17日目の記事です。

Vim の起動が遅い?

Vim の起動速度が云々という話題が時折あり、自分もなんとなく気になっていました。
闇のプラグインマネージャである dein.vimを試したりもしました。
しかし、聖なる存在である私 anekosとは相性が悪いようで、奇妙な動きに翻弄されるばかり。
不具合報告したくとも、奇怪複雑な動作のため、超面倒くさい!
あきらめた!

起動時間はあきらめる

実際のところ、起動速度が遅いというのは、本質的な問題ではないはず。
Vim を使いたいと思ってから、実際に使えるまでの時間こそが問題です。

それに、起動時間を短くするために色々考えるのも面倒。

起動しなければ 0 秒?

そういうわけで、起動するから時間がかかるので、あらかじめ起動しておくという方針にしました。
つまり、gVim をあらかじめ何個かストック(起動)しておいて、そこから引っ張り出すだけにするのです。

panty コマンド書いた

そしてできたのが pantyというコマンドです。
はじめは、シェルスクリプトだったのですが、最近 Rust で書き直しました。

anekos/panty: Super fast gVim summoner

Linux の X 用なので、Mac の人は こちらを参考にすると良いでしょう。

インストル方法

インストール(ビルド)には、rustのパッケージマネージャの cargoが必要です。
(Arch Linux であれば、公式リポジトリにどちらもあるので、サクっとインストールできます。)

$ cargo install panty
$ ~/.cargo/bin/panty -h

これで、~/.cargo/bin/pantyにコマンドができます。
適当にパスを通すなりしましょう。

使用方法

まずは、gVim をストックするためのサーバ的なものを起動します。
↓の例では、--stocks 3の数だけ gVim をストックしておき、--watchで指定されたファイルが更新されると、ストックを再起動して更新します。
これは終了しないので、そのまま放置しておきます。

$ panty collector --stocks 3 --watch ~/.vimrc --watch ~/.gvimrc

あとは、gVim を起動したいときに

$ panty summon ~/.vimrc

のようにすると、裏で起動していた gVim がシャキっと出現し、~/.vimrcを開きます。
ショートカットなどで起動できるようにしておくと良いでしょう。

pros/cons

良いとこ

  • 高速起動 (もどき)
  • .vimrc の書き方などを工夫しなくても良い
  • Rust で遊べた

悪いとこ

  • .vimrc を書き換えた場合、起動が遅れる (上記の--watchオプションを使う場合)

個人的には、vim 関係をいじる時は単純に二つ vim を起動してテストしているので、あまり問題になりません。

実際の速度

実際、どれほどの速度か簡単に計測してみました。
うちの環境では、<A-S-g>panty summonが呼ばれるので、これを押した一定時間後に、aを押すようにします。
これで、インサートモードに入っていれば、その一定時間後には起動が完了しているという寸法です。

実際のテストは以下のようにしました。
$MSECの部分が問題の時間です。

$ MSEC=0.5
$ sleep 1; xdotool key --delay 0 alt+shift+g ; sleep "$MSEC"; xdotool key --delay 0 a

正確な計測とはいいづらいですが、おおよそ $MSEC0.02もあればちゃんと起動完了し、インサートモードへ入れているようです。
ほぼウィンドウを表示しているだけなので、もっと速くても良い気もしますが、これ以上速くても意味はないでしょう。
実際に手で入力しても、即インサートモードに入れる感じです。
通常だと、0.5 秒くらいかかっていたようなので、かなり速くなった印象です。

そういうわけで目的は無事達成できたようです!

TODO

最近シェルスクリプトから移植をしはじめたので、ちょっと足りてないとこあります。

  • 起動する gVim のパス指定
  • 他のオプションもわたせるようにする

など。

使いたい人がいて欲しい機能とかあれば、Issue 登録するか Twitter で言ってください。

(ちなみに、過去のコミットにシェルスクリプトも入ってたりしますが、こちらは自分の環境に強く依存しているので参考程度にしかならないと思います)

オマケ

svim

似たものとして、singleton.vimというのがありますが、pantyと併用するのに良いものとして、anekos/svim: gVim singleton or gVim window selector on current workspaceというのがあります。
画面上に見えている gVim のどれかにファイルを送りこむというものです。

XMonad の設定

xmonadは、アイコン状態でのアプリの起動に対応していないっぽいので、ManageHook を以下のようにすると良いと思います。

import XMonad hiding (doShift)
import qualified XMonad.StackSet as SS
import XMonad.Util.XUtils (hideWindow)

myManageHook :: ManageHook -> ManageHook
myManageHook = composeAll
    [ ...
      , role      =? "STOCKING"           --> doHide ]

doHide :: ManageHook
doHide = ask >>= \w -> liftX (hideWindow w) >> doF (SS.delete w)

role :: Query String
role = stringProperty "WM_WINDOW_ROLE"

Vim の下着

gVim をストックしておく → Stock → Stocking → ストッキング → ストッキングといえばパンティーらしい

こういう理論で、panty という名前になりました。

Viewing all 5720 articles
Browse latest View live


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