0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sas用vim環境個人メモ

0
Last updated at Posted at 2026-07-19

VimでSASを書く実際のワークフロー(使い方編)

導入編で入れた「SASIDE」を、実際の業務でどう使うかをシナリオ順に説明します。
コマンドの網羅的な一覧はリファレンス編を参照してください。


1. まず覚える3つ

これだけで日常の8割が回ります。

キー 意味
F5 保存してSAS実行 → ログが下に開く → ERROR/WARNINGがquickfixに並ぶ
F12 IDEレイアウト(左ツリー・中央エディタ・右構造ビュー・下ログ)を一発構築
\rc 構文チェック(データを処理せず、数秒で文法エラーだけ検出)

\ は Leader キーです(既定のまま)。\rc は「バックスラッシュ → r → c」と
順に押します。


2. 一日の始まり:F12で作業環境を開く

vim report.sas

を開いて F12 を押すと、こうなります。

┌──────────┬──────────────────────────┬────────────┐
│ Explorer │        Editor            │ Navigator  │
│  (F2)    │      (編集領域)         │   (F3)     │
├──────────┴──────────────────────────┴────────────┤
│                 Log (F6) / quickfix              │
└──────────────────────────────────────────────────┘
  • 左(Explorer): ファイルを開く・作る・消す。Enterで開く、aで新規作成
  • 右(Navigator): このプログラムのDATA/PROC/%MACRO一覧。Enterでその行へジャンプ
  • 下(Log): 実行後にログが出る

広すぎると感じたら各ペインで q を押せば閉じられます。幅は
let g:saside_navigator_width = 28 のようにvimrcで調整できます。


3. 書く:補完とスニペット

骨格をスニペットで出す

挿入モードで datastep と打って Ctrl+j:

data <+out+>;        ← カーソルがここに来る(プレースホルダは消える)
    set <+in+>;
    <+statements+>
run;

出力データセット名を打ったら、また Ctrl+j で次の set の位置へ飛びます。
主なキーワード: datastep sql sortds meansds freqds macrodef
doloop selwhen importcsv exportcsv

補完はTab

  • subst + Tabsubstr [func](SAS関数辞書。説明付き)
  • &cut + Tab&cutoff_high.このファイル内で %let 済みのマクロ変数
  • %sys + Tab%sysfunc [macro]
  • work. の続き + Tab → このファイルで使われているデータセット名

先頭候補が選択された状態で出るので、そのまま Enter で確定できます。

括弧・クオートは自動で閉じる

( を打てば () になりカーソルは中。閉じ括弧を自分で打っても二重にならず
素通りします。don't のような語中アポストロフィは誤爆しません。


4. 実行する:3つの粒度を使い分ける

ここがSAS開発の肝です。毎回フルで流さないのがコツ。

(a) 構文チェックだけ(\rc)— まず これ

\rc

-obs 0 -noreplace を付けて実行します。データを1件も読まないので、
数百万件のローンデータを扱うプログラムでも数秒で終わり、
タイプミス・セミコロン漏れ・存在しない変数名だけを先に潰せます。
永久データセットを上書きしないので安全です。

「とりあえず\rc → 通ったらF5」を習慣にすると、待ち時間が激減します。

(b) 今書いているステップだけ(\rb

カーソルをDATAステップやPROCの中に置いて \rb
そのブロック(datarun;)だけを切り出して実行します。

(c) 選んだ範囲だけ(ビジュアル + F5)

V で行選択して範囲を広げ、F5。選択範囲だけ実行されます。

重要: (b)(c)の部分実行では、選択範囲より前にある LIBNAME /
OPTIONS / %LET が自動で先頭に付与されます
。だから
「PROC MEANSだけ選んで実行したらライブラリが無いと言われる」という
部分実行あるあるが起きません。不要なら let g:saside_run_preamble = 0

ただしマクロ定義(%macro)が前提のコードは、マクロ定義ごと選択範囲に
含めてください。ここは自動化していません。

(d) 全部流す(F5)

最終確認はこれ。未保存なら自動で保存してから実行します。
実行を中断したくなったら :SasAbort


5. ログを読む:ここが一番差が出る

実行が終わると、下ペインにログが色分け表示され、
ERROR/WARNINGが自動でquickfixに入ります。

[saside] SAS終了 exit=1 / ERROR+WARNING 2件 / 危険NOTE 8件

ERROR/WARNINGを潰す

  • quickfixで Enter → ログの該当行へジャンプ
  • :cnext / :cprev で次・前へ
  • ログペイン内では ]e [e で次/前のERROR、]w [w でWARNINGへ移動

危険NOTEを確認する(\lr)— ここが本題

SASで一番怖いのはERRORではありません。 エラーにならずに処理が続行し、
黙って誤った結果を出すNOTEです。\lr を押すと、それらだけが理由付きで
quickfixに並びます。

[変数が未初期化(変数名のタイプミス・定義漏れの可能性)] NOTE: Variable ZANDAKA is uninitialized.
[MERGEでBY値が重複(意図しない結合・件数増加の典型例)] NOTE: MERGE statement has more than one...
[不正なデータ(型変換に失敗し欠損値になっている)] NOTE: Invalid numeric data, KINGAKU='ABC'...
[出力が0件(抽出条件・結合条件の誤りの可能性)] NOTE: The data set WORK.RESULT has 0 observations.
[ゼロ除算(結果が欠損値になっている)] NOTE: Division by zero detected...

検出対象は、未初期化変数・不正データ・MERGEのBY重複・ゼロ除算・桁あふれ・
暗黙の型変換・欠損値発生・出力0件・INPUT行またぎ・LOST CARD・変数長不一致など。

「exit=0 だから成功」ではありません。 \rc で構文を通し、F5 で流し、
最後に \lr で黙って壊れていないかを確認する——この3段階が実務での安全な流れです。

自社特有のチェックを足したい場合はvimrcで追加できます。

let g:saside_log_risk_patterns = [
      \ {'pat': 'has 0 observations', 'desc': '出力0件(要確認)'},
      \ {'pat': '独自の警告文言', 'desc': '説明'},
      \ ]

PROC出力(.lst)を見る

F7.lst(PROC PRINTなどの出力結果)を下ペインに表示します。


6. 直す:整形とナビゲーション

コードを整える(F9)

インデントの再計算・行末空白の除去・連続空行の圧縮を一括で行います。
undo 1回で全部戻せます

予約語を大文字にしたい場合は let g:saside_format_upcase = 1
(文字列とコメントの中は保護されます)。

一部だけ整えたいときは、範囲選択して =
1ブロックだけなら =%% のブロックジャンプと組み合わせ)。

移動する

キー 動作
]] / [[ 次 / 前の DATA・PROC・%MACRO へ
% DOEND%DO%END%MACRO%MENDDATA/PROCRUN/QUIT
F3 → Enter Navigatorの一覧からジャンプ
K カーソル下のSAS関数・PROCの説明を表示

探す

キー 動作
\sg プロジェクト全体を検索(**/*.sas **/*.txt
\sd カーソル下のデータセット名の使用箇所(set/merge/from/join に絞る)
\sm カーソル下のマクロの定義と呼び出し
F10 TODO / FIXME / BUG の一覧

一括置換の定石:

:SasGrep old_dataset_name
:cdo s/old_dataset_name/new_name/gc | update

7. 構造を把握する:4つのビュー

大きなプログラムを引き継いだときに効きます。右ペイン(F3)を開いて、
中で 1 2 3 4 を押すと表示が切り替わります。

キー ビュー 何が見えるか
1 Navigator 種別ごと(MACRO / DATA / PROC / LIBNAME / ODS…)
2 Outline 出現順のフラットな一覧
3 Dataset 入力(SET/MERGE/FROM/JOIN)と出力(DATA/CREATE TABLE)のデータセット一覧
4 Macro %macro 定義と引数リスト

特に Dataset ビュー(3 は、他人が書いた1000行のプログラムで
「結局どのライブラリの何を読んで、何を作っているのか」を数秒で把握できます。

編集すると約0.3秒後に自動更新されます。


8. 作業を中断・再開する

:SasSessionSave 案件A     " 開いているファイルとペイン構成を保存
:SasSessionLoad 案件A     " 復元

気になる行には \bb でブックマーク(名前を付けて保存)。
\bl で一覧表示 → Enterでジャンプ。Vimを閉じても消えません


9. 実務での推奨フロー(まとめ)

1. F12                    作業レイアウトを開く
2. コードを書く            Tab補完 / Ctrl+j スニペット
3. \rc                    構文チェック(数秒)→ エラーがあればここで潰す
4. \rb または V+F5        書いた部分だけ試し実行
5. F5                     全体を実行
6. F8 → quickfix          ERROR/WARNING を潰す
7. \lr                    危険NOTE を確認 ← ここを飛ばさない
8. F9                     コミット前に整形

3と7が、他のエディタでは得られにくい部分です。


10. つまずいたら

症状 対処
ペーストでVimが固まる 貼る前に F11(貼り終えたら再度F11)
\rc で SAS が見つからない let g:saside_sas_cmd = '/フルパス/sas'
部分実行でライブラリが無いと言われる マクロ定義ごと選択範囲に含める
巨大ログが重い 10MB超は自動でsyntax offになる。:SasLogErrors で抽出だけ見る
Navigatorが更新されない 2万行超は自動停止する仕様。ペイン内で r を押す
キーが他と衝突する let g:saside_no_default_maps = 1 で既定割当を全停止し、<Plug> で個別に割当

詳細は :help saside またはリファレンス編を参照してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?