Atomでの LaTeX における $ 補完

AtomLaTeX の環境を整える中、問題が一つ解決したのでメモ。

$(ドル)をタイプするだけで、$$ と二つ目の $ が自動補完されるようにしたかった。
これは ( を押すと、() と自動補完される機能がデフォルトで入っているので、絶対できるはずだということはわかっていた。

解決策

「File」→「config...」から、ファイル「config.cson」を開き、以下を書き込む。

".text.latex.tex":
  "bracket-matcher":
    autocompleteCharacters: [
      "()"
      "[]"
      "{}"
      "$$"
    ]

Atom のC言語用 Snippets(個人用)

コア・パッケージ「language-c」の Snippets は、次のサイトから取得している。
github.com自分用に細かい修正を加えたかったので、「File」→「Snippets」からファイル「snippets.cson」を開いて、そこに下記の内容を追加。
(下記をコピーする場合、カーソルを置くと現れる「select」ボタンを押すと楽)

##################################
# My snippets for C language     #
# Last modified time: 2017/09/30 #
##################################
'.source.c, .source.cpp, .source.objc, .source.objcpp':
# header
  'Header Include-Guard':
    'prefix': 'IncludeGuard'
    'body': '#ifndef ${1:SYMBOL} /* beginning of include guard ${1:SYMBOL} */\n#define ${1:SYMBOL}\n\n${2}\n\n#endif /* end of include guard: $1 */\n'
  '#include <>':
    'prefix': 'Inc'
    'body': '#include <${1:stdio.h}>'
  '#include ""':
    'prefix': 'inc'
    'body': '#include "${1:current.h}"'
  'Function-like Macro':
    'prefix': 'MacroFunc'
    'body': '#define ${1:f}(${2:x}) do { ${3:macro} } while (0)'
  'typedef enum':
    'prefix': 'enum'
    'body': 'typedef enum { $2 } ${1:Name};'
  'typedef struct':
    'prefix': 'struct'
    'body': 'typedef struct {\n\t${2:int };\n} ${1:Name};'
  'linear list':
    'prefix': 'llist'
    'body': 'typedef struct ${1:__node} {\n\t${3:int val};\n\tstruct ${1:__node} *next;\n} ${2:Node};'
  'function':
    'prefix': 'func'
    'body': '${1:void} ${2:functionName}(${3:int parameter}) {\n\t${4:/* function body */}\n}'
  'main()':
    'prefix': 'main'
    'body': 'int main(int argc, char const *argv[]) {\n\t${1:/* code */}\n\n\treturn 0;\n}'
# stdio.h
  'printf()':
    'prefix': 'printf'
    'body': 'printf("$1", ${2:var});'
  'scanf()':
    'prefix': 'scanf'
    'body': 'scanf("%${1:s}", ${2:ptr});'
  'putchar()':
    'prefix': 'putchar'
    'body': '''putchar('$1');'''
  'puts()':
    'prefix': 'puts'
    'body': 'puts("$1");'
  'Switch Statement':
    'prefix': 'switch'
    'body': 'switch (${1:/* expression */}) {\n\tcase ${2:/* value */} :\n\t\t${3:/* code */}\n}'
  'case :':
    'prefix': 'case'
    'body': 'case ${1:value} :\n\t${2:/* code */}'
  'Do Loop':
    'prefix': 'do'
    'body': 'do {\n\t${2:/* code */}\n} while (${1:/* code */});'
  'While Loop':
    'prefix': 'while'
    'body': 'while (${1:/* code */}) {\n\t${2:/* code */}\n}'
  'For Loop - customize':
    'prefix': 'For'
    'body': 'for (${1:int} ${2:i} = ${3:0}; ${2:i} < ${4:count}; ${2:i}${5:++}) {\n\t${6:/* code */}\n}'
  'For Loop':
    'prefix': 'for'
    'body': 'for (size_t ${1:i} = 0; ${1:i} < ${2:count}; ${1:i}++) {\n\t${3:/* code */}\n}'
  'sizeof()':
    'prefix': 'sizeof'
    'body': 'sizeof(${1:int})'
  'open file':
    'prefix': 'fopen'
    'body': '''if ((${1:fp} = fopen(${2:filename}, "${3:w}")) == NULL) {\n\tfprintf(stderr, "We have failed to open file \\\\"%s\\\\".\\\\n", ${2:filename});\n} else {\n\t${4:/* code */}\n\t\n\tfclose(${1:fp});\n}'''
# stdlib.h
  'rand()':
    'prefix': 'rand'
    'body': 'rand()'
  'srand()':
    'prefix': 'srand'
    'body': 'srand(${1:(unsigned)time(NULL)});'
  'calloc() - initialize':
    'prefix': 'Calloc'
    'body': '${1:int} *${2:ptr} = (${1:int} *)calloc(${3:num_arry}, sizeof(${1:int}))\n\nif (() == NULL) {\n\t${4:fprintf(stderr, "Failed to allocate memory.\\\\n")};\n} else {\n\t${5:/* code */}\n\t\n\tfree(${2:ptr});\n}'
  'calloc()':
    'prefix': 'calloc'
    'body': '''/* allocate memory '${1:ptr}' */\nif ((${1:ptr} = (${2:int} *)calloc(${3:num_arry}, sizeof(${2:int}))) == NULL) {\n\tfprintf(stderr, "Failed to allocate memory '${1:ptr}'.\\\\n");\n} else {\n\t${5:/* code */}\n\t\n\tfree(${1:ptr});\n}'''
  'bsearch()':
    'prefix': 'bsearch'
    'body': '''/* binary search '${1:sorted_array}' for '${2:key}' */\nif ((${3:res} = bsearch(&${2:key}, ${1:sorted_array}, ${4:nmemb}, sizeof(${5:int}), (int (*)(const void *, const void *))${6:compar})) == NULL) {\n\t${7:puts("We have failed to binary search.");}\n} else {\t/* Success: ${1:sorted_array}[(int)(${3:res} - ${1:sorted_array})] = ${2:key}  */\n\t${8:/* code */}\n}'''
# string.h
  'strcmp()':
    'prefix': 'strcmp'
    'body': 'strcmp(${1:s1}, ${2:s2})'

「Atom」でのC言語学習環境を整える

 

前置き

エディタ「Atom」をインストールしてから、C言語の学習環境を整えるのに、随分手間取ってしまった。

以下、直面したトラブルや、調べるのに時間を費やしてしまったこと(解決済)。

  • 「Linter」が上手く機能しない
  • 「gpp-compiler」で文字化け&データ消失
  • パッケージを導入してはみたものの、自動補完が自分好みでない
  • 自作した自動補完が上書きできない
  • 「//」ではなく、こっちのコメントアウト「/* */」を手軽に打てるようにしたい
  • ソースコードを書いたときに、ヘッダの部分を自動でつけたい

これらに4、5日吸い取られたけど、一応全て解消できたので、まあ良しとしよう。

次回以降の手間を省くため、インストール後の手順を以下に記した。

 

環境

OS: Windows 10

システム: 64 ビット オペレーティング システム、x64 ベース プロセッサ

GCCコンパイラー: x86_64-w64-mingw32

Atom: 1.19.5、x64

 

インストール後の手順

 

1.「Welcome Guide」をオフにする

  • 「■ Show Welcome Guide when opening Atom」のチェックを外す

f:id:lightology:20170902103436p:plain

ついでに、開かれているタブ「Telemery Consent」で、YesかNoの選択。

入力パターンを自動で収集されるのが嫌なら、No。

特に問題ないなら、Yesといった具合。

f:id:lightology:20170902105127p:plain

 

2.パッケージのインストール

  • 「Ctrl-,」を入力すると、「Settings」のタブが開けるので、「Install」を選択。

f:id:lightology:20170902110229p:plain

  • 「Search packages」と書かれている検索Boxで、下記を検索してインストール。
auto-encoding
busy-signal
docblockr
file-header
gpp-compiler
intentions
linter
linter-gcc
linter-ui-default
sublime-block-comment

日本語のメニューにしたい場合は、これもインストール(ここではインストールしていない)

japanese-menu

 

3.各種設定

  • 「Editor」の「Show Indent Guide」と「Show Invisibles」をオン。

f:id:lightology:20170902194047p:plain

  • 「Soft Tabs」をオフ、「Tab Length」の欄に「4」を入力、「Tab Type」を「Auto」に変更。

f:id:lightology:20170903123556p:plain

  •  パッケージの設定変更は以下の画像のように、「Packages」に移動してから、インストール済みのパッケージにある「Settings」をクリック。

f:id:lightology:20170902112950p:plain

 

(1)「docblockr」の設定
  • あまりこだわる必要もないが、一応「C style block comments」をオンに。

f:id:lightology:20170902114005p:plain

 

(2)「file-header」の設定
  • 「Real Name」の欄に自分の名前を入れる

f:id:lightology:20170902121945p:plain

  • 「Email Address」の欄を入力し、「Enable Filename」をオン。

f:id:lightology:20170902122019p:plain

  • 「Date Time Format」の欄に
YYYY/MM/DD HH:mm (UTCZ)

を入力↓

f:id:lightology:20170902122030p:plain

  • 「Number of Empty Lines after New Header」の欄に「1」を入力

f:id:lightology:20170902122036p:plain

  • 「Ignore List for Auto Update and Adding Header」の欄に

f:id:lightology:20170930144811p:plain

以下を追加で入力

, source.coffee

  ↓

f:id:lightology:20170930144612p:plain

  

(3-1)「gpp-compiler」の設定(Shift-JISでC言語学習をする場合)※推奨
  • 「C Compiler Options」の欄には何も入力せず、空欄のままにする。

f:id:lightology:20170902125822p:plain

  • ソースコードに日本語を書く必要がある場合、「Core」の設定画面で「File Encoding」の欄を「Japanese (Shift JIS)」に変更。

f:id:lightology:20170902125920p:plain

「html」など、他の言語の編集作業をする際には、デフォルトの「Unicode (UTF-8)」に戻す。

文字コードの切り替えは忘れやすいので、パッケージ「project-manager」を導入することで回避するのがベター。

 

(3-2)「gpp-compiler」の設定(UTF-8でC言語学習をする場合)※非推奨
  •  「C Compiler Options」の欄に
--input-charset=utf-8 --exec-charset=cp932

を入力↓

f:id:lightology:20170902123311p:plain

C言語の学習が終わったら、「C Compiler Options」の入力欄は空欄に戻し、Cのソースコードに日本語を書くのを直ちにやめる。

 

(4)「linter-gcc」の設定
  • GCC Executable Path」の欄に「gcc」と入力(gccのパスを通してあることが前提)。Windows特有で、MacLinuxでは不要な変更かもしれない。

f:id:lightology:20170902130843p:plain

  • 「Linter on-the-fly」をオンにする。

f:id:lightology:20170902130853p:plain

 

(5)「sublime-block-comment」の設定
  • 「Pad with spaces」をオンにする

f:id:lightology:20170902132013p:plain

 

4.「Config」の設定

  • まず「File」を開き、「Config...」をクリック。

    f:id:lightology:20170930141818p:plain

  • 「config.cson」というファイルが開くので、そこに以下を追加。
'.coffee.source':
  editor:
    tabLength: 2

 

5.「Snippets」の設定

  • 次に、「File」を開き、「Snippets」をクリック。

f:id:lightology:20170902133959p:plain

  • 「snippets.cson」というファイルが下のように開く。

f:id:lightology:20170907150840p:plain

このファイルに http://lightology.hatenablog.com/entry/2017/09/07/102102 にあるテキストをコピーして、張り付ける。

 

まとめ

パッケージの説明が全然できず、導入した理由も書けなかった。。。

別のエントリになるだろうけど、頑張ってそのうち書きたい。

そういえば、「Snippets」に関して「autocomplete-clang」があるけど、あれはC++向けみたいだから、Cはあまり充実してない印象だった。

そもそもCの自動補完は、デフォルトで入ってるパッケージによって、次のページ:

github.com

から「Snippets」を取得してるっぽい。

でも、正直粗があるし、修正の反映も遅いみたい?だから、自作してガンガン修正したほうが手っ取り早い。

GitHubアカウントを作って、修正に協力した方が良いとも思うけど、まだシステムをよく理解してないから、おいおいという感じだな。

Visual Studio やめました

久々に Visual Studio でプログラム書こうとしたら、cのソースファイル全く開けなくなってた。

まぁ、兼ねてより Visual Studio には不満があったし、離れるにはちょうどいいのかな、と前向きに考えることにした。

1つソースファイル作るごとに、自動で関連ファイル作りすぎだしね。

ほんとぶくぶく太ってく・・・。

 

というわけで、重たい腰を上げて、MinGWを導入。

しかしここで、現在使用中のノートPCが64bit版であるがゆえに、パスをうまく通せない事態が発生。(これは、たまたま同じように困ってる人がいて、64bit版が原因では?と指摘しているのを見つけたので、気づくことができた)

で、MinGWの64bit版をインストールしなおし。

まあ、気づいてみればどうということはないが、それまであっちこっち調べまくる羽目に(泣)

 

次に、おすすめのエディタをいろいろ調べて、最終的にサクラエディタAtomまで絞った。

サクラエディタの導入は順調にいった。

Atomの方は、動かそうとしたら、早速文字化け発生。

この文字化けに随分悩まされた。

gpp-compilerというパッケージを入れて、これで動かせれば、一番ストレスフリーにC言語の学習ができるだろうと思ったんだけど、そこからの格闘が長かった。

だって、UTF-8になおしても、文字化け治らないんだもの!(むしろ悪化)しかも、他ですでに書いてたやつはSJIS?とかいうやつで、Atomにないし、Shift-JISにしても文字化けするし!

まあ、おバカなのは自分なんだけど、とにかく発狂。

  

文字コードは、ホントわからんわ。

 

今日は1日中、cプログラミングの環境整備で時間を吸い取られた・・・。

上で述べたこと以外にも、めちゃめちゃトラブル起きてたんで、もう、へとへと・・・。 

その分、勉強にはなったかな(白目)

 

<追記 2017/08/27>

Atom、gpp-compilerと文字化け問題は、gcc が原因だと判明。

実際、Atom関係なしに、UTF-8で書かれたものをgccコンパイルすると同じ文字化けが起きる。

gcc "ファイル名" --input-charset=utf-8 --exec-charset=cp932

とかやれば、文字化け回避ができることも分かったけど、さて、Atomのgpp-compiler使うときはどうすれば良いのやら・・・。

まぁ、Atom上でShift-JISで書いて、Atom上でコンパイルする分には何も問題ないから、Shift-JIS安定かなぁ?

でも、起動するたびにUTF-8をShift-JISに直すのは面倒だし、将来的にhtmlとか扱うとしたらUTF-8安定みたいだから、どうしたものか・・・。

3次元もできるようになった

f:id:lightology:20170620234556g:plain

コンパイル時に初期条件を決めて数値計算させ、gnuplotにグラフを書かせるプログラムができた!!

コンパイルごとにランダムに初期関数を与える仕様にもできたので、大満足。

しかもコンパイル時間3秒!!3秒で上のような図が量産できるのが、とにかく嬉しい!!

gifアニメが作れるようになりました

ここ最近、C言語を使ってgnuplotを扱う手法を勉強してきたが、ついにgifアニメを作れるようになった!!それがこれ↓

f:id:lightology:20170423141036g:plainf:id:lightology:20170423141057g:plain

f:id:lightology:20170423141110g:plain

これを作るために組んだプログラムが下のやつ(なるべく使い勝手が良いように、頑張って綺麗にした)↓

f:id:lightology:20170423122542p:plain

割と簡潔に作れたと思ってるけど、/* 動点をプロット */ の行は改善の余地がある気がしてる・・・。

これはgnuplotの仕様について、まだまだ勉強不足なのが原因。

互換性を切る_popenも良くないし、関数の命名も良くないかな。

 

あと、反省しなきゃいけないのは、数値計算の技術が身についてないこと。

相変わらず、後輩の数値計算プログラムを使わせてもらっている情けない先輩です・・・orz

なんか、データの表現方法ばっかり磨いてる感じだな。

数値計算の結果を実行時にgnuplotに渡す

数値計算の結果をデータファイルにして、gnuplotでグラフにする。

このときに、地味に面倒なのが、データファイルのいるディレクトリをコピーして、それをgnuplotに渡す作業。

このイライラを解消するために悪戦苦闘(と言っても、popen使えば良いだけなので、単に自分が情弱なだけorz)。

んで、「ついでに、pngファイルも自動で作らせてしまえ」と思い、さらに時間を浪費(主に打ち間違いが原因で無駄な時間を過ごす)。

 

この作業をプログラムで組めないかとあれこれ調べ、関数を作るまで至った。

それがこれ↓

f:id:lightology:20170404233635p:plain

pngファイルの名前を作るのに、無駄にプログラムが長くなってる印象。

(※2017/4/23追記:for文にすれば6行を3行に減らせる)

この名前の付け方を少し説明すると、数値計算のデータファイル名を、例えば"test.dat"としたときに、pngファイル名を"test.png"にしたかった。

だから、"test"の部分だけ抜き出すために、配列spng[]を用意して、そこに"."が現れるまでコピー。

で、最後にナル文字"\0"を追加。

 

ちなみに、自分はwindowsでやってるので、_popenだけど、Linuxとかだとpopenだったはずなので、そこは変更しないといけない。

ヘッダファイル作って、互換性保てるようにしたいなぁ・・・

 

あと、どういうグラフを書かせたいかによって、いじらないといけないので、これは試用という感じだな。