pygmentize記念に dos コマンドプロンプトの継続行を生まれて初めて知る

憶えたくなんかねーのよ、こんなの。

pygments は version 2.0.2 でも、DOS プロンプト、PowerShell セッションの lexer がないのね。で、自力で書いちゃった:

pygments/lexers/shell.pyに追加
 1 class MSDOSSessionLexer(Lexer):
 2     """
 3     Lexer for simplistic MSDOS sessions.
 4 
 5     .. versionadded:: 2.0
 6     """
 7 
 8     name = 'MSDOS Session'
 9     aliases = ['doscon']
10     filenames = []
11     mimetypes = []
12 
13     def get_tokens_unprocessed(self, text):
14         bashlexer = BatchLexer(**self.options)
15 
16         pos = 0
17         curcode = ''
18         insertions = []
19 
20         for match in line_re.finditer(text):
21             line = match.group()
22             m = re.match(r'^([^>]+>)(.*\n?)', line)
23             if m:
24                 # To support output lexers (say diff output), the output
25                 # needs to be broken by prompts whenever the output lexer
26                 # changes.
27                 if not insertions:
28                     pos = match.start()
29 
30                 insertions.append((len(curcode),
31                                    [(0, Generic.Prompt, m.group(1))]))
32                 curcode += m.group(2)
33             elif line.startswith('More? '):
34                 insertions.append((len(curcode),
35                                    [(0, Generic.Prompt, line[:len('More? ')])]))
36                 curcode += line[len('More? '):]
37             else:
38                 if insertions:
39                     toks = bashlexer.get_tokens_unprocessed(curcode)
40                     for i, t, v in do_insertions(insertions, toks):
41                         yield pos+i, t, v
42                 yield match.start(), Generic.Output, line
43                 insertions = []
44                 curcode = ''
45         if insertions:
46             for i, t, v in do_insertions(insertions,
47                                          bashlexer.get_tokens_unprocessed(curcode)):
48                 yield pos+i, t, v
49 
50 
51 class PowerShellSessionLexer(Lexer):
52     """
53     Lexer for simplistic Windows PowerShell sessions.
54 
55     .. versionadded:: 2.0
56     """
57 
58     name = 'PowerShell Session'
59     aliases = ['ps1con']
60     filenames = []
61     mimetypes = []
62 
63     def get_tokens_unprocessed(self, text):
64         bashlexer = PowerShellLexer(**self.options)
65 
66         pos = 0
67         curcode = ''
68         insertions = []
69 
70         for match in line_re.finditer(text):
71             line = match.group()
72             m = re.match(r'^(PS [^>]+> )(.*\n?)', line)
73             if m:
74                 # To support output lexers (say diff output), the output
75                 # needs to be broken by prompts whenever the output lexer
76                 # changes.
77                 if not insertions:
78                     pos = match.start()
79 
80                 insertions.append((len(curcode),
81                                    [(0, Generic.Prompt, m.group(1))]))
82                 curcode += m.group(2)
83             elif line.startswith('>> '):
84                 insertions.append((len(curcode),
85                                    [(0, Generic.Prompt, line[:len('>> ')])]))
86                 curcode += line[len('>> '):]
87             else:
88                 if insertions:
89                     toks = bashlexer.get_tokens_unprocessed(curcode)
90                     for i, t, v in do_insertions(insertions, toks):
91                         yield pos+i, t, v
92                 yield match.start(), Generic.Output, line
93                 insertions = []
94                 curcode = ''
95         if insertions:
96             for i, t, v in do_insertions(insertions,
97                                          bashlexer.get_tokens_unprocessed(curcode)):
98                 yield pos+i, t, v

shell.py 内 __all__ にはこの2つを追加した上で、(おそらく本来は自動生成されると思われる)_mapping.py をメンテ:

_mapping.py内
1 # ...
2 LEXERS = {
3     # ...
4     'MSDOSSessionLexer': ('pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), (),),
5     # ...
6     'PowerShellSessionLexer': ('pygments.lexers.shell', 'PowerShell Session', ('ps1con',), (), (),),
7     # ...

そうなんだけどさ、あたしは日常的に MSYS ユーザなんであって、剥き身のコマンドプロンプトにいる時間なんか、一日5秒にも満たないわけよ。(プロンプト起動してそのまますぐさま bash とタイプする。)

はじめてみたぞ、dos の PS2(*):

 1 Microsoft Windows [Version 6.1.7601]
 2 Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
 3 
 4 C:\Users\hhsprings>echo 1
 5 1
 6 
 7 C:\Users\hhsprings>\
 8 '\' は、内部コマンドまたは外部コマンド、
 9 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
10 
11 C:\Users\hhsprings>_
12 '_' は、内部コマンドまたは外部コマンド、
13 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
14 
15 C:\Users\hhsprings>echo ^
16 More? 1
17 1
18 
19 C:\Users\hhsprings>

継続行は「^」なんだと。

powershell は python 対話モードや unix シェルと似て、不完全行では自動で継続しますね:

1 PS C:\Users\hhsprings> $a =
2 >> 1
3 >> 
4 PS C:\Users\hhsprings> $a
5 1
6 PS C:\Users\hhsprings> 

追記:
このサイトでは結構出てきてるけど一応。unix系シェルでは、「バックスラッシュ」でも継続行:

 1 me@host: ~$ ls -l | \
 2 > awk '{print $1, $2}'
 3 total 33
 4 -rw-r--r-- 1
 5 -rw-r--r-- 1
 6 -rw-r--r-- 1
 7 -rw-r--r-- 1
 8 -rw-r--r-- 1
 9 -rw-r--r-- 1
10 -rwxr-xr-x 1
11 -rwxr-xr-x 1
12 -rwxr-xr-x 1
13 drwxr-xr-x 6
14 drwxr-xr-x 8
15 me@host: ~$ 

powershellと同じで、不完全行では自動的に継続行になります。