恥は/dev/nullへ by 初心者

プログラミング初心者がのろのろと学んだことをつづっています♪

Shift_JIS、CP932、SJIS

自分が文章を作成する場合はUTF-8を使っていますが、古いファイルや人から渡されるファイルの中にはUTF-8以外のものもあります。

そこで、個人的に紛らわしいと思っている「Shift_JIS、CP932、SJIS」について、違いを少し調べてみました。本来は専門書を当たるべきなのでしょうけれど、仕事で調査しているわけではないのでWikipediaで済ませました。


一般論

まずは、Shift_JISとCP932の違いから。
WikipediaでCP932に関する項目を見ると、

Microsoft コードページ 932は(以下 CP932)、マイクロソフト及び、
MS-DOSのOEMベンダがShift_JISを独自に拡張した文字コードである。
また、同時にCP932は、Shift_JISのWindowsアプリケーションにおける
「実装」を指す用語であるとも言える。

と書かれています。この記述から、CP932はMicrosoft社などがShift_JISを独自拡張したものだと分かります。

Shift_JISよりもCP932の方が扱う文字の範囲が広いので、CP932を使って作成されたファイルをShift_JISに変換したら失われる文字があるかもしれませんね。

次はWindows-31Jに関するWikipediaの記述です。

Windows-31J
Windows 3.1 (J) のリリースに合わせて、マイクロソフトが IBMと日本電気(NEC)
のコードを統合して作った符号化文字集合。1993 年以降、マイクロソフトが
自社のドキュメント等で「CP932」という用語を使って表している対象は、
常にこの「Windows-31J」である。この名前は IANA に登録されている。

この記述を読むと、1993年以降、CP932の中身は「Windows-31J」のようです。

最後にSJISに関するWikipediaの記述

SJIS
Shift_JISの短縮形。

この記述からSJISShift_JISと同じだと分かります。

ここまでをまとめると以下のようになります。

・SJISはShift_JISを短縮した名称
・CP932はShift_JISをMicrosoft社などが独自拡張したもの
・1993年以降のCP932はWindows-31J


現実はもう少し複雑

一般論としては上述したとおりですが、現実はもう少しややこしいようです。

たとえば、エンコーディングに関する実装において「SJIS」というワードを「Windows-31J」に割り当てている場合もあるようです。この状況だと「SJIS = Shift_JIS」ではありませんね。

こういうケースがあるので、何か上手く行かなかった時にその都度どんなセッティングになっているのか調べるしかなさそうです。


素朴な疑問(Vimsjis

いきなりVimの話になりますが、Vimのヘルプでencodingに関する部分を読むと

2   cp932    日本語 (Windows only)
2   euc-jp  日本語 (Unix only)
2   sjis    日本語 (Unix only)

という記述がありました。気になるのは3行目のsjisです。このsjisShift_JISと同一視してよいのか分かりません。はて?

Neovimのキーマップ設定 and 自作コマンド定義

目次


情報源

情報源は、Lua-guideのMappingsという項目と、Neovimのヘルプです。

Lua-guide - Neovim docs


キーマップを設定するにはvim.keymap.set()を使う

キーマップを設定するにはvim.keymap.set()を使います。
たとえば、ノーマルモードで j に gj を割り当てる場合、init.lua

vim.keymap.set('n', 'j', 'gj')

と記述します。n はノーマルモードを指します。

この設定は、Vim

nnoremap j gj

に相当します。

一方、

nmap j gj

のようにしたい場合は

vim.keymap.set('n', 'j', 'gj', {remap = true})

と記述します。

https://neovim.io/doc/user/lua-guide.html#lua-guide-mappings-set
に以下の記述があります。

remap: By default, all mappings are nonrecursive by default 
(i.e., vim.keymap.set() behaves like :noremap). 
If the {rhs} is itself a mapping that should be executed, 
set remap = true:

つまり、デフォルトではremapされないようになっています。よって、remapを有効にするには {remap = true} を記述する必要があります。


コマンドをキーに割り当てる

私はVaffleというプラグインを使っているのですが、これを呼び出す場合

:Vaffle

を実行します。
これを s というキーに割り当てる場合、init.lua

vim.keymap.set('n', 's', '<cmd>Vaffle<CR>')

と記述します。

ちなみに、次のように記述しても同じように動作しました。

vim.keymap.set('n', 's', ':Vaffle<CR>')


キーマップ設定例

以下は、設定したキーマップの一部です。

vim.keymap.set('n', 's', '<Nop>')               -- s押下時は何もしない
vim.keymap.set('n', 'sa', '<cmd>set wrap<CR>')  -- saで折り返し表示

-- Ctrl+LにESCを割り当てる
vim.keymap.set('' , '<C-l>', '<ESC>') -- Normal, Visual, Operator-pendingに適用
vim.keymap.set('i', '<C-l>', '<ESC>') -- Insertに適用

-- Ctrl+LにCtrl+Cを割り当てる
vim.keymap.set('c', '<C-l>', '<C-c>') -- CommandからNormalに戻る

-- Ctrl+Sに再描画を割り当てる
vim.keymap.set('n' , '<C-s>', '<C-l>')

-- 表示行でカーソル移動
vim.keymap.set('n', 'j', 'gj')
vim.keymap.set('v', 'j', 'gj')
vim.keymap.set('n', 'k', 'gk')
vim.keymap.set('v', 'k', 'gk')

-- init.luaを開く
vim.keymap.set('n', '<Leader>ev', '<cmd>e ~/.config/nvim/init.lua<cr>')


自作コマンドを定義する

ついでに、自作コマンドを定義する手順を調べてみました。

ホームディレクトリにある.vimrcを開く「Hoge」というコマンドを自作したいとします。Vimの.vimrcに記述する場合

command Hoge :e ~/.vimrc

という表現になりますが、同じことをNeovimのinit.luaに記述する場合は次のようになります。

vim.api.nvim_create_user_command('Hoge', 'e ~/.vimrc', {})

vim.api.nvim_create_user_command()には3つの引数を指定します。1つ目はコマンド名です。2つ目はVimコマンドかLua関数です。3番目はコマンド属性です。

コマンド属性は数が多いので、必要に応じて下記リンク先を参照すればよいと思います。
https://neovim.io/doc/user/map.html#user-commands

Neovimでautocmdとcolorschemeの設定をする

情報源

今回の情報源も以下のLua-guideです。

Lua-guide - Neovim docs


autocmdの設定

Vimに記述しているautocmdをNeovimにも設定してみようと調べてみました。

Vimで以下の設定をしているとして、

augroup vimrc
  autocmd!
  autocmd FileType vim setlocal keywordprg=:help
augroup END


これをNeovimのinit.luaに記述する場合、次のようになります。

vim.api.nvim_create_augroup('vimrc', { clear = true })
vim.api.nvim_create_autocmd({ 'FileType' }, {
  pattern = 'vim',
  group = 'vimrc',
  command = 'setlocal keywordprg=:help',
})

1行目で vimrcというaugroupを作成しています。clear = trueはautocmd!の役割を担っています。 2行目以降は見たまんまで、FileTypeがvimの時にcommand行で指定したsetlocal keywordprg=:help を実行します。

Lua-guideに載っていた例を真似して下から2行目の行末に , を記述していますが、別に記述しなくても問題ありません。

Markdownファイルを編集している時に一部の _ (アンダースコア)がハイライトする問題に対処するため、以下のautocmdを記述してみました。

-- Markdownファイルにおいて一部の _ がハイライトするのを防止する
local cmhgroup = vim.api.nvim_create_augroup('clear_markdownError_highlight', { clear = true })
vim.api.nvim_create_autocmd({ 'FileType' }, {
  pattern = 'markdown',
  group = cmhgroup,
  command = 'highlight link markdownError NONE'
})

1行目でclear_markdownError_highlightというaugroupを作成しています。先の例と同じくclear = trueは autocmd! に相当します。2行目以降では、FileTypeがmarkdownの場合に(Markdownファイルを開くと)、command行にある highlight link markdownError NONE というコマンドが実行されます。

それと、こちらではaugroupの名前が長いので cmhgroupという変数を用意しています。そして、この変数をgroup行で使用しています。

ちなみに、vim.api.nvim_create_augroup関数はグループを識別する数を返すので、変数cmhgroupに格納されるのは文字列ではなく数です。

これを確認するために

print('cmhgroup is '..cmhgroup)

という文を記述しておいたら、次のように表示されました。

cmhgroup is 6


colorschemeの設定

カラースキームを設定してみます。たとえば、「torte」というカラースキームを使う場合、

vim.cmd[[colorscheme torte]]

とinit.luaに記述します。

失敗例を書いておきます。Lua-guideには

vim.cmd("colorscheme habamax")

という例が載っているのですが、この書き方ではカラースキームが有効になりませんでした。ちなみに、使用しているNeovimのバージョンは0.9.0です。

それと自作のカラースキームファイルを使う場合、以下のディレクトリの中にファイルを配置します。

~/.config/nvim/colors


追記

後から気づいたのですが、この記事に書いた

vim.api.nvim_create_augroup()
vim.api.nvim_create_autocmd()

を使ったautocmdの記述例は、Vimで以下のようにするのと同じ形ですね。

augroup takoyaki
  autocmd!
augroup END

autocmd takoyaki FileType txt set ignorecase
autocmd takoyaki FileType cpp set noignorecase

(この形ではautocmd行にグループ名を記述する手間があるので、普段は余り使いませんが・・・)

Neovimのオプション設定(init.lua)

Neovimのオプション設定をしてみたのですが、Lua形式の設定を知らなかったので時間がかかりました。

目次


Lua-guide

Lua-guide - Neovim docs

NeovimでLuaを使う場合の基礎が上記のページに記述されています。このページを拾い読みしながらinit.lua(Neovimの設定ファイル)を作成しました。

設定を記述するファイル

Neovimの各種設定を記述するファイルはinit.luaです。オプションの設定もこのファイルに記述します。

~/.config/nvim/init.lua


オプション設定の基本形

オプションを設定する時の基本形は

vim.opt.[オプション名] = [引数]

です。

Vimで次のようなオプション設定をしていたとして、

" 現在行から見た行番号を表示する
set relativenumber

これをNeovimのinit.luaファイルに記述する場合、次のようになります。

-- 現在行から見た行番号を表示する
vim.opt.relativenumber = true

(備考)-- から右側はコメントとなります。

ちなみに、オプションには種類があり、「グローバルオプション、バッファローカルオプション、ウィンドウローカルオプション」の3つです。この3つを区別して次のように記述することもできます。

vim.o.[オプション名]  = [value]  グローバルオプション
vim.bo.[オプション名] = [value]  バッファローカルオプション
vim.wo.[オプション名] = [value]  ウィンドウローカルオプション


vim.optとvim.o等

vim.o、vim.bo、vim.woではグローバル、バッファローカル、ウィンドウローカルを区別して記述しますが、vim.optはそれらを区別することなく使用できるので便利です。

NeovimのLua-guideによると、vim.optの不便な所はオプションの値を調べる時に:get()を使う必要があることだそうです(以下はLua-guideからの引用です)。

print(vim.opt.smarttab)
--> {...} (big table)
print(vim.opt.smarttab:get())
--> false

vim.optを使用した1行目のprint文ではsmarttabオプションに設定されている値を取得できていません。3行目のprint文では :get()を使うことで値を取得できています。

一方、vim.o vim.bo vim.wo を使用した場合、オプションの値を直接調べられます(以下はLua-guideからの引用です)。

vim.o.smarttab = false   -- :set nosmarttab
print(vim.o.smarttab)
--> false

1行目の「-- :set nosmarttab」はコメントなので無視してください。
1行目でsmarttabにfalseという値をセットし、2行目のprint文では(:get()を使うことなく)セットした値を取得できています。

ついでに引用しておくと、Lua-guideには以下の記述もありました。

vim.o : behaves like :set
vim.go: behaves like :setglobal
vim.bo: for buffer-scoped options
vim.wo: for window-scoped options


オプション設定例

オプションの設定例をいくつか記載します。

数値を指定する場合

vim.opt.tabstop = 4


bool値を指定する場合

vim.opt.relativenumber = true

(備考)trueかfalseを指定します。

文字列を指定する場合

vim.opt.clipboard = 'unnamedplus'


Vimの +=、^=、-=に相当するもの(以下はLua-guideからの引用です)。

vim.opt.shortmess:append({ I = true })
vim.opt.wildignore:prepend('*.o')
vim.opt.whichwrap:remove({ 'b', 's' })

たとえば、Vimの.vimrcにおいて

set formatoptions+=mM

と記述していたものは、次のように記述します。

vim.opt.formatoptions:append({m = true, M = true})


以下はNeovimのオプションではなく、Vaffleというプラグインのオプションですが、これを例にして変数を使う場合に触れておくと、

let g:vaffle_show_hidden_files = 1

Vimで記述していた場合、Neovimでは

vim.g.vaffle_show_hidden_files = 1

と記述します。

Lua-guideから引用しておきます。

vim.g: global variables (g:)
vim.b: variables for the current buffer (b:)
vim.w: variables for the current window (w:)
vim.t: variables for the current tabpage (t:)
vim.v: predefined Vim variables (v:)
vim.env: environment variables defined in the editor session


ヘルプでオプションを調べる

ヘルプを調べる場合、調べたいオプション名にシングルクォーテーションを付けます。

:h 'relativenumber'


なお、オプションがグローバル、バッファローカル、ウィンドウローカルのいずれなのかはヘルプの冒頭に記述されています。以下はrelativenumberのヘルプです。

'relativenumber' 'rnu'   boolean (default off)
                        local to window
    Show the line number relative to the line with the cursor
    in front of each line. (以下略)

local to windowという記述から、このオプションはウィンドウローカルオプションだと分かります。

booleanという記述があるので指定する値はtrueかfalseです。

vim.opt.relativenumber = true


オプションの一覧を見る

オプションの一覧を見る場合は次のようにします。

:h option-list


失敗談

失敗談を書きます。undoファイルの場所を指定する場合、

vim.opt.undodir = '/home/hoge/.nvim/undo'

のようにしますが、これを

vim.opt.undodir = '~/.nvim/undo'

と記述したら、ホームディレクトリに ~ という名前のディレクトリが作成されていました(汗)。そこで、~を使わずに/home/hoge/という風に書いています。


記法をいくつか試した時のメモ

whichwrapオプションを設定するにあたり、NeovimのLua-guideに載っていた記法をいくつか試しました。以下はその時のメモです(私がLuaという言語を分かっていないので、意味不明なことをしているだけだと思いますが)。

結果だけ先に書いておきますと、

vim.opt.whichwrap = 'h,l,<,>,[,],~'

と記述するのが一番楽だなと思いました。

以下、試したことを羅列します。

Lua-guideにある

vim.opt.wildignore = { '*.o', '*.a', '__pycache__' }

という記述例を真似して

vim.opt.whichwrap = {'h', 'l'}

と記述したらinit.lua読み込み時にエラーとなりました。

Lua-guideに

vim.opt.whichwrap:remove({ 'b', 's' })

という記載があったので、append、prepend、removeは使えそうだと思い、試してみました。

vim.opt.whichwrap:append('h', 'l')

と記述したら、h は機能しますが l は機能しませんでした。先頭のものしかappendされていないようです。

vim.opt.whichwrap:append('h')
vim.opt.whichwrap:append('l')

と記述したら、h も l も機能しました。しかし、これだと行数が多くなるので使いたくありませんね。

vim.opt.whichwrap:append('h,l')

と記述すると h も l も機能しましたが、これなら

vim.opt.whichwrap = 'h,l'

と記述した方が文字数が少なくて良いですね。

次に

vim.opt.whichwrap = { h = true, l = true }

と記述したら、これは h も l も機能しました。
しかし、< 等の記号には使用できませんでした。たとえば、

vim.opt.whichwrap = {< = true}

と記述したら、init.lua読み込み時にエラーとなりました(< をエスケープすれば良いのかもしれませんが、Luaの知識が無いので不明です)。

< 等の記号でもappendでは使用できました。たとえば

vim.opt.whichwrap:append('<')

と記述すると、< が機能しました。

Neovimをほんの少し触ってみた

Vimから乗り換える予定はありませんが、Neovimが少し気になったのでDebian11に入れてみました。


Neovimのインストール

下記サイトにAppImage形式のNeovimがあったので、それを使うことにしました。

https://github.com/neovim/neovim/wiki/Installing-Neovim

curlコマンドでファイルをダウンロードします。

curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage


私はAppImageを使ったことが無かったので、ホームディレクトリにAppImage用のディレクトリを作成しました。

$ mkdir .appimages

ダウンロードしたnvim.appimagesを.appimagesディレクトリに移動し

$ mv nvim.appimage .appimages/

実行権限を付与しました。

$ cd .appimages/
$ chmod u+x nvim.appimage

私の環境では~/.local/binにパスを通してあるので、そこにシンボリックリンクを配置しました。

$ ln -s /home/hoge/.appimages/nvim.appimage /home/hoge/.local/bin/nvim


固まったらCtrl + C

理由は不明ですが、Neovimが固まることが時々あります。
固まった場合、とりあえず「Ctrl + C」を押すと何とかなります。


おや?挙動が少し違うような?

少し触ってみて最初に違和感を覚えたのはモーションコマンドの挙動がVimと若干違うことでした。

たとえば、ggを叩いたところ、先頭行には移動するけれど行頭にはカーソルが移動しません。ヘルプを見たら、startoflineオプションがセットされていないと、行頭には移動しないとのことでした(移動前にカーソルがあった列と同じ列に移動する)。

そこで、init.luaに以下の設定を記述しました。

vim.opt.startofline = true

これでggによって先頭行の行頭にカーソルが移動します。

次に気づいたのはYの挙動です。VimだとyyもYも同じ挙動をしていますがNeovimでYを叩いたら、行全体ではなく、カーソル位置から行末までがコピーされました。これに関しては、この挙動の方が好みだなと思ったので、NeovimではなくVimのキーマップを変更しました。

nnoremap Y y$


あと、Vimではデフォルトで有効になっていないオプションがNeovimでは最初からセットされていることが多かった気がします。ただ、大抵はその方が便利だなと思うことが多かったです。

Vimでアンダースコアがハイライトした話

目次


問題の内容

Vimで文章を書いていた折、アンダースコアが赤くハイライトされました。

ただ、いつもこうなるわけではなく、首をかしげました。


原因(markdown.vim

ネット検索をしたら、同じ現象に遭遇した方が原因を書いていらっしゃいました。それによると、Markdownのsyntaxを定義しているファイルの

syn match markdownError "\w\@<=_\w\@="

という行が原因とのことでした。これを読み、「そういえば、Markdownファイルを編集している時にこの現象に遭遇しているな」と気づきました。

「\w\@<=_\w\@=」について調べてみました。

\wはアルファベット、数字、アンダースコアにマッチします。
通常の正規表現だと [0-9A-Za-z_] です。

\@<=は「A\@<=B」のように使うと、直前にAがあるBにマッチします。
\w\@<=_ に当てはめると、直前に「アルファベット、数字、アンダースコア」が
あるアンダースコアにマッチします。

(例)1_   a_   K_   3___ のアンダースコア部分


\@=は「AB\@=」のように使うと、直後にBがあるAにマッチします。
_\w\@= に当てはめると、直後に「アルファベット、数字、アンダースコア」が
あるアンダースコアにマッチします。

(例)_2   _f   _J   ___k のアンダースコア部分


よって、上記のパターンを組み合わせた \w\@<=_\w\@= は次のような
テキストのアンダースコア部分にマッチします。

(例) a_a   a_1   2_B   J__w 
(例)smile___laugh   zB_1rk   g2_____Hkk


つまり、アンダースコアの両側に「アルファベット、数字、アンダースコア」がある場合にハイライトしているようです。


対応(ハイライトのリンクを解除)

Markdownのsyntaxを定義しているファイル(markdown.vim)において今回の問題に関係している部分は次の2行です。

syn match markdownError "\w\@<=_\w\@="

hi def link markdownError  Error


Vimのヘルプに

リンクを作るには:
  :hi[ghlight][!] [default] link {from-group} {to-group}

リンクを削除するには:
  :hi[ghlight][!] [default] link {from-group} NONE

と書かれています。この知識から

hi def link markdownError  Error

は markdownError というグループを Error というグループにリンクさせていることが分かります。Errorにマッチした部分は赤く着色されるようになっているのですが、それがmarkdownErrorにも適用されます。このため、\w\@<=_\w\@= にマッチする部分が赤く着色されているのです。


先程のヘルプの内容からリンクを解除するには

:hi[ghlight][!] [default] link {from-group} NONE

を使えば良いと分かります。なお、[ ]で囲まれた部分については

[] 角カッコで囲まれた文字は省略可能。

Vimのヘルプに書かれています。

以上の知識から.vimrcに以下の記述をしました。

augroup clear_markdownError_highlight
  autocmd!
  autocmd FileType markdown highlight link markdownError NONE
augroup END


これでMarkdownファイルの編集中にアンダースコアが赤くハイライトすることはなくなりました。


markdown.vimの場所

Markdownのsyntaxを定義しているmarkdown.vimファイルの場所を書いておきます。

aptでDebian11にインストールしたVimでは

/usr/share/vim/vim82/syntax

にありました。

一方、ソースからビルドして~/.localにインストールしたVimでは

~/.local/share/vim/vim90/syntax

にありました。


参考にしたサイト

VimでMarkdownファイル中の`_`がエラーハイライトされてしまう問題の対処

vim正規表現リファレンス - Qiita

i3wmのキーバインドを変更してみる

i3wmのキーバインドを少しだけ変更しました。


目次


keycodeとkeysym

i3wmのconfigファイルを見ると次のような感じでキーバインドが設定されています。

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal

# kill focused window
bindsym $mod+Shift+q kill

これを見ると、「Return」や「Shift」というワードをどこで調べるのか気になりますね。

ターミナルで

xmodmap -pke

を実行すると

keycode  36 = Return NoSymbol Return
keycode  37 = Control_L NoSymbol Control_L

(備考)本当はもっと沢山出力されます。これは一部を抜粋したものです。

という感じで、キーの情報が出力されます。

この出力結果から、我々が「Enterキー」と呼んでいるもののkeycodeは「36」、keysymは「Return」だと分かります。同様に、我々が「左のCtrlキー」と呼んでいるもののkeycodeは「37」、keysymは「Control_L」だと分かります。


Mod2とMod3はどのキーなのか?

i3wmのサイトに以下の記述がありました。

This is the Alt key (Mod1) by default, with the Windows key (Mod4) being a popular alternative that largely prevents conflicts with application-defined shortcuts.

この記述からMod1というのはAltキーで、Mod4というのはWindowsキーだと分かります。では、Mod2やMod3はどのキーでしょうか?

今度は

xmodmap -pm

を実行しました。

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

この結果を見ると、Mod2はNum_Lockのようです。一方、Mod3に該当するキーは無いようです。


変更したキーバインド

dmenuの呼び出しを $mod + M にしました。

bindsym $mod+m exec --no-startup-id dmenu_run


フォーカスウィンドウを閉じるキーバインドを $mod + Q にしました。

# kill focused window
bindsym $mod+q kill


フォーカスウィンドウの切り替えと移動をVim風味にしました。

# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right

# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mrd+Shift+l move right


Vim風味にするために $mod+h を使用したので、「split h」の機能をコメントアウトし、「split toggle」を追加しました。

# bindsym $mod+h split h        この行をコメントアウト

bindsym $mod+v split v

bindsym $mod+t split toggle     この行を追加

私の場合、「split v」はよく使うのですが「split h」を使うことがほとんど無いという事情もあります。

i3wmの終了を $mod + Shift + = にしました。

# exit i3 (logs you out of your X session)
bindsym $mod+Shift+equal exit


resizeモードにおけるキー操作をVim風味にしました。

# resize window (you can also use the mouse for that)
mode "resize" {
        bindsym h resize shrink width 10 px or 10 ppt
        bindsym j resize grow height 10 px or 10 ppt
        bindsym k resize shrink height 10 px or 10 ppt
        bindsym l resize grow width 10 px or 10 ppt

        # 変更前
        # bindsym j resize shrink width 10 px or 10 ppt
        # bindsym k resize grow height 10 px or 10 ppt
        # bindsym l resize shrink height 10 px or 10 ppt
        # bindsym semicolon resize grow width 10 px or 10 ppt

        (以下略)
}


$mod + G でgvimを起動するようにしました。

# gvimを起動
bindsym $mod+g exec vim -g


モード(mode)

i3wm,config しないなんて勿体ない!

というサイトにmodeを使ってlayoutを変更する設定例が載っていました。

(備考)これは上記サイトからの引用です

set $layout "layout [h: splith] [v: splitv] [s: stacking] [t: tabbed] [f: floating toggle]"
bindsym Mod4+l mode $layout
mode $layout {
    bindsym Return mode "default"
    bindsym h layout splith; mode "default"
    bindsym v layout splitv; mode "default"
    bindsym s layout stacking; mode "default"
    bindsym t layout tabbed; mode "default"
    bindsym f floating toggle; mode "default"
}

内容に関しては元サイトの説明をご覧ください(丁寧で分かりやすいです)。

しかし、私自身、時間が経てば忘れてしまいそうなので、簡単な説明メモを書いておきます。

・set行は $layout という変数を設定しています
・「Mod4 + L」でlayoutモードに入ります
・layoutモードに入ったら { }内のキーバインドを使います
・たとえば S を押下すると、stackingレイアウトになります
  その後、defaultモードに移行します
  (備考)セミコロンはコマンドを区切るためのものです


私は上記の設定をほぼそのまま使わせていただいています。ただ、私の環境ではWindowsキーが無効になっているので、以下のとおり、Mod4ではなく$modを使っています。

# 上記設定と同じ内容を $mod + P に割り当てています

set $layout "layout [h: splith] [v: splitv] [s: stacking] [t: tabbed] [f: floating toggle]"
mode $layout {
    bindsym Return mode "default"
    bindsym h layout splith;   mode "default"
    bindsym v layout splitv;   mode "default"
    bindsym s layout stacking; mode "default"
    bindsym t layout tabbed;   mode "default"
    bindsym f floating toggle; mode "default"
}

bindsym $mod+p mode $layout


上記サイトには以下の注意喚起が書かれています。

あるモードに入ると,そのモード内で定義されたキーバインド/マウスバインド以外全部無効になってしまうため注意が必要です.特に, default モードに戻る手段を書き忘れると大変なことになります.

これは確かに危ないですね。「mode "default"」を忘れずに記述するように心がけようと思います。


困っていること(F11)

F11 を押したら、フォーカスウィンドウが最大化しました(もしくはfull screen?)。そういう設定をした記憶はないので、デフォルトでそうなっているのでしょう。

個人的には、Vimで Shift + F11 に某機能を割り当てたいので、この挙動を無効化したいのですが・・・。


参考にしたサイト

i3wm,config しないなんて勿体ない!