Windowのリサイズのショートカットが効かない時

Xubuntu 22.04上でキーボードショートカット(Win+左でウインドウが半分のサイズになって左にいくとか)が滅茶苦茶なので直し方。

まず下記のここをみて、不要なキーを削除、修正する。

その後、「設定」->「ウインドウマネージャー」->「キーボード」の順で進み、そこで直接入力したら綺麗に治った。

追記 1

一時的に治るけどログインし直したらまた元通りの壊れた状態に戻った。

追記 2

これを見つけて試したら完全に治った。(「設定」->「ウインドウマネージャー」->「キーボード」の順に進み、おかしいキーをクリアを2回してから正しいショートカットを入力する)

Ubuntu 22.04のインストール出来ない時の解決策

Windows 11を入れていたPCにUbuntu 22.04をインストールしようとしたら、2箇所、詰まるポイントがあったので覚書。

ISOをDVDに焼いてインストールを開始するとしばらくして[FAILED] Failed to start Ubuntu live CD installer.とログを吐いてインストールできなくなった。

これは起動オプションをいじることで解決出来た。

…… splash fsck.mode=skip --- ……

上記のように編集した後にF10でインストールを開始。

参考: Ubuntu日本語フォーラム / 22.04LTS 日本語Remix ライブDVD 動作報告

インストールの途中でThe attempt to mount a file system with type vfat in SSI1(0,0,0), partition#1(sda) at /boot/efi failed云々とでてまたもインストールが進まなくなった。

これはCtrl+Alt+tでターミナルを呼び出して下記のコマンドで解決できた。

# 自分の環境ではsda1でいけた
# fdisk -l で色々見てみるほうがいいかも
sudo mkfs.vfat -F 32 /dev/sda1

参考: uefi - The attempt to mount a file system with type vfat in SSI1(0,0,0),partition#1(sda)at/boot/efi failed - Ask Ubuntu

vim-goの使い方

普段使用しているコマンド郡のメモ。

コマンド名の後ろの[!]は、!をつけてそのコマンドを実行するとエラーが起きた場合でもその箇所へ飛ばないようになる。コマンドによっては例外もあるので、その場合は注記している。

ビルドと実行

ビルドする
:GoBuild[!] [expand]

ビルドを行いエラーがあればエラー箇所へ飛ぶ。環境を汚さない(現在のディレクトリにバイナリなどは作られない)。引数は[expand]へ。オプションについて詳しくはgo help build。

  • ビルド時に自動的にファイルを保存する
" vim
set autowrite
パッケージをビルドし実行する
:GoRun[!] [expand] 

ビルドに失敗した場合は実行されない。引数は[expand]へ。オプションについて詳しくはgo help run。

  • カレントファイルをビルドし実行する
:GoRun[!] %

main関数は必須。

(例)

// hello.go
package main
import "fmt"
func main() {
    fmt.Println("Hello")
}
// Hello

テスト

テストする
:GoTest[!] [expand]

エラーがあればエラー箇所へ飛ぶ。***_test.goを開かなくても使える。引数は[expand]へ。オプションについて詳しくはgo help test。

let g:go_test_timeout= '10s' " デフォルト
let g:go_test_timeout= '15s' " 15秒へ
関数単体でテストする
:GoTestFunc[!] [expand]

カーソル下のテスト関数をテストする。

テストファイルをコンパイルする
:GoTestCompile[!] [expand]

テストファイルをコンパイルしてエラーがあればエラー箇所へ飛ぶ。コンパイルが成功してもテストは実行されない。大きいテストファイルを編集している時に使うと便利かも。

テスト漏れを調べる
:GoCoverage[!] [options]

テストされている関数は緑色、テストされていない関数は赤色で色付けされる。[options]はよく分からない。カバレッジ系のヘルプは"go help testflag"や"go tool cover -help"でみられる。

:GoCoverageClear [options]

色付けを元に戻す。

:GoCoverageToggle[!] [options]

上記2つのコマンドをトグルする。

:GoCoverageBrowser[!] [options]

ブラウザでカバレッジを表示。

整形

コードを整形する。

:GoFmt

整形時にエラーがあればエラー箇所へ飛ぶ。

  • 整形時にエラーがでてもエラーリストを表示しない
let g:go_fmt_fail_silently = 1
  • デフォルトでファイル保存時に自動整形(gofmt)される
let g:go_fmt_autosave = 1 " デフォルト
let g:go_fmt_autosave = 0 " オフ
  • デフォルトで自動整形がオンの場合に使われるコマンドはgofmt
let g:go_fmt_command = "gofmt" " デフォルト
let g:go_fmt_command = "goimports" " goimportsに変更 
:GoImport

GoImport strings すると、import "strings" が追加される。

:GoImportAs

GoImportAs str strings すると、import str "strings" が追加される。

:GoDrop

GoDrop strings すると、import "strings" や import str "strings" が追加される。

:GoImports

GoFmtとGoImportとGoDropを同時にやってくれる感じ。

テキストオブジェクト

関数やコメントの内側やそれ自体を操作する
Key Meaning
if (inner function) 関数の内側が対象
af (a function) 関数全体が対象
ic (inner comment) コメントの内側が対象
ac (a comment) コメント全体が対象
  • 削除 (d)
    • 内側 dif
    • 全体 daf
  • コピー (y)
    • 内側 yif
    • 全体 yaf
  • 選択 (v)

    • 内側 vif
    • 全体 vaf
  • *af 系はデフォルトで関数の上部にあるコメント部分も対象とする。変更可。

let g:go_textobj_include_function_doc = 1 " デフォルト
let g:go_textobj_include_function_doc = 0 " オフ
前後の関数へ移動、操作する
Key Meaning
[[ (inner function) 前の関数へ移動
]] (a function) 後ろの関数へ移動

テキストオブジェクトと同様に色々と組み合わせて使える。

  • 削除 (d)
    • 前の関数 d[[
    • 後ろの関数 v[[

スニペット

インストールなど基本的な使い方はこちら

デフォルトで構造体のタグはスネークケース(snake_case)で展開される。変更可。

let g:go_addtags_transform = "snakecase" " デフォルト
let g:go_addtags_transform = "camelcase" " キャメルケース 

シンタックスハイライト

詳しくはこちら。

静的解析

ソースコードを静的解析する開発補助郡。

:GoErrCheck[!]

errcheckを実行。関数などから返されるエラーがちゃんとチェックされているかをチェックする。

:GoVet[!]

go vetを実行。

:GoLint[!]

golintを実行。

:GoMetaLinter

デフォルトでgo vet、golint、errcheckをまとめて実行。変更可。

let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck'] " デフォルト
let g:go_metalinter_enabled = ['golint'] " golintだけに
  • ファイル保存時に自動でGoMetaLinterを呼ぶ設定。
let g:go_metalinter_autosave = 1
  • 自動で呼ぶものを設定。
let g:go_metalinter_autosave_enabled = ['vet', 'golint']
let g:go_metalinter_deadline = "5s" " デフォルト
let g:go_metalinter_deadline = "7s" " 7秒に

移動

対応するテストファイルへ移動する
:GoAlternate[!]
  • a.go上で実行するとa_test.go を開く
  • a_test.go上で実行するとa.go を開く

コマンドの後ろに!をつけると、ファイルが存在しない場合に新規作成して開く挙動になる。

vim側の便利な設定はこちら。

定義元へ移動する
:GoDef 

カーソル下の文字列の定義元へ移動。(ノーマルモード: gd、ctrl-])

:GoDefPop [count]

元の場所に戻る。ctrl-oでも戻れるが、何度もジャンプしていると複数回押さなけれならなくなるので面倒。

:GoDefStack

以前にGoDefで飛んだ箇所がリスト表示され、そこから移動できる。

:GoDefStackClear

上記のリストをクリアする。

デフォルトでGoDefはguruを使用する。変更可。

let g:go_def_mode = 'guru' " デフォルト
let g:go_def_mode = 'godef' " godefへ
関数一覧から関数を探す

要インストール: github.com/ctrlpvim/ctrlp.vim

:GoDecls [file]

関数一覧表示。

:GoDeclsDir [dir]

関数一覧表示。テストファイルの中の関数は含まれるが、サブディレクトリは含まれない。

  • デフォルトでGoDeclsとGoDeclsDirは関数とタイプを表示する。変更可。
let g:go_decls_includes = "func,type" " デフォルト
let g:go_decls_includes = "func" " 関数のみ

情報

:GoDoc

カーソル下の文字列のドキュメントを表示(ノーマルモード: K)。適当なフォルダでGoDocを実行しても"vim-go: no package to containing file ****"というエラーがでた。${GOPATH}/src/****/以下で作業すると成功した。

:GoInfo

カーソル下の文字列の情報を表示。(関数シグネチャやタイプなど)

  • 自動でカーソル下の文字列の情報を表示することも出来る。
let g:go_auto_type_info = 1
  • デフォルトで更新間隔は800ミリ秒(800ms)。変更可。
let g:go_updatetime = 800 " デフォルト
let g:go_updatetime = 100 " 100ミリ秒へ
識別子ハイライト
:GoSameIds

カーソル下の文字列(識別子)をハイライトする。

:GoSameIdsClear

ハイライトをオフにする。

:GoSameIdsToggle

上記2つのコマンドをトグルする。

:GoSameIdsAutoToggle

自動でハイライトとオフのトグル。

  • デフォルトで自動でハイライトはオフ。変更可。
let g:go_auto_sameids = 0 " デフォルト
let g:go_auto_sameids = 1 " オン
  • デフォルトで更新間隔は800ミリ秒(800ms)。この挙動は変更できる。
let g:go_updatetime = 800 " デフォルト
let g:go_updatetime = 100 " 100ミリ秒へ
構成ファイルと依存
:GoFiles [source_files]

パッケージを構成しているファイルを表示。****_test.goファイルは表示されない。

:GoDeps

今開いているファイルの依存ファイルを表示。

Guru

詳しくはこちら。

リファクタリング

識別子名の変更

:GoRename[!] [to]

カーソル下の名前を"to"に変更する。パッケージ内の他のファイル内で使われているものも賢く変更してくれる。

関数を抽出する

:GoFreevars

抽出したい箇所を選択して(visual mode)、実行。詳しくはこちら。

コード生成

インターフェイス実装の補助

:GoImpl [receiver] [interface]

カーソルを"type T struct{}"の"T"にもっていき実行。次にインターフェイスタイプ(例えば"io.ReadCloser"など。補完も効く。)を入力。josharian/impl

カーソル位置に関係なくどこからでも可能。

(例) :GoImpl t *T io.ReadCloser

その他

コードシェア

vimから離れることなくplay.golangでシェアできる。

:GoPlay
  • デフォルトで自動でブラウザが開くようになっている。変更可。
let g:go_play_open_browser = 1 " デフォルト 
let g:go_play_open_browser = 0 " オフ
  • 開くブラウザを指定できる。
let g:go_play_browser_command = "chrome" " chromeで開く
テンプレートファイルのシンタックスハイライト
  • HTML template

デフォルトでGo HTMLテンプレートシンタックスハイライトは*.tmplファイルに対して有効になっている。 変更可。

au BufRead,BufNewFile *.gohtml set filetype=gohtmltmpl " *.gohtml で有効
  • TEXT template

Go TEXTテンプレートシンタックスハイライトはファイルタイプをgotexttmplへ変更すると有効になる。

se ft=gotexttmpl
GOPATHを変更する
:GoPath [path]

GOPATHを[path]へ変更する。[path]が""だった場合、元のGOPATHへと戻る。引数を与えなかった場合は現在のGOPATHを表示する。

Go アセンブラファイルを整形する
:Asmfmt

デフォルトでファイル保存時の自動整形はオフになっている。変更可。

let g:go_asmfmt_autosave = 0 " デフォルト
let g:go_asmfmt_autosave = 1 " オン
:GoAsmFmtAutoSaveToggle

ファイル保存時の自動整形のオンとオフのトグル。

asmfmtの詳細はこちら。

GNU C Library(glibc)の実装を覗く

ソースファイルを入手

Index of /gnu/glibcにあるglibc-*というのがソースファイル。

$ curl https://ftp.gnu.org/gnu/glibc/glibc-2.27.tar.gz | tar zx
$ cd glibc-2.27

目的の関数を探す

# ファイル名から関数を探す
$ find . -type f -name "*printf*" | less

# ファイル内から関数を探す
$ find stdio-common -type f -print | xargs grep 'printf' | less

stdlib.h に含まれている関数 abs を覗いてみよう

/usr/include/stdlib.h

/* Return the absolute value of X.  */
extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;

glibc-2.27/stdlib/abs.c

/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
...
 */

#include <stdlib.h>

#undef abs

/* Return the absolute value of I.  */
int
abs (int i)
{
  return i < 0 ? -i : i;
}